From 9c950a086f6d6abecb5bddc9445e79902792f880 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 14 May 2024 16:50:17 +0200 Subject: [PATCH 001/257] parameter check completed --- bin/check_params.py | 170 +++++++ bin/check_samplesheet.py | 259 ----------- conf/igenomes.config | 440 ------------------ conf/modules.config | 20 - conf/test.config | 29 -- conf/test_full.config | 24 - lib/WorkflowDrugresponseeval.groovy | 57 +-- lib/WorkflowMain.groovy | 16 - main.nf | 18 +- modules/local/params_check.nf | 37 ++ modules/local/samplesheet_check.nf | 31 -- .../custom/dumpsoftwareversions/main.nf | 24 - .../custom/dumpsoftwareversions/meta.yml | 36 -- .../templates/dumpsoftwareversions.py | 102 ---- modules/nf-core/fastqc/main.nf | 51 -- modules/nf-core/fastqc/meta.yml | 52 --- modules/nf-core/multiqc/main.nf | 53 --- modules/nf-core/multiqc/meta.yml | 56 --- nextflow.config | 37 +- nextflow_schema.json | 167 ++++--- subworkflows/local/input_check.nf | 44 -- workflows/drugresponseeval.nf | 56 +-- 22 files changed, 328 insertions(+), 1451 deletions(-) create mode 100755 bin/check_params.py delete mode 100755 bin/check_samplesheet.py delete mode 100644 conf/igenomes.config delete mode 100644 conf/test.config delete mode 100644 conf/test_full.config create mode 100644 modules/local/params_check.nf delete mode 100644 modules/local/samplesheet_check.nf delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/main.nf delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/meta.yml delete mode 100755 modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py delete mode 100644 modules/nf-core/fastqc/main.nf delete mode 100644 modules/nf-core/fastqc/meta.yml delete mode 100644 modules/nf-core/multiqc/main.nf delete mode 100644 modules/nf-core/multiqc/meta.yml delete mode 100644 subworkflows/local/input_check.nf diff --git a/bin/check_params.py b/bin/check_params.py new file mode 100755 index 0000000..3b47fc5 --- /dev/null +++ b/bin/check_params.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python + + +"""Provide a command line tool to validate and transform tabular samplesheets.""" + + +import argparse +import logging +import sys +from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler +from models import MODEL_FACTORY +from response_datasets import RESPONSE_DATASET_FACTORY +from dreval.experiment import drug_response_experiment +from dreval.evaluation import AVAILABLE_METRICS + +logger = logging.getLogger() + + +def check_arguments(args): + assert args.models, "At least one model must be specified" + assert all( + [model in MODEL_FACTORY for model in args.models] + ), f"Invalid model name. Available models are {list(MODEL_FACTORY.keys())}. If you want to use your own model, you need to implement a new model class and add it to the MODEL_FACTORY in the models init" + assert all( + [test in ["LPO", "LCO", "LDO"] for test in args.test_mode] + ), "Invalid test mode. Available test modes are LPO, LCO, LDO" + assert args.dataset_name in RESPONSE_DATASET_FACTORY, f"Invalid dataset name. Available datasets are {list(RESPONSE_DATASET_FACTORY.keys())} If you want to use your own dataset, you need to implement a new response dataset class and add it to the RESPONSE_DATASET_FACTORY in the response_datasets init" + + assert args.n_cv_splits > 1, "Number of cross-validation splits must be greater than 1" + + # TODO Allow for custom randomization tests maybe via config file + if args.randomization_mode[0] != "None": + assert all( + [randomization in ["SVCC", "SVRC", "SVSC", "SVRD"] for randomization in args.randomization_mode] + ), "At least one invalid randomization mode. Available randomization modes are SVCC, SVRC, SVSC, SVRD" + else: + args.randomization_mode = None + if args.curve_curator != 'false': + raise NotImplementedError("CurveCurator not implemented") + if args.response_transformation == "None": + response_transformation = None + elif (args.response_transformation == "standard"): + response_transformation = StandardScaler() + elif (args.response_transformation == "minmax"): + response_transformation = MinMaxScaler() + elif (args.response_transformation == "robust"): + response_transformation = RobustScaler() + else: + # TODO add log, sinh etc + raise ValueError( + f"Invalid response_transformation: {args.response_transformation}. Choose robust, minmax or standard.") + + assert args.optim_metric in AVAILABLE_METRICS, f"Invalid optim_metric for hyperparameter tuning. Choose from {list(AVAILABLE_METRICS.keys())}" + +def parse_args(argv=None): + """Define and immediately parse command line arguments.""" + parser = argparse.ArgumentParser( + description="Run the drug response prediction model test suite." + ) + parser.add_argument( + "--run_id", type=str, default="my_run", help="identifier to save the results" + ) + parser.add_argument( + "--models", nargs="+", help="model to evaluate or list of models to compare" + ) + parser.add_argument( + "--test_mode", + nargs="+", + default=["LPO"], + help="Which tests to run (LPO=Leave-random-Pairs-Out, " + "LCO=Leave-Cell-line-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO LCO LDO' to run all tests. Default is LPO", + ) + parser.add_argument( + "--randomization_mode", + nargs="+", + default=["None"], + help="Which randomization tests to run, additionally to the normal run. Default is None which means no randomization tests are run." + "Modes: SVCC, SVRC, SVCD, SVRD" + "Can be a list of randomization tests e.g. 'SCVC SCVD' to run two tests. Default is None" + "SVCC: Single View Constant for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." + "For each experiment one cell line view is held constant while the others are randomized. " + "SVRC Single View Random for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." + "For each experiment one cell line view is randomized while the others are held constant." + "SVCD: Single View Constant for Drugs: in this mode, one experiment is done for every drug view the model uses (e.g. fingerprints, target_information, ..)." + "For each experiment one drug view is held constant while the others are randomized." + "SVRD: Single View Random for Drugs: in this mode, one experiment is done for every drug view the model uses (e.g. gene expression, target_information, ..)." + "For each experiment one drug view is randomized while the others are held constant." + , + ) + parser.add_argument( + "--randomization_type", + type=str, + default="permutation", + help="""type of randomization to use. Choose from "gaussian", "zeroing", "permutation". Default is "permutation" + "gaussian": replace the features with random values sampled from a gaussian distribution with the same mean and standard deviation + "zeroing": replace the features with zeros + "permutation": permute the features over the instances, keeping the distribution of the features the same but dissolving the relationship to the target""" + ) + parser.add_argument( + "--n_trials_robustness", + type=int, + default=0, + help="Number of trials to run for the robustness test. Default is 0, which means no robustness test is run. The robustness test is a test where the model is trained with varying seeds. This is done multiple times to see how stable the model is." + ) + + parser.add_argument( + "--dataset_name", + type=str, + default="GDSC1", + help="Name of the drug response dataset" + ) + + parser.add_argument( + "--path_out", type=str, default="results/", help="Path to the output directory" + ) + + parser.add_argument( + "--curve_curator", + type=str, + default='false', + help="Whether to run " "CurveCurator " "to sort out " "non-reactive " "curves", + ) + parser.add_argument( + "--overwrite", + type=str, + default='false', + help="Overwrite existing results with the same path out and run_id? ", + ) + parser.add_argument( + "--optim_metric", + type=str, + default="RMSE", + help=f'Metric for hyperparameter tuning choose from {list(AVAILABLE_METRICS.keys())} Default is RMSE.' + ) + parser.add_argument( + "--n_cv_splits", + type=int, + default=5, + help="Number of cross-validation splits to use for the evaluation" + ) + + parser.add_argument( + "--response_transformation", + type=str, + default="None", + help="Transformation to apply to the response variable possible values: standard, minmax, robust") + parser.add_argument( + "--multiprocessing", + action='store_true', + default=False, + help="Whether to use multiprocessing for the evaluation. Default is False") + parser.add_argument( + "-l", + "--log-level", + help="The desired log level (default WARNING).", + choices=("CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"), + default="WARNING", + ) + return parser.parse_args(argv) + + +def main(argv=None): + """Coordinate argument parsing and program execution.""" + args = parse_args(argv) + logging.basicConfig(level=args.log_level, format="[%(levelname)s] %(message)s") + check_arguments(args) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py deleted file mode 100755 index 4a758fe..0000000 --- a/bin/check_samplesheet.py +++ /dev/null @@ -1,259 +0,0 @@ -#!/usr/bin/env python - - -"""Provide a command line tool to validate and transform tabular samplesheets.""" - - -import argparse -import csv -import logging -import sys -from collections import Counter -from pathlib import Path - -logger = logging.getLogger() - - -class RowChecker: - """ - Define a service that can validate and transform each given row. - - Attributes: - modified (list): A list of dicts, where each dict corresponds to a previously - validated and transformed row. The order of rows is maintained. - - """ - - VALID_FORMATS = ( - ".fq.gz", - ".fastq.gz", - ) - - def __init__( - self, - sample_col="sample", - first_col="fastq_1", - second_col="fastq_2", - single_col="single_end", - **kwargs, - ): - """ - Initialize the row checker with the expected column names. - - Args: - sample_col (str): The name of the column that contains the sample name - (default "sample"). - first_col (str): The name of the column that contains the first (or only) - FASTQ file path (default "fastq_1"). - second_col (str): The name of the column that contains the second (if any) - FASTQ file path (default "fastq_2"). - single_col (str): The name of the new column that will be inserted and - records whether the sample contains single- or paired-end sequencing - reads (default "single_end"). - - """ - super().__init__(**kwargs) - self._sample_col = sample_col - self._first_col = first_col - self._second_col = second_col - self._single_col = single_col - self._seen = set() - self.modified = [] - - def validate_and_transform(self, row): - """ - Perform all validations on the given row and insert the read pairing status. - - Args: - row (dict): A mapping from column headers (keys) to elements of that row - (values). - - """ - self._validate_sample(row) - self._validate_first(row) - self._validate_second(row) - self._validate_pair(row) - self._seen.add((row[self._sample_col], row[self._first_col])) - self.modified.append(row) - - def _validate_sample(self, row): - """Assert that the sample name exists and convert spaces to underscores.""" - if len(row[self._sample_col]) <= 0: - raise AssertionError("Sample input is required.") - # Sanitize samples slightly. - row[self._sample_col] = row[self._sample_col].replace(" ", "_") - - def _validate_first(self, row): - """Assert that the first FASTQ entry is non-empty and has the right format.""" - if len(row[self._first_col]) <= 0: - raise AssertionError("At least the first FASTQ file is required.") - self._validate_fastq_format(row[self._first_col]) - - def _validate_second(self, row): - """Assert that the second FASTQ entry has the right format if it exists.""" - if len(row[self._second_col]) > 0: - self._validate_fastq_format(row[self._second_col]) - - def _validate_pair(self, row): - """Assert that read pairs have the same file extension. Report pair status.""" - if row[self._first_col] and row[self._second_col]: - row[self._single_col] = False - first_col_suffix = Path(row[self._first_col]).suffixes[-2:] - second_col_suffix = Path(row[self._second_col]).suffixes[-2:] - if first_col_suffix != second_col_suffix: - raise AssertionError("FASTQ pairs must have the same file extensions.") - else: - row[self._single_col] = True - - def _validate_fastq_format(self, filename): - """Assert that a given filename has one of the expected FASTQ extensions.""" - if not any(filename.endswith(extension) for extension in self.VALID_FORMATS): - raise AssertionError( - f"The FASTQ file has an unrecognized extension: {filename}\n" - f"It should be one of: {', '.join(self.VALID_FORMATS)}" - ) - - def validate_unique_samples(self): - """ - Assert that the combination of sample name and FASTQ filename is unique. - - In addition to the validation, also rename all samples to have a suffix of _T{n}, where n is the - number of times the same sample exist, but with different FASTQ files, e.g., multiple runs per experiment. - - """ - if len(self._seen) != len(self.modified): - raise AssertionError("The pair of sample name and FASTQ must be unique.") - seen = Counter() - for row in self.modified: - sample = row[self._sample_col] - seen[sample] += 1 - row[self._sample_col] = f"{sample}_T{seen[sample]}" - - -def read_head(handle, num_lines=10): - """Read the specified number of lines from the current position in the file.""" - lines = [] - for idx, line in enumerate(handle): - if idx == num_lines: - break - lines.append(line) - return "".join(lines) - - -def sniff_format(handle): - """ - Detect the tabular format. - - Args: - handle (text file): A handle to a `text file`_ object. The read position is - expected to be at the beginning (index 0). - - Returns: - csv.Dialect: The detected tabular format. - - .. _text file: - https://docs.python.org/3/glossary.html#term-text-file - - """ - peek = read_head(handle) - handle.seek(0) - sniffer = csv.Sniffer() - dialect = sniffer.sniff(peek) - return dialect - - -def check_samplesheet(file_in, file_out): - """ - Check that the tabular samplesheet has the structure expected by nf-core pipelines. - - Validate the general shape of the table, expected columns, and each row. Also add - an additional column which records whether one or two FASTQ reads were found. - - Args: - file_in (pathlib.Path): The given tabular samplesheet. The format can be either - CSV, TSV, or any other format automatically recognized by ``csv.Sniffer``. - file_out (pathlib.Path): Where the validated and transformed samplesheet should - be created; always in CSV format. - - Example: - This function checks that the samplesheet follows the following structure, - see also the `viral recon samplesheet`_:: - - sample,fastq_1,fastq_2 - SAMPLE_PE,SAMPLE_PE_RUN1_1.fastq.gz,SAMPLE_PE_RUN1_2.fastq.gz - SAMPLE_PE,SAMPLE_PE_RUN2_1.fastq.gz,SAMPLE_PE_RUN2_2.fastq.gz - SAMPLE_SE,SAMPLE_SE_RUN1_1.fastq.gz, - - .. _viral recon samplesheet: - https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv - - """ - required_columns = {"sample", "fastq_1", "fastq_2"} - # See https://docs.python.org/3.9/library/csv.html#id3 to read up on `newline=""`. - with file_in.open(newline="") as in_handle: - reader = csv.DictReader(in_handle, dialect=sniff_format(in_handle)) - # Validate the existence of the expected header columns. - if not required_columns.issubset(reader.fieldnames): - req_cols = ", ".join(required_columns) - logger.critical(f"The sample sheet **must** contain these column headers: {req_cols}.") - sys.exit(1) - # Validate each row. - checker = RowChecker() - for i, row in enumerate(reader): - try: - checker.validate_and_transform(row) - except AssertionError as error: - logger.critical(f"{str(error)} On line {i + 2}.") - sys.exit(1) - checker.validate_unique_samples() - header = list(reader.fieldnames) - header.insert(1, "single_end") - # See https://docs.python.org/3.9/library/csv.html#id3 to read up on `newline=""`. - with file_out.open(mode="w", newline="") as out_handle: - writer = csv.DictWriter(out_handle, header, delimiter=",") - writer.writeheader() - for row in checker.modified: - writer.writerow(row) - - -def parse_args(argv=None): - """Define and immediately parse command line arguments.""" - parser = argparse.ArgumentParser( - description="Validate and transform a tabular samplesheet.", - epilog="Example: python check_samplesheet.py samplesheet.csv samplesheet.valid.csv", - ) - parser.add_argument( - "file_in", - metavar="FILE_IN", - type=Path, - help="Tabular input samplesheet in CSV or TSV format.", - ) - parser.add_argument( - "file_out", - metavar="FILE_OUT", - type=Path, - help="Transformed output samplesheet in CSV format.", - ) - parser.add_argument( - "-l", - "--log-level", - help="The desired log level (default WARNING).", - choices=("CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"), - default="WARNING", - ) - return parser.parse_args(argv) - - -def main(argv=None): - """Coordinate argument parsing and program execution.""" - args = parse_args(argv) - logging.basicConfig(level=args.log_level, format="[%(levelname)s] %(message)s") - if not args.file_in.is_file(): - logger.error(f"The given input file {args.file_in} was not found!") - sys.exit(2) - args.file_out.parent.mkdir(parents=True, exist_ok=True) - check_samplesheet(args.file_in, args.file_out) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/conf/igenomes.config b/conf/igenomes.config deleted file mode 100644 index 3f11437..0000000 --- a/conf/igenomes.config +++ /dev/null @@ -1,440 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for iGenomes paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines reference genomes using iGenome paths. - Can be used by any config that customises the base path using: - $params.igenomes_base / --igenomes_base ----------------------------------------------------------------------------------------- -*/ - -params { - // illumina iGenomes reference file paths - genomes { - 'GRCh37' { - fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" - } - 'GRCh38' { - fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'CHM13' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAIndex/" - bwamem2 = "${params.igenomes_base}/Homo_sapiens/UCSC/CHM13/Sequence/BWAmem2Index/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/CHM13/Annotation/Genes/genes.gtf" - gff = "ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/009/914/755/GCF_009914755.1_T2T-CHM13v2.0/GCF_009914755.1_T2T-CHM13v2.0_genomic.gff.gz" - mito_name = "chrM" - } - 'GRCm38' { - fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed" - } - 'TAIR10' { - fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" - mito_name = "Mt" - } - 'EB2' { - fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" - } - 'UMD3.1' { - fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" - mito_name = "MT" - } - 'WBcel235' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" - mito_name = "MtDNA" - macs_gsize = "9e7" - } - 'CanFam3.1' { - fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" - mito_name = "MT" - } - 'GRCz10' { - fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'BDGP6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" - mito_name = "M" - macs_gsize = "1.2e8" - } - 'EquCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" - mito_name = "MT" - } - 'EB1' { - fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" - } - 'Galgal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'Gm01' { - fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" - } - 'Mmul_1' { - fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" - mito_name = "MT" - } - 'IRGSP-1.0' { - fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'CHIMP2.1.4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" - mito_name = "MT" - } - 'Rnor_5.0' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'Rnor_6.0' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'R64-1-1' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" - mito_name = "MT" - macs_gsize = "1.2e7" - } - 'EF2' { - fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.21e7" - } - 'Sbi1' { - fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" - } - 'Sscrofa10.2' { - fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" - mito_name = "MT" - } - 'AGPv3' { - fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'hg38' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'hg19' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg19-blacklist.bed" - } - 'mm10' { - fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/mm10-blacklist.bed" - } - 'bosTau8' { - fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'ce10' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "9e7" - } - 'canFam3' { - fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" - mito_name = "chrM" - } - 'danRer10' { - fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.37e9" - } - 'dm6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.2e8" - } - 'equCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" - mito_name = "chrM" - } - 'galGal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" - mito_name = "chrM" - } - 'panTro4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" - mito_name = "chrM" - } - 'rn6' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'sacCer3' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" - readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.2e7" - } - 'susScr3' { - fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" - mito_name = "chrM" - } - } -} diff --git a/conf/modules.config b/conf/modules.config index da58a5d..e27fd28 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -18,24 +18,4 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - withName: SAMPLESHEET_CHECK { - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - - withName: FASTQC { - ext.args = '--quiet' - } - - withName: CUSTOM_DUMPSOFTWAREVERSIONS { - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - pattern: '*_versions.yml' - ] - } - } diff --git a/conf/test.config b/conf/test.config deleted file mode 100644 index 7250d3d..0000000 --- a/conf/test.config +++ /dev/null @@ -1,29 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running minimal tests -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a fast and simple pipeline test. - - Use as follows: - nextflow run nf-core/drugresponseeval -profile test, --outdir - ----------------------------------------------------------------------------------------- -*/ - -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 - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/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 deleted file mode 100644 index 3fd96b7..0000000 --- a/conf/test_full.config +++ /dev/null @@ -1,24 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for running full-size tests -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines input files and everything required to run a full size pipeline test. - - Use as follows: - nextflow run nf-core/drugresponseeval -profile test_full, --outdir - ----------------------------------------------------------------------------------------- -*/ - -params { - config_profile_name = 'Full test profile' - config_profile_description = 'Full test dataset to check pipeline function' - - // Input data for full size test - // TODO nf-core: Specify the paths to your full test data ( on nf-core/test-datasets or directly in repositories, e.g. SRA) - // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' - - // Genome references - genome = 'R64-1-1' -} diff --git a/lib/WorkflowDrugresponseeval.groovy b/lib/WorkflowDrugresponseeval.groovy index 853b8b2..f1ccbb7 100755 --- a/lib/WorkflowDrugresponseeval.groovy +++ b/lib/WorkflowDrugresponseeval.groovy @@ -7,50 +7,10 @@ import groovy.text.SimpleTemplateEngine class WorkflowDrugresponseeval { - // - // Check and validate parameters - // - public static void initialise(params, log) { - - genomeExistsError(params, log) - - - if (!params.fasta) { - Nextflow.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." - } - } - // - // Get workflow summary for MultiQC - // - public static String paramsSummaryMultiqc(workflow, summary) { - String summary_section = '' - for (group in summary.keySet()) { - def group_params = summary.get(group) // This gets the parameters of that particular group - if (group_params) { - summary_section += "

$group

\n" - summary_section += "
\n" - for (param in group_params.keySet()) { - summary_section += "
$param
${group_params.get(param) ?: 'N/A'}
\n" - } - summary_section += "
\n" - } - } - - String yaml_file_text = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" - yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n" - yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n" - yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n" - yaml_file_text += "plot_type: 'html'\n" - yaml_file_text += "data: |\n" - yaml_file_text += "${summary_section}" - return yaml_file_text + public static void initialise(params, log) { } - // - // Generate methods description for MultiQC - // - public static String toolCitationText(params) { // TODO Optionally add in-text citation tools to this list. @@ -58,8 +18,6 @@ class WorkflowDrugresponseeval { // 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() @@ -106,17 +64,4 @@ class WorkflowDrugresponseeval { return description_html } - // - // Exit pipeline if incorrect --genome key provided - // - private static void genomeExistsError(params, log) { - if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - def error_string = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + - " Currently, the available genome keys are:\n" + - " ${params.genomes.keySet().join(", ")}\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - Nextflow.error(error_string) - } - } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 5a42a2f..b83d8f9 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -43,21 +43,5 @@ class WorkflowMain { // Check AWS batch settings NfcoreTemplate.awsBatch(workflow, params) - - // Check input has been provided - if (!params.input) { - Nextflow.error("Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'") - } - } - // - // Get attribute from genome config file e.g. fasta - // - public static Object getGenomeAttribute(params, attribute) { - if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { - if (params.genomes[ params.genome ].containsKey(attribute)) { - return params.genomes[ params.genome ][ attribute ] - } - } - return null } } diff --git a/main.nf b/main.nf index 4e4b814..01b9a28 100644 --- a/main.nf +++ b/main.nf @@ -10,37 +10,21 @@ */ nextflow.enable.dsl = 2 - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - GENOME PARAMETER VALUES -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE & PRINT PARAMETER SUMMARY ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { validateParameters; paramsHelp } from 'plugin/nf-validation' - // Print help message if needed if (params.help) { def logo = NfcoreTemplate.logo(workflow, params.monochrome_logs) def citation = '\n' + WorkflowMain.citation(workflow) + '\n' - def String command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" + //def String command = "nextflow run ${workflow.manifest.name} --input samplesheet.csv --genome GRCh37 -profile docker" log.info logo + paramsHelp(command) + citation + NfcoreTemplate.dashedLine(params.monochrome_logs) System.exit(0) } -// Validate input parameters -if (params.validate_params) { - validateParameters() -} - WorkflowMain.initialise(workflow, params, log) /* diff --git a/modules/local/params_check.nf b/modules/local/params_check.nf new file mode 100644 index 0000000..49c4472 --- /dev/null +++ b/modules/local/params_check.nf @@ -0,0 +1,37 @@ +process PARAMS_CHECK { + //tag "$samplesheet" + //label 'process_single' + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + val models + val test_mode + val dataset_name + val n_cv_splits + val randomization_mode + val curve_curator + val response_transformation + val optim_metric + + output: + + when: + task.ext.when == null || task.ext.when + + script: // This script is bundled with the pipeline, in nf-core/drugresponseeval/bin/ + """ + check_params.py \\ + --models $models \\ + --test_mode $test_mode \\ + --dataset_name $dataset_name \\ + --n_cv_splits $n_cv_splits \\ + --randomization_mode $randomization_mode \\ + --curve_curator $curve_curator \\ + --response_transformation $response_transformation \\ + --optim_metric $optim_metric + """ +} diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf deleted file mode 100644 index 2a1667b..0000000 --- a/modules/local/samplesheet_check.nf +++ /dev/null @@ -1,31 +0,0 @@ -process SAMPLESHEET_CHECK { - tag "$samplesheet" - label 'process_single' - - conda "conda-forge::python=3.8.3" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - 'biocontainers/python:3.8.3' }" - - input: - path samplesheet - - output: - path '*.csv' , emit: csv - path "versions.yml", emit: versions - - when: - task.ext.when == null || task.ext.when - - script: // This script is bundled with the pipeline, in nf-core/drugresponseeval/bin/ - """ - check_samplesheet.py \\ - $samplesheet \\ - samplesheet.valid.csv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - python: \$(python --version | sed 's/Python //g') - END_VERSIONS - """ -} diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf deleted file mode 100644 index 800a609..0000000 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ /dev/null @@ -1,24 +0,0 @@ -process CUSTOM_DUMPSOFTWAREVERSIONS { - label 'process_single' - - // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.14" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" - - input: - path versions - - output: - path "software_versions.yml" , emit: yml - path "software_versions_mqc.yml", emit: mqc_yml - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - template 'dumpsoftwareversions.py' -} diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml deleted file mode 100644 index c32657d..0000000 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ /dev/null @@ -1,36 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json -name: custom_dumpsoftwareversions -description: Custom module used to dump software versions within the nf-core pipeline template -keywords: - - custom - - dump - - version -tools: - - custom: - description: Custom module used to dump software versions within the nf-core pipeline template - homepage: https://github.com/nf-core/tools - documentation: https://github.com/nf-core/tools - licence: ["MIT"] -input: - - versions: - type: file - description: YML file containing software versions - pattern: "*.yml" - -output: - - yml: - type: file - description: Standard YML file containing software versions - pattern: "software_versions.yml" - - mqc_yml: - type: file - description: MultiQC custom content YML file containing software versions - pattern: "software_versions_mqc.yml" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - -authors: - - "@drpatelh" - - "@grst" diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py deleted file mode 100755 index e55b8d4..0000000 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env python - - -"""Provide functions to merge multiple versions.yml files.""" - - -import platform -from textwrap import dedent - -import yaml - - -def _make_versions_html(versions): - """Generate a tabular HTML output of all versions for MultiQC.""" - html = [ - dedent( - """\\ - - - - - - - - - - """ - ) - ] - for process, tmp_versions in sorted(versions.items()): - html.append("") - for i, (tool, version) in enumerate(sorted(tmp_versions.items())): - html.append( - dedent( - f"""\\ - - - - - - """ - ) - ) - html.append("") - html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") - return "\\n".join(html) - - -def main(): - """Load all version files and generate merged output.""" - versions_this_module = {} - versions_this_module["${task.process}"] = { - "python": platform.python_version(), - "yaml": yaml.__version__, - } - - with open("$versions") as f: - versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module - - # aggregate versions by the module name (derived from fully-qualified process name) - versions_by_module = {} - for process, process_versions in versions_by_process.items(): - module = process.split(":")[-1] - try: - if versions_by_module[module] != process_versions: - raise AssertionError( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) - except KeyError: - versions_by_module[module] = process_versions - - versions_by_module["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version", - } - - versions_mqc = { - "id": "software_versions", - "section_name": "${workflow.manifest.name} Software Versions", - "section_href": "https://github.com/${workflow.manifest.name}", - "plot_type": "html", - "description": "are collected at run time from the software output.", - "data": _make_versions_html(versions_by_module), - } - - with open("software_versions.yml", "w") as f: - yaml.dump(versions_by_module, f, default_flow_style=False) - with open("software_versions_mqc.yml", "w") as f: - yaml.dump(versions_mqc, f, default_flow_style=False) - - with open("versions.yml", "w") as f: - yaml.dump(versions_this_module, f, default_flow_style=False) - - -if __name__ == "__main__": - main() diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf deleted file mode 100644 index 9ae5838..0000000 --- a/modules/nf-core/fastqc/main.nf +++ /dev/null @@ -1,51 +0,0 @@ -process FASTQC { - tag "$meta.id" - label 'process_medium' - - conda "bioconda::fastqc=0.11.9" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : - 'quay.io/biocontainers/fastqc:0.11.9--0' }" - - input: - tuple val(meta), path(reads) - - output: - tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip") , emit: zip - path "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(' ') - """ - 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 $renamed_files - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) - 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 -e "s/FastQC v//g" ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml deleted file mode 100644 index 4da5bb5..0000000 --- a/modules/nf-core/fastqc/meta.yml +++ /dev/null @@ -1,52 +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"] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - html: - type: file - description: FastQC report - pattern: "*_{fastqc.html}" - - zip: - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf deleted file mode 100644 index 4b60474..0000000 --- a/modules/nf-core/multiqc/main.nf +++ /dev/null @@ -1,53 +0,0 @@ -process MULTIQC { - label 'process_single' - - conda "bioconda::multiqc=1.14" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" - - input: - path multiqc_files, stageAs: "?/*" - path(multiqc_config) - path(extra_multiqc_config) - path(multiqc_logo) - - 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 config = multiqc_config ? "--config $multiqc_config" : '' - def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' - """ - multiqc \\ - --force \\ - $args \\ - $config \\ - $extra_config \\ - . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS - """ - - stub: - """ - touch 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 f93b5ee..0000000 --- a/modules/nf-core/multiqc/meta.yml +++ /dev/null @@ -1,56 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json -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"] - -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}" - -output: - - report: - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@abhi18av" - - "@bunop" - - "@drpatelh" - - "@jfy133" diff --git a/nextflow.config b/nextflow.config index f4d46d6..eb307e0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -9,21 +9,19 @@ // Global default params, used in configs params { - // TODO nf-core: Specify your pipeline's command line flags - // Input options - input = null - // References - genome = null - igenomes_base = 's3://ngi-igenomes/igenomes' - igenomes_ignore = false - - - // MultiQC options - multiqc_config = null - multiqc_title = null - multiqc_logo = null - max_multiqc_email_size = '25.MB' - multiqc_methods_description = null + // For this pipeline + models = 'NaivePredictor' + test_mode = 'LPO' + randomization_mode = 'None' + randomization_type = 'permutation' + n_trials_robustness = 0 + dataset_name = 'GDSC1' + path_out = 'results' + curve_curator = false + overwrite = false + optim_metric = 'RMSE' + n_cv_splits = 5 + response_transformation = 'None' // Boilerplate options outdir = null @@ -43,7 +41,7 @@ params { 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 @@ -182,13 +180,6 @@ singularity.registry = 'quay.io' plugins { id 'nf-validation' // Validation of pipeline parameters and creation of an input channel from a sample sheet } - -// Load igenomes.config if required -if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' -} else { - params.genomes = [:] -} // Export these variables to prevent local Python/R libraries from conflicting with those in the container // The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. diff --git a/nextflow_schema.json b/nextflow_schema.json index 373c264..3db90e2 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,22 +10,22 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": ["input", "outdir"], + "required": ["run_id", "dataset_name", "path_out"], "properties": { - "input": { + "run_id": { "type": "string", - "format": "file-path", - "exists": true, - "mimetype": "text/csv", - "pattern": "^\\S+\\.csv$", - "description": "Path to comma-separated file containing information about the samples in the experiment.", - "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row. See [usage docs](https://nf-co.re/drugresponseeval/usage#samplesheet-input).", - "fa_icon": "fas fa-file-csv" + "description": "Run ID for the pipeline.", + "help_text": "You will need to set a run identifier for the pipeline. This is used to create a unique output directory for each run." }, - "outdir": { + "dataset_name": { + "type": "string", + "description": "Name of the dataset.", + "help_text": "Name of the dataset used for the pipeline. Allowed values are GDSC1, GDSC2, and Custom." + }, + "path_out": { "type": "string", "format": "directory-path", - "description": "The output directory where the results will be saved. You have to use absolute paths to storage on Cloud infrastructure.", + "description": "The output directory where the results will be saved. Default is results/", "fa_icon": "fas fa-folder-open" }, "email": { @@ -34,51 +34,89 @@ "fa_icon": "fas fa-envelope", "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" - }, - "multiqc_title": { - "type": "string", - "description": "MultiQC report title. Printed as page header, used for filename if not otherwise specified.", - "fa_icon": "fas fa-file-signature" } } }, - "reference_genome_options": { - "title": "Reference genome options", + "mode_options": { + "title": "Mode options", "type": "object", - "fa_icon": "fas fa-dna", - "description": "Reference genome related files and options required for the workflow.", + "fa_icon": "fas fa-cogs", + "description": "Define the mode in which the pipeline will be run.", + "required": ["test_mode"], "properties": { - "genome": { + "test_mode": { "type": "string", - "description": "Name of iGenomes reference.", - "fa_icon": "fas fa-book", - "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details." - }, - "fasta": { + "description": "Run the pipeline in test mode LPO, LCO, or LDO.", + "default": "LPO", + "help_text": "Which tests to run (LPO=Leave-random-Pairs-Out, LCO=Leave-Cell-line-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO LCO LDO' to run all tests. Default is LPO." + } + } + }, + "randomization_options": { + "title": "Randomization options", + "type": "object", + "fa_icon": "fas fa-cogs", + "description": "Options for randomization.", + "randomization_mode": { "type": "string", - "format": "file-path", - "exists": true, - "mimetype": "text/plain", - "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", - "description": "Path to FASTA genome file.", - "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", - "fa_icon": "far fa-file-code" + "description": "Randomization mode for the pipeline.", + "help_text": "Which randomization tests to run, additionally to the normal run. Default is None which means no randomization tests are run. Modes: SVCC, SVRC, SVCD, SVRD. Can be a list of randomization tests e.g. 'SCVC SCVD' to run two tests. Default is None. SVCC: Single View Constant for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..). For each experiment one cell line view is held constant while the others are randomized. SVRC Single View Random for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." }, - "igenomes_base": { + "randomization_type": { "type": "string", - "format": "directory-path", - "description": "Directory / URL base for iGenomes references.", - "default": "s3://ngi-igenomes/igenomes", - "fa_icon": "fas fa-cloud-download-alt", - "hidden": true - }, - "igenomes_ignore": { - "type": "boolean", - "description": "Do not load the iGenomes reference config.", - "fa_icon": "fas fa-ban", - "hidden": true, - "help_text": "Do not load `igenomes.config` when running the pipeline. You may choose this option if you observe clashes between custom parameters and those supplied in `igenomes.config`." + "default": "permutation", + "description": "Randomization type for the pipeline.", + "help_text": "type of randomization to use. Choose from \"gaussian\", \"zeroing\", \"permutation\". Default is \"permutation" } + + }, + "robustness_options": { + "title": "Robustness options", + "type": "object", + "fa_icon": "fas fa-cogs", + "description": "Options for robustness.", + "n_trials_robustness": { + "type": "integer", + "default": 0, + "description": "Number of trials to run for the robustness test", + "help_text": "Number of trials to run for the robustness test. Default is 0, which means no robustness test is run. The robustness test is a test where the model is trained with varying seeds. This is done multiple times to see how stable the model is." + } + + }, + "additional_options": { + "title": "Additional options", + "type": "object", + "fa_icon": "fas fa-cogs", + "description": "Additional options for the pipeline.", + "curve_curator": { + "type": "boolean", + "description": "Run the curve curator.", + "default": false, + "help_text": "Whether to run \" \"CurveCurator \" \"to sort out \" \"non-reactive \" \"curves" + }, + "overwrite": { + "type": "boolean", + "description": "Overwrite existing results.", + "default": false, + "help_text": "Whether to overwrite existing results." + }, + "optim_metric": { + "type": "string", + "description": "Optimization metric for the pipeline.", + "default": "RMSE", + "help_text": "Optimization metric for the pipeline. Default is RMSE." + }, + "n_cv_splits": { + "type": "integer", + "default": 5, + "description": "Number of cross-validation splits.", + "help_text": "Number of cross-validation splits. Default is 5." + }, + "response_transformation": { + "type": "string", + "description": "Response transformation", + "help_text": "Transformation to apply to the response variable possible values: standard, minmax, robust" + } } }, "institutional_config_options": { @@ -209,14 +247,6 @@ "default": false, "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.", @@ -231,24 +261,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", @@ -288,7 +300,16 @@ "$ref": "#/definitions/input_output_options" }, { - "$ref": "#/definitions/reference_genome_options" + "$ref": "#/definitions/mode_options" + }, + { + "$ref": "#/definitions/randomization_options" + }, + { + "$ref": "#/definitions/robustness_options" + }, + { + "$ref": "#/definitions/additional_options" }, { "$ref": "#/definitions/institutional_config_options" diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf deleted file mode 100644 index 0aecf87..0000000 --- a/subworkflows/local/input_check.nf +++ /dev/null @@ -1,44 +0,0 @@ -// -// Check input samplesheet and get read channels -// - -include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' - -workflow INPUT_CHECK { - take: - samplesheet // file: /path/to/samplesheet.csv - - main: - SAMPLESHEET_CHECK ( samplesheet ) - .csv - .splitCsv ( header:true, sep:',' ) - .map { create_fastq_channel(it) } - .set { reads } - - emit: - reads // channel: [ val(meta), [ reads ] ] - versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] -} - -// Function to get list of [ meta, [ fastq_1, fastq_2 ] ] -def create_fastq_channel(LinkedHashMap row) { - // create meta map - def meta = [:] - meta.id = row.sample - meta.single_end = row.single_end.toBoolean() - - // add path(s) of the fastq file(s) to the meta map - def fastq_meta = [] - if (!file(row.fastq_1).exists()) { - exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" - } - if (meta.single_end) { - fastq_meta = [ meta, [ file(row.fastq_1) ] ] - } else { - if (!file(row.fastq_2).exists()) { - exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}" - } - fastq_meta = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] - } - return fastq_meta -} diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index a5255f1..937d434 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -21,21 +21,17 @@ WorkflowDrugresponseeval.initialise(params, log) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -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() -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) - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT LOCAL MODULES/SUBWORKFLOWS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +include { PARAMS_CHECK } from '../modules/local/params_check' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { INPUT_CHECK } from '../subworkflows/local/input_check' + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -46,9 +42,6 @@ include { INPUT_CHECK } from '../subworkflows/local/input_check' // // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/fastqc/main' -include { MULTIQC } from '../modules/nf-core/multiqc/main' -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -66,48 +59,21 @@ workflow DRUGRESPONSEEVAL { // // SUBWORKFLOW: Read in samplesheet, validate and stage input files // - INPUT_CHECK ( - file(params.input) + PARAMS_CHECK ( + params.models, + params.test_mode, + params.dataset_name, + params.n_cv_splits, + params.randomization_mode, + params.curve_curator, + params.response_transformation, + params.optim_metric ) - ch_versions = ch_versions.mix(INPUT_CHECK.out.versions) // TODO: OPTIONAL, you can use nf-validation plugin to create an input channel from the samplesheet with Channel.fromSamplesheet("input") // See the documentation https://nextflow-io.github.io/nf-validation/samplesheets/fromSamplesheet/ // ! There is currently no tooling to help you write a sample sheet schema - // - // MODULE: Run FastQC - // - FASTQC ( - INPUT_CHECK.out.reads - ) - ch_versions = ch_versions.mix(FASTQC.out.versions.first()) - - CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_versions.unique().collectFile(name: 'collated_versions.yml') - ) - // - // MODULE: MultiQC - // - workflow_summary = WorkflowDrugresponseeval.paramsSummaryMultiqc(workflow, summary_params) - ch_workflow_summary = Channel.value(workflow_summary) - - methods_description = WorkflowDrugresponseeval.methodsDescriptionText(workflow, ch_multiqc_custom_methods_description, params) - ch_methods_description = Channel.value(methods_description) - - ch_multiqc_files = Channel.empty() - ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_files = ch_multiqc_files.mix(ch_methods_description.collectFile(name: 'methods_description_mqc.yaml')) - ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) - ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) - - MULTIQC ( - ch_multiqc_files.collect(), - ch_multiqc_config.toList(), - ch_multiqc_custom_config.toList(), - ch_multiqc_logo.toList() - ) - multiqc_report = MULTIQC.out.report.toList() } /* From 06748cb46bd94d0990e4aae0e2d0a12bb144794c Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 14 May 2024 16:55:01 +0200 Subject: [PATCH 002/257] parameter check completed --- bin/check_params.py | 16 +--------------- conf/base.config | 3 --- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/bin/check_params.py b/bin/check_params.py index 3b47fc5..a2ffb86 100755 --- a/bin/check_params.py +++ b/bin/check_params.py @@ -33,23 +33,9 @@ def check_arguments(args): assert all( [randomization in ["SVCC", "SVRC", "SVSC", "SVRD"] for randomization in args.randomization_mode] ), "At least one invalid randomization mode. Available randomization modes are SVCC, SVRC, SVSC, SVRD" - else: - args.randomization_mode = None if args.curve_curator != 'false': raise NotImplementedError("CurveCurator not implemented") - if args.response_transformation == "None": - response_transformation = None - elif (args.response_transformation == "standard"): - response_transformation = StandardScaler() - elif (args.response_transformation == "minmax"): - response_transformation = MinMaxScaler() - elif (args.response_transformation == "robust"): - response_transformation = RobustScaler() - else: - # TODO add log, sinh etc - raise ValueError( - f"Invalid response_transformation: {args.response_transformation}. Choose robust, minmax or standard.") - + assert args.response_transformation in ["None", "standard", "minmax", "robust"], "Invalid response_transformation. Choose from None, standard, minmax, robust" assert args.optim_metric in AVAILABLE_METRICS, f"Invalid optim_metric for hyperparameter tuning. Choose from {list(AVAILABLE_METRICS.keys())}" def parse_args(argv=None): diff --git a/conf/base.config b/conf/base.config index 5f9ba88..74f1bf9 100644 --- a/conf/base.config +++ b/conf/base.config @@ -59,7 +59,4 @@ process { errorStrategy = 'retry' maxRetries = 2 } - withName:CUSTOM_DUMPSOFTWAREVERSIONS { - cache = false - } } From 89a308bff1a902585cbf4803e5db6fe7bd006edf Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 15 May 2024 09:32:14 +0200 Subject: [PATCH 003/257] main branch --- bin/train_and_predict.py | 21 +++++++++++++++++++++ modules/local/train_and_predict.nf | 14 ++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 bin/train_and_predict.py create mode 100644 modules/local/train_and_predict.nf diff --git a/bin/train_and_predict.py b/bin/train_and_predict.py new file mode 100644 index 0000000..6574daa --- /dev/null +++ b/bin/train_and_predict.py @@ -0,0 +1,21 @@ +import pickle +from typing import Dict +from dreval.experiment import train_and_predict +from dreval.models import MODEL_FACTORY + +def dreval_train_and_predict( + model_name: str, + hyperparameters: Dict, + train_path: str, + pred_path: str, + es_path: str, + response_transform: str, + cl_feature_path: str, + drug_feature_path: str + +): + model_class = MODEL_FACTORY[model_name] + train_dataset = pickle.load(open(train_path, "rb")) + pred_dataset = pickle.load(open(pred_path, "rb")) + es_dataset = pickle.load(open(es_path, "rb")) + diff --git a/modules/local/train_and_predict.nf b/modules/local/train_and_predict.nf new file mode 100644 index 0000000..f4c45c5 --- /dev/null +++ b/modules/local/train_and_predict.nf @@ -0,0 +1,14 @@ + + +process TRAIN_AND_PREDICT { + input: + val model_name + val hyperparameters + path train_data + path prediction_data + path early_stopping_data + val response_transformation + path cl_features + path drug_features + +} From 5a83684a4f5e92d599a0aafaf3566cfcb13fed90 Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Wed, 15 May 2024 11:09:30 +0200 Subject: [PATCH 004/257] load response --- bin/load_response.py | 19 +++++++++++++++++++ modules/local/load_response.nf | 20 ++++++++++++++++++++ nextflow.config | 3 ++- nextflow_schema.json | 7 +++++++ workflows/drugresponseeval.nf | 4 +++- 5 files changed, 51 insertions(+), 2 deletions(-) create mode 100755 bin/load_response.py create mode 100644 modules/local/load_response.nf diff --git a/bin/load_response.py b/bin/load_response.py new file mode 100755 index 0000000..03db260 --- /dev/null +++ b/bin/load_response.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +import argparse +from dreval.response_datasets import RESPONSE_DATASET_FACTORY +import os +def get_parser(): + parser = argparse.ArgumentParser(description='Load response data') + parser.add_argument('--dataset_name', type=str, required=True, help='Name of the dataset to load') + parser.add_argument('--path_out', type=str, default='results', help='Path to the output directory') + parser.add_argument('--path_data', type=str, default='data', help='Data directory path') + return parser + +if __name__ == "__main__": + args = get_parser().parse_args() + assert args.dataset_name in RESPONSE_DATASET_FACTORY, f"Invalid dataset name. Available datasets are {list(RESPONSE_DATASET_FACTORY.keys())} If you want to use your own dataset, you need to implement a new response dataset class and add it to the RESPONSE_DATASET_FACTORY in the response_datasets init" + if not os.path.exists(args.path_out): + os.makedirs(args.path_out) + response_data = RESPONSE_DATASET_FACTORY[args.dataset_name](path_data=args.path_data) + response_data.save(path=f"{args.path_out}/response.csv") diff --git a/modules/local/load_response.nf b/modules/local/load_response.nf new file mode 100644 index 0000000..b63c681 --- /dev/null +++ b/modules/local/load_response.nf @@ -0,0 +1,20 @@ +process LOAD_RESPONSE { + //tag "$samplesheet" + //label 'process_single' + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + input: + val dataset_name + val path_out + val path_data + output: + file 'results/response.csv' + script: + """ + load_response.py --dataset_name ${dataset_name} --path_out ${path_out} --path_data ${path_data} + """ + +} diff --git a/nextflow.config b/nextflow.config index eb307e0..5af019a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -10,7 +10,7 @@ params { // For this pipeline - models = 'NaivePredictor' + models = 'SimpleNeuralNetwork' test_mode = 'LPO' randomization_mode = 'None' randomization_type = 'permutation' @@ -22,6 +22,7 @@ params { optim_metric = 'RMSE' n_cv_splits = 5 response_transformation = 'None' + path_data = '~/Projects/munich/NF-CORE-DRUGRESPONSEEVAL/data/' // Boilerplate options outdir = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 3db90e2..94832d4 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -116,7 +116,14 @@ "type": "string", "description": "Response transformation", "help_text": "Transformation to apply to the response variable possible values: standard, minmax, robust" + }, + "path_data": { + "type": "string", + "format": "directory-path", + "description": "Path to the data directory.", + "help_text": "Path to the data directory." } + } }, "institutional_config_options": { diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 937d434..9b790ce 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -27,7 +27,7 @@ WorkflowDrugresponseeval.initialise(params, log) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { PARAMS_CHECK } from '../modules/local/params_check' - +include { LOAD_RESPONSE } from '../modules/local/load_response' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // @@ -69,6 +69,8 @@ workflow DRUGRESPONSEEVAL { params.response_transformation, params.optim_metric ) + + LOAD_RESPONSE(params.dataset_name, params.path_out, params.path_data) // TODO: OPTIONAL, you can use nf-validation plugin to create an input channel from the samplesheet with Channel.fromSamplesheet("input") // See the documentation https://nextflow-io.github.io/nf-validation/samplesheets/fromSamplesheet/ // ! There is currently no tooling to help you write a sample sheet schema From 8650e4ded18a1e58f8e38cd8bf45853c3497af4a Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 15 May 2024 11:31:56 +0200 Subject: [PATCH 005/257] train and predict module implemented --- bin/check_params.py | 1 + bin/train_and_predict.py | 112 ++++++++++++++++++++++++++++- modules/local/params_check.nf | 1 + modules/local/train_and_predict.nf | 18 ++++- workflows/drugresponseeval.nf | 12 ++++ 5 files changed, 141 insertions(+), 3 deletions(-) mode change 100644 => 100755 bin/train_and_predict.py mode change 100644 => 100755 modules/local/params_check.nf mode change 100644 => 100755 modules/local/train_and_predict.nf diff --git a/bin/check_params.py b/bin/check_params.py index a2ffb86..a98a653 100755 --- a/bin/check_params.py +++ b/bin/check_params.py @@ -38,6 +38,7 @@ def check_arguments(args): assert args.response_transformation in ["None", "standard", "minmax", "robust"], "Invalid response_transformation. Choose from None, standard, minmax, robust" assert args.optim_metric in AVAILABLE_METRICS, f"Invalid optim_metric for hyperparameter tuning. Choose from {list(AVAILABLE_METRICS.keys())}" + def parse_args(argv=None): """Define and immediately parse command line arguments.""" parser = argparse.ArgumentParser( diff --git a/bin/train_and_predict.py b/bin/train_and_predict.py old mode 100644 new mode 100755 index 6574daa..1b72bce --- a/bin/train_and_predict.py +++ b/bin/train_and_predict.py @@ -1,11 +1,66 @@ +#!/usr/bin/env python +import os +import random +import sys import pickle from typing import Dict +from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler from dreval.experiment import train_and_predict from dreval.models import MODEL_FACTORY +import logging +import argparse + + +def get_parser(): + parser = argparse.ArgumentParser( + description="Train and predict using a drug response prediction model." + ) + parser.add_argument( + "--model_name", + type=str, + help="model to evaluate or list of models to compare", + ) + parser.add_argument( + "--hyperparameters", + type=str, + help="hyperparameters for the model", + ) + parser.add_argument( + "--train_data", + type=str, + help="path to the training dataset", + ) + parser.add_argument( + "--prediction_data", + type=str, + help="path to the prediction dataset", + ) + parser.add_argument( + "--early_stopping_data", + type=str, + help="path to the early stopping dataset", + ) + parser.add_argument( + "--response_transformation", + type=str, + help="response transformation to apply to the dataset", + ) + parser.add_argument( + "--cl_features", + type=str, + help="path to the cell line feature dataset", + ) + parser.add_argument( + "--drug_features", + type=str, + help="path to the drug feature dataset", + ) + return parser + def dreval_train_and_predict( model_name: str, - hyperparameters: Dict, + hpam_path: str, train_path: str, pred_path: str, es_path: str, @@ -15,7 +70,60 @@ def dreval_train_and_predict( ): model_class = MODEL_FACTORY[model_name] + model = model_class(target='IC50') train_dataset = pickle.load(open(train_path, "rb")) pred_dataset = pickle.load(open(pred_path, "rb")) - es_dataset = pickle.load(open(es_path, "rb")) + if model.early_stopping: + es_dataset = pickle.load(open(es_path, "rb")) + else: + es_dataset = None + cl_feature = pickle.load(open(cl_feature_path, "rb")) + drug_feature = pickle.load(open(drug_feature_path, "rb")) + if response_transform == "None": + response_transform = None + elif response_transform == "standard": + response_transform = StandardScaler() + elif response_transform == "minmax": + response_transform = MinMaxScaler() + elif response_transform == "robust": + response_transform = RobustScaler() + else: + raise ValueError(f"Invalid response_transform: {response_transform}. Choose robust, minmax or standard.") + hyperparameters = pickle.load(open(hpam_path, "rb")) + prediction_dataset = train_and_predict( + model=model, + hpams=hyperparameters, + train_dataset=train_dataset, + prediction_dataset=pred_dataset, + early_stopping_dataset=( + es_dataset if model.early_stopping else None + ), + response_transformation=response_transform, + cl_features=cl_feature, + drug_features=drug_feature + ) + hpams = [f'{key}:{value}' for key, value in hyperparameters.items()] + hyperparameters = '_'.join(hpams) + filename = f'prediction_dataset.pkl' + logging.basicConfig(level=logging.INFO) + logger = logging.getLogger() + logger.info(f"Saving prediction dataset to {filename}") + logger.info(os.getcwd()) + logger.info(filename) + with open(filename, 'wb') as f: + pickle.dump(prediction_dataset, f) + +if __name__ == "__main__": + args = get_parser().parse_args() + dreval_train_and_predict( + model_name=args.model_name, + hpam_path=args.hyperparameters, + train_path=args.train_data, + pred_path=args.prediction_data, + es_path=args.early_stopping_data, + response_transform=args.response_transformation, + cl_feature_path=args.cl_features, + drug_feature_path=args.drug_features + ) + sys.exit(0) diff --git a/modules/local/params_check.nf b/modules/local/params_check.nf old mode 100644 new mode 100755 index 49c4472..58d6a74 --- a/modules/local/params_check.nf +++ b/modules/local/params_check.nf @@ -19,6 +19,7 @@ process PARAMS_CHECK { output: + when: task.ext.when == null || task.ext.when diff --git a/modules/local/train_and_predict.nf b/modules/local/train_and_predict.nf old mode 100644 new mode 100755 index f4c45c5..ceea462 --- a/modules/local/train_and_predict.nf +++ b/modules/local/train_and_predict.nf @@ -3,7 +3,7 @@ process TRAIN_AND_PREDICT { input: val model_name - val hyperparameters + path hyperparameters path train_data path prediction_data path early_stopping_data @@ -11,4 +11,20 @@ process TRAIN_AND_PREDICT { path cl_features path drug_features + output: + path "*.pkl" , emit: pred_data + + script: + """ + train_and_predict.py \\ + --model_name $model_name \\ + --hyperparameters $hyperparameters \\ + --train_data $train_data \\ + --prediction_data $prediction_data \\ + --early_stopping_data $early_stopping_data \\ + --response_transformation $response_transformation \\ + --cl_features $cl_features \\ + --drug_features $drug_features + """ + } diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 937d434..88fb338 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -27,6 +27,7 @@ WorkflowDrugresponseeval.initialise(params, log) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { PARAMS_CHECK } from '../modules/local/params_check' +include { TRAIN_AND_PREDICT } from '../modules/local/train_and_predict' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules @@ -74,6 +75,17 @@ workflow DRUGRESPONSEEVAL { // ! There is currently no tooling to help you write a sample sheet schema + TRAIN_AND_PREDICT ( + params.model_name, + params.hyperparameters, + params.train_data, + params.prediction_data, + params.early_stopping_data, + params.response_transformation, + params.cl_features, + params.drug_features + ) + } /* From 5973c78954f9c255cc6b399b45dd7e3a106a24af Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Wed, 15 May 2024 14:46:43 +0200 Subject: [PATCH 006/257] load data --- bin/load_response.py | 8 ++++++-- modules/local/load_response.nf | 2 +- workflows/drugresponseeval.nf | 20 ++++++++++---------- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/bin/load_response.py b/bin/load_response.py index 03db260..9247ad0 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -1,8 +1,9 @@ #!/usr/bin/env python - import argparse from dreval.response_datasets import RESPONSE_DATASET_FACTORY import os +import pickle + def get_parser(): parser = argparse.ArgumentParser(description='Load response data') parser.add_argument('--dataset_name', type=str, required=True, help='Name of the dataset to load') @@ -16,4 +17,7 @@ def get_parser(): if not os.path.exists(args.path_out): os.makedirs(args.path_out) response_data = RESPONSE_DATASET_FACTORY[args.dataset_name](path_data=args.path_data) - response_data.save(path=f"{args.path_out}/response.csv") + + # Pickle the object to a file + with open(f"{args.path_out}/response.pkl", 'wb') as f: + pickle.dump(response_data, f) \ No newline at end of file diff --git a/modules/local/load_response.nf b/modules/local/load_response.nf index b63c681..377e9aa 100644 --- a/modules/local/load_response.nf +++ b/modules/local/load_response.nf @@ -11,7 +11,7 @@ process LOAD_RESPONSE { val path_out val path_data output: - file 'results/response.csv' + path '*/response.pkl' script: """ load_response.py --dataset_name ${dataset_name} --path_out ${path_out} --path_data ${path_data} diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index f1e06fd..27514df 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -77,16 +77,16 @@ workflow DRUGRESPONSEEVAL { // ! There is currently no tooling to help you write a sample sheet schema - TRAIN_AND_PREDICT ( - params.model_name, - params.hyperparameters, - params.train_data, - params.prediction_data, - params.early_stopping_data, - params.response_transformation, - params.cl_features, - params.drug_features - ) + // TRAIN_AND_PREDICT ( + // params.model_name, + // params.hyperparameters, + // params.train_data, + // params.prediction_data, + // params.early_stopping_data, + // params.response_transformation, + // params.cl_features, + // params.drug_features + // ) } From dc043b564905fa0e95c8511b8ae4a1d2548ae626 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 15 May 2024 14:49:59 +0200 Subject: [PATCH 007/257] cv split module, first channel --- bin/cv_split.py | 34 ++++++++++++++++++++++++++++++++++ bin/evaluate.py | 26 ++++++++++++++++++++++++++ bin/load_response.py | 3 +++ modules/local/cv_split.nf | 26 ++++++++++++++++++++++++++ modules/local/evaluate.nf | 24 ++++++++++++++++++++++++ modules/local/load_response.nf | 4 +++- workflows/drugresponseeval.nf | 18 +++++++++++++++--- 7 files changed, 131 insertions(+), 4 deletions(-) create mode 100755 bin/cv_split.py create mode 100755 bin/evaluate.py create mode 100644 modules/local/cv_split.nf create mode 100644 modules/local/evaluate.nf diff --git a/bin/cv_split.py b/bin/cv_split.py new file mode 100755 index 0000000..9cc3f3a --- /dev/null +++ b/bin/cv_split.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +import argparse +import pickle +import sys + + +def get_parser(): + parser = argparse.ArgumentParser(description='Split data into CV splits') + parser.add_argument('--response', type=str, required=True, help='Path to response data') + parser.add_argument('--n_cv_splits', type=int, required=True, help='Number of CV splits') + parser.add_argument('--test_mode', type=str, default='LPO', help='Test mode (LPO, LCO, LDO)') + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + response_data = pickle.load(open(args.response, 'rb')) + response_data.split_dataset( + n_cv_splits=args.n_cv_splits, + mode=args.test_mode, + split_validation=True, + validation_ratio=0.1, + random_state=42 + ) + for split_index, split in enumerate(response_data.cv_splits): + with open(f"split_{split_index}.pkl", "wb") as f: + pickle.dump(split, f) + + +if __name__ == "__main__": + main() + sys.exit(0) diff --git a/bin/evaluate.py b/bin/evaluate.py new file mode 100755 index 0000000..7de350a --- /dev/null +++ b/bin/evaluate.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +import argparse +import pickle +import sys +from dreval.evaluation import evaluate + + +def get_parser(): + parser = argparse.ArgumentParser(description='Evaluate model') + parser.add_argument('--pred_data', type=str, required=True, help='Path to prediction data') + parser.add_argument('--metric', type=str, default='RMSE', help='Metric to evaluate') + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + pred_data = pickle.load(open(args.pred_data, 'rb')) + results = evaluate(dataset=pred_data, metric=[args.metric]) + with open("eval_results.pkl", "wb") as f: + pickle.dump(results, f) + + +if __name__ == "__main__": + main() + sys.exit(0) diff --git a/bin/load_response.py b/bin/load_response.py index 03db260..61c2850 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -3,6 +3,8 @@ import argparse from dreval.response_datasets import RESPONSE_DATASET_FACTORY import os + + def get_parser(): parser = argparse.ArgumentParser(description='Load response data') parser.add_argument('--dataset_name', type=str, required=True, help='Name of the dataset to load') @@ -10,6 +12,7 @@ def get_parser(): parser.add_argument('--path_data', type=str, default='data', help='Data directory path') return parser + if __name__ == "__main__": args = get_parser().parse_args() assert args.dataset_name in RESPONSE_DATASET_FACTORY, f"Invalid dataset name. Available datasets are {list(RESPONSE_DATASET_FACTORY.keys())} If you want to use your own dataset, you need to implement a new response dataset class and add it to the RESPONSE_DATASET_FACTORY in the response_datasets init" diff --git a/modules/local/cv_split.nf b/modules/local/cv_split.nf new file mode 100644 index 0000000..7188073 --- /dev/null +++ b/modules/local/cv_split.nf @@ -0,0 +1,26 @@ +process CV_SPLIT { + //tag "$samplesheet" + //label 'process_single' + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + input: + path response + val n_cv_splits + val test_mode + + output: + path "*.pkl" , emit: response_cv_splits + + + script: + """ + cv_split.py \\ + --response $response \\ + --n_cv_splits $n_cv_splits \\ + --test_mode $test_mode + """ + +} diff --git a/modules/local/evaluate.nf b/modules/local/evaluate.nf new file mode 100644 index 0000000..be98087 --- /dev/null +++ b/modules/local/evaluate.nf @@ -0,0 +1,24 @@ +process EVALUATE { + //tag "$samplesheet" + //label 'process_single' + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + input: + val pred_data + val metric + + output: + path "*.pkl" , emit: eval_results + + + script: + """ + evaluate.py \\ + --pred_data $pred_data \\ + --metric $metric + """ + +} diff --git a/modules/local/load_response.nf b/modules/local/load_response.nf index b63c681..97f2f61 100644 --- a/modules/local/load_response.nf +++ b/modules/local/load_response.nf @@ -10,8 +10,10 @@ process LOAD_RESPONSE { val dataset_name val path_out val path_data + output: - file 'results/response.csv' + path 'results/response.csv' + script: """ load_response.py --dataset_name ${dataset_name} --path_out ${path_out} --path_data ${path_data} diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index f1e06fd..b153ac5 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -28,7 +28,9 @@ WorkflowDrugresponseeval.initialise(params, log) */ include { PARAMS_CHECK } from '../modules/local/params_check' include { LOAD_RESPONSE } from '../modules/local/load_response' +include { CV_SPLIT } from '../modules/local/cv_split' include { TRAIN_AND_PREDICT } from '../modules/local/train_and_predict' +include { EVALUATE } from '../modules/local/evaluate' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // @@ -72,10 +74,15 @@ workflow DRUGRESPONSEEVAL { ) LOAD_RESPONSE(params.dataset_name, params.path_out, params.path_data) - // TODO: OPTIONAL, you can use nf-validation plugin to create an input channel from the samplesheet with Channel.fromSamplesheet("input") - // See the documentation https://nextflow-io.github.io/nf-validation/samplesheets/fromSamplesheet/ - // ! There is currently no tooling to help you write a sample sheet schema + ch_cv_splits = Channel.empty() + CV_SPLIT ( + params.response, + params.n_cv_splits, + params.test_mode + ) + ch_cv_splits = CV_SPLIT.out.response_cv_splits + ch_cv_splits.view() TRAIN_AND_PREDICT ( params.model_name, @@ -88,6 +95,11 @@ workflow DRUGRESPONSEEVAL { params.drug_features ) + EVALUATE ( + TRAIN_AND_PREDICT.out.pred_data, + params.optim_metric + ) + } /* From 3cc443625448ed981e8deb665d08eb1793f3f9f1 Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Wed, 15 May 2024 14:56:33 +0200 Subject: [PATCH 008/257] load data 2 --- bin/load_response.py | 7 ++----- modules/local/load_response.nf | 4 ++-- workflows/drugresponseeval.nf | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/bin/load_response.py b/bin/load_response.py index 3390f0e..13935a8 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -1,14 +1,12 @@ #!/usr/bin/env python import argparse from dreval.response_datasets import RESPONSE_DATASET_FACTORY -import os import pickle def get_parser(): parser = argparse.ArgumentParser(description='Load response data') parser.add_argument('--dataset_name', type=str, required=True, help='Name of the dataset to load') - parser.add_argument('--path_out', type=str, default='results', help='Path to the output directory') parser.add_argument('--path_data', type=str, default='data', help='Data directory path') return parser @@ -16,10 +14,9 @@ def get_parser(): if __name__ == "__main__": args = get_parser().parse_args() assert args.dataset_name in RESPONSE_DATASET_FACTORY, f"Invalid dataset name. Available datasets are {list(RESPONSE_DATASET_FACTORY.keys())} If you want to use your own dataset, you need to implement a new response dataset class and add it to the RESPONSE_DATASET_FACTORY in the response_datasets init" - if not os.path.exists(args.path_out): - os.makedirs(args.path_out) + response_data = RESPONSE_DATASET_FACTORY[args.dataset_name](path_data=args.path_data) # Pickle the object to a file - with open(f"{args.path_out}/response.pkl", 'wb') as f: + with open("response_dataset.pkl", 'wb') as f: pickle.dump(response_data, f) diff --git a/modules/local/load_response.nf b/modules/local/load_response.nf index c62c17a..48c400d 100644 --- a/modules/local/load_response.nf +++ b/modules/local/load_response.nf @@ -12,10 +12,10 @@ process LOAD_RESPONSE { val path_data output: - path '*/response.pkl' + path 'response_dataset.pkl' script: """ - load_response.py --dataset_name ${dataset_name} --path_out ${path_out} --path_data ${path_data} + load_response.py --dataset_name ${dataset_name} --path_data ${path_data} """ } diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index b153ac5..478b75a 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -73,7 +73,7 @@ workflow DRUGRESPONSEEVAL { params.optim_metric ) - LOAD_RESPONSE(params.dataset_name, params.path_out, params.path_data) + LOAD_RESPONSE(params.dataset_name, params.path_data) ch_cv_splits = Channel.empty() CV_SPLIT ( From 327a561560a0f73e2664380ded861200c089d423 Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Wed, 15 May 2024 14:58:07 +0200 Subject: [PATCH 009/257] load data 2 --- modules/local/load_response.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/load_response.nf b/modules/local/load_response.nf index 48c400d..44a1333 100644 --- a/modules/local/load_response.nf +++ b/modules/local/load_response.nf @@ -12,7 +12,7 @@ process LOAD_RESPONSE { val path_data output: - path 'response_dataset.pkl' + path 'response_dataset.pkl', emit: response_dataset script: """ load_response.py --dataset_name ${dataset_name} --path_data ${path_data} From 9a41eb4cbf3c2fff6f02cd83da6817f66f68e8e1 Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Wed, 15 May 2024 14:59:16 +0200 Subject: [PATCH 010/257] lol --- modules/local/load_response.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/local/load_response.nf b/modules/local/load_response.nf index 44a1333..c028c2b 100644 --- a/modules/local/load_response.nf +++ b/modules/local/load_response.nf @@ -8,7 +8,6 @@ process LOAD_RESPONSE { // 'biocontainers/python:3.8.3' }" input: val dataset_name - val path_out val path_data output: From 3b6137182a71eae776e017b069fe3d7c473c9e2c Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Wed, 15 May 2024 15:02:24 +0200 Subject: [PATCH 011/257] hello --- workflows/drugresponseeval.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 478b75a..17a07ac 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -77,13 +77,13 @@ workflow DRUGRESPONSEEVAL { ch_cv_splits = Channel.empty() CV_SPLIT ( - params.response, + LOAD_RESPONSE.out.response_data, params.n_cv_splits, params.test_mode ) ch_cv_splits = CV_SPLIT.out.response_cv_splits ch_cv_splits.view() - +/* TRAIN_AND_PREDICT ( params.model_name, params.hyperparameters, @@ -99,7 +99,7 @@ workflow DRUGRESPONSEEVAL { TRAIN_AND_PREDICT.out.pred_data, params.optim_metric ) - +*/ } /* From 9cf1705d3bbe27f447019d4b04136586bb58ff6f Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Wed, 15 May 2024 15:04:07 +0200 Subject: [PATCH 012/257] hello --- workflows/drugresponseeval.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 17a07ac..445e842 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -77,7 +77,7 @@ workflow DRUGRESPONSEEVAL { ch_cv_splits = Channel.empty() CV_SPLIT ( - LOAD_RESPONSE.out.response_data, + LOAD_RESPONSE.out.response_dataset, params.n_cv_splits, params.test_mode ) From d01b9a11c483854c7f6279c90a4c85277a8fb020 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 15 May 2024 16:23:44 +0200 Subject: [PATCH 013/257] trying to run train and predict for CV --- bin/train_and_predict_cv.py | 55 +++++++++++++++++++++++++++ modules/local/train_and_predict_cv.nf | 22 +++++++++++ workflows/drugresponseeval.nf | 11 +++++- 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100755 bin/train_and_predict_cv.py create mode 100644 modules/local/train_and_predict_cv.nf diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py new file mode 100755 index 0000000..0d0e86c --- /dev/null +++ b/bin/train_and_predict_cv.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +import argparse +import sys +import pickle +from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler + + +from dreval.models import MODEL_FACTORY +from dreval.experiment import train_and_predict, split_early_stopping + + +def get_parser(): + parser = argparse.ArgumentParser(description='Train and predict using a drug response prediction model.') + parser.add_argument('--model_name', type=str, help='model to evaluate or list of models to compare') + parser.add_argument('--test_mode', type=str, default='LPO', help='Test mode (LPO, LCO, LDO)') + parser.add_argument('--hyperparameters', type=str, help='hyperparameters for the model') + parser.add_argument('--cv_data', type=str, help='path to the cv data split') + parser.add_argument('--response_transformation', type=str, help='response transformation to apply to the dataset') + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + model_class = MODEL_FACTORY[args.model_name] + split = pickle.load(open(args.cv_data, 'rb')) + train_dataset = split["train"] + validation_dataset = split["validation"] + hpams = pickle.load(open(args.hyperparameters, 'rb')) + if model_class.early_stopping: + validation_dataset, es_dataset = split_early_stopping(validation_dataset, args.test_mode) + else: + es_dataset = None + model = model_class(target='IC50') + if args.response_transformation == "None": + response_transform = None + elif args.response_transformation == "standard": + response_transform = StandardScaler() + elif args.response_transformation == "minmax": + response_transform = MinMaxScaler() + elif args.response_transformation == "robust": + response_transform = RobustScaler() + else: + raise ValueError(f"Invalid response_transform: {args.response_transformation}. Choose robust, minmax or standard.") + validation_dataset = train_and_predict( + model=model, + hpams=hpams, + train_dataset=train_dataset, + prediction_dataset=validation_dataset, + early_stopping_dataset=es_dataset, + response_transformation=response_transform + ) + with open('prediction_dataset.pkl', 'wb') as f: + pickle.dump(validation_dataset, f) diff --git a/modules/local/train_and_predict_cv.nf b/modules/local/train_and_predict_cv.nf new file mode 100644 index 0000000..1db86c7 --- /dev/null +++ b/modules/local/train_and_predict_cv.nf @@ -0,0 +1,22 @@ + + +process TRAIN_AND_PREDICT_CV { + input: + val model_name + path hyperparameters + path cv_data + val response_transformation + + output: + path "prediction_dataset.pkl" , emit: pred_data + + script: + """ + train_and_predict_cv.py \\ + --model_name $model_name \\ + --hyperparameters $hyperparameters \\ + --cv_data $cv_data \\ + --response_transformation $response_transformation + """ + +} diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 445e842..7d0dfd7 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -29,6 +29,7 @@ WorkflowDrugresponseeval.initialise(params, log) include { PARAMS_CHECK } from '../modules/local/params_check' include { LOAD_RESPONSE } from '../modules/local/load_response' include { CV_SPLIT } from '../modules/local/cv_split' +include { TRAIN_AND_PREDICT_CV } from '../modules/local/train_and_predict_cv' include { TRAIN_AND_PREDICT } from '../modules/local/train_and_predict' include { EVALUATE } from '../modules/local/evaluate' // @@ -82,7 +83,15 @@ workflow DRUGRESPONSEEVAL { params.test_mode ) ch_cv_splits = CV_SPLIT.out.response_cv_splits - ch_cv_splits.view() + + TRAIN_AND_PREDICT_CV ( + params.models, + params.hyperparameters, + ch_cv_splits, + params.response_transformation + ) + + /* TRAIN_AND_PREDICT ( params.model_name, From b3f1f8132d007423e1a1340510e28aeba0ca18a9 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 15 May 2024 17:06:01 +0200 Subject: [PATCH 014/257] trying to run train and predict for CV --- modules/local/train_and_predict_cv.nf | 7 +++---- workflows/drugresponseeval.nf | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/modules/local/train_and_predict_cv.nf b/modules/local/train_and_predict_cv.nf index 1db86c7..edc2e56 100644 --- a/modules/local/train_and_predict_cv.nf +++ b/modules/local/train_and_predict_cv.nf @@ -1,6 +1,6 @@ - - process TRAIN_AND_PREDICT_CV { + label 'process_single' + input: val model_name path hyperparameters @@ -8,7 +8,7 @@ process TRAIN_AND_PREDICT_CV { val response_transformation output: - path "prediction_dataset.pkl" , emit: pred_data + path "prediction_dataset.pkl", emit: pred_data script: """ @@ -18,5 +18,4 @@ process TRAIN_AND_PREDICT_CV { --cv_data $cv_data \\ --response_transformation $response_transformation """ - } diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 7d0dfd7..da67ddc 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -76,13 +76,12 @@ workflow DRUGRESPONSEEVAL { LOAD_RESPONSE(params.dataset_name, params.path_data) - ch_cv_splits = Channel.empty() CV_SPLIT ( LOAD_RESPONSE.out.response_dataset, params.n_cv_splits, params.test_mode ) - ch_cv_splits = CV_SPLIT.out.response_cv_splits + ch_cv_splits = CV_SPLIT.out.response_cv_splits.flatten() TRAIN_AND_PREDICT_CV ( params.models, From 6cc69f73be1248c9d54f737ed470eb08a1e26f5f Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 15 May 2024 17:11:35 +0200 Subject: [PATCH 015/257] trying to run train and predict for CV --- bin/train_and_predict_cv.py | 5 +++++ nextflow.config | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index 0d0e86c..29e5e0f 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -53,3 +53,8 @@ def main(): ) with open('prediction_dataset.pkl', 'wb') as f: pickle.dump(validation_dataset, f) + + +if __name__ == "__main__": + main() + sys.exit(0) diff --git a/nextflow.config b/nextflow.config index 5af019a..b7b7695 100644 --- a/nextflow.config +++ b/nextflow.config @@ -10,7 +10,7 @@ params { // For this pipeline - models = 'SimpleNeuralNetwork' + models = 'NaivePredictor' test_mode = 'LPO' randomization_mode = 'None' randomization_type = 'permutation' From 28ae6581c1af9372e8dc7fd41425cefe8fe3a3eb Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 16 May 2024 10:05:17 +0200 Subject: [PATCH 016/257] adjusting parameters for modules, replaced path_out with outdir (default name) --- bin/check_params.py | 2 +- conf/modules.config | 25 +++++++++++++++++++++++++ nextflow.config | 4 ++-- nextflow_schema.json | 4 ++-- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/bin/check_params.py b/bin/check_params.py index a98a653..e768f0f 100755 --- a/bin/check_params.py +++ b/bin/check_params.py @@ -98,7 +98,7 @@ def parse_args(argv=None): ) parser.add_argument( - "--path_out", type=str, default="results/", help="Path to the output directory" + "--outdir", type=str, default="results/", help="Path to the output directory" ) parser.add_argument( diff --git a/conf/modules.config b/conf/modules.config index e27fd28..d2ea4af 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -18,4 +18,29 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] + withName: 'LOAD_RESPONSE' { + publishDir = [ + path: { params.save_datasets ? "${params.outdir}/datasets" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } + ] + } + + withName: 'CV_SPLIT' { + publishDir = [ + path: { params.save_datasets ? "${params.outdir}/datasets" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } + ] + } + + + withName: 'TRAIN_AND_PREDICT_CV' { + publishDir = [ + path: { params.save_datasets ? "${params.outdir}/datasets" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } + ] + } + } diff --git a/nextflow.config b/nextflow.config index b7b7695..a43d488 100644 --- a/nextflow.config +++ b/nextflow.config @@ -16,16 +16,16 @@ params { randomization_type = 'permutation' n_trials_robustness = 0 dataset_name = 'GDSC1' - path_out = 'results' curve_curator = false overwrite = false optim_metric = 'RMSE' n_cv_splits = 5 response_transformation = 'None' path_data = '~/Projects/munich/NF-CORE-DRUGRESPONSEEVAL/data/' + save_datasets = false // Boilerplate options - outdir = null + outdir = 'results' publish_dir_mode = 'copy' email = null email_on_fail = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 94832d4..29f3744 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,7 +10,7 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": ["run_id", "dataset_name", "path_out"], + "required": ["run_id", "dataset_name", "outdir"], "properties": { "run_id": { "type": "string", @@ -22,7 +22,7 @@ "description": "Name of the dataset.", "help_text": "Name of the dataset used for the pipeline. Allowed values are GDSC1, GDSC2, and Custom." }, - "path_out": { + "outdir": { "type": "string", "format": "directory-path", "description": "The output directory where the results will be saved. Default is results/", From 71881fe63be219637aa6d5144ddd576763f0f55c Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 16 May 2024 10:55:57 +0200 Subject: [PATCH 017/257] hpam split implemented --- bin/hpam_split.py | 25 +++++++++++++++++++++ bin/train_and_predict_cv.py | 3 ++- modules/local/hpam_split.nf | 22 ++++++++++++++++++ workflows/baseline_hyperparameters.yml | 31 ++++++++++++++++++++++++++ workflows/drugresponseeval.nf | 10 ++++++++- 5 files changed, 89 insertions(+), 2 deletions(-) create mode 100755 bin/hpam_split.py create mode 100644 modules/local/hpam_split.nf create mode 100644 workflows/baseline_hyperparameters.yml diff --git a/bin/hpam_split.py b/bin/hpam_split.py new file mode 100755 index 0000000..225466e --- /dev/null +++ b/bin/hpam_split.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import argparse +import sys +import yaml +from dreval.models import MODEL_FACTORY + + +def get_parser(): + parser = argparse.ArgumentParser(description='Take model name, get hyperparameters, and split into single hyperparameter combinations') + parser.add_argument('--model_name', type=str, help='model name') + return parser + + +if __name__ == "__main__": + parser = get_parser() + args = parser.parse_args() + model_class = MODEL_FACTORY[args.model_name] + hyperparameters = model_class.get_hyperparameter_set() + hpam_idx = 0 + for hpam_combi in hyperparameters: + with open(f'hpam_{hpam_idx}.yaml', 'w') as yaml_file: + hpam_idx += 1 + yaml.dump(hpam_combi, yaml_file, default_flow_style=False) + diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index 29e5e0f..c6a920f 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -3,6 +3,7 @@ import argparse import sys import pickle +import yaml from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler @@ -27,7 +28,7 @@ def main(): split = pickle.load(open(args.cv_data, 'rb')) train_dataset = split["train"] validation_dataset = split["validation"] - hpams = pickle.load(open(args.hyperparameters, 'rb')) + hpams = yaml.load(open(args.hyperparameters, 'r'), Loader=yaml.FullLoader) if model_class.early_stopping: validation_dataset, es_dataset = split_early_stopping(validation_dataset, args.test_mode) else: diff --git a/modules/local/hpam_split.nf b/modules/local/hpam_split.nf new file mode 100644 index 0000000..113f1e1 --- /dev/null +++ b/modules/local/hpam_split.nf @@ -0,0 +1,22 @@ +process HPAM_SPLIT { + //tag "$samplesheet" + //label 'process_single' + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + input: + val model_name + + output: + path "*.yaml" , emit: hpam_combi + + + script: + """ + hpam_split.py \\ + --model_name $model_name + """ + +} diff --git a/workflows/baseline_hyperparameters.yml b/workflows/baseline_hyperparameters.yml new file mode 100644 index 0000000..f97a45a --- /dev/null +++ b/workflows/baseline_hyperparameters.yml @@ -0,0 +1,31 @@ +--- +models: + ElasticNet: + alpha: + - 0.1 + - 0.5 + - 1 + l1_ratio: + - 0.1 + - 0.5 + - 0.9 + RandomForest: + - n_estimators: + - 100 + - max_depth: + - None + - 10 + - 100 + - max_samples: + - 0.7 + - n_jobs: + - 3 + - min_samples_leaf: + - 1 + - 3 + - min_samples_split: + - 2 + - 4 + - criterion: + - squared_error + - absolute_error diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index da67ddc..39cf9e0 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -29,6 +29,7 @@ WorkflowDrugresponseeval.initialise(params, log) include { PARAMS_CHECK } from '../modules/local/params_check' include { LOAD_RESPONSE } from '../modules/local/load_response' include { CV_SPLIT } from '../modules/local/cv_split' +include { HPAM_SPLIT } from '../modules/local/hpam_split' include { TRAIN_AND_PREDICT_CV } from '../modules/local/train_and_predict_cv' include { TRAIN_AND_PREDICT } from '../modules/local/train_and_predict' include { EVALUATE } from '../modules/local/evaluate' @@ -83,9 +84,16 @@ workflow DRUGRESPONSEEVAL { ) ch_cv_splits = CV_SPLIT.out.response_cv_splits.flatten() + HPAM_SPLIT ( + params.models + ) + + ch_hpam_combis = HPAM_SPLIT.out.hpam_combi.flatten() + TRAIN_AND_PREDICT_CV ( params.models, - params.hyperparameters, + params.test_mode, + ch_hpam_combis, ch_cv_splits, params.response_transformation ) From 12964186d0f0785b767fa37534ca995ec9a928af Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 16 May 2024 11:20:04 +0200 Subject: [PATCH 018/257] model channels implemented --- conf/modules.config | 8 ++++++++ modules/local/params_check.nf | 4 ++-- modules/local/train_and_predict_cv.nf | 2 ++ workflows/drugresponseeval.nf | 22 ++++++++++++---------- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index d2ea4af..d73266c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -34,6 +34,14 @@ process { ] } + withName: 'HPAM_SPLIT' { + publishDir = [ + path: { params.save_datasets ? "${params.outdir}/hpams" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } + ] + } + withName: 'TRAIN_AND_PREDICT_CV' { publishDir = [ diff --git a/modules/local/params_check.nf b/modules/local/params_check.nf index 58d6a74..96344d8 100755 --- a/modules/local/params_check.nf +++ b/modules/local/params_check.nf @@ -1,6 +1,6 @@ process PARAMS_CHECK { //tag "$samplesheet" - //label 'process_single' + label 'process_single' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -26,7 +26,7 @@ process PARAMS_CHECK { script: // This script is bundled with the pipeline, in nf-core/drugresponseeval/bin/ """ check_params.py \\ - --models $models \\ + --models ${models.replace(',', ' ')} \\ --test_mode $test_mode \\ --dataset_name $dataset_name \\ --n_cv_splits $n_cv_splits \\ diff --git a/modules/local/train_and_predict_cv.nf b/modules/local/train_and_predict_cv.nf index edc2e56..740f48f 100644 --- a/modules/local/train_and_predict_cv.nf +++ b/modules/local/train_and_predict_cv.nf @@ -3,6 +3,7 @@ process TRAIN_AND_PREDICT_CV { input: val model_name + val test_mode path hyperparameters path cv_data val response_transformation @@ -14,6 +15,7 @@ process TRAIN_AND_PREDICT_CV { """ train_and_predict_cv.py \\ --model_name $model_name \\ + --test_mode $test_mode \\ --hyperparameters $hyperparameters \\ --cv_data $cv_data \\ --response_transformation $response_transformation diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 39cf9e0..a041bc3 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -31,7 +31,7 @@ include { LOAD_RESPONSE } from '../modules/local/load_response' include { CV_SPLIT } from '../modules/local/cv_split' include { HPAM_SPLIT } from '../modules/local/hpam_split' include { TRAIN_AND_PREDICT_CV } from '../modules/local/train_and_predict_cv' -include { TRAIN_AND_PREDICT } from '../modules/local/train_and_predict' +//include { TRAIN_AND_PREDICT } from '../modules/local/train_and_predict' include { EVALUATE } from '../modules/local/evaluate' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules @@ -54,8 +54,7 @@ include { EVALUATE } from '../modules/local/evaluate' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -// Info required for completion email and summary -def multiqc_report = [] +def models = params.models.split(",") workflow DRUGRESPONSEEVAL { @@ -64,6 +63,9 @@ workflow DRUGRESPONSEEVAL { // // SUBWORKFLOW: Read in samplesheet, validate and stage input files // + + ch_models = channel.from(models) + PARAMS_CHECK ( params.models, params.test_mode, @@ -85,19 +87,24 @@ workflow DRUGRESPONSEEVAL { ch_cv_splits = CV_SPLIT.out.response_cv_splits.flatten() HPAM_SPLIT ( - params.models + ch_models ) ch_hpam_combis = HPAM_SPLIT.out.hpam_combi.flatten() TRAIN_AND_PREDICT_CV ( - params.models, + ch_models, params.test_mode, ch_hpam_combis, ch_cv_splits, params.response_transformation ) + EVALUATE ( + TRAIN_AND_PREDICT_CV.out.pred_data, + params.optim_metric + ) + /* TRAIN_AND_PREDICT ( @@ -110,11 +117,6 @@ workflow DRUGRESPONSEEVAL { params.cl_features, params.drug_features ) - - EVALUATE ( - TRAIN_AND_PREDICT.out.pred_data, - params.optim_metric - ) */ } From 1dabde9c673315063133a3281d81c5fb55173036 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 16 May 2024 13:55:42 +0200 Subject: [PATCH 019/257] latest stable version --- bin/load_response.py | 2 +- bin/train_and_predict_cv.py | 2 ++ modules/local/train_and_predict_cv.nf | 2 ++ workflows/baseline_hyperparameters.yml | 31 -------------------------- workflows/drugresponseeval.nf | 1 + 5 files changed, 6 insertions(+), 32 deletions(-) delete mode 100644 workflows/baseline_hyperparameters.yml diff --git a/bin/load_response.py b/bin/load_response.py index 13935a8..17fd8e4 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -1,6 +1,6 @@ #!/usr/bin/env python import argparse -from dreval.response_datasets import RESPONSE_DATASET_FACTORY +from dreval.datasets import RESPONSE_DATASET_FACTORY import pickle diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index c6a920f..bbe79e6 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -14,6 +14,7 @@ def get_parser(): parser = argparse.ArgumentParser(description='Train and predict using a drug response prediction model.') parser.add_argument('--model_name', type=str, help='model to evaluate or list of models to compare') + parser.add_argument('--path_data', type=str, default='data', help='Data directory path') parser.add_argument('--test_mode', type=str, default='LPO', help='Test mode (LPO, LCO, LDO)') parser.add_argument('--hyperparameters', type=str, help='hyperparameters for the model') parser.add_argument('--cv_data', type=str, help='path to the cv data split') @@ -47,6 +48,7 @@ def main(): validation_dataset = train_and_predict( model=model, hpams=hpams, + path_data=args.path_data, train_dataset=train_dataset, prediction_dataset=validation_dataset, early_stopping_dataset=es_dataset, diff --git a/modules/local/train_and_predict_cv.nf b/modules/local/train_and_predict_cv.nf index 740f48f..3e2c140 100644 --- a/modules/local/train_and_predict_cv.nf +++ b/modules/local/train_and_predict_cv.nf @@ -3,6 +3,7 @@ process TRAIN_AND_PREDICT_CV { input: val model_name + val path_data val test_mode path hyperparameters path cv_data @@ -15,6 +16,7 @@ process TRAIN_AND_PREDICT_CV { """ train_and_predict_cv.py \\ --model_name $model_name \\ + --path_data $path_data \\ --test_mode $test_mode \\ --hyperparameters $hyperparameters \\ --cv_data $cv_data \\ diff --git a/workflows/baseline_hyperparameters.yml b/workflows/baseline_hyperparameters.yml deleted file mode 100644 index f97a45a..0000000 --- a/workflows/baseline_hyperparameters.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- -models: - ElasticNet: - alpha: - - 0.1 - - 0.5 - - 1 - l1_ratio: - - 0.1 - - 0.5 - - 0.9 - RandomForest: - - n_estimators: - - 100 - - max_depth: - - None - - 10 - - 100 - - max_samples: - - 0.7 - - n_jobs: - - 3 - - min_samples_leaf: - - 1 - - 3 - - min_samples_split: - - 2 - - 4 - - criterion: - - squared_error - - absolute_error diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index a041bc3..ae1a271 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -94,6 +94,7 @@ workflow DRUGRESPONSEEVAL { TRAIN_AND_PREDICT_CV ( ch_models, + params.path_data, params.test_mode, ch_hpam_combis, ch_cv_splits, From 96813ea5372bc58586f9fffabb0454b68c25e21e Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 16 May 2024 14:08:09 +0200 Subject: [PATCH 020/257] new paths --- bin/check_params.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/check_params.py b/bin/check_params.py index e768f0f..b993f7e 100755 --- a/bin/check_params.py +++ b/bin/check_params.py @@ -8,8 +8,8 @@ import logging import sys from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler -from models import MODEL_FACTORY -from response_datasets import RESPONSE_DATASET_FACTORY +from dreval.models import MODEL_FACTORY +from dreval.datasets import RESPONSE_DATASET_FACTORY from dreval.experiment import drug_response_experiment from dreval.evaluation import AVAILABLE_METRICS From 91cb3f02e9bcbf6b2546c12085066f5a9e9dc575 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 16 May 2024 14:23:42 +0200 Subject: [PATCH 021/257] HOW TO DO THIS --- workflows/drugresponseeval.nf | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index ae1a271..99acaca 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -66,7 +66,7 @@ workflow DRUGRESPONSEEVAL { ch_models = channel.from(models) - PARAMS_CHECK ( + /*PARAMS_CHECK ( params.models, params.test_mode, params.dataset_name, @@ -75,7 +75,7 @@ workflow DRUGRESPONSEEVAL { params.curve_curator, params.response_transformation, params.optim_metric - ) + )*/ LOAD_RESPONSE(params.dataset_name, params.path_data) @@ -84,13 +84,15 @@ workflow DRUGRESPONSEEVAL { params.n_cv_splits, params.test_mode ) - ch_cv_splits = CV_SPLIT.out.response_cv_splits.flatten() + ch_cv_splits = CV_SPLIT.out.response_cv_splits + + ch_models.cross(ch_cv_splits).view() - HPAM_SPLIT ( + /*HPAM_SPLIT ( ch_models ) - ch_hpam_combis = HPAM_SPLIT.out.hpam_combi.flatten() + ch_hpam_combis = HPAM_SPLIT.out.hpam_combis TRAIN_AND_PREDICT_CV ( ch_models, @@ -104,7 +106,7 @@ workflow DRUGRESPONSEEVAL { EVALUATE ( TRAIN_AND_PREDICT_CV.out.pred_data, params.optim_metric - ) + )*/ /* From c95cd961546274e2bf88e71f1d435798974451dc Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 16 May 2024 15:15:54 +0200 Subject: [PATCH 022/257] HELP --- modules/local/hpam_split.nf | 2 +- modules/local/train_and_predict_cv.nf | 4 +--- workflows/drugresponseeval.nf | 17 +++++++++-------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/modules/local/hpam_split.nf b/modules/local/hpam_split.nf index 113f1e1..1271a2e 100644 --- a/modules/local/hpam_split.nf +++ b/modules/local/hpam_split.nf @@ -1,6 +1,6 @@ process HPAM_SPLIT { //tag "$samplesheet" - //label 'process_single' + label 'process_single' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/train_and_predict_cv.nf b/modules/local/train_and_predict_cv.nf index 3e2c140..91dd569 100644 --- a/modules/local/train_and_predict_cv.nf +++ b/modules/local/train_and_predict_cv.nf @@ -2,11 +2,9 @@ process TRAIN_AND_PREDICT_CV { label 'process_single' input: - val model_name + tuple val(model_name), path(cv_data), path(hyperparameters) val path_data val test_mode - path hyperparameters - path cv_data val response_transformation output: diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 99acaca..a6ad10f 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -86,20 +86,21 @@ workflow DRUGRESPONSEEVAL { ) ch_cv_splits = CV_SPLIT.out.response_cv_splits - ch_models.cross(ch_cv_splits).view() - - /*HPAM_SPLIT ( + HPAM_SPLIT ( ch_models ) - ch_hpam_combis = HPAM_SPLIT.out.hpam_combis + ch_hpam_combis = HPAM_SPLIT.out.hpam_combi + ch_model_cv = ch_models.combine(ch_cv_splits.flatten()) + ch_model_hpam = ch_models.combine(ch_hpam_combis) + ch_model_hpam.view() + //ch_test_combis = ch_model_cv.join(ch_model_hpam) + //ch_test_combis.view() - TRAIN_AND_PREDICT_CV ( - ch_models, + /*TRAIN_AND_PREDICT_CV ( + ch_test_combis, params.path_data, params.test_mode, - ch_hpam_combis, - ch_cv_splits, params.response_transformation ) From 561427400a30123930eb436e971048b46eb43de9 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 16 May 2024 15:31:16 +0200 Subject: [PATCH 023/257] I THINK I GOT IT? --- modules/local/hpam_split.nf | 2 +- workflows/drugresponseeval.nf | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/modules/local/hpam_split.nf b/modules/local/hpam_split.nf index 1271a2e..6e46b47 100644 --- a/modules/local/hpam_split.nf +++ b/modules/local/hpam_split.nf @@ -10,7 +10,7 @@ process HPAM_SPLIT { val model_name output: - path "*.yaml" , emit: hpam_combi + tuple val(model_name), path("*.yaml") , emit: hpam_combi script: diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index a6ad10f..fcde055 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -92,12 +92,11 @@ workflow DRUGRESPONSEEVAL { ch_hpam_combis = HPAM_SPLIT.out.hpam_combi ch_model_cv = ch_models.combine(ch_cv_splits.flatten()) - ch_model_hpam = ch_models.combine(ch_hpam_combis) - ch_model_hpam.view() - //ch_test_combis = ch_model_cv.join(ch_model_hpam) - //ch_test_combis.view() + ch_hpam_combis = ch_hpam_combis.transpose() - /*TRAIN_AND_PREDICT_CV ( + ch_test_combis = ch_model_cv.join(ch_hpam_combis) + + TRAIN_AND_PREDICT_CV ( ch_test_combis, params.path_data, params.test_mode, @@ -107,7 +106,7 @@ workflow DRUGRESPONSEEVAL { EVALUATE ( TRAIN_AND_PREDICT_CV.out.pred_data, params.optim_metric - )*/ + ) /* From 0ce774595e32a2cfef3f011eaee4ab052febece2 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 16 May 2024 15:56:11 +0200 Subject: [PATCH 024/257] got it!!!!!!! --- workflows/drugresponseeval.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index fcde055..67374e9 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -94,7 +94,7 @@ workflow DRUGRESPONSEEVAL { ch_model_cv = ch_models.combine(ch_cv_splits.flatten()) ch_hpam_combis = ch_hpam_combis.transpose() - ch_test_combis = ch_model_cv.join(ch_hpam_combis) + ch_test_combis = ch_model_cv.combine(ch_hpam_combis, by: 0) TRAIN_AND_PREDICT_CV ( ch_test_combis, From 31137e711ef07431d3826bb1905149f7d7449634 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 16 May 2024 16:20:07 +0200 Subject: [PATCH 025/257] trying to find best hyperparameter --- conf/modules.config | 8 ++++++++ modules/local/evaluate.nf | 2 ++ modules/local/train_and_predict_cv.nf | 1 + workflows/drugresponseeval.nf | 3 ++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index d73266c..8d38b3b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -51,4 +51,12 @@ process { ] } + withName: 'EVALUATE' { + publishDir = [ + path: { params.save_datasets ? "${params.outdir}/datasets" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } + ] + } + } diff --git a/modules/local/evaluate.nf b/modules/local/evaluate.nf index be98087..af73cce 100644 --- a/modules/local/evaluate.nf +++ b/modules/local/evaluate.nf @@ -9,9 +9,11 @@ process EVALUATE { input: val pred_data val metric + tuple val(model_name), path(cv_data) output: path "*.pkl" , emit: eval_results + tuple val(model_name), path(cv_data), emit: meta script: diff --git a/modules/local/train_and_predict_cv.nf b/modules/local/train_and_predict_cv.nf index 91dd569..85113a3 100644 --- a/modules/local/train_and_predict_cv.nf +++ b/modules/local/train_and_predict_cv.nf @@ -9,6 +9,7 @@ process TRAIN_AND_PREDICT_CV { output: path "prediction_dataset.pkl", emit: pred_data + tuple val(model_name), path(cv_data), emit: meta script: """ diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 67374e9..b895f0b 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -105,7 +105,8 @@ workflow DRUGRESPONSEEVAL { EVALUATE ( TRAIN_AND_PREDICT_CV.out.pred_data, - params.optim_metric + params.optim_metric, + TRAIN_AND_PREDICT_CV.out.meta ) From a0c0d86fed4ab9717f921c7f8b6ac82193b607dc Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 16 May 2024 17:05:27 +0200 Subject: [PATCH 026/257] found out that this actually works --- bin/evaluate.py | 26 -------------------------- modules/local/evaluate.nf | 11 +++++++---- 2 files changed, 7 insertions(+), 30 deletions(-) delete mode 100755 bin/evaluate.py diff --git a/bin/evaluate.py b/bin/evaluate.py deleted file mode 100755 index 7de350a..0000000 --- a/bin/evaluate.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python -import argparse -import pickle -import sys -from dreval.evaluation import evaluate - - -def get_parser(): - parser = argparse.ArgumentParser(description='Evaluate model') - parser.add_argument('--pred_data', type=str, required=True, help='Path to prediction data') - parser.add_argument('--metric', type=str, default='RMSE', help='Metric to evaluate') - return parser - - -def main(): - parser = get_parser() - args = parser.parse_args() - pred_data = pickle.load(open(args.pred_data, 'rb')) - results = evaluate(dataset=pred_data, metric=[args.metric]) - with open("eval_results.pkl", "wb") as f: - pickle.dump(results, f) - - -if __name__ == "__main__": - main() - sys.exit(0) diff --git a/modules/local/evaluate.nf b/modules/local/evaluate.nf index af73cce..c38456a 100644 --- a/modules/local/evaluate.nf +++ b/modules/local/evaluate.nf @@ -12,15 +12,18 @@ process EVALUATE { tuple val(model_name), path(cv_data) output: - path "*.pkl" , emit: eval_results + val result, emit: metric tuple val(model_name), path(cv_data), emit: meta script: """ - evaluate.py \\ - --pred_data $pred_data \\ - --metric $metric + #!/usr/bin/env python + import pickle + from dreval.evaluation import evaluate + pred_data = pickle.load(open('$pred_data', 'rb')) + results = evaluate(dataset=pred_data, metric=[$metric]) + print(results[$metric]) """ } From 52c9fe9b2ba074850a092ef8f882f5bb8cff3810 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 17 May 2024 09:36:56 +0200 Subject: [PATCH 027/257] writing evaluation results to file again --- modules/local/evaluate.nf | 8 +++++--- workflows/drugresponseeval.nf | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/local/evaluate.nf b/modules/local/evaluate.nf index c38456a..9d71cbf 100644 --- a/modules/local/evaluate.nf +++ b/modules/local/evaluate.nf @@ -12,7 +12,7 @@ process EVALUATE { tuple val(model_name), path(cv_data) output: - val result, emit: metric + path 'result_metrics.yaml', emit: result_metrics tuple val(model_name), path(cv_data), emit: meta @@ -20,10 +20,12 @@ process EVALUATE { """ #!/usr/bin/env python import pickle + import yaml from dreval.evaluation import evaluate pred_data = pickle.load(open('$pred_data', 'rb')) - results = evaluate(dataset=pred_data, metric=[$metric]) - print(results[$metric]) + results = evaluate(dataset=pred_data, metric=['$metric']) + with open('result_metrics.yaml', 'w') as f: + yaml.dump(results, f, default_flow_style=False) """ } diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index b895f0b..3c4aba5 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -108,6 +108,7 @@ workflow DRUGRESPONSEEVAL { params.optim_metric, TRAIN_AND_PREDICT_CV.out.meta ) + EVALUATE.out.result_metrics.view() /* From 95d4b64a8f07c79e0af6d5591acc34e9a5fb4d0a Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 17 May 2024 16:58:20 +0200 Subject: [PATCH 028/257] stable pipeline; randomization tests started --- bin/evaluate_and_find_max.py | 59 ++++++++++++ bin/train_and_predict.py | 129 -------------------------- bin/train_and_predict_cv.py | 8 +- conf/modules.config | 7 ++ modules/local/evaluate.nf | 25 ++--- modules/local/hpam_split.nf | 2 +- modules/local/predict_full.nf | 73 +++++++++++++++ modules/local/randomization_split.nf | 34 +++++++ modules/local/train_and_predict.nf | 30 ------ modules/local/train_and_predict_cv.nf | 4 +- workflows/drugresponseeval.nf | 39 +++++--- 11 files changed, 215 insertions(+), 195 deletions(-) create mode 100755 bin/evaluate_and_find_max.py delete mode 100755 bin/train_and_predict.py create mode 100644 modules/local/predict_full.nf create mode 100644 modules/local/randomization_split.nf delete mode 100755 modules/local/train_and_predict.nf diff --git a/bin/evaluate_and_find_max.py b/bin/evaluate_and_find_max.py new file mode 100755 index 0000000..b7c70ee --- /dev/null +++ b/bin/evaluate_and_find_max.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +import argparse +import pickle +import yaml + +from dreval.experiment import evaluate + + +def get_parser(): + parser = argparse.ArgumentParser(description='Take model name, get hyperparameters, and split into single hyperparameter combinations') + parser.add_argument('--model_name', type=str, help='model name') + parser.add_argument('--split_id', type=str, help='split id') + parser.add_argument('--hpam_yamls', nargs='+', help='paths to hpam yamls') + parser.add_argument('--pred_datas', nargs='+', help='paths to pred datas') + parser.add_argument('--metric', type=str, help='metric') + return parser + + +def best_metric(metric, current_metric, best_metric): + if metric in ['MSE', 'RMSE', 'MAE']: + if current_metric < best_metric: + return True + else: + if current_metric > best_metric: + return True + return False + + +if __name__ == "__main__": + parser = get_parser() + args = parser.parse_args() + hpam_yamls = [] + for hpam_yaml in args.hpam_yamls: + hpam_yamls.append(hpam_yaml) + pred_datas = [] + for pred_data in args.pred_datas: + pred_datas.append(pred_data) + + best_hpam_combi = None + best_result = None + for i in range(0, len(pred_datas)): + pred_data = pickle.load(open(pred_datas[i], 'rb')) + with open(hpam_yamls[i], 'r') as yaml_file: + hpam_combi = yaml.load(yaml_file, Loader=yaml.FullLoader) + results = evaluate(pred_data, args.metric) + if best_result is None: + best_result = results[args.metric] + best_hpam_combi = hpam_combi + elif best_metric(args.metric, results[args.metric], best_result): + best_result = results[args.metric] + best_hpam_combi = hpam_combi + final_result = {f'{args.model_name}_{args.split_id}': { + 'best_hpam_combi': best_hpam_combi, + 'best_result': best_result + }} + with open(f'best_hpam_combi_{args.split_id}.yaml', 'w') as yaml_file: + yaml.dump(final_result, yaml_file, default_flow_style=False) + diff --git a/bin/train_and_predict.py b/bin/train_and_predict.py deleted file mode 100755 index 1b72bce..0000000 --- a/bin/train_and_predict.py +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/env python -import os -import random -import sys -import pickle -from typing import Dict -from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler -from dreval.experiment import train_and_predict -from dreval.models import MODEL_FACTORY -import logging -import argparse - - -def get_parser(): - parser = argparse.ArgumentParser( - description="Train and predict using a drug response prediction model." - ) - parser.add_argument( - "--model_name", - type=str, - help="model to evaluate or list of models to compare", - ) - parser.add_argument( - "--hyperparameters", - type=str, - help="hyperparameters for the model", - ) - parser.add_argument( - "--train_data", - type=str, - help="path to the training dataset", - ) - parser.add_argument( - "--prediction_data", - type=str, - help="path to the prediction dataset", - ) - parser.add_argument( - "--early_stopping_data", - type=str, - help="path to the early stopping dataset", - ) - parser.add_argument( - "--response_transformation", - type=str, - help="response transformation to apply to the dataset", - ) - parser.add_argument( - "--cl_features", - type=str, - help="path to the cell line feature dataset", - ) - parser.add_argument( - "--drug_features", - type=str, - help="path to the drug feature dataset", - ) - return parser - - -def dreval_train_and_predict( - model_name: str, - hpam_path: str, - train_path: str, - pred_path: str, - es_path: str, - response_transform: str, - cl_feature_path: str, - drug_feature_path: str - -): - model_class = MODEL_FACTORY[model_name] - model = model_class(target='IC50') - train_dataset = pickle.load(open(train_path, "rb")) - pred_dataset = pickle.load(open(pred_path, "rb")) - if model.early_stopping: - es_dataset = pickle.load(open(es_path, "rb")) - else: - es_dataset = None - cl_feature = pickle.load(open(cl_feature_path, "rb")) - drug_feature = pickle.load(open(drug_feature_path, "rb")) - if response_transform == "None": - response_transform = None - elif response_transform == "standard": - response_transform = StandardScaler() - elif response_transform == "minmax": - response_transform = MinMaxScaler() - elif response_transform == "robust": - response_transform = RobustScaler() - else: - raise ValueError(f"Invalid response_transform: {response_transform}. Choose robust, minmax or standard.") - hyperparameters = pickle.load(open(hpam_path, "rb")) - prediction_dataset = train_and_predict( - model=model, - hpams=hyperparameters, - train_dataset=train_dataset, - prediction_dataset=pred_dataset, - early_stopping_dataset=( - es_dataset if model.early_stopping else None - ), - response_transformation=response_transform, - cl_features=cl_feature, - drug_features=drug_feature - ) - hpams = [f'{key}:{value}' for key, value in hyperparameters.items()] - hyperparameters = '_'.join(hpams) - filename = f'prediction_dataset.pkl' - logging.basicConfig(level=logging.INFO) - logger = logging.getLogger() - logger.info(f"Saving prediction dataset to {filename}") - logger.info(os.getcwd()) - logger.info(filename) - with open(filename, 'wb') as f: - pickle.dump(prediction_dataset, f) - - -if __name__ == "__main__": - args = get_parser().parse_args() - dreval_train_and_predict( - model_name=args.model_name, - hpam_path=args.hyperparameters, - train_path=args.train_data, - pred_path=args.prediction_data, - es_path=args.early_stopping_data, - response_transform=args.response_transformation, - cl_feature_path=args.cl_features, - drug_feature_path=args.drug_features - ) - sys.exit(0) diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index bbe79e6..44aba28 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import argparse +import random import sys import pickle import yaml @@ -8,7 +9,7 @@ from dreval.models import MODEL_FACTORY -from dreval.experiment import train_and_predict, split_early_stopping +from dreval.experiment import train_and_predict def get_parser(): @@ -31,7 +32,8 @@ def main(): validation_dataset = split["validation"] hpams = yaml.load(open(args.hyperparameters, 'r'), Loader=yaml.FullLoader) if model_class.early_stopping: - validation_dataset, es_dataset = split_early_stopping(validation_dataset, args.test_mode) + validation_dataset = split["validation_es"] + es_dataset = split["early_stopping"] else: es_dataset = None model = model_class(target='IC50') @@ -54,7 +56,7 @@ def main(): early_stopping_dataset=es_dataset, response_transformation=response_transform ) - with open('prediction_dataset.pkl', 'wb') as f: + with open(f'prediction_dataset_{validation_dataset.__hash__()}.pkl', 'wb') as f: pickle.dump(validation_dataset, f) diff --git a/conf/modules.config b/conf/modules.config index 8d38b3b..6006762 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -59,4 +59,11 @@ process { ] } + withName: 'PREDICT_FULL' { + publishDir = [ + path: "${params.outdir}/predictions", + mode: params.publish_dir_mode + ] + } + } diff --git a/modules/local/evaluate.nf b/modules/local/evaluate.nf index 9d71cbf..17e8079 100644 --- a/modules/local/evaluate.nf +++ b/modules/local/evaluate.nf @@ -1,31 +1,26 @@ process EVALUATE { - //tag "$samplesheet" - //label 'process_single' + tag "${model_name}_${split_id}" + label 'process_single' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : // 'biocontainers/python:3.8.3' }" input: - val pred_data + tuple val(model_name), val(split_id), path(hpam_yamls), path(pred_datas) val metric - tuple val(model_name), path(cv_data) output: - path 'result_metrics.yaml', emit: result_metrics - tuple val(model_name), path(cv_data), emit: meta - + tuple val(model_name), val(split_id), path('best_hpam_combi_*.yaml'), emit: best_combis script: """ - #!/usr/bin/env python - import pickle - import yaml - from dreval.evaluation import evaluate - pred_data = pickle.load(open('$pred_data', 'rb')) - results = evaluate(dataset=pred_data, metric=['$metric']) - with open('result_metrics.yaml', 'w') as f: - yaml.dump(results, f, default_flow_style=False) + evaluate_and_find_max.py \\ + --model_name $model_name \\ + --split_id $split_id \\ + --hpam_yamls $hpam_yamls \\ + --pred_datas $pred_datas \\ + --metric $metric """ } diff --git a/modules/local/hpam_split.nf b/modules/local/hpam_split.nf index 6e46b47..8443a22 100644 --- a/modules/local/hpam_split.nf +++ b/modules/local/hpam_split.nf @@ -1,5 +1,5 @@ process HPAM_SPLIT { - //tag "$samplesheet" + tag "$model_name" label 'process_single' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/predict_full.nf b/modules/local/predict_full.nf new file mode 100644 index 0000000..c5f5943 --- /dev/null +++ b/modules/local/predict_full.nf @@ -0,0 +1,73 @@ +process PREDICT_FULL { + tag "${model_name}_${split_id}" + label 'process_single' + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + input: + tuple val(split_id), path(split_dataset), val(model_name), path(hpam_combi) + val(response_transformation) + val(test_mode) + val(path_data) + + output: + path('test_dataset_*.csv'), emit: test_dataset + + script: + """ + #!/usr/bin/env python + import pickle + import yaml + from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler + + from dreval.models import MODEL_FACTORY + from dreval.experiment import train_and_predict + + split = pickle.load(open('${split_dataset}', 'rb')) + train_dataset = split['train'] + validation_dataset = split['validation'] + test_dataset = split['test'] + + model_class = MODEL_FACTORY['${model_name}'] + if model_class.early_stopping: + validation_dataset = split["validation_es"] + es_dataset = split["early_stopping"] + + train_dataset.add_rows(validation_dataset) + train_dataset.shuffle(random_state=42) + + with open('${hpam_combi}', 'r') as f: + best_hpam_dict = yaml.safe_load(f) + best_hpams = best_hpam_dict['${model_name}_${split_id}']['best_hpam_combi'] + + model = model_class(target='IC50') + if '${response_transformation}' == "None": + response_transform = None + elif '${response_transformation}' == "standard": + response_transform = StandardScaler() + elif '${response_transformation}' == "minmax": + response_transform = MinMaxScaler() + elif '${response_transformation}' == "robust": + response_transform = RobustScaler() + else: + raise ValueError("Invalid response_transform: ${response_transformation}. Choose robust, minmax or standard.") + + test_dataset = train_and_predict( + model=model, + hpams=best_hpams, + path_data='${path_data}', + train_dataset=train_dataset, + prediction_dataset=test_dataset, + early_stopping_dataset=( + es_dataset if model_class.early_stopping else None + ), + response_transformation=response_transform + ) + + prediction_dataset = 'test_dataset_${test_mode}_${split_id}.csv' + test_dataset.save(prediction_dataset) + """ + +} diff --git a/modules/local/randomization_split.nf b/modules/local/randomization_split.nf new file mode 100644 index 0000000..ae7d994 --- /dev/null +++ b/modules/local/randomization_split.nf @@ -0,0 +1,34 @@ +process RANDOMIZATION_SPLIT { + tag "${model_name}_${randomization_mode}" + label 'process_single' + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + input: + tuple val(model_name), val(randomization_mode) + + output: + tuple val(model_name), path('randomization_test_views.pkl'), emit: randomization_test_views + + script: + """ + #!/usr/bin/env python + import pickle + from dreval.models import MODEL_FACTORY + from dreval.experiment import get_randomization_test_views + + model_class = MODEL_FACTORY['${model_name}'] + model = model_class(target='IC50') + + randomization_test_views = get_randomization_test_views( + model=model, + randomization_mode=['${randomization_mode}'] + ) + with open('randomization_test_views.pkl', 'wb') as f: + pickle.dump(randomization_test_views, f) + + """ + +} diff --git a/modules/local/train_and_predict.nf b/modules/local/train_and_predict.nf deleted file mode 100755 index ceea462..0000000 --- a/modules/local/train_and_predict.nf +++ /dev/null @@ -1,30 +0,0 @@ - - -process TRAIN_AND_PREDICT { - input: - val model_name - path hyperparameters - path train_data - path prediction_data - path early_stopping_data - val response_transformation - path cl_features - path drug_features - - output: - path "*.pkl" , emit: pred_data - - script: - """ - train_and_predict.py \\ - --model_name $model_name \\ - --hyperparameters $hyperparameters \\ - --train_data $train_data \\ - --prediction_data $prediction_data \\ - --early_stopping_data $early_stopping_data \\ - --response_transformation $response_transformation \\ - --cl_features $cl_features \\ - --drug_features $drug_features - """ - -} diff --git a/modules/local/train_and_predict_cv.nf b/modules/local/train_and_predict_cv.nf index 85113a3..79b3073 100644 --- a/modules/local/train_and_predict_cv.nf +++ b/modules/local/train_and_predict_cv.nf @@ -1,4 +1,5 @@ process TRAIN_AND_PREDICT_CV { + tag "$model_name" label 'process_single' input: @@ -8,8 +9,7 @@ process TRAIN_AND_PREDICT_CV { val response_transformation output: - path "prediction_dataset.pkl", emit: pred_data - tuple val(model_name), path(cv_data), emit: meta + tuple val(model_name), val(cv_data.baseName), path(hyperparameters), path("prediction_dataset_*.pkl"), emit: pred_data script: """ diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 3c4aba5..7f31195 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -31,8 +31,9 @@ include { LOAD_RESPONSE } from '../modules/local/load_response' include { CV_SPLIT } from '../modules/local/cv_split' include { HPAM_SPLIT } from '../modules/local/hpam_split' include { TRAIN_AND_PREDICT_CV } from '../modules/local/train_and_predict_cv' -//include { TRAIN_AND_PREDICT } from '../modules/local/train_and_predict' include { EVALUATE } from '../modules/local/evaluate' +include { PREDICT_FULL } from '../modules/local/predict_full' +include { RANDOMIZATION_SPLIT } from '../modules/local/randomization_split' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // @@ -55,6 +56,7 @@ include { EVALUATE } from '../modules/local/evaluate' */ def models = params.models.split(",") +def randomizations = params.randomization_mode.split(",") workflow DRUGRESPONSEEVAL { @@ -103,26 +105,33 @@ workflow DRUGRESPONSEEVAL { params.response_transformation ) + ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.groupTuple(by: [0,1]) + EVALUATE ( - TRAIN_AND_PREDICT_CV.out.pred_data, - params.optim_metric, - TRAIN_AND_PREDICT_CV.out.meta + ch_combined_hpams, + params.optim_metric ) - EVALUATE.out.result_metrics.view() + ch_best_hpams_per_split = ch_cv_splits + .map { it -> [it, it.baseName]} + .transpose() + .combine(EVALUATE.out.best_combis, by: 1) -/* - TRAIN_AND_PREDICT ( - params.model_name, - params.hyperparameters, - params.train_data, - params.prediction_data, - params.early_stopping_data, + PREDICT_FULL ( + ch_best_hpams_per_split, params.response_transformation, - params.cl_features, - params.drug_features + params.test_mode, + params.path_data ) -*/ + + if (params.randomization_mode != 'None') { + ch_randomization = channel.from(randomizations) + ch_models_rand = ch_models.combine(ch_randomization) + RANDOMIZATION_SPLIT ( + ch_models_rand + ) + RANDOMIZATION_SPLIT.out.randomization_test_views.view() + } } /* From 7d56a77d3765eea52ccf9e57afcee2c0b51e7631 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 17 May 2024 16:59:46 +0200 Subject: [PATCH 029/257] stable pipeline; randomization tests started --- conf/modules.config | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 6006762..abf8169 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -66,4 +66,12 @@ process { ] } + withName: 'RANDOMIZATION_SPLIT' { + publishDir = [ + path: { params.save_datasets ? "${params.outdir}/datasets" : params.outdir }, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } + ] + } + } From 204d6bb2d9fdc4abc307f7a1f80d51b31b8e76fb Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 21 May 2024 11:34:15 +0200 Subject: [PATCH 030/257] randomization tests done! --- bin/train_and_predict_final.py | 145 +++++++++++++++++++++++++++ conf/modules.config | 7 ++ modules/local/predict_full.nf | 60 ++--------- modules/local/randomization_split.nf | 12 ++- modules/local/randomization_test.nf | 34 +++++++ workflows/drugresponseeval.nf | 14 ++- 6 files changed, 217 insertions(+), 55 deletions(-) create mode 100755 bin/train_and_predict_final.py create mode 100644 modules/local/randomization_test.nf diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py new file mode 100755 index 0000000..42b9fcc --- /dev/null +++ b/bin/train_and_predict_final.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python + +import sys +import argparse +import pickle +import warnings +from typing import Dict, List, Optional + +import yaml +from dreval.datasets.dataset import DrugResponseDataset +from dreval.models.drp_model import DRPModel +from sklearn.base import TransformerMixin +from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler + +from dreval.models import MODEL_FACTORY +from dreval.experiment import train_and_predict + + +def get_parser(): + parser = argparse.ArgumentParser(description='Train and predict: either full mode, randomization mode, or robustness mode.') + parser.add_argument('--mode', type=str, default='full', help='Mode: full, randomization, or robustness.') + parser.add_argument('--model_name', type=str, required=True, help='Model name.') + parser.add_argument('--split_id', type=str, required=True, help='Split id.') + parser.add_argument('--split_dataset_path', type=str, required=True, help='Path to split dataset.') + parser.add_argument('--hyperparameters_path', type=str, required=True, help='Path to hyperparameters.') + parser.add_argument('--response_transformation', type=str, default='None', help='Response transformation.') + parser.add_argument('--test_mode', type=str, default='LPO', help='Test mode (LPO, LCO, LDO).') + parser.add_argument('--path_data', type=str, required=True, help='Path to data.') + parser.add_argument('--randomization_views_path', type=str, default=None, help='Path to randomization views.') + parser.add_argument('--randomization_type', type=str, default='permutation', help='Randomization type (permutation, zeroing, gaussian).') + return parser + + +def prep_data(arguments): + split = pickle.load(open(arguments.split_dataset_path, 'rb')) + train_dataset = split['train'] + validation_dataset = split['validation'] + test_dataset = split['test'] + + model_class = MODEL_FACTORY[arguments.model_name] + if model_class.early_stopping: + validation_dataset = split["validation_es"] + es_dataset = split["early_stopping"] + else: + es_dataset = None + + train_dataset.add_rows(validation_dataset) + train_dataset.shuffle(random_state=42) + + with open(arguments.hyperparameters_path, 'r') as f: + best_hpam_dict = yaml.safe_load(f) + best_hpams = best_hpam_dict[f'{arguments.model_name}_{arguments.split_id}']['best_hpam_combi'] + + model = model_class(target='IC50') + if arguments.response_transformation == "None": + response_transform = None + elif arguments.response_transformation == "standard": + response_transform = StandardScaler() + elif arguments.response_transformation == "minmax": + response_transform = MinMaxScaler() + elif arguments.response_transformation == "robust": + response_transform = RobustScaler() + else: + raise ValueError("Invalid response_transform: ${response_transformation}. Choose robust, minmax or standard.") + return model, best_hpams, train_dataset, test_dataset, es_dataset, response_transform + + +def compute_randomization( + randomization_test_view: Dict[str, str], + model: DRPModel, + hpam_set: Dict, + path_data: str, + train_dataset: DrugResponseDataset, + test_dataset: DrugResponseDataset, + early_stopping_dataset: Optional[DrugResponseDataset], + split_id: str, + test_mode: str, + randomization_type: str = "permutation", + response_transformation=Optional[TransformerMixin] +): + cl_features = model.load_cell_line_features(data_path=path_data, dataset_name=train_dataset.dataset_name) + drug_features = model.load_drug_features(data_path=path_data, dataset_name=train_dataset.dataset_name) + + randomization_test_file = f'test_dataset_{model.model_name}_{randomization_test_view["test_name"]}_{test_mode}_{split_id}.csv' + + cl_features_rand = cl_features.copy() + drug_features_rand = drug_features.copy() + view = randomization_test_view['view'] + if view in cl_features.get_view_names(): + cl_features_rand.randomize_features(view, randomization_type=randomization_type) + elif view in drug_features.get_view_names(): + drug_features_rand.randomize_features(view, randomization_type=randomization_type) + else: + warnings.warn(f"View {view} not found in cell line or drug features. Skipping randomization {randomization_test_view['test_name']}.") + return + + test_dataset = train_and_predict( + model=model, + hpams=hpam_set, + path_data=path_data, + train_dataset=train_dataset, + prediction_dataset=test_dataset, + early_stopping_dataset=early_stopping_dataset, + response_transformation=response_transformation, + cl_features=cl_features_rand, + drug_features=drug_features_rand + ) + test_dataset.save(randomization_test_file) + + +if __name__ == "__main__": + parser = get_parser() + args = parser.parse_args() + model, best_hpams, train_dataset, test_dataset, es_dataset, response_transform = prep_data(args) + + if args.mode == 'full': + test_dataset = train_and_predict( + model=model, + hpams=best_hpams, + path_data=args.path_data, + train_dataset=train_dataset, + prediction_dataset=test_dataset, + early_stopping_dataset=es_dataset, + response_transformation=response_transform + ) + prediction_dataset = f'test_dataset_{model.model_name}_predictions_{args.test_mode}_{args.split_id}.csv' + test_dataset.save(prediction_dataset) + elif args.mode == 'randomization': + with open(args.randomization_views_path, 'r') as f: + randomization_test_view = yaml.safe_load(f) + compute_randomization( + randomization_test_view=randomization_test_view, + model=model, + hpam_set=best_hpams, + path_data=args.path_data, + train_dataset=train_dataset, + test_dataset=test_dataset, + early_stopping_dataset=es_dataset, + split_id=args.split_id, + test_mode=args.test_mode, + randomization_type=args.randomization_type, + response_transformation=response_transform + ) + + sys.exit(0) diff --git a/conf/modules.config b/conf/modules.config index abf8169..2651168 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -74,4 +74,11 @@ process { ] } + withName: RANDOMIZATION_TEST { + publishDir = [ + path: "${params.outdir}/randomization_test", + mode: params.publish_dir_mode + ] + } + } diff --git a/modules/local/predict_full.nf b/modules/local/predict_full.nf index c5f5943..a160a58 100644 --- a/modules/local/predict_full.nf +++ b/modules/local/predict_full.nf @@ -17,57 +17,15 @@ process PREDICT_FULL { script: """ - #!/usr/bin/env python - import pickle - import yaml - from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler - - from dreval.models import MODEL_FACTORY - from dreval.experiment import train_and_predict - - split = pickle.load(open('${split_dataset}', 'rb')) - train_dataset = split['train'] - validation_dataset = split['validation'] - test_dataset = split['test'] - - model_class = MODEL_FACTORY['${model_name}'] - if model_class.early_stopping: - validation_dataset = split["validation_es"] - es_dataset = split["early_stopping"] - - train_dataset.add_rows(validation_dataset) - train_dataset.shuffle(random_state=42) - - with open('${hpam_combi}', 'r') as f: - best_hpam_dict = yaml.safe_load(f) - best_hpams = best_hpam_dict['${model_name}_${split_id}']['best_hpam_combi'] - - model = model_class(target='IC50') - if '${response_transformation}' == "None": - response_transform = None - elif '${response_transformation}' == "standard": - response_transform = StandardScaler() - elif '${response_transformation}' == "minmax": - response_transform = MinMaxScaler() - elif '${response_transformation}' == "robust": - response_transform = RobustScaler() - else: - raise ValueError("Invalid response_transform: ${response_transformation}. Choose robust, minmax or standard.") - - test_dataset = train_and_predict( - model=model, - hpams=best_hpams, - path_data='${path_data}', - train_dataset=train_dataset, - prediction_dataset=test_dataset, - early_stopping_dataset=( - es_dataset if model_class.early_stopping else None - ), - response_transformation=response_transform - ) - - prediction_dataset = 'test_dataset_${test_mode}_${split_id}.csv' - test_dataset.save(prediction_dataset) + train_and_predict_final.py \\ + --mode full \\ + --model_name $model_name \\ + --split_id $split_id \\ + --split_dataset_path $split_dataset \\ + --hyperparameters_path $hpam_combi \\ + --response_transformation $response_transformation \\ + --test_mode $test_mode \\ + --path_data $path_data """ } diff --git a/modules/local/randomization_split.nf b/modules/local/randomization_split.nf index ae7d994..3eb6dca 100644 --- a/modules/local/randomization_split.nf +++ b/modules/local/randomization_split.nf @@ -10,12 +10,13 @@ process RANDOMIZATION_SPLIT { tuple val(model_name), val(randomization_mode) output: - tuple val(model_name), path('randomization_test_views.pkl'), emit: randomization_test_views + tuple val(model_name), path('randomization_test_view*.yaml'), emit: randomization_test_views script: """ #!/usr/bin/env python import pickle + import yaml from dreval.models import MODEL_FACTORY from dreval.experiment import get_randomization_test_views @@ -26,9 +27,14 @@ process RANDOMIZATION_SPLIT { model=model, randomization_mode=['${randomization_mode}'] ) - with open('randomization_test_views.pkl', 'wb') as f: - pickle.dump(randomization_test_views, f) + key = list(randomization_test_views.keys())[0] + # create as many dicts as there are elements in the value list of the key + randomization_test_view_dicts = [{'test_name': key, 'view': value} for value in randomization_test_views[key]] + + for rand_dict in randomization_test_view_dicts: + with open(f'randomization_test_view_{rand_dict["test_name"]}.yaml', 'w') as f: + yaml.dump(rand_dict, f) """ } diff --git a/modules/local/randomization_test.nf b/modules/local/randomization_test.nf new file mode 100644 index 0000000..62e963f --- /dev/null +++ b/modules/local/randomization_test.nf @@ -0,0 +1,34 @@ +process RANDOMIZATION_TEST { + tag "${model_name}_${randomization_type}" + label 'process_single' + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + input: + tuple val(model_name), val(split_id), path(split_dataset), path(best_hpams), path(randomization_views) + path(path_data) + val(test_mode) + val(randomization_type) + val(response_transformation) + + output: + path('test_dataset_*.csv'), emit: test_dataset + + script: + """ + train_and_predict_final.py \\ + --mode randomization \\ + --model_name $model_name \\ + --split_id $split_id \\ + --split_dataset_path $split_dataset \\ + --hyperparameters_path $best_hpams \\ + --response_transformation $response_transformation \\ + --test_mode $test_mode \\ + --path_data $path_data \\ + --randomization_views_path $randomization_views \\ + --randomization_type $randomization_type + """ + +} diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 7f31195..a39a7db 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -34,6 +34,7 @@ include { TRAIN_AND_PREDICT_CV } from '../modules/local/train_and_predict_cv' include { EVALUATE } from '../modules/local/evaluate' include { PREDICT_FULL } from '../modules/local/predict_full' include { RANDOMIZATION_SPLIT } from '../modules/local/randomization_split' +include { RANDOMIZATION_TEST } from '../modules/local/randomization_test' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // @@ -130,7 +131,18 @@ workflow DRUGRESPONSEEVAL { RANDOMIZATION_SPLIT ( ch_models_rand ) - RANDOMIZATION_SPLIT.out.randomization_test_views.view() + ch_best_hpams_per_split = ch_best_hpams_per_split.map { + split_id, path_to_split, model_name, path_to_hpams -> + return [model_name, split_id, path_to_split, path_to_hpams] + } + ch_randomization = ch_best_hpams_per_split.combine(RANDOMIZATION_SPLIT.out.randomization_test_views, by: 0) + RANDOMIZATION_TEST ( + ch_randomization, + params.path_data, + params.test_mode, + params.randomization_type, + params.response_transformation + ) } } From ca03cdcbb2669bd87a5cfa0e430bda50cb7aca3f Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 21 May 2024 15:03:53 +0200 Subject: [PATCH 031/257] robustness tests done! --- bin/train_and_predict_final.py | 90 ++++++++++++++++++++++++-------- conf/modules.config | 9 +++- modules/local/robustness_test.nf | 33 ++++++++++++ workflows/drugresponseeval.nf | 14 +++++ 4 files changed, 123 insertions(+), 23 deletions(-) create mode 100644 modules/local/robustness_test.nf diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 42b9fcc..1ab4fef 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -4,7 +4,7 @@ import argparse import pickle import warnings -from typing import Dict, List, Optional +from typing import Dict, Optional import yaml from dreval.datasets.dataset import DrugResponseDataset @@ -17,7 +17,8 @@ def get_parser(): - parser = argparse.ArgumentParser(description='Train and predict: either full mode, randomization mode, or robustness mode.') + parser = argparse.ArgumentParser(description='Train and predict: either full mode, randomization mode, ' + 'or robustness mode.') parser.add_argument('--mode', type=str, default='full', help='Mode: full, randomization, or robustness.') parser.add_argument('--model_name', type=str, required=True, help='Model name.') parser.add_argument('--split_id', type=str, required=True, help='Split id.') @@ -28,6 +29,7 @@ def get_parser(): parser.add_argument('--path_data', type=str, required=True, help='Path to data.') parser.add_argument('--randomization_views_path', type=str, default=None, help='Path to randomization views.') parser.add_argument('--randomization_type', type=str, default='permutation', help='Randomization type (permutation, zeroing, gaussian).') + parser.add_argument('--robustness_trial', type=int, help='Robustness trial index.') return parser @@ -108,38 +110,82 @@ def compute_randomization( test_dataset.save(randomization_test_file) +def compute_robustness( + model: DRPModel, + hpam_set: Dict, + path_data: str, + train_dataset: DrugResponseDataset, + test_dataset: DrugResponseDataset, + early_stopping_dataset: Optional[DrugResponseDataset], + split_id: str, + test_mode: str, + trial: int, + response_transformation=Optional[TransformerMixin] +): + robustness_test_file = f'test_dataset_{model.model_name}_robustness_{test_mode}_{split_id}_{trial}.csv' + train_dataset.shuffle(random_state=trial) + test_dataset.shuffle(random_state=trial) + if early_stopping_dataset is not None: + early_stopping_dataset.shuffle(random_state=trial) + test_dataset = train_and_predict( + model=model, + hpams=hpam_set, + path_data=path_data, + train_dataset=train_dataset, + prediction_dataset=test_dataset, + early_stopping_dataset=early_stopping_dataset, + response_transformation=response_transformation + ) + test_dataset.save(robustness_test_file) + + if __name__ == "__main__": - parser = get_parser() - args = parser.parse_args() - model, best_hpams, train_dataset, test_dataset, es_dataset, response_transform = prep_data(args) + arg_parser = get_parser() + args = arg_parser.parse_args() + selected_model, hpam_combi, train_set, test_set, es_set, transformation = prep_data(args) if args.mode == 'full': - test_dataset = train_and_predict( - model=model, - hpams=best_hpams, + test_set = train_and_predict( + model=selected_model, + hpams=hpam_combi, path_data=args.path_data, - train_dataset=train_dataset, - prediction_dataset=test_dataset, - early_stopping_dataset=es_dataset, - response_transformation=response_transform + train_dataset=train_set, + prediction_dataset=test_set, + early_stopping_dataset=es_set, + response_transformation=transformation ) - prediction_dataset = f'test_dataset_{model.model_name}_predictions_{args.test_mode}_{args.split_id}.csv' - test_dataset.save(prediction_dataset) + prediction_dataset = f'test_dataset_{selected_model.model_name}_predictions_{args.test_mode}_{args.split_id}.csv' + test_set.save(prediction_dataset) elif args.mode == 'randomization': with open(args.randomization_views_path, 'r') as f: - randomization_test_view = yaml.safe_load(f) + rand_test_view = yaml.safe_load(f) compute_randomization( - randomization_test_view=randomization_test_view, - model=model, - hpam_set=best_hpams, + randomization_test_view=rand_test_view, + model=selected_model, + hpam_set=hpam_combi, path_data=args.path_data, - train_dataset=train_dataset, - test_dataset=test_dataset, - early_stopping_dataset=es_dataset, + train_dataset=train_set, + test_dataset=test_set, + early_stopping_dataset=es_set, split_id=args.split_id, test_mode=args.test_mode, randomization_type=args.randomization_type, - response_transformation=response_transform + response_transformation=transformation + ) + elif args.mode == 'robustness': + compute_robustness( + model=selected_model, + hpam_set=hpam_combi, + path_data=args.path_data, + train_dataset=train_set, + test_dataset=test_set, + early_stopping_dataset=es_set, + split_id=args.split_id, + test_mode=args.test_mode, + trial=args.robustness_trial, + response_transformation=transformation ) + else: + raise ValueError(f"Invalid mode: {args.mode}. Choose full, randomization, or robustness.") sys.exit(0) diff --git a/conf/modules.config b/conf/modules.config index 2651168..482faad 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -74,11 +74,18 @@ process { ] } - withName: RANDOMIZATION_TEST { + withName: 'RANDOMIZATION_TEST' { publishDir = [ path: "${params.outdir}/randomization_test", mode: params.publish_dir_mode ] } + withName: 'ROBUSTNESS_TEST' { + publishDir = [ + path: "${params.outdir}/robustness_test", + mode: params.publish_dir_mode + ] + } + } diff --git a/modules/local/robustness_test.nf b/modules/local/robustness_test.nf new file mode 100644 index 0000000..ba2208a --- /dev/null +++ b/modules/local/robustness_test.nf @@ -0,0 +1,33 @@ +process ROBUSTNESS_TEST { + tag "${model_name}_${robustness_iteration}" + label 'process_single' + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + input: + tuple val(split_id), path(split_dataset), val(model_name), path(best_hpams), val(robustness_iteration) + path(path_data) + val(test_mode) + val(randomization_type) + val(response_transformation) + + output: + path('test_dataset_*.csv'), emit: test_dataset + + script: + """ + train_and_predict_final.py \\ + --mode robustness \\ + --model_name $model_name \\ + --split_id $split_id \\ + --split_dataset_path $split_dataset \\ + --hyperparameters_path $best_hpams \\ + --response_transformation $response_transformation \\ + --test_mode $test_mode \\ + --path_data $path_data \\ + --robustness_trial $robustness_iteration + """ + +} diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index a39a7db..ff5e332 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -35,6 +35,7 @@ include { EVALUATE } from '../modules/local/evaluate' include { PREDICT_FULL } from '../modules/local/predict_full' include { RANDOMIZATION_SPLIT } from '../modules/local/randomization_split' include { RANDOMIZATION_TEST } from '../modules/local/randomization_test' +include { ROBUSTNESS_TEST } from '../modules/local/robustness_test' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // @@ -144,6 +145,19 @@ workflow DRUGRESPONSEEVAL { params.response_transformation ) } + + if (params.n_trials_robustness > 0) { + ch_trials_robustness = Channel.from(1..params.n_trials_robustness) + ch_robustness = ch_best_hpams_per_split.combine(ch_trials_robustness) + + ROBUSTNESS_TEST ( + ch_robustness, + params.path_data, + params.test_mode, + params.randomization_type, + params.response_transformation + ) + } } /* From 6d3d68ba55bbccfab39bfc3a9a8b5c5a3a095181 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 24 May 2024 15:37:01 +0200 Subject: [PATCH 032/257] channel for LPO, LDO, LCO is there! Also, now supporting baselines vs. modles --- bin/check_params.py | 2 - bin/hpam_split.py | 1 - bin/train_and_predict_cv.py | 1 - modules/local/cv_split.nf | 9 ++-- modules/local/evaluate.nf | 6 +-- modules/local/params_check.nf | 7 ++-- modules/local/predict_full.nf | 5 +-- modules/local/randomization_test.nf | 5 +-- modules/local/robustness_test.nf | 3 +- modules/local/train_and_predict_cv.nf | 7 ++-- nextflow.config | 3 +- nextflow_schema.json | 18 ++++++++ workflows/drugresponseeval.nf | 60 +++++++++++++++++---------- 13 files changed, 78 insertions(+), 49 deletions(-) diff --git a/bin/check_params.py b/bin/check_params.py index b993f7e..377fe93 100755 --- a/bin/check_params.py +++ b/bin/check_params.py @@ -7,10 +7,8 @@ import argparse import logging import sys -from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler from dreval.models import MODEL_FACTORY from dreval.datasets import RESPONSE_DATASET_FACTORY -from dreval.experiment import drug_response_experiment from dreval.evaluation import AVAILABLE_METRICS logger = logging.getLogger() diff --git a/bin/hpam_split.py b/bin/hpam_split.py index 225466e..194ab1a 100755 --- a/bin/hpam_split.py +++ b/bin/hpam_split.py @@ -1,7 +1,6 @@ #!/usr/bin/env python import argparse -import sys import yaml from dreval.models import MODEL_FACTORY diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index 44aba28..6aa0881 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -1,7 +1,6 @@ #!/usr/bin/env python import argparse -import random import sys import pickle import yaml diff --git a/modules/local/cv_split.nf b/modules/local/cv_split.nf index 7188073..cc58dec 100644 --- a/modules/local/cv_split.nf +++ b/modules/local/cv_split.nf @@ -1,18 +1,17 @@ process CV_SPLIT { - //tag "$samplesheet" - //label 'process_single' + tag "$test_mode" + label 'process_single' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : // 'biocontainers/python:3.8.3' }" input: - path response + tuple val(test_mode), path(response) val n_cv_splits - val test_mode output: - path "*.pkl" , emit: response_cv_splits + tuple val(test_mode), path("split*.pkl") , emit: response_cv_splits script: diff --git a/modules/local/evaluate.nf b/modules/local/evaluate.nf index 17e8079..8f946de 100644 --- a/modules/local/evaluate.nf +++ b/modules/local/evaluate.nf @@ -1,5 +1,5 @@ process EVALUATE { - tag "${model_name}_${split_id}" + tag "${test_mode}_${model_name}_${split_id}" label 'process_single' //conda "conda-forge::python=3.8.3" @@ -7,11 +7,11 @@ process EVALUATE { // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : // 'biocontainers/python:3.8.3' }" input: - tuple val(model_name), val(split_id), path(hpam_yamls), path(pred_datas) + tuple val(model_name), val(test_mode), val(split_id), path(hpam_yamls), path(pred_datas) val metric output: - tuple val(model_name), val(split_id), path('best_hpam_combi_*.yaml'), emit: best_combis + tuple val(model_name), val(split_id), val(test_mode), path('best_hpam_combi_*.yaml'), emit: best_combis script: """ diff --git a/modules/local/params_check.nf b/modules/local/params_check.nf index 96344d8..c1db0d9 100755 --- a/modules/local/params_check.nf +++ b/modules/local/params_check.nf @@ -8,6 +8,7 @@ process PARAMS_CHECK { // 'biocontainers/python:3.8.3' }" input: + val baselines val models val test_mode val dataset_name @@ -26,11 +27,11 @@ process PARAMS_CHECK { script: // This script is bundled with the pipeline, in nf-core/drugresponseeval/bin/ """ check_params.py \\ - --models ${models.replace(',', ' ')} \\ - --test_mode $test_mode \\ + --models ${models.replace(',', ' ')} ${baselines.replace(',', ' ')} \\ + --test_mode ${test_mode.replace(',', ' ')} \\ --dataset_name $dataset_name \\ --n_cv_splits $n_cv_splits \\ - --randomization_mode $randomization_mode \\ + --randomization_mode ${randomization_mode.replace(',', ' ')} \\ --curve_curator $curve_curator \\ --response_transformation $response_transformation \\ --optim_metric $optim_metric diff --git a/modules/local/predict_full.nf b/modules/local/predict_full.nf index a160a58..bd5493f 100644 --- a/modules/local/predict_full.nf +++ b/modules/local/predict_full.nf @@ -1,5 +1,5 @@ process PREDICT_FULL { - tag "${model_name}_${split_id}" + tag "${test_mode}_${model_name}_${split_id}" label 'process_single' //conda "conda-forge::python=3.8.3" @@ -7,9 +7,8 @@ process PREDICT_FULL { // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : // 'biocontainers/python:3.8.3' }" input: - tuple val(split_id), path(split_dataset), val(model_name), path(hpam_combi) + tuple val(split_id), val(test_mode), path(split_dataset), val(model_name), path(hpam_combi) val(response_transformation) - val(test_mode) val(path_data) output: diff --git a/modules/local/randomization_test.nf b/modules/local/randomization_test.nf index 62e963f..1ff1ee8 100644 --- a/modules/local/randomization_test.nf +++ b/modules/local/randomization_test.nf @@ -1,5 +1,5 @@ process RANDOMIZATION_TEST { - tag "${model_name}_${randomization_type}" + tag "${test_mode}_${model_name}_${randomization_type}" label 'process_single' //conda "conda-forge::python=3.8.3" @@ -7,9 +7,8 @@ process RANDOMIZATION_TEST { // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : // 'biocontainers/python:3.8.3' }" input: - tuple val(model_name), val(split_id), path(split_dataset), path(best_hpams), path(randomization_views) + tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), path(randomization_views) path(path_data) - val(test_mode) val(randomization_type) val(response_transformation) diff --git a/modules/local/robustness_test.nf b/modules/local/robustness_test.nf index ba2208a..4cfd7aa 100644 --- a/modules/local/robustness_test.nf +++ b/modules/local/robustness_test.nf @@ -7,9 +7,8 @@ process ROBUSTNESS_TEST { // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : // 'biocontainers/python:3.8.3' }" input: - tuple val(split_id), path(split_dataset), val(model_name), path(best_hpams), val(robustness_iteration) + tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), val(robustness_iteration) path(path_data) - val(test_mode) val(randomization_type) val(response_transformation) diff --git a/modules/local/train_and_predict_cv.nf b/modules/local/train_and_predict_cv.nf index 79b3073..9ea64df 100644 --- a/modules/local/train_and_predict_cv.nf +++ b/modules/local/train_and_predict_cv.nf @@ -1,15 +1,14 @@ process TRAIN_AND_PREDICT_CV { - tag "$model_name" + tag "${model_name}_${test_mode}" label 'process_single' input: - tuple val(model_name), path(cv_data), path(hyperparameters) + tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters) val path_data - val test_mode val response_transformation output: - tuple val(model_name), val(cv_data.baseName), path(hyperparameters), path("prediction_dataset_*.pkl"), emit: pred_data + tuple val(model_name), val(test_mode), val(cv_data.baseName), path(hyperparameters), path("prediction_dataset_*.pkl"), emit: pred_data script: """ diff --git a/nextflow.config b/nextflow.config index a43d488..1332584 100644 --- a/nextflow.config +++ b/nextflow.config @@ -10,7 +10,8 @@ params { // For this pipeline - models = 'NaivePredictor' + baselines = 'NaivePredictor' + models = 'SimpleNeuralNetwork' test_mode = 'LPO' randomization_mode = 'None' randomization_type = 'permutation' diff --git a/nextflow_schema.json b/nextflow_schema.json index 29f3744..49159da 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -5,6 +5,24 @@ "description": "This pipeline takes a drug response prediction model architecture as input and evaluates its performance by using custom training, validation, and test sets. It compares it against existing deep learning models and baseline models. Additionally, it tests the model for overfitting, consistency, robustness, and generalization. ", "type": "object", "definitions": { + "model_options": { + "title": "Model options", + "type": "object", + "fa_icon": "fas fa-cogs", + "description": "Define the models and baselines to be tested.", + "required": ["models", "baselines"], + "properties": { + "model": { + "type": "string", + "description": "Model to be tested.", + "help_text": "Model to be tested." + }, + "baselines": { + "type": "string", + "description": "Baselines to be tested.", + "help_text": "Baselines to be tested." + } + }, "input_output_options": { "title": "Input/output options", "type": "object", diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index ff5e332..2028718 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -57,7 +57,9 @@ include { ROBUSTNESS_TEST } from '../modules/local/robustness_test' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +def test_modes = params.test_mode.split(",") def models = params.models.split(",") +def baselines = params.baselines.split(",") def randomizations = params.randomization_mode.split(",") workflow DRUGRESPONSEEVAL { @@ -67,10 +69,13 @@ workflow DRUGRESPONSEEVAL { // // SUBWORKFLOW: Read in samplesheet, validate and stage input files // - + ch_test_modes = channel.from(test_modes) ch_models = channel.from(models) + ch_baselines = channel.from(baselines) + ch_models_baselines = ch_models.concat(ch_baselines) - /*PARAMS_CHECK ( + PARAMS_CHECK ( + params.baselines, params.models, params.test_mode, params.dataset_name, @@ -79,68 +84,75 @@ workflow DRUGRESPONSEEVAL { params.curve_curator, params.response_transformation, params.optim_metric - )*/ + ) LOAD_RESPONSE(params.dataset_name, params.path_data) + ch_data = ch_test_modes.combine(LOAD_RESPONSE.out.response_dataset) + CV_SPLIT ( - LOAD_RESPONSE.out.response_dataset, - params.n_cv_splits, - params.test_mode + ch_data, + params.n_cv_splits ) + // [test_mode, [split_1.pkl, split_2.pkl, ..., split_n.pkl]] ch_cv_splits = CV_SPLIT.out.response_cv_splits HPAM_SPLIT ( - ch_models + ch_models_baselines ) + // [model_name, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml]] ch_hpam_combis = HPAM_SPLIT.out.hpam_combi - ch_model_cv = ch_models.combine(ch_cv_splits.flatten()) + // [model_name, hpam_X.yaml] ch_hpam_combis = ch_hpam_combis.transpose() + // [model_name, test_mode, split_X.pkl] + ch_model_cv = ch_models_baselines.combine(ch_cv_splits.transpose()) + + // [model_name, test_mode, split_X.pkl, hpam_X.yaml] ch_test_combis = ch_model_cv.combine(ch_hpam_combis, by: 0) TRAIN_AND_PREDICT_CV ( ch_test_combis, params.path_data, - params.test_mode, params.response_transformation ) - - ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.groupTuple(by: [0,1]) + // [model_name, test_mode, split_id, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], [prediction_dataset_0.pkl, prediction_dataset_1.pkl, ..., prediction_dataset_n.pkl]] + ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.groupTuple(by: [0,1,2]) EVALUATE ( ch_combined_hpams, params.optim_metric ) + // [split_id, test_mode, split_dataset, model_name, best_hpam_combi_X.yaml] ch_best_hpams_per_split = ch_cv_splits - .map { it -> [it, it.baseName]} + .map { test_mode, it -> [it, it.baseName, test_mode]} .transpose() - .combine(EVALUATE.out.best_combis, by: 1) + .combine(EVALUATE.out.best_combis, by: [1, 2]) PREDICT_FULL ( ch_best_hpams_per_split, params.response_transformation, - params.test_mode, params.path_data ) if (params.randomization_mode != 'None') { ch_randomization = channel.from(randomizations) + // randomizations only for models, not for baselines ch_models_rand = ch_models.combine(ch_randomization) RANDOMIZATION_SPLIT ( ch_models_rand ) - ch_best_hpams_per_split = ch_best_hpams_per_split.map { - split_id, path_to_split, model_name, path_to_hpams -> - return [model_name, split_id, path_to_split, path_to_hpams] + ch_best_hpams_per_split_rand = ch_best_hpams_per_split.map { + split_id, test_mode, path_to_split, model_name, path_to_hpams -> + return [model_name, test_mode, split_id, path_to_split, path_to_hpams] } - ch_randomization = ch_best_hpams_per_split.combine(RANDOMIZATION_SPLIT.out.randomization_test_views, by: 0) + // [model_name, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, randomization_views] + ch_randomization = ch_best_hpams_per_split_rand.combine(RANDOMIZATION_SPLIT.out.randomization_test_views, by: 0) RANDOMIZATION_TEST ( ch_randomization, params.path_data, - params.test_mode, params.randomization_type, params.response_transformation ) @@ -148,12 +160,18 @@ workflow DRUGRESPONSEEVAL { if (params.n_trials_robustness > 0) { ch_trials_robustness = Channel.from(1..params.n_trials_robustness) - ch_robustness = ch_best_hpams_per_split.combine(ch_trials_robustness) + ch_trials_robustness = ch_models.combine(ch_trials_robustness) + + ch_best_hpams_per_split_rob = ch_best_hpams_per_split.map { + split_id, test_mode, path_to_split, model_name, path_to_hpams -> + return [model_name, test_mode, split_id, path_to_split, path_to_hpams] + } + // [model_name, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, robustness_iteration] + ch_robustness = ch_best_hpams_per_split_rob.combine(ch_trials_robustness, by: 0) ROBUSTNESS_TEST ( ch_robustness, params.path_data, - params.test_mode, params.randomization_type, params.response_transformation ) From 8e47b999581b3911b057afec6c7aaf77e493fbef Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 24 May 2024 15:46:09 +0200 Subject: [PATCH 033/257] updated to drevalpy --- bin/check_params.py | 7 ++++--- bin/evaluate_and_find_max.py | 2 +- bin/hpam_split.py | 2 +- bin/load_response.py | 2 +- bin/train_and_predict_cv.py | 4 ++-- bin/train_and_predict_final.py | 8 ++++---- modules/local/randomization_split.nf | 4 ++-- 7 files changed, 15 insertions(+), 14 deletions(-) diff --git a/bin/check_params.py b/bin/check_params.py index 377fe93..63eec78 100755 --- a/bin/check_params.py +++ b/bin/check_params.py @@ -7,9 +7,10 @@ import argparse import logging import sys -from dreval.models import MODEL_FACTORY -from dreval.datasets import RESPONSE_DATASET_FACTORY -from dreval.evaluation import AVAILABLE_METRICS + +from drevalpy.models import MODEL_FACTORY +from drevalpy.datasets import RESPONSE_DATASET_FACTORY +from drevalpy.evaluation import AVAILABLE_METRICS logger = logging.getLogger() diff --git a/bin/evaluate_and_find_max.py b/bin/evaluate_and_find_max.py index b7c70ee..23d111b 100755 --- a/bin/evaluate_and_find_max.py +++ b/bin/evaluate_and_find_max.py @@ -4,7 +4,7 @@ import pickle import yaml -from dreval.experiment import evaluate +from drevalpy.experiment import evaluate def get_parser(): diff --git a/bin/hpam_split.py b/bin/hpam_split.py index 194ab1a..ca168ec 100755 --- a/bin/hpam_split.py +++ b/bin/hpam_split.py @@ -2,7 +2,7 @@ import argparse import yaml -from dreval.models import MODEL_FACTORY +from drevalpy.models import MODEL_FACTORY def get_parser(): diff --git a/bin/load_response.py b/bin/load_response.py index 17fd8e4..54350d0 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -1,6 +1,6 @@ #!/usr/bin/env python import argparse -from dreval.datasets import RESPONSE_DATASET_FACTORY +from drevalpy.datasets import RESPONSE_DATASET_FACTORY import pickle diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index 6aa0881..429d5c4 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -7,8 +7,8 @@ from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler -from dreval.models import MODEL_FACTORY -from dreval.experiment import train_and_predict +from drevalpy.models import MODEL_FACTORY +from drevalpy.experiment import train_and_predict def get_parser(): diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 1ab4fef..fb6a867 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -7,13 +7,13 @@ from typing import Dict, Optional import yaml -from dreval.datasets.dataset import DrugResponseDataset -from dreval.models.drp_model import DRPModel +from drevalpy.datasets.dataset import DrugResponseDataset +from drevalpy.models.drp_model import DRPModel from sklearn.base import TransformerMixin from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler -from dreval.models import MODEL_FACTORY -from dreval.experiment import train_and_predict +from drevalpy.models import MODEL_FACTORY +from drevalpy.experiment import train_and_predict def get_parser(): diff --git a/modules/local/randomization_split.nf b/modules/local/randomization_split.nf index 3eb6dca..028c07a 100644 --- a/modules/local/randomization_split.nf +++ b/modules/local/randomization_split.nf @@ -17,8 +17,8 @@ process RANDOMIZATION_SPLIT { #!/usr/bin/env python import pickle import yaml - from dreval.models import MODEL_FACTORY - from dreval.experiment import get_randomization_test_views + from drevalpy.models import MODEL_FACTORY + from drevalpy.experiment import get_randomization_test_views model_class = MODEL_FACTORY['${model_name}'] model = model_class(target='IC50') From 338757c18a337fdd1b9adca333bfd582052b5fd4 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 24 May 2024 17:04:00 +0200 Subject: [PATCH 034/257] updated folder structure and schema --- bin/train_and_predict_final.py | 6 +- conf/modules.config | 35 ++------- modules/local/predict_full.nf | 3 +- modules/local/randomization_test.nf | 3 +- modules/local/robustness_test.nf | 3 +- nextflow.config | 1 + nextflow_schema.json | 115 ++++++++++++++-------------- 7 files changed, 73 insertions(+), 93 deletions(-) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index fb6a867..55b893a 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -83,7 +83,7 @@ def compute_randomization( cl_features = model.load_cell_line_features(data_path=path_data, dataset_name=train_dataset.dataset_name) drug_features = model.load_drug_features(data_path=path_data, dataset_name=train_dataset.dataset_name) - randomization_test_file = f'test_dataset_{model.model_name}_{randomization_test_view["test_name"]}_{test_mode}_{split_id}.csv' + randomization_test_file = f'randomization_{randomization_test_view["test_name"]}_{split_id}.csv' cl_features_rand = cl_features.copy() drug_features_rand = drug_features.copy() @@ -122,7 +122,7 @@ def compute_robustness( trial: int, response_transformation=Optional[TransformerMixin] ): - robustness_test_file = f'test_dataset_{model.model_name}_robustness_{test_mode}_{split_id}_{trial}.csv' + robustness_test_file = f'robustness_{split_id}_{trial}.csv' train_dataset.shuffle(random_state=trial) test_dataset.shuffle(random_state=trial) if early_stopping_dataset is not None: @@ -154,7 +154,7 @@ def compute_robustness( early_stopping_dataset=es_set, response_transformation=transformation ) - prediction_dataset = f'test_dataset_{selected_model.model_name}_predictions_{args.test_mode}_{args.split_id}.csv' + prediction_dataset = f'predictions_{args.split_id}.csv' test_set.save(prediction_dataset) elif args.mode == 'randomization': with open(args.randomization_views_path, 'r') as f: diff --git a/conf/modules.config b/conf/modules.config index 482faad..7a10c59 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -13,14 +13,14 @@ process { publishDir = [ - path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + path: { "${params.outdir}/${params.run_id}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] withName: 'LOAD_RESPONSE' { publishDir = [ - path: { params.save_datasets ? "${params.outdir}/datasets" : params.outdir }, + path: { params.save_datasets ? "${params.outdir}/${params.run_id}/datasets" : params.outdir }, mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] @@ -28,7 +28,7 @@ process { withName: 'CV_SPLIT' { publishDir = [ - path: { params.save_datasets ? "${params.outdir}/datasets" : params.outdir }, + path: { params.save_datasets ? "${params.outdir}/${params.run_id}/datasets" : params.outdir }, mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] @@ -36,7 +36,7 @@ process { withName: 'HPAM_SPLIT' { publishDir = [ - path: { params.save_datasets ? "${params.outdir}/hpams" : params.outdir }, + path: { params.save_datasets ? "${params.outdir}/${params.run_id}/hpams" : params.outdir }, mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] @@ -45,7 +45,7 @@ process { withName: 'TRAIN_AND_PREDICT_CV' { publishDir = [ - path: { params.save_datasets ? "${params.outdir}/datasets" : params.outdir }, + path: { params.save_datasets ? "${params.outdir}/${params.run_id}/datasets" : params.outdir }, mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] @@ -53,39 +53,18 @@ process { withName: 'EVALUATE' { publishDir = [ - path: { params.save_datasets ? "${params.outdir}/datasets" : params.outdir }, + path: { params.save_datasets ? "${params.outdir}/${params.run_id}/datasets" : params.outdir }, mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] } - withName: 'PREDICT_FULL' { - publishDir = [ - path: "${params.outdir}/predictions", - mode: params.publish_dir_mode - ] - } - withName: 'RANDOMIZATION_SPLIT' { publishDir = [ - path: { params.save_datasets ? "${params.outdir}/datasets" : params.outdir }, + path: { params.save_datasets ? "${params.outdir}/${params.run_id}/datasets" : params.outdir }, mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] } - withName: 'RANDOMIZATION_TEST' { - publishDir = [ - path: "${params.outdir}/randomization_test", - mode: params.publish_dir_mode - ] - } - - withName: 'ROBUSTNESS_TEST' { - publishDir = [ - path: "${params.outdir}/robustness_test", - mode: params.publish_dir_mode - ] - } - } diff --git a/modules/local/predict_full.nf b/modules/local/predict_full.nf index bd5493f..d3a16ab 100644 --- a/modules/local/predict_full.nf +++ b/modules/local/predict_full.nf @@ -1,6 +1,7 @@ process PREDICT_FULL { tag "${test_mode}_${model_name}_${split_id}" label 'process_single' + publishDir "${params.outdir}/${params.run_id}/${test_mode}/${model_name}/predictions" //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -12,7 +13,7 @@ process PREDICT_FULL { val(path_data) output: - path('test_dataset_*.csv'), emit: test_dataset + path('predictions_*.csv'), emit: test_dataset script: """ diff --git a/modules/local/randomization_test.nf b/modules/local/randomization_test.nf index 1ff1ee8..c97f6d0 100644 --- a/modules/local/randomization_test.nf +++ b/modules/local/randomization_test.nf @@ -1,6 +1,7 @@ process RANDOMIZATION_TEST { tag "${test_mode}_${model_name}_${randomization_type}" label 'process_single' + publishDir "${params.outdir}/${params.run_id}/${test_mode}/${model_name}/randomization_test" //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -13,7 +14,7 @@ process RANDOMIZATION_TEST { val(response_transformation) output: - path('test_dataset_*.csv'), emit: test_dataset + path('randomization_*.csv'), emit: test_dataset script: """ diff --git a/modules/local/robustness_test.nf b/modules/local/robustness_test.nf index 4cfd7aa..03df783 100644 --- a/modules/local/robustness_test.nf +++ b/modules/local/robustness_test.nf @@ -1,6 +1,7 @@ process ROBUSTNESS_TEST { tag "${model_name}_${robustness_iteration}" label 'process_single' + publishDir "${params.outdir}/${params.run_id}/${test_mode}/${model_name}/robustness_test" //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -13,7 +14,7 @@ process ROBUSTNESS_TEST { val(response_transformation) output: - path('test_dataset_*.csv'), emit: test_dataset + path('robustness_*.csv'), emit: test_dataset script: """ diff --git a/nextflow.config b/nextflow.config index 1332584..d70c780 100644 --- a/nextflow.config +++ b/nextflow.config @@ -10,6 +10,7 @@ params { // For this pipeline + run_id = 'my_run' baselines = 'NaivePredictor' models = 'SimpleNeuralNetwork' test_mode = 'LPO' diff --git a/nextflow_schema.json b/nextflow_schema.json index 49159da..96f07e9 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -12,15 +12,16 @@ "description": "Define the models and baselines to be tested.", "required": ["models", "baselines"], "properties": { - "model": { + "models": { "type": "string", "description": "Model to be tested.", "help_text": "Model to be tested." - }, - "baselines": { - "type": "string", - "description": "Baselines to be tested.", - "help_text": "Baselines to be tested." + }, + "baselines": { + "type": "string", + "description": "Baselines to be tested.", + "help_text": "Baselines to be tested." + } } }, "input_output_options": { @@ -68,14 +69,15 @@ "default": "LPO", "help_text": "Which tests to run (LPO=Leave-random-Pairs-Out, LCO=Leave-Cell-line-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO LCO LDO' to run all tests. Default is LPO." } - } - }, + } + }, "randomization_options": { "title": "Randomization options", "type": "object", "fa_icon": "fas fa-cogs", "description": "Options for randomization.", - "randomization_mode": { + "properties": { + "randomization_mode": { "type": "string", "description": "Randomization mode for the pipeline.", "help_text": "Which randomization tests to run, additionally to the normal run. Default is None which means no randomization tests are run. Modes: SVCC, SVRC, SVCD, SVRD. Can be a list of randomization tests e.g. 'SCVC SCVD' to run two tests. Default is None. SVCC: Single View Constant for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..). For each experiment one cell line view is held constant while the others are randomized. SVRC Single View Random for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." @@ -86,62 +88,61 @@ "description": "Randomization type for the pipeline.", "help_text": "type of randomization to use. Choose from \"gaussian\", \"zeroing\", \"permutation\". Default is \"permutation" } - + } }, "robustness_options": { "title": "Robustness options", "type": "object", "fa_icon": "fas fa-cogs", "description": "Options for robustness.", - "n_trials_robustness": { - "type": "integer", - "default": 0, - "description": "Number of trials to run for the robustness test", - "help_text": "Number of trials to run for the robustness test. Default is 0, which means no robustness test is run. The robustness test is a test where the model is trained with varying seeds. This is done multiple times to see how stable the model is." + "properties": { + "n_trials_robustness": { + "type": "integer", + "default": 0, + "description": "Number of trials to run for the robustness test", + "help_text": "Number of trials to run for the robustness test. Default is 0, which means no robustness test is run. The robustness test is a test where the model is trained with varying seeds. This is done multiple times to see how stable the model is." + } } - }, "additional_options": { "title": "Additional options", "type": "object", "fa_icon": "fas fa-cogs", "description": "Additional options for the pipeline.", - "curve_curator": { - "type": "boolean", - "description": "Run the curve curator.", - "default": false, - "help_text": "Whether to run \" \"CurveCurator \" \"to sort out \" \"non-reactive \" \"curves" - }, - "overwrite": { - "type": "boolean", - "description": "Overwrite existing results.", - "default": false, - "help_text": "Whether to overwrite existing results." - }, - "optim_metric": { - "type": "string", - "description": "Optimization metric for the pipeline.", - "default": "RMSE", - "help_text": "Optimization metric for the pipeline. Default is RMSE." - }, - "n_cv_splits": { - "type": "integer", - "default": 5, - "description": "Number of cross-validation splits.", - "help_text": "Number of cross-validation splits. Default is 5." - }, - "response_transformation": { - "type": "string", - "description": "Response transformation", - "help_text": "Transformation to apply to the response variable possible values: standard, minmax, robust" - }, - "path_data": { - "type": "string", - "format": "directory-path", - "description": "Path to the data directory.", - "help_text": "Path to the data directory." - } - + "properties": { + "curve_curator": { + "type": "boolean", + "description": "Run the curve curator.", + "help_text": "Whether to run \" \"CurveCurator \" \"to sort out \" \"non-reactive \" \"curves" + }, + "overwrite": { + "type": "boolean", + "description": "Overwrite existing results.", + "help_text": "Whether to overwrite existing results." + }, + "optim_metric": { + "type": "string", + "description": "Optimization metric for the pipeline.", + "default": "RMSE", + "help_text": "Optimization metric for the pipeline. Default is RMSE." + }, + "n_cv_splits": { + "type": "integer", + "default": 5, + "description": "Number of cross-validation splits.", + "help_text": "Number of cross-validation splits. Default is 5." + }, + "response_transformation": { + "type": "string", + "description": "Response transformation", + "help_text": "Transformation to apply to the response variable possible values: standard, minmax, robust" + }, + "path_data": { + "type": "string", + "format": "directory-path", + "description": "Path to the data directory.", + "help_text": "Path to the data directory." + } } }, "institutional_config_options": { @@ -238,14 +239,12 @@ "type": "boolean", "description": "Display help text.", "fa_icon": "fas fa-question-circle", - "default": false, "hidden": true }, "version": { "type": "boolean", "description": "Display version and exit.", "fa_icon": "fas fa-question-circle", - "default": false, "hidden": true }, "publish_dir_mode": { @@ -269,14 +268,12 @@ "type": "boolean", "description": "Send plain-text email instead of HTML.", "fa_icon": "fas fa-remove-format", - "default": false, "hidden": true }, "monochrome_logs": { "type": "boolean", "description": "Do not use coloured log outputs.", "fa_icon": "fas fa-palette", - "default": false, "hidden": true }, "hook_url": { @@ -297,7 +294,6 @@ "type": "boolean", "fa_icon": "far fa-eye-slash", "description": "Show all params when using `--help`", - "default": false, "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." }, @@ -305,7 +301,6 @@ "type": "boolean", "fa_icon": "far fa-check-circle", "description": "Validation of parameters fails when an unrecognised parameter is found.", - "default": false, "hidden": true, "help_text": "By default, when an unrecognised parameter is found, it returns a warinig." }, @@ -313,7 +308,6 @@ "type": "boolean", "fa_icon": "far fa-check-circle", "description": "Validation of parameters in lenient more.", - "default": false, "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)." } @@ -321,6 +315,9 @@ } }, "allOf": [ + { + "$ref": "#/definitions/model_options" + }, { "$ref": "#/definitions/input_output_options" }, From 513987b7b35439b13f271c9975c961432f4876fb Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 12 Jun 2024 13:27:12 +0200 Subject: [PATCH 035/257] implemented final evaluation per file and collection of results into the 4 expected output files --- bin/collect_results.py | 54 +++++++++++ bin/evaluate_final.py | 95 +++++++++++++++++++ bin/train_and_predict_final.py | 2 +- conf/modules.config | 2 +- modules/local/collect_results.nf | 26 +++++ modules/local/evaluate_final.nf | 25 +++++ .../{evaluate.nf => evaluate_find_max.nf} | 2 +- modules/local/parse_results.nf | 27 ++++++ modules/local/predict_full.nf | 2 +- modules/local/randomization_test.nf | 2 +- modules/local/robustness_test.nf | 2 +- workflows/drugresponseeval.nf | 29 +++++- 12 files changed, 259 insertions(+), 9 deletions(-) create mode 100755 bin/collect_results.py create mode 100755 bin/evaluate_final.py create mode 100644 modules/local/collect_results.nf create mode 100644 modules/local/evaluate_final.nf rename modules/local/{evaluate.nf => evaluate_find_max.nf} (96%) create mode 100644 modules/local/parse_results.nf diff --git a/bin/collect_results.py b/bin/collect_results.py new file mode 100755 index 0000000..9cdf5da --- /dev/null +++ b/bin/collect_results.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +import argparse +import pandas as pd + + +def get_parser(): + parser = argparse.ArgumentParser(description='Collect results and write to single files.') + parser.add_argument('--outfiles', type=str, nargs='+', required=True, help='Output files.') + return parser + + +def collapse_file(files): + out_df = None + for file in files: + if out_df is None: + out_df = pd.read_csv(file, index_col=0) + else: + out_df = pd.concat([out_df, pd.read_csv(file, index_col=0)]) + return out_df + + +if __name__ == "__main__": + args = get_parser().parse_args() + # get all files with the pattern f'{model_name}_evaluation_results.csv' from args.outfiles + eval_result_files = [file for file in args.outfiles if 'evaluation_results.csv' in file] + # get all files with the pattern f'{model_name}_evaluation_results_per_drug.csv' from args.outfiles + eval_result_per_drug_files = [file for file in args.outfiles if 'evaluation_results_per_drug.csv' in file] + # get all files with the pattern f'{model_name}_evaluation_results_per_cl.csv' from args.outfiles + eval_result_per_cl_files = [file for file in args.outfiles if 'evaluation_results_per_cl.csv' in file] + # get all files with the pattern f'{model_name}_true_vs_pred.csv' from args.outfiles + true_vs_pred_files = [file for file in args.outfiles if 'true_vs_pred.csv' in file] + + eval_results = collapse_file(eval_result_files) + eval_results_per_drug = collapse_file(eval_result_per_drug_files) + eval_results_per_cell_line = collapse_file(eval_result_per_cl_files) + t_vs_p = collapse_file(true_vs_pred_files) + + new_columns = eval_results.index.str.split('_', expand=True).to_frame() + new_columns.columns = ['algorithm', 'rand_setting', 'LPO_LCO_LDO', 'split', 'CV_split'] + new_columns.index = eval_results.index + eval_results = pd.concat([new_columns.drop('split', axis=1), eval_results], axis=1) + eval_results_per_drug[['algorithm', 'rand_setting', 'LPO_LCO_LDO', 'split', 'CV_split']] = eval_results_per_drug[ + 'model'].str.split( + '_', expand=True) + eval_results_per_cell_line[['algorithm', 'rand_setting', 'LPO_LCO_LDO', 'split', 'CV_split']] = \ + eval_results_per_cell_line['model'].str.split( + '_', expand=True) + t_vs_p[['algorithm', 'rand_setting', 'LPO_LCO_LDO', 'split', 'CV_split']] = t_vs_p['model'].str.split( + '_', expand=True) + + eval_results.to_csv('evaluation_results.csv', index=True) + eval_results_per_drug.to_csv('evaluation_results_per_drug.csv', index=True) + eval_results_per_cell_line.to_csv('evaluation_results_per_cl.csv', index=True) + t_vs_p.to_csv('true_vs_pred.csv', index=True) diff --git a/bin/evaluate_final.py b/bin/evaluate_final.py new file mode 100755 index 0000000..4cb889e --- /dev/null +++ b/bin/evaluate_final.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python +import os +import argparse +import pandas as pd + +from drevalpy.datasets.dataset import DrugResponseDataset +from drevalpy.evaluation import evaluate, AVAILABLE_METRICS +from drevalpy.visualization.utils import evaluate_per_group + + +def get_parser(): + parser = argparse.ArgumentParser(description='Evaluate the predictions from the final model.') + parser.add_argument('--test_mode', type=str, default='LPO', help='Test mode (LPO, LCO, LDO).') + parser.add_argument('--model_name', type=str, required=True, help='Model name.') + parser.add_argument('--pred_file', type=str, required=True, help='Path to predictions.') + return parser + + +def generate_name(test_mode, model_name, pred_file): + pred_rand_rob = os.path.basename(pred_file).split('_')[0] + if pred_rand_rob == 'predictions': + pred_setting = 'predictions' + elif pred_rand_rob == 'randomization': + pred_setting = 'randomize-' + '-'.join(os.path.basename(pred_file).split('_')[1:-2]) + else: + pred_setting = "-".join(os.path.basename(pred_file).split('_')[:2]) + split = '_'.join(os.path.basename(pred_file).split('.')[0].split('_')[-2:]) + return f'{model_name}_{pred_setting}_{test_mode}_{split}' + + +def evaluate_file(test_mode, model_name, pred_file): + print('Parsing file:', os.path.normpath(pred_file)) + result = pd.read_csv(pred_file) + dataset = DrugResponseDataset( + response=result['response'], + cell_line_ids=result['cell_line_ids'], + drug_ids=result['drug_ids'], + predictions=result['predictions'] + ) + model = generate_name(test_mode, model_name, pred_file) + overall_eval = {model: evaluate(dataset, AVAILABLE_METRICS.keys())} + true_vs_pred = pd.DataFrame({ + 'model': [model for _ in range(len(dataset.response))], + 'drug': dataset.drug_ids, + 'cell_line': dataset.cell_line_ids, + 'y_true': dataset.response, + 'y_pred': dataset.predictions}) + + evaluation_results_per_drug = None + evaluation_results_per_cl = None + norm_drug_eval_results = {} + norm_cl_eval_results = {} + if 'LPO' == test_mode or 'LCO' == test_mode: + norm_drug_eval_results, evaluation_results_per_drug = evaluate_per_group(df=true_vs_pred, + group_by='drug', + norm_group_eval_results=norm_drug_eval_results, + eval_results_per_group=evaluation_results_per_drug, + model=model) + if 'LPO' == test_mode or 'LDO' == test_mode: + norm_cl_eval_results, evaluation_results_per_cl = evaluate_per_group(df=true_vs_pred, + group_by='cell_line', + norm_group_eval_results=norm_cl_eval_results, + eval_results_per_group=evaluation_results_per_cl, + model=model) + overall_eval = pd.DataFrame.from_dict(overall_eval, orient='index') + if norm_drug_eval_results != {}: + overall_eval = concat_results(norm_drug_eval_results, 'drug', overall_eval) + if norm_cl_eval_results != {}: + overall_eval = concat_results(norm_cl_eval_results, 'cell_line', overall_eval) + + return overall_eval, evaluation_results_per_drug, evaluation_results_per_cl, true_vs_pred, model + + +def write_results(overall_eval, evaluation_results_per_drug, evaluation_results_per_cl, true_vs_pred, model_name): + overall_eval.to_csv(f'{model_name}_evaluation_results.csv') + if evaluation_results_per_drug is not None: + evaluation_results_per_drug.to_csv(f'{model_name}_evaluation_results_per_drug.csv') + if evaluation_results_per_cl is not None: + evaluation_results_per_cl.to_csv(f'{model_name}_evaluation_results_per_cl.csv') + true_vs_pred.to_csv(f'{model_name}_true_vs_pred.csv') + + +def concat_results(norm_group_res, group_by, eval_res): + norm_group_res = pd.DataFrame.from_dict(norm_group_res, orient='index') + # append 'group normalized ' to the column names + norm_group_res.columns = [f'{col}: {group_by} normalized' for col in norm_group_res.columns] + eval_res = pd.concat([eval_res, norm_group_res], axis=1) + return eval_res + + +if __name__ == "__main__": + args = get_parser().parse_args() + results_all, eval_res_d, eval_res_cl, t_vs_pred, mname = evaluate_file(args.test_mode, args.model_name, args.pred_file) + write_results(results_all, eval_res_d, eval_res_cl, t_vs_pred, mname) + diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 55b893a..60e94cb 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -122,7 +122,7 @@ def compute_robustness( trial: int, response_transformation=Optional[TransformerMixin] ): - robustness_test_file = f'robustness_{split_id}_{trial}.csv' + robustness_test_file = f'robustness_{trial}_{split_id}.csv' train_dataset.shuffle(random_state=trial) test_dataset.shuffle(random_state=trial) if early_stopping_dataset is not None: diff --git a/conf/modules.config b/conf/modules.config index 7a10c59..050035a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -51,7 +51,7 @@ process { ] } - withName: 'EVALUATE' { + withName: 'EVALUATE_FIND_MAX' { publishDir = [ path: { params.save_datasets ? "${params.outdir}/${params.run_id}/datasets" : params.outdir }, mode: params.publish_dir_mode, diff --git a/modules/local/collect_results.nf b/modules/local/collect_results.nf new file mode 100644 index 0000000..d140ec4 --- /dev/null +++ b/modules/local/collect_results.nf @@ -0,0 +1,26 @@ +process COLLECT_RESULTS { + //tag "${test_mode}_${model_name}_${pred_file}" + label 'process_single' + publishDir "${params.outdir}/${params.run_id}" + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + path(outfiles) + + output: + path('evaluation_results.csv'), emit: evaluation_results + path('evaluation_results_per_drug.csv'), emit: evaluation_results_per_drug + path('evaluation_results_per_cl.csv'), emit: evaluation_results_per_cl + path('true_vs_pred.csv'), emit: true_vs_pred + + script: + """ + collect_results.py \\ + --outfiles $outfiles + """ + +} diff --git a/modules/local/evaluate_final.nf b/modules/local/evaluate_final.nf new file mode 100644 index 0000000..f509944 --- /dev/null +++ b/modules/local/evaluate_final.nf @@ -0,0 +1,25 @@ +process EVALUATE_FINAL { + tag "${test_mode}_${model_name}_${pred_file}" + label 'process_single' + //publishDir "${params.outdir}/${params.run_id}" + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + tuple val(test_mode), val(model_name), path(pred_file) + + output: + path('*.csv'), emit: ch_individual_results + + script: + """ + evaluate_final.py \\ + --test_mode $test_mode \\ + --model_name $model_name \\ + --pred_file $pred_file + """ + +} diff --git a/modules/local/evaluate.nf b/modules/local/evaluate_find_max.nf similarity index 96% rename from modules/local/evaluate.nf rename to modules/local/evaluate_find_max.nf index 8f946de..31e4f6e 100644 --- a/modules/local/evaluate.nf +++ b/modules/local/evaluate_find_max.nf @@ -1,4 +1,4 @@ -process EVALUATE { +process EVALUATE_FIND_MAX { tag "${test_mode}_${model_name}_${split_id}" label 'process_single' diff --git a/modules/local/parse_results.nf b/modules/local/parse_results.nf new file mode 100644 index 0000000..35e0316 --- /dev/null +++ b/modules/local/parse_results.nf @@ -0,0 +1,27 @@ +process PARSE_RESULTS { + //tag "${test_mode}_${model_name}_${split_id}" + label 'process_single' + publishDir "${params.outdir}/${params.run_id}" + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + path(outfiles) + val(run_id) + val(outdir) + + output: + path('evaluation_*.csv'), emit: all_results + + script: + """ + #!/usr/bin/env python + import os + from drevalpy.visualization.utils import prep_results + prep_results(path_to_results="${outdir}/${run_id}", path_out="") + """ + +} diff --git a/modules/local/predict_full.nf b/modules/local/predict_full.nf index d3a16ab..815c85e 100644 --- a/modules/local/predict_full.nf +++ b/modules/local/predict_full.nf @@ -13,7 +13,7 @@ process PREDICT_FULL { val(path_data) output: - path('predictions_*.csv'), emit: test_dataset + tuple val(test_mode), val(model_name), path('predictions_*.csv'), emit: ch_vis script: """ diff --git a/modules/local/randomization_test.nf b/modules/local/randomization_test.nf index c97f6d0..3a20510 100644 --- a/modules/local/randomization_test.nf +++ b/modules/local/randomization_test.nf @@ -14,7 +14,7 @@ process RANDOMIZATION_TEST { val(response_transformation) output: - path('randomization_*.csv'), emit: test_dataset + tuple val(test_mode), val(model_name), path('randomization_*.csv'), emit: ch_vis script: """ diff --git a/modules/local/robustness_test.nf b/modules/local/robustness_test.nf index 03df783..0b3aec1 100644 --- a/modules/local/robustness_test.nf +++ b/modules/local/robustness_test.nf @@ -14,7 +14,7 @@ process ROBUSTNESS_TEST { val(response_transformation) output: - path('robustness_*.csv'), emit: test_dataset + tuple val(test_mode), val(model_name), path('robustness_*.csv'), emit: ch_vis script: """ diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 2028718..3ee787d 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -31,11 +31,14 @@ include { LOAD_RESPONSE } from '../modules/local/load_response' include { CV_SPLIT } from '../modules/local/cv_split' include { HPAM_SPLIT } from '../modules/local/hpam_split' include { TRAIN_AND_PREDICT_CV } from '../modules/local/train_and_predict_cv' -include { EVALUATE } from '../modules/local/evaluate' +include { EVALUATE_FIND_MAX } from '../modules/local/evaluate_find_max' include { PREDICT_FULL } from '../modules/local/predict_full' include { RANDOMIZATION_SPLIT } from '../modules/local/randomization_split' include { RANDOMIZATION_TEST } from '../modules/local/randomization_test' include { ROBUSTNESS_TEST } from '../modules/local/robustness_test' +include { EVALUATE_FINAL } from '../modules/local/evaluate_final' +include { COLLECT_RESULTS } from '../modules/local/collect_results' +include { PARSE_RESULTS } from '../modules/local/parse_results' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // @@ -61,6 +64,7 @@ def test_modes = params.test_mode.split(",") def models = params.models.split(",") def baselines = params.baselines.split(",") def randomizations = params.randomization_mode.split(",") +def outdirPath = new File(params.outdir).getAbsolutePath() workflow DRUGRESPONSEEVAL { @@ -120,7 +124,7 @@ workflow DRUGRESPONSEEVAL { // [model_name, test_mode, split_id, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], [prediction_dataset_0.pkl, prediction_dataset_1.pkl, ..., prediction_dataset_n.pkl]] ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.groupTuple(by: [0,1,2]) - EVALUATE ( + EVALUATE_FIND_MAX ( ch_combined_hpams, params.optim_metric ) @@ -129,13 +133,14 @@ workflow DRUGRESPONSEEVAL { ch_best_hpams_per_split = ch_cv_splits .map { test_mode, it -> [it, it.baseName, test_mode]} .transpose() - .combine(EVALUATE.out.best_combis, by: [1, 2]) + .combine(EVALUATE_FIND_MAX.out.best_combis, by: [1, 2]) PREDICT_FULL ( ch_best_hpams_per_split, params.response_transformation, params.path_data ) + ch_vis = PREDICT_FULL.out.ch_vis if (params.randomization_mode != 'None') { ch_randomization = channel.from(randomizations) @@ -156,6 +161,7 @@ workflow DRUGRESPONSEEVAL { params.randomization_type, params.response_transformation ) + ch_vis = ch_vis.concat(RANDOMIZATION_TEST.out.ch_vis) } if (params.n_trials_robustness > 0) { @@ -175,7 +181,24 @@ workflow DRUGRESPONSEEVAL { params.randomization_type, params.response_transformation ) + ch_vis = ch_vis.concat(ROBUSTNESS_TEST.out.ch_vis) } + + EVALUATE_FINAL ( + ch_vis + ) + + ch_collapse = EVALUATE_FINAL.out.ch_individual_results.collect() + + COLLECT_RESULTS ( + ch_collapse + ) + + /*PARSE_RESULTS ( + ch_vis.count(), + params.run_id, + outdirPath + )*/ } /* From bd1a3d771de6ff0070726888e8123fc0113727f7 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 12 Jun 2024 14:34:34 +0200 Subject: [PATCH 036/257] heatmap and violin plots done --- bin/draw_violin_and_heatmap.py | 47 ++++++++++++++++++++++++++++++++++ modules/local/draw_heatmap.nf | 26 +++++++++++++++++++ modules/local/draw_violin.nf | 26 +++++++++++++++++++ modules/local/parse_results.nf | 27 ------------------- workflows/drugresponseeval.nf | 22 +++++++++++----- 5 files changed, 115 insertions(+), 33 deletions(-) create mode 100755 bin/draw_violin_and_heatmap.py create mode 100644 modules/local/draw_heatmap.nf create mode 100644 modules/local/draw_violin.nf delete mode 100644 modules/local/parse_results.nf diff --git a/bin/draw_violin_and_heatmap.py b/bin/draw_violin_and_heatmap.py new file mode 100755 index 0000000..0c6feba --- /dev/null +++ b/bin/draw_violin_and_heatmap.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +import argparse +import pandas as pd + +from drevalpy.visualization.violin import Violin +from drevalpy.visualization.heatmap import Heatmap + + +def get_parser(): + parser = argparse.ArgumentParser(description='Draw violin plots.') + parser.add_argument('--plot', type=str, default='violinplot', help='Type of plot (violin or heatmap).') + parser.add_argument('--name', type=str, required=True, help='Name/Setting of violin plot.') + parser.add_argument('--data', type=str, required=True, help='Path to data.') + return parser + + +def draw_violin_or_heatmap(plot_type: str, path_to_df: str, setting: str): + df = pd.read_csv(path_to_df, index_col=0) + if setting in ['LPO', 'LDO', 'LCO', 'LPO_normalized', 'LDO_normalized', 'LCO_normalized']: + # subset df such that the column 'LPO_LCO_LDO' == setting and the column 'rand_setting' == 'predictions' + df = df[(df['LPO_LCO_LDO'] == setting) & (df['rand_setting'] == 'predictions')] + if setting in ['LPO', 'LDO', 'LCO']: + if plot_type == 'violinplot': + out_plot = Violin(df=df, normalized_metrics=False, whole_name=False) + else: + out_plot = Heatmap(df=df, normalized_metrics=False, whole_name=False) + else: + if plot_type == 'violinplot': + out_plot = Violin(df=df, normalized_metrics=True, whole_name=False) + else: + out_plot = Heatmap(df=df, normalized_metrics=True, whole_name=False) + else: + name_split = setting.split('_') + lpo_lco_ldo = name_split[0] + algorithm = name_split[1] + # subset df such that the column 'LPO_LCO_LDO' == lpo_lco_ldo and the column 'algorithm' == algorithm + df = df[(df['LPO_LCO_LDO'] == lpo_lco_ldo) & (df['algorithm'] == algorithm)] + if plot_type == 'violinplot': + out_plot = Violin(df=df, normalized_metrics=False, whole_name=True) + else: + out_plot = Heatmap(df=df, normalized_metrics=False, whole_name=True) + out_plot.fig.write_html(f'{plot_type}_{setting}.html') + + +if __name__ == "__main__": + args = get_parser().parse_args() + draw_violin_or_heatmap(args.plot, args.data, args.name) diff --git a/modules/local/draw_heatmap.nf b/modules/local/draw_heatmap.nf new file mode 100644 index 0000000..6804a6a --- /dev/null +++ b/modules/local/draw_heatmap.nf @@ -0,0 +1,26 @@ +process DRAW_HEATMAP { + tag "${name}" + label 'process_single' + publishDir "${params.outdir}/${params.run_id}/heatmaps" + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + val(name) + path(eval_results) + + output: + path('heatmap*.html'), emit: heatmap + + script: + """ + draw_violin_and_heatmap.py \\ + --plot heatmap \\ + --name $name \\ + --data $eval_results + """ + +} diff --git a/modules/local/draw_violin.nf b/modules/local/draw_violin.nf new file mode 100644 index 0000000..6ae6bb7 --- /dev/null +++ b/modules/local/draw_violin.nf @@ -0,0 +1,26 @@ +process DRAW_VIOLIN { + tag "${name}" + label 'process_single' + publishDir "${params.outdir}/${params.run_id}/violin_plots" + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + val(name) + path(eval_results) + + output: + path('violinplot*.html'), emit: violin_plot + + script: + """ + draw_violin_and_heatmap.py \\ + --plot violinplot \\ + --name $name \\ + --data $eval_results + """ + +} diff --git a/modules/local/parse_results.nf b/modules/local/parse_results.nf deleted file mode 100644 index 35e0316..0000000 --- a/modules/local/parse_results.nf +++ /dev/null @@ -1,27 +0,0 @@ -process PARSE_RESULTS { - //tag "${test_mode}_${model_name}_${split_id}" - label 'process_single' - publishDir "${params.outdir}/${params.run_id}" - - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" - - input: - path(outfiles) - val(run_id) - val(outdir) - - output: - path('evaluation_*.csv'), emit: all_results - - script: - """ - #!/usr/bin/env python - import os - from drevalpy.visualization.utils import prep_results - prep_results(path_to_results="${outdir}/${run_id}", path_out="") - """ - -} diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 3ee787d..1d18e03 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -38,7 +38,8 @@ include { RANDOMIZATION_TEST } from '../modules/local/randomization_test' include { ROBUSTNESS_TEST } from '../modules/local/robustness_test' include { EVALUATE_FINAL } from '../modules/local/evaluate_final' include { COLLECT_RESULTS } from '../modules/local/collect_results' -include { PARSE_RESULTS } from '../modules/local/parse_results' +include { DRAW_VIOLIN } from '../modules/local/draw_violin' +include { DRAW_HEATMAP } from '../modules/local/draw_heatmap' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // @@ -194,11 +195,20 @@ workflow DRUGRESPONSEEVAL { ch_collapse ) - /*PARSE_RESULTS ( - ch_vis.count(), - params.run_id, - outdirPath - )*/ + ch_test_modes_normalized = ch_test_modes.map { it + "_normalized" } + ch_combined = ch_test_modes.combine(ch_models_baselines) + ch_combined_mapped = ch_combined.map { it[0] + "_" + it[1] } + ch_vio_heat = ch_test_modes.concat(ch_test_modes_normalized).concat(ch_combined_mapped) + + DRAW_VIOLIN ( + ch_vio_heat, + COLLECT_RESULTS.out.evaluation_results + ) + + DRAW_HEATMAP ( + ch_vio_heat, + COLLECT_RESULTS.out.evaluation_results + ) } /* From 61a1c56135d0b495cdbfb6e9bde610697f5713a3 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 14 Jun 2024 14:38:16 +0200 Subject: [PATCH 037/257] visualization part done --- bin/draw_corr_comp.py | 39 ++++++++++++++ bin/draw_violin_and_heatmap.py | 4 +- bin/write_html.py | 91 ++++++++++++++++++++++++++++++++ modules/local/draw_corr_comp.nf | 24 +++++++++ modules/local/draw_regression.nf | 40 ++++++++++++++ modules/local/save_tables.nf | 76 ++++++++++++++++++++++++++ modules/local/write_html.nf | 27 ++++++++++ modules/local/write_index.nf | 54 +++++++++++++++++++ workflows/drugresponseeval.nf | 89 +++++++++++++++++++++++++++++++ 9 files changed, 442 insertions(+), 2 deletions(-) create mode 100755 bin/draw_corr_comp.py create mode 100755 bin/write_html.py create mode 100644 modules/local/draw_corr_comp.nf create mode 100644 modules/local/draw_regression.nf create mode 100644 modules/local/save_tables.nf create mode 100644 modules/local/write_html.nf create mode 100644 modules/local/write_index.nf diff --git a/bin/draw_corr_comp.py b/bin/draw_corr_comp.py new file mode 100755 index 0000000..a781aaa --- /dev/null +++ b/bin/draw_corr_comp.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +import argparse +import pandas as pd + +from drevalpy.visualization.corr_comp_scatter import CorrelationComparisonScatter +from drevalpy.models import MODEL_FACTORY + + +def get_parser(): + parser = argparse.ArgumentParser(description='Draw violin plots.') + parser.add_argument('--name', type=str, required=True, help='Name/Setting of plot.') + parser.add_argument('--data', type=str, required=True, help='Path to data.') + return parser + + +def draw_corr_comp(path_to_df: str, setting: str): + df = pd.read_csv(path_to_df, index_col=0) + # extract which lpo_ldo_lco setting is used + lpo_lco_ldo = [name for name in ['LPO', 'LDO', 'LCO'] if name in setting][0] + # if setting ends with _drug, set group_by to 'drug' + group_by = 'drug' if setting.endswith('_drug') else 'cell_line' + # if one of the names in model factory occurs in the setting, subset df accordingly + if any(name in setting for name in MODEL_FACTORY): + # get the name of the algorithm + algorithm = setting.split('_')[0] + # subset df such that the column 'algorithm' == algorithm + df = df[(df['LPO_LCO_LDO'] == lpo_lco_ldo) & (df['algorithm'] == algorithm)] + corr_comp = CorrelationComparisonScatter(df=df, color_by=group_by) + else: + # subset df such that the column 'LPO_LCO_LDO' == lpo_lco_ldo + df = df[(df['LPO_LCO_LDO'] == lpo_lco_ldo) & (df['rand_setting'] == 'predictions')] + corr_comp = CorrelationComparisonScatter(df=df, color_by=group_by) + corr_comp.dropdown_fig.write_html(f'corr_comp_scatter_{setting}.html') + corr_comp.fig_overall.write_html(f'corr_comp_scatter_overall_{setting}.html') + + +if __name__ == "__main__": + args = get_parser().parse_args() + draw_corr_comp(args.data, args.name) diff --git a/bin/draw_violin_and_heatmap.py b/bin/draw_violin_and_heatmap.py index 0c6feba..64ef3ae 100755 --- a/bin/draw_violin_and_heatmap.py +++ b/bin/draw_violin_and_heatmap.py @@ -7,9 +7,9 @@ def get_parser(): - parser = argparse.ArgumentParser(description='Draw violin plots.') + parser = argparse.ArgumentParser(description='Draw violin plots or heatmaps.') parser.add_argument('--plot', type=str, default='violinplot', help='Type of plot (violin or heatmap).') - parser.add_argument('--name', type=str, required=True, help='Name/Setting of violin plot.') + parser.add_argument('--name', type=str, required=True, help='Name/Setting of plot.') parser.add_argument('--data', type=str, required=True, help='Path to data.') return parser diff --git a/bin/write_html.py b/bin/write_html.py new file mode 100755 index 0000000..23c97fc --- /dev/null +++ b/bin/write_html.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python +import argparse +import shutil +import importlib.resources as pkg_resources + +from drevalpy.visualization.utils import parse_layout, write_violins_and_heatmaps, write_scatter_eval_models + + +def get_parser(): + parser = argparse.ArgumentParser(description="Write individual LCO/LDO/LPO html files.") + parser.add_argument("--run_id", type=str, required=True, help="Run ID.") + parser.add_argument("--test_mode", type=str, required=True, help="LPO, LDO, or LCO.") + parser.add_argument("--files", type=str, nargs="+", required=True, help="Paths to files.") + return parser + + +def get_plot_list(files: list, lpo_lco_ldo: str, plot_type: str): + return [ + f + for f in files + if lpo_lco_ldo in f + and f.startswith(plot_type) + and f != f"{plot_type}_{lpo_lco_ldo}.html" + and f != f"{plot_type}_{lpo_lco_ldo}_normalized.html" + ] + + +def write_table(f, table): + with open(table, "r") as eval_f: + eval_results = eval_f.readlines() + eval_results[0] = eval_results[0].replace( + '', + '
', + ) + for line in eval_results: + f.write(line) + + +def write_html(run_id: str, lpo_lco_ldo: str, files: list): + favicon_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/favicon.png")) + logo_path = str( + pkg_resources.files("drevalpy").joinpath("visualization/style_utils/nf-core-drugresponseeval_logo_light.png") + ) + page_layout = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/page_layout.html")) + shutil.copyfile(favicon_path, "favicon.png") + shutil.copyfile(logo_path, "nf-core-drugresponseeval_logo_light.png") + + with open(f"{lpo_lco_ldo}.html", "w") as f: + parse_layout(f=f, path_to_layout=page_layout) + f.write(f"

Results for {run_id}: {lpo_lco_ldo}

\n") + + plot_list = get_plot_list(files=files, lpo_lco_ldo=lpo_lco_ldo, plot_type="violinplot") + write_violins_and_heatmaps(f=f, setting=lpo_lco_ldo, plot_list=plot_list, plot='Violin') + plot_list = get_plot_list(files=files, lpo_lco_ldo=lpo_lco_ldo, plot_type="heatmap") + write_violins_and_heatmaps(f=f, setting=lpo_lco_ldo, plot_list=plot_list, plot='Heatmap') + + f.write('

Regression plots

\n') + f.write("
    \n") + regr_files = [f for f in files if lpo_lco_ldo in f and f.startswith("regression_lines")] + for regr_file in regr_files: + f.write(f'
  • {regr_file}
  • \n') + f.write("
\n") + + f.write('

Comparison of correlation metrics

\n') + corr_files = [f for f in files if lpo_lco_ldo in f and f.startswith("corr_comp_scatter") and f.endswith("drug.html")] + write_scatter_eval_models(f=f, setting=lpo_lco_ldo, group_by="drug", plot_list=corr_files) + corr_files = [f for f in files if lpo_lco_ldo in f and f.startswith("corr_comp_scatter") and f.endswith("cell_line.html")] + write_scatter_eval_models(f=f, setting=lpo_lco_ldo, group_by="cell_line", plot_list=corr_files) + + f.write('

Evaluation Results Table

\n') + whole_table = [f for f in files if f == f'table_{lpo_lco_ldo}.html'][0] + write_table(f=f, table=whole_table) + + if lpo_lco_ldo != "LCO": + f.write("

Evaluation Results per Cell Line Table

\n") + cell_line_table = [f for f in files if f == f'table_{lpo_lco_ldo}_per_cl.html'][0] + write_table(f=f, table=cell_line_table) + + if lpo_lco_ldo != "LDO": + f.write("

Evaluation Results per Drug Table

\n") + drug_table = [f for f in files if f == f'table_{lpo_lco_ldo}_per_drug.html'][0] + write_table(f=f, table=drug_table) + + f.write("\n") + f.write("\n") + f.write("\n") + + +if __name__ == "__main__": + args = get_parser().parse_args() + write_html(args.run_id, args.test_mode, args.files) diff --git a/modules/local/draw_corr_comp.nf b/modules/local/draw_corr_comp.nf new file mode 100644 index 0000000..cf9b7cd --- /dev/null +++ b/modules/local/draw_corr_comp.nf @@ -0,0 +1,24 @@ +process DRAW_CORR_COMP { + tag "${name}" + label 'process_single' + publishDir "${params.outdir}/${params.run_id}/corr_comp_scatter" + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + tuple val(name), path(eval_results_per_group) + + output: + path('corr_comp_scatter*.html'), emit: corr_comp_scatter + + script: + """ + draw_corr_comp.py \\ + --name $name \\ + --data $eval_results_per_group + """ + +} diff --git a/modules/local/draw_regression.nf b/modules/local/draw_regression.nf new file mode 100644 index 0000000..db7fed3 --- /dev/null +++ b/modules/local/draw_regression.nf @@ -0,0 +1,40 @@ +process DRAW_REGRESSION { + tag "${name}_${model}" + label 'process_single' + publishDir "${params.outdir}/${params.run_id}/regression_plots" + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + tuple val(name), val(model), path(true_vs_pred) + + output: + path('regression_lines*.html'), emit: regression_lines + + script: + """ + #!/usr/bin/env python + import pandas as pd + from drevalpy.visualization.regression_slider_plot import RegressionSliderPlot + + name_split = '${name}'.split('_') + lpo_lco_ldo = name_split[0] + group_by = name_split[1] + if group_by == 'cell': + group_by = 'cell_line' + normalized = '${name}'.endswith('normalized') + true_vs_pred = pd.read_csv('${true_vs_pred}') + true_vs_pred = true_vs_pred[(true_vs_pred['LPO_LCO_LDO'] == lpo_lco_ldo) & (true_vs_pred['algorithm'] == '${model}')] + + regr_slider = RegressionSliderPlot( + df=true_vs_pred, + group_by=group_by, + normalize=normalized + ) + regr_slider.fig.write_html('regression_lines_${name}_${model}.html') + """ + +} diff --git a/modules/local/save_tables.nf b/modules/local/save_tables.nf new file mode 100644 index 0000000..20118d0 --- /dev/null +++ b/modules/local/save_tables.nf @@ -0,0 +1,76 @@ +process SAVE_TABLES { + tag "${lpo_lco_ldo}_${eval_results}" + label 'process_single' + publishDir "${params.outdir}/${params.run_id}/html_tables" + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + tuple val(lpo_lco_ldo), path(eval_results) + + output: + path('table*.html'), emit: html_table + + script: + """ + #!/usr/bin/env python + import pandas as pd + + df = pd.read_csv('${eval_results}') + df = df[df['LPO_LCO_LDO'] == '${lpo_lco_ldo}'] + + selected_columns = [ + "algorithm", + "rand_setting", + "CV_split", + "MSE", + "R^2", + "Pearson", + "RMSE", + "MAE", + "Spearman", + "Kendall", + "Partial_Correlation", + "LPO_LCO_LDO" + ] + + if 'per_drug' in '${eval_results}': + extra = '_per_drug' + selected_columns = ['drug'] + selected_columns + elif 'per_cl' in '${eval_results}': + extra = '_per_cl' + selected_columns = ['cell_line'] + selected_columns + else: + extra = '' + selected_columns = [ + "algorithm", + "rand_setting", + "CV_split", + "MSE", + "R^2", + "Pearson", + "R^2: drug normalized", + "Pearson: drug normalized", + "R^2: cell_line normalized", + "Pearson: cell_line normalized", + "RMSE", + "MAE", + "Spearman", + "Kendall", + "Partial_Correlation", + "Spearman: drug normalized", + "Kendall: drug normalized", + "Partial_Correlation: drug normalized", + "Spearman: cell_line normalized", + "Kendall: cell_line normalized", + "Partial_Correlation: cell_line normalized", + "LPO_LCO_LDO" + ] + df = df[selected_columns] + df.to_html(f'table_${lpo_lco_ldo}{extra}.html', index=False) + """ + +} diff --git a/modules/local/write_html.nf b/modules/local/write_html.nf new file mode 100644 index 0000000..30e456a --- /dev/null +++ b/modules/local/write_html.nf @@ -0,0 +1,27 @@ +process WRITE_HTML { + tag "${test_mode}" + label 'process_single' + publishDir "${params.outdir}/${params.run_id}" + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + val(run_id) + tuple val(test_mode), path(files) + + output: + path('*.html'), emit: html_out + path('*.png'), emit: graphic_elements + + script: + """ + write_html.py \\ + --run_id $run_id \\ + --test_mode $test_mode \\ + --files $files + """ + +} diff --git a/modules/local/write_index.nf b/modules/local/write_index.nf new file mode 100644 index 0000000..012b2a8 --- /dev/null +++ b/modules/local/write_index.nf @@ -0,0 +1,54 @@ +process WRITE_INDEX { + //tag "index" + label 'process_single' + publishDir "${params.outdir}/${params.run_id}" + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + val(run_id) + val(test_modes) + + output: + path('*.html'), emit: html_out + path('*.png'), emit: graphic_elements + + script: + """ + #!/usr/bin/env python + import shutil + import importlib.resources as pkg_resources + from drevalpy.visualization.utils import parse_layout + + lpo_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/LPO.png")) + shutil.copyfile(lpo_path, "LPO.png") + lco_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/LCO.png")) + shutil.copyfile(lco_path, "LCO.png") + ldo_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/LDO.png")) + shutil.copyfile(ldo_path, "LDO.png") + layout_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/index_layout.html")) + + with open("index.html", "w") as f: + parse_layout(f=f, path_to_layout=layout_path) + f.write('
\\n') + f.write('Logo\\n') + f.write("

Results for $run_id

\\n") + f.write("

Available settings

\\n") + f.write('
\\n') + f.write("

Click on the images to open the respective report in a new tab.

\\n") + settings = '$test_modes'.split(",") + settings.sort() + for setting in settings: + f.write( + f'\\n' + ) + f.write("
\\n") + f.write("
\\n") + f.write("\\n") + f.write("\\n") + """ + +} diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 1d18e03..975f1ca 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -40,6 +40,11 @@ include { EVALUATE_FINAL } from '../modules/local/evaluate_final' include { COLLECT_RESULTS } from '../modules/local/collect_results' include { DRAW_VIOLIN } from '../modules/local/draw_violin' include { DRAW_HEATMAP } from '../modules/local/draw_heatmap' +include { DRAW_CORR_COMP } from '../modules/local/draw_corr_comp' +include { DRAW_REGRESSION } from '../modules/local/draw_regression' +include { SAVE_TABLES } from '../modules/local/save_tables' +include { WRITE_HTML } from '../modules/local/write_html' +include { WRITE_INDEX } from '../modules/local/write_index' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // @@ -209,6 +214,90 @@ workflow DRUGRESPONSEEVAL { ch_vio_heat, COLLECT_RESULTS.out.evaluation_results ) + + def suffixes = ['LCO': '_drug', + 'LDO': '_cell_line', + 'LPO': ['_drug', '_cell_line']] + + ch_test_modes_extended = ch_test_modes.flatMap { test_mode -> + def modeSuffixes = suffixes[test_mode] + if (modeSuffixes instanceof String) { + return [test_mode + modeSuffixes] + } else { + return modeSuffixes.collect { test_mode + it } + } + } + + ch_modes_algos = ch_test_modes_extended.combine(ch_models_baselines) + ch_modes_algos = ch_modes_algos.map { it[1] + "_" + it[0] } + ch_test_modes_extended = ch_test_modes_extended.concat(ch_modes_algos) + + ch_test_modes_extended_drug = ch_test_modes_extended.filter { it.endsWith("_drug") } + ch_test_modes_extended_cl = ch_test_modes_extended.filter { it.endsWith("_cell_line") } + + ch_test_modes_extended_drug = ch_test_modes_extended_drug.combine(COLLECT_RESULTS.out.evaluation_results_per_drug) + ch_test_modes_extended_cl = ch_test_modes_extended_cl.combine(COLLECT_RESULTS.out.evaluation_results_per_cl) + + ch_test_modes_extended = ch_test_modes_extended_drug.concat(ch_test_modes_extended_cl) + + DRAW_CORR_COMP ( + ch_test_modes_extended + ) + + def suffixes_regr = ['LCO': ['_cell_line', '_cell_line_normalized'], + 'LDO': ['_drug', '_drug_normalized'], + 'LPO': ['_drug', '_drug_normalized', '_cell_line', '_cell_line_normalized']] + + ch_regr = ch_test_modes.flatMap { test_mode -> + def modeSuffixes = suffixes_regr[test_mode] + return modeSuffixes.collect { test_mode + it } + } + ch_regr = ch_regr.combine(ch_models_baselines).combine(COLLECT_RESULTS.out.true_vs_pred) + + DRAW_REGRESSION ( + ch_regr + ) + + ch_drug = ch_test_modes.filter { it == 'LCO' || it == 'LPO' } + ch_drug = ch_drug.combine(COLLECT_RESULTS.out.evaluation_results_per_drug) + ch_cl = ch_test_modes.filter { it == 'LDO' || it == 'LPO' } + ch_cl = ch_cl.combine(COLLECT_RESULTS.out.evaluation_results_per_cl) + + ch_tables = ch_test_modes.combine(COLLECT_RESULTS.out.evaluation_results) + ch_tables = ch_tables.concat(ch_drug).concat(ch_cl) + + SAVE_TABLES ( + ch_tables + ) + + ch_html_files = DRAW_VIOLIN.out.violin_plot + .concat(DRAW_HEATMAP.out.heatmap) + .concat(DRAW_CORR_COMP.out.corr_comp_scatter) + .concat(DRAW_REGRESSION.out.regression_lines) + .concat(SAVE_TABLES.out.html_table) + .flatten() + ch_lpo = ch_html_files + .filter { it.baseName.contains('LPO') } + .map { it -> ['LPO', it] } + ch_lco = ch_html_files + .filter { it.baseName.contains('LCO') } + .map { it -> ['LCO', it] } + ch_ldo = ch_html_files + .filter { it.baseName.contains('LDO') } + .map { it -> ['LDO', it] } + ch_html_files = ch_lpo.concat(ch_lco).concat(ch_ldo).groupTuple(by: 0) + + WRITE_HTML ( + params.run_id, + ch_html_files + ) + + WRITE_INDEX ( + params.run_id, + params.test_mode + ) + + } /* From fef4454169de9c8ecfa5fd6732686f2383d852d6 Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Tue, 25 Jun 2024 14:16:04 +0200 Subject: [PATCH 038/257] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c74a542..35e01e8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # ![nf-core/drugresponseeval](docs/images/nf-core-drugresponseeval_logo_light.png#gh-light-mode-only) ![nf-core/drugresponseeval](docs/images/nf-core-drugresponseeval_logo_dark.png#gh-dark-mode-only) +# ![DrEval_pipeline](https://github.com/JudithBernett/nf-core-drugresponseeval/assets/38618495/2cca1d76-7814-479e-b34c-02e162a614b7) [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) From 8104e5edeea84725597f1df3976e8469e54972b3 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 2 Jul 2024 16:36:40 +0200 Subject: [PATCH 039/257] visualization part done --- bin/write_html.py | 6 ------ modules/local/write_html.nf | 1 - modules/local/write_index.nf | 16 ++++++++++------ 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/bin/write_html.py b/bin/write_html.py index 23c97fc..e41d6db 100755 --- a/bin/write_html.py +++ b/bin/write_html.py @@ -37,13 +37,7 @@ def write_table(f, table): def write_html(run_id: str, lpo_lco_ldo: str, files: list): - favicon_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/favicon.png")) - logo_path = str( - pkg_resources.files("drevalpy").joinpath("visualization/style_utils/nf-core-drugresponseeval_logo_light.png") - ) page_layout = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/page_layout.html")) - shutil.copyfile(favicon_path, "favicon.png") - shutil.copyfile(logo_path, "nf-core-drugresponseeval_logo_light.png") with open(f"{lpo_lco_ldo}.html", "w") as f: parse_layout(f=f, path_to_layout=page_layout) diff --git a/modules/local/write_html.nf b/modules/local/write_html.nf index 30e456a..0574c98 100644 --- a/modules/local/write_html.nf +++ b/modules/local/write_html.nf @@ -14,7 +14,6 @@ process WRITE_HTML { output: path('*.html'), emit: html_out - path('*.png'), emit: graphic_elements script: """ diff --git a/modules/local/write_index.nf b/modules/local/write_index.nf index 012b2a8..fb394ff 100644 --- a/modules/local/write_index.nf +++ b/modules/local/write_index.nf @@ -23,12 +23,14 @@ process WRITE_INDEX { import importlib.resources as pkg_resources from drevalpy.visualization.utils import parse_layout - lpo_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/LPO.png")) - shutil.copyfile(lpo_path, "LPO.png") - lco_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/LCO.png")) - shutil.copyfile(lco_path, "LCO.png") - ldo_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/LDO.png")) - shutil.copyfile(ldo_path, "LDO.png") + files_to_copy = [ + "favicon.png", + "nf-core-drugresponseeval_logo_light.png", + ] + for file in files_to_copy: + file_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils", file)) + shutil.copyfile(file_path, file) + layout_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/index_layout.html")) with open("index.html", "w") as f: @@ -42,6 +44,8 @@ process WRITE_INDEX { settings = '$test_modes'.split(",") settings.sort() for setting in settings: + img_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils", f"{setting}.png")) + shutil.copyfile(img_path, f"{setting}.png") f.write( f'\\n' ) From 5f454e446418b425c2c4949e07d5373a68f4fa36 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 3 Jul 2024 11:27:01 +0200 Subject: [PATCH 040/257] fixed some errors with htmls and rendering of heatmaps and violin plots --- bin/draw_violin_and_heatmap.py | 7 +++++-- conf/modules.config | 16 ++++++++++++++++ modules/local/draw_heatmap.nf | 1 + modules/local/write_html.nf | 1 - modules/local/write_index.nf | 2 +- workflows/drugresponseeval.nf | 3 ++- 6 files changed, 25 insertions(+), 5 deletions(-) diff --git a/bin/draw_violin_and_heatmap.py b/bin/draw_violin_and_heatmap.py index 64ef3ae..bcbfcb1 100755 --- a/bin/draw_violin_and_heatmap.py +++ b/bin/draw_violin_and_heatmap.py @@ -17,14 +17,17 @@ def get_parser(): def draw_violin_or_heatmap(plot_type: str, path_to_df: str, setting: str): df = pd.read_csv(path_to_df, index_col=0) if setting in ['LPO', 'LDO', 'LCO', 'LPO_normalized', 'LDO_normalized', 'LCO_normalized']: - # subset df such that the column 'LPO_LCO_LDO' == setting and the column 'rand_setting' == 'predictions' - df = df[(df['LPO_LCO_LDO'] == setting) & (df['rand_setting'] == 'predictions')] if setting in ['LPO', 'LDO', 'LCO']: + # subset df such that the column 'LPO_LCO_LDO' == setting and the column 'rand_setting' == 'predictions' + df = df[(df['LPO_LCO_LDO'] == setting) & (df['rand_setting'] == 'predictions')] if plot_type == 'violinplot': out_plot = Violin(df=df, normalized_metrics=False, whole_name=False) else: out_plot = Heatmap(df=df, normalized_metrics=False, whole_name=False) else: + lpo_lco_ldo = setting.split('_')[0] + # subset df such that the column 'LPO_LCO_LDO' == lpo_lco_ldo and the column 'rand_setting' == 'predictions' + df = df[(df['LPO_LCO_LDO'] == lpo_lco_ldo) & (df['rand_setting'] == 'predictions')] if plot_type == 'violinplot': out_plot = Violin(df=df, normalized_metrics=True, whole_name=False) else: diff --git a/conf/modules.config b/conf/modules.config index 050035a..539101b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -67,4 +67,20 @@ process { ] } + withName: 'WRITE_HTML' { + publishDir = [ + path: { "${params.outdir}/${params.run_id}" }, + mode: 'copy', + saveAs: { filename -> filename } + ] + } + + withName: 'WRITE_INDEX' { + publishDir = [ + path: { "${params.outdir}/${params.run_id}" }, + mode: 'copy', + saveAs: { filename -> filename } + ] + } + } diff --git a/modules/local/draw_heatmap.nf b/modules/local/draw_heatmap.nf index 6804a6a..d2e9953 100644 --- a/modules/local/draw_heatmap.nf +++ b/modules/local/draw_heatmap.nf @@ -21,6 +21,7 @@ process DRAW_HEATMAP { --plot heatmap \\ --name $name \\ --data $eval_results + """ } diff --git a/modules/local/write_html.nf b/modules/local/write_html.nf index 0574c98..06076f2 100644 --- a/modules/local/write_html.nf +++ b/modules/local/write_html.nf @@ -1,7 +1,6 @@ process WRITE_HTML { tag "${test_mode}" label 'process_single' - publishDir "${params.outdir}/${params.run_id}" //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/write_index.nf b/modules/local/write_index.nf index fb394ff..1aba162 100644 --- a/modules/local/write_index.nf +++ b/modules/local/write_index.nf @@ -1,7 +1,6 @@ process WRITE_INDEX { //tag "index" label 'process_single' - publishDir "${params.outdir}/${params.run_id}" //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -11,6 +10,7 @@ process WRITE_INDEX { input: val(run_id) val(test_modes) + val(nr_html_files) output: path('*.html'), emit: html_out diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 975f1ca..f458e55 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -294,7 +294,8 @@ workflow DRUGRESPONSEEVAL { WRITE_INDEX ( params.run_id, - params.test_mode + params.test_mode, + WRITE_HTML.out.html_out.count() ) From 5b250edb60d1b5c2cbe3736924087f9698cc4419 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 11 Jul 2024 12:50:02 +0200 Subject: [PATCH 041/257] restructured to subworkflows! --- .../main.nf} | 0 .../local/{cv_split.nf => cv_split/main.nf} | 0 .../main.nf} | 0 .../{draw_heatmap.nf => draw_heatmap/main.nf} | 1 - .../main.nf} | 0 .../{draw_violin.nf => draw_violin/main.nf} | 0 .../main.nf} | 0 .../main.nf} | 0 .../{hpam_split.nf => hpam_split/main.nf} | 0 .../main.nf} | 0 .../{params_check.nf => params_check/main.nf} | 0 .../{predict_full.nf => predict_full/main.nf} | 0 .../main.nf} | 0 .../main.nf} | 0 .../main.nf} | 0 .../{save_tables.nf => save_tables/main.nf} | 0 .../main.nf} | 0 .../{write_html.nf => write_html/main.nf} | 0 .../{write_index.nf => write_index/main.nf} | 0 subworkflows/local/model_testing/main.nf | 81 +++++++ subworkflows/local/run_cv/main.nf | 66 +++++ subworkflows/local/visualization/main.nf | 126 ++++++++++ workflows/drugresponseeval.nf | 228 ++---------------- 23 files changed, 292 insertions(+), 210 deletions(-) rename modules/local/{collect_results.nf => collect_results/main.nf} (100%) rename modules/local/{cv_split.nf => cv_split/main.nf} (100%) rename modules/local/{draw_corr_comp.nf => draw_corr_comp/main.nf} (100%) rename modules/local/{draw_heatmap.nf => draw_heatmap/main.nf} (99%) rename modules/local/{draw_regression.nf => draw_regression/main.nf} (100%) rename modules/local/{draw_violin.nf => draw_violin/main.nf} (100%) rename modules/local/{evaluate_final.nf => evaluate_final/main.nf} (100%) rename modules/local/{evaluate_find_max.nf => evaluate_find_max/main.nf} (100%) rename modules/local/{hpam_split.nf => hpam_split/main.nf} (100%) rename modules/local/{load_response.nf => load_response/main.nf} (100%) rename modules/local/{params_check.nf => params_check/main.nf} (100%) rename modules/local/{predict_full.nf => predict_full/main.nf} (100%) rename modules/local/{randomization_split.nf => randomization_split/main.nf} (100%) rename modules/local/{randomization_test.nf => randomization_test/main.nf} (100%) rename modules/local/{robustness_test.nf => robustness_test/main.nf} (100%) rename modules/local/{save_tables.nf => save_tables/main.nf} (100%) rename modules/local/{train_and_predict_cv.nf => train_and_predict_cv/main.nf} (100%) rename modules/local/{write_html.nf => write_html/main.nf} (100%) rename modules/local/{write_index.nf => write_index/main.nf} (100%) create mode 100644 subworkflows/local/model_testing/main.nf create mode 100644 subworkflows/local/run_cv/main.nf create mode 100644 subworkflows/local/visualization/main.nf diff --git a/modules/local/collect_results.nf b/modules/local/collect_results/main.nf similarity index 100% rename from modules/local/collect_results.nf rename to modules/local/collect_results/main.nf diff --git a/modules/local/cv_split.nf b/modules/local/cv_split/main.nf similarity index 100% rename from modules/local/cv_split.nf rename to modules/local/cv_split/main.nf diff --git a/modules/local/draw_corr_comp.nf b/modules/local/draw_corr_comp/main.nf similarity index 100% rename from modules/local/draw_corr_comp.nf rename to modules/local/draw_corr_comp/main.nf diff --git a/modules/local/draw_heatmap.nf b/modules/local/draw_heatmap/main.nf similarity index 99% rename from modules/local/draw_heatmap.nf rename to modules/local/draw_heatmap/main.nf index d2e9953..6804a6a 100644 --- a/modules/local/draw_heatmap.nf +++ b/modules/local/draw_heatmap/main.nf @@ -21,7 +21,6 @@ process DRAW_HEATMAP { --plot heatmap \\ --name $name \\ --data $eval_results - """ } diff --git a/modules/local/draw_regression.nf b/modules/local/draw_regression/main.nf similarity index 100% rename from modules/local/draw_regression.nf rename to modules/local/draw_regression/main.nf diff --git a/modules/local/draw_violin.nf b/modules/local/draw_violin/main.nf similarity index 100% rename from modules/local/draw_violin.nf rename to modules/local/draw_violin/main.nf diff --git a/modules/local/evaluate_final.nf b/modules/local/evaluate_final/main.nf similarity index 100% rename from modules/local/evaluate_final.nf rename to modules/local/evaluate_final/main.nf diff --git a/modules/local/evaluate_find_max.nf b/modules/local/evaluate_find_max/main.nf similarity index 100% rename from modules/local/evaluate_find_max.nf rename to modules/local/evaluate_find_max/main.nf diff --git a/modules/local/hpam_split.nf b/modules/local/hpam_split/main.nf similarity index 100% rename from modules/local/hpam_split.nf rename to modules/local/hpam_split/main.nf diff --git a/modules/local/load_response.nf b/modules/local/load_response/main.nf similarity index 100% rename from modules/local/load_response.nf rename to modules/local/load_response/main.nf diff --git a/modules/local/params_check.nf b/modules/local/params_check/main.nf similarity index 100% rename from modules/local/params_check.nf rename to modules/local/params_check/main.nf diff --git a/modules/local/predict_full.nf b/modules/local/predict_full/main.nf similarity index 100% rename from modules/local/predict_full.nf rename to modules/local/predict_full/main.nf diff --git a/modules/local/randomization_split.nf b/modules/local/randomization_split/main.nf similarity index 100% rename from modules/local/randomization_split.nf rename to modules/local/randomization_split/main.nf diff --git a/modules/local/randomization_test.nf b/modules/local/randomization_test/main.nf similarity index 100% rename from modules/local/randomization_test.nf rename to modules/local/randomization_test/main.nf diff --git a/modules/local/robustness_test.nf b/modules/local/robustness_test/main.nf similarity index 100% rename from modules/local/robustness_test.nf rename to modules/local/robustness_test/main.nf diff --git a/modules/local/save_tables.nf b/modules/local/save_tables/main.nf similarity index 100% rename from modules/local/save_tables.nf rename to modules/local/save_tables/main.nf diff --git a/modules/local/train_and_predict_cv.nf b/modules/local/train_and_predict_cv/main.nf similarity index 100% rename from modules/local/train_and_predict_cv.nf rename to modules/local/train_and_predict_cv/main.nf diff --git a/modules/local/write_html.nf b/modules/local/write_html/main.nf similarity index 100% rename from modules/local/write_html.nf rename to modules/local/write_html/main.nf diff --git a/modules/local/write_index.nf b/modules/local/write_index/main.nf similarity index 100% rename from modules/local/write_index.nf rename to modules/local/write_index/main.nf diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf new file mode 100644 index 0000000..8795585 --- /dev/null +++ b/subworkflows/local/model_testing/main.nf @@ -0,0 +1,81 @@ +include { PREDICT_FULL } from '../../../modules/local/predict_full' +include { RANDOMIZATION_SPLIT } from '../../../modules/local/randomization_split' +include { RANDOMIZATION_TEST } from '../../../modules/local/randomization_test' +include { ROBUSTNESS_TEST } from '../../../modules/local/robustness_test' +include { EVALUATE_FINAL } from '../../../modules/local/evaluate_final' +include { COLLECT_RESULTS } from '../../../modules/local/collect_results' + + +workflow MODEL_TESTING { + take: + models // from input + best_hpam_per_split // from RUN_CV + randomizations // from input + + main: + ch_models = channel.from(models) + + PREDICT_FULL ( + best_hpam_per_split, + params.response_transformation, + params.path_data + ) + ch_vis = PREDICT_FULL.out.ch_vis + + if (params.randomization_mode != 'None') { + ch_randomization = channel.from(randomizations) + // randomizations only for models, not for baselines + ch_models_rand = ch_models.combine(ch_randomization) + RANDOMIZATION_SPLIT ( + ch_models_rand + ) + ch_best_hpams_per_split_rand = best_hpam_per_split.map { + split_id, test_mode, path_to_split, model_name, path_to_hpams -> + return [model_name, test_mode, split_id, path_to_split, path_to_hpams] + } + // [model_name, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, randomization_views] + ch_randomization = ch_best_hpams_per_split_rand.combine(RANDOMIZATION_SPLIT.out.randomization_test_views, by: 0) + RANDOMIZATION_TEST ( + ch_randomization, + params.path_data, + params.randomization_type, + params.response_transformation + ) + ch_vis = ch_vis.concat(RANDOMIZATION_TEST.out.ch_vis) + } + + if (params.n_trials_robustness > 0) { + ch_trials_robustness = Channel.from(1..params.n_trials_robustness) + ch_trials_robustness = ch_models.combine(ch_trials_robustness) + + ch_best_hpams_per_split_rob = best_hpam_per_split.map { + split_id, test_mode, path_to_split, model_name, path_to_hpams -> + return [model_name, test_mode, split_id, path_to_split, path_to_hpams] + } + + // [model_name, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, robustness_iteration] + ch_robustness = ch_best_hpams_per_split_rob.combine(ch_trials_robustness, by: 0) + ROBUSTNESS_TEST ( + ch_robustness, + params.path_data, + params.randomization_type, + params.response_transformation + ) + ch_vis = ch_vis.concat(ROBUSTNESS_TEST.out.ch_vis) + } + + EVALUATE_FINAL ( + ch_vis + ) + + ch_collapse = EVALUATE_FINAL.out.ch_individual_results.collect() + + COLLECT_RESULTS ( + ch_collapse + ) + emit: + evaluation_results = COLLECT_RESULTS.out.evaluation_results + evaluation_results_per_drug = COLLECT_RESULTS.out.evaluation_results_per_drug + evaluation_results_per_cl = COLLECT_RESULTS.out.evaluation_results_per_cl + true_vs_predicted = COLLECT_RESULTS.out.true_vs_pred +} diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf new file mode 100644 index 0000000..845f846 --- /dev/null +++ b/subworkflows/local/run_cv/main.nf @@ -0,0 +1,66 @@ +include { LOAD_RESPONSE } from '../../../modules/local/load_response' +include { CV_SPLIT } from '../../../modules/local/cv_split' +include { HPAM_SPLIT } from '../../../modules/local/hpam_split' +include { TRAIN_AND_PREDICT_CV } from '../../../modules/local/train_and_predict_cv' +include { EVALUATE_FIND_MAX } from '../../../modules/local/evaluate_find_max' + +workflow RUN_CV { + take: + test_modes // LPO,LDO,LCO + models // model names for full testing + baselines // model names for comparison + + main: + LOAD_RESPONSE(params.dataset_name, params.path_data) + + ch_test_modes = channel.from(test_modes) + ch_data = ch_test_modes.combine(LOAD_RESPONSE.out.response_dataset) + + CV_SPLIT ( + ch_data, + params.n_cv_splits + ) + // [test_mode, [split_1.pkl, split_2.pkl, ..., split_n.pkl]] + ch_cv_splits = CV_SPLIT.out.response_cv_splits + + ch_models = channel.from(models) + ch_baselines = channel.from(baselines) + ch_models_baselines = ch_models.concat(ch_baselines) + HPAM_SPLIT ( + ch_models_baselines + ) + + // [model_name, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml]] + ch_hpam_combis = HPAM_SPLIT.out.hpam_combi + // [model_name, hpam_X.yaml] + ch_hpam_combis = ch_hpam_combis.transpose() + + // [model_name, test_mode, split_X.pkl] + ch_model_cv = ch_models_baselines.combine(ch_cv_splits.transpose()) + + // [model_name, test_mode, split_X.pkl, hpam_X.yaml] + ch_test_combis = ch_model_cv.combine(ch_hpam_combis, by: 0) + + TRAIN_AND_PREDICT_CV ( + ch_test_combis, + params.path_data, + params.response_transformation + ) + // [model_name, test_mode, split_id, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], [prediction_dataset_0.pkl, prediction_dataset_1.pkl, ..., prediction_dataset_n.pkl]] + ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.groupTuple(by: [0,1,2]) + + EVALUATE_FIND_MAX ( + ch_combined_hpams, + params.optim_metric + ) + + // [split_id, test_mode, split_dataset, model_name, best_hpam_combi_X.yaml] + ch_best_hpams_per_split = ch_cv_splits + .map { test_mode, it -> [it, it.baseName, test_mode]} + .transpose() + .combine(EVALUATE_FIND_MAX.out.best_combis, by: [1, 2]) + + emit: + best_hpam_per_split = ch_best_hpams_per_split + +} diff --git a/subworkflows/local/visualization/main.nf b/subworkflows/local/visualization/main.nf new file mode 100644 index 0000000..c24d70f --- /dev/null +++ b/subworkflows/local/visualization/main.nf @@ -0,0 +1,126 @@ +include { DRAW_VIOLIN } from '../../../modules/local/draw_violin' +include { DRAW_HEATMAP } from '../../../modules/local/draw_heatmap' +include { DRAW_CORR_COMP } from '../../../modules/local/draw_corr_comp' +include { DRAW_REGRESSION } from '../../../modules/local/draw_regression' +include { SAVE_TABLES } from '../../../modules/local/save_tables' +include { WRITE_HTML } from '../../../modules/local/write_html' +include { WRITE_INDEX } from '../../../modules/local/write_index' + + +workflow VISUALIZATION { + take: + test_modes // from input + models // from input + baselines // from input + evaluation_results // from MODEL_TESTING + evaluation_results_per_drug // from MODEL_TESTING + evaluation_results_per_cl // from MODEL_TESTING + true_vs_pred // from MODEL_TESTING + + main: + ch_test_modes = channel.from(test_modes) + ch_test_modes_normalized = ch_test_modes.map { it + "_normalized" } + + ch_models = channel.from(models) + ch_baselines = channel.from(baselines) + ch_models_baselines = ch_models.concat(ch_baselines) + + ch_combined = ch_test_modes.combine(ch_models_baselines) + ch_combined_mapped = ch_combined.map { it[0] + "_" + it[1] } + + ch_vio_heat = ch_test_modes.concat(ch_test_modes_normalized).concat(ch_combined_mapped) + + DRAW_VIOLIN ( + ch_vio_heat, + evaluation_results + ) + + DRAW_HEATMAP ( + ch_vio_heat, + evaluation_results + ) + + def suffixes = ['LCO': '_drug', + 'LDO': '_cell_line', + 'LPO': ['_drug', '_cell_line']] + + ch_test_modes_extended = ch_test_modes.flatMap { test_mode -> + def modeSuffixes = suffixes[test_mode] + if (modeSuffixes instanceof String) { + return [test_mode + modeSuffixes] + } else { + return modeSuffixes.collect { test_mode + it } + } + } + + ch_modes_algos = ch_test_modes_extended.combine(ch_models_baselines) + ch_modes_algos = ch_modes_algos.map { it[1] + "_" + it[0] } + ch_test_modes_extended = ch_test_modes_extended.concat(ch_modes_algos) + + ch_test_modes_extended_drug = ch_test_modes_extended.filter { it.endsWith("_drug") } + ch_test_modes_extended_cl = ch_test_modes_extended.filter { it.endsWith("_cell_line") } + + ch_test_modes_extended_drug = ch_test_modes_extended_drug.combine(evaluation_results_per_drug) + ch_test_modes_extended_cl = ch_test_modes_extended_cl.combine(evaluation_results_per_cl) + + ch_test_modes_extended = ch_test_modes_extended_drug.concat(ch_test_modes_extended_cl) + + DRAW_CORR_COMP ( + ch_test_modes_extended + ) + + def suffixes_regr = ['LCO': ['_cell_line', '_cell_line_normalized'], + 'LDO': ['_drug', '_drug_normalized'], + 'LPO': ['_drug', '_drug_normalized', '_cell_line', '_cell_line_normalized']] + + ch_regr = ch_test_modes.flatMap { test_mode -> + def modeSuffixes = suffixes_regr[test_mode] + return modeSuffixes.collect { test_mode + it } + } + ch_regr = ch_regr.combine(ch_models_baselines).combine(true_vs_pred) + + DRAW_REGRESSION ( + ch_regr + ) + + ch_drug = ch_test_modes.filter { it == 'LCO' || it == 'LPO' } + ch_drug = ch_drug.combine(evaluation_results_per_drug) + ch_cl = ch_test_modes.filter { it == 'LDO' || it == 'LPO' } + ch_cl = ch_cl.combine(evaluation_results_per_cl) + + ch_tables = ch_test_modes.combine(evaluation_results) + ch_tables = ch_tables.concat(ch_drug).concat(ch_cl) + + SAVE_TABLES ( + ch_tables + ) + + ch_html_files = DRAW_VIOLIN.out.violin_plot + .concat(DRAW_HEATMAP.out.heatmap) + .concat(DRAW_CORR_COMP.out.corr_comp_scatter) + .concat(DRAW_REGRESSION.out.regression_lines) + .concat(SAVE_TABLES.out.html_table) + .flatten() + ch_lpo = ch_html_files + .filter { it.baseName.contains('LPO') } + .map { it -> ['LPO', it] } + ch_lco = ch_html_files + .filter { it.baseName.contains('LCO') } + .map { it -> ['LCO', it] } + ch_ldo = ch_html_files + .filter { it.baseName.contains('LDO') } + .map { it -> ['LDO', it] } + ch_html_files = ch_lpo.concat(ch_lco).concat(ch_ldo).groupTuple(by: 0) + + WRITE_HTML ( + params.run_id, + ch_html_files + ) + + WRITE_INDEX ( + params.run_id, + params.test_mode, + WRITE_HTML.out.html_out.count() + ) + +} diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index f458e55..fe84926 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -27,17 +27,6 @@ WorkflowDrugresponseeval.initialise(params, log) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { PARAMS_CHECK } from '../modules/local/params_check' -include { LOAD_RESPONSE } from '../modules/local/load_response' -include { CV_SPLIT } from '../modules/local/cv_split' -include { HPAM_SPLIT } from '../modules/local/hpam_split' -include { TRAIN_AND_PREDICT_CV } from '../modules/local/train_and_predict_cv' -include { EVALUATE_FIND_MAX } from '../modules/local/evaluate_find_max' -include { PREDICT_FULL } from '../modules/local/predict_full' -include { RANDOMIZATION_SPLIT } from '../modules/local/randomization_split' -include { RANDOMIZATION_TEST } from '../modules/local/randomization_test' -include { ROBUSTNESS_TEST } from '../modules/local/robustness_test' -include { EVALUATE_FINAL } from '../modules/local/evaluate_final' -include { COLLECT_RESULTS } from '../modules/local/collect_results' include { DRAW_VIOLIN } from '../modules/local/draw_violin' include { DRAW_HEATMAP } from '../modules/local/draw_heatmap' include { DRAW_CORR_COMP } from '../modules/local/draw_corr_comp' @@ -49,6 +38,9 @@ include { WRITE_INDEX } from '../modules/local/write_index' // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // +include { RUN_CV } from '../subworkflows/local/run_cv' +include { MODEL_TESTING } from '../subworkflows/local/model_testing' +include { VISUALIZATION } from '../subworkflows/local/visualization' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -79,7 +71,6 @@ workflow DRUGRESPONSEEVAL { // // SUBWORKFLOW: Read in samplesheet, validate and stage input files // - ch_test_modes = channel.from(test_modes) ch_models = channel.from(models) ch_baselines = channel.from(baselines) ch_models_baselines = ch_models.concat(ch_baselines) @@ -96,208 +87,27 @@ workflow DRUGRESPONSEEVAL { params.optim_metric ) - LOAD_RESPONSE(params.dataset_name, params.path_data) - - ch_data = ch_test_modes.combine(LOAD_RESPONSE.out.response_dataset) - - CV_SPLIT ( - ch_data, - params.n_cv_splits - ) - // [test_mode, [split_1.pkl, split_2.pkl, ..., split_n.pkl]] - ch_cv_splits = CV_SPLIT.out.response_cv_splits - - HPAM_SPLIT ( - ch_models_baselines - ) - - // [model_name, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml]] - ch_hpam_combis = HPAM_SPLIT.out.hpam_combi - // [model_name, hpam_X.yaml] - ch_hpam_combis = ch_hpam_combis.transpose() - - // [model_name, test_mode, split_X.pkl] - ch_model_cv = ch_models_baselines.combine(ch_cv_splits.transpose()) - - // [model_name, test_mode, split_X.pkl, hpam_X.yaml] - ch_test_combis = ch_model_cv.combine(ch_hpam_combis, by: 0) - - TRAIN_AND_PREDICT_CV ( - ch_test_combis, - params.path_data, - params.response_transformation + RUN_CV ( + test_modes, + models, + baselines ) - // [model_name, test_mode, split_id, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], [prediction_dataset_0.pkl, prediction_dataset_1.pkl, ..., prediction_dataset_n.pkl]] - ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.groupTuple(by: [0,1,2]) - EVALUATE_FIND_MAX ( - ch_combined_hpams, - params.optim_metric + MODEL_TESTING ( + models, + RUN_CV.out.best_hpam_per_split, + randomizations ) - // [split_id, test_mode, split_dataset, model_name, best_hpam_combi_X.yaml] - ch_best_hpams_per_split = ch_cv_splits - .map { test_mode, it -> [it, it.baseName, test_mode]} - .transpose() - .combine(EVALUATE_FIND_MAX.out.best_combis, by: [1, 2]) - - PREDICT_FULL ( - ch_best_hpams_per_split, - params.response_transformation, - params.path_data + VISUALIZATION ( + test_modes, + models, + baselines, + MODEL_TESTING.out.evaluation_results, + MODEL_TESTING.out.evaluation_results_per_drug, + MODEL_TESTING.out.evaluation_results_per_cl, + MODEL_TESTING.out.true_vs_predicted ) - ch_vis = PREDICT_FULL.out.ch_vis - - if (params.randomization_mode != 'None') { - ch_randomization = channel.from(randomizations) - // randomizations only for models, not for baselines - ch_models_rand = ch_models.combine(ch_randomization) - RANDOMIZATION_SPLIT ( - ch_models_rand - ) - ch_best_hpams_per_split_rand = ch_best_hpams_per_split.map { - split_id, test_mode, path_to_split, model_name, path_to_hpams -> - return [model_name, test_mode, split_id, path_to_split, path_to_hpams] - } - // [model_name, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, randomization_views] - ch_randomization = ch_best_hpams_per_split_rand.combine(RANDOMIZATION_SPLIT.out.randomization_test_views, by: 0) - RANDOMIZATION_TEST ( - ch_randomization, - params.path_data, - params.randomization_type, - params.response_transformation - ) - ch_vis = ch_vis.concat(RANDOMIZATION_TEST.out.ch_vis) - } - - if (params.n_trials_robustness > 0) { - ch_trials_robustness = Channel.from(1..params.n_trials_robustness) - ch_trials_robustness = ch_models.combine(ch_trials_robustness) - - ch_best_hpams_per_split_rob = ch_best_hpams_per_split.map { - split_id, test_mode, path_to_split, model_name, path_to_hpams -> - return [model_name, test_mode, split_id, path_to_split, path_to_hpams] - } - - // [model_name, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, robustness_iteration] - ch_robustness = ch_best_hpams_per_split_rob.combine(ch_trials_robustness, by: 0) - ROBUSTNESS_TEST ( - ch_robustness, - params.path_data, - params.randomization_type, - params.response_transformation - ) - ch_vis = ch_vis.concat(ROBUSTNESS_TEST.out.ch_vis) - } - - EVALUATE_FINAL ( - ch_vis - ) - - ch_collapse = EVALUATE_FINAL.out.ch_individual_results.collect() - - COLLECT_RESULTS ( - ch_collapse - ) - - ch_test_modes_normalized = ch_test_modes.map { it + "_normalized" } - ch_combined = ch_test_modes.combine(ch_models_baselines) - ch_combined_mapped = ch_combined.map { it[0] + "_" + it[1] } - ch_vio_heat = ch_test_modes.concat(ch_test_modes_normalized).concat(ch_combined_mapped) - - DRAW_VIOLIN ( - ch_vio_heat, - COLLECT_RESULTS.out.evaluation_results - ) - - DRAW_HEATMAP ( - ch_vio_heat, - COLLECT_RESULTS.out.evaluation_results - ) - - def suffixes = ['LCO': '_drug', - 'LDO': '_cell_line', - 'LPO': ['_drug', '_cell_line']] - - ch_test_modes_extended = ch_test_modes.flatMap { test_mode -> - def modeSuffixes = suffixes[test_mode] - if (modeSuffixes instanceof String) { - return [test_mode + modeSuffixes] - } else { - return modeSuffixes.collect { test_mode + it } - } - } - - ch_modes_algos = ch_test_modes_extended.combine(ch_models_baselines) - ch_modes_algos = ch_modes_algos.map { it[1] + "_" + it[0] } - ch_test_modes_extended = ch_test_modes_extended.concat(ch_modes_algos) - - ch_test_modes_extended_drug = ch_test_modes_extended.filter { it.endsWith("_drug") } - ch_test_modes_extended_cl = ch_test_modes_extended.filter { it.endsWith("_cell_line") } - - ch_test_modes_extended_drug = ch_test_modes_extended_drug.combine(COLLECT_RESULTS.out.evaluation_results_per_drug) - ch_test_modes_extended_cl = ch_test_modes_extended_cl.combine(COLLECT_RESULTS.out.evaluation_results_per_cl) - - ch_test_modes_extended = ch_test_modes_extended_drug.concat(ch_test_modes_extended_cl) - - DRAW_CORR_COMP ( - ch_test_modes_extended - ) - - def suffixes_regr = ['LCO': ['_cell_line', '_cell_line_normalized'], - 'LDO': ['_drug', '_drug_normalized'], - 'LPO': ['_drug', '_drug_normalized', '_cell_line', '_cell_line_normalized']] - - ch_regr = ch_test_modes.flatMap { test_mode -> - def modeSuffixes = suffixes_regr[test_mode] - return modeSuffixes.collect { test_mode + it } - } - ch_regr = ch_regr.combine(ch_models_baselines).combine(COLLECT_RESULTS.out.true_vs_pred) - - DRAW_REGRESSION ( - ch_regr - ) - - ch_drug = ch_test_modes.filter { it == 'LCO' || it == 'LPO' } - ch_drug = ch_drug.combine(COLLECT_RESULTS.out.evaluation_results_per_drug) - ch_cl = ch_test_modes.filter { it == 'LDO' || it == 'LPO' } - ch_cl = ch_cl.combine(COLLECT_RESULTS.out.evaluation_results_per_cl) - - ch_tables = ch_test_modes.combine(COLLECT_RESULTS.out.evaluation_results) - ch_tables = ch_tables.concat(ch_drug).concat(ch_cl) - - SAVE_TABLES ( - ch_tables - ) - - ch_html_files = DRAW_VIOLIN.out.violin_plot - .concat(DRAW_HEATMAP.out.heatmap) - .concat(DRAW_CORR_COMP.out.corr_comp_scatter) - .concat(DRAW_REGRESSION.out.regression_lines) - .concat(SAVE_TABLES.out.html_table) - .flatten() - ch_lpo = ch_html_files - .filter { it.baseName.contains('LPO') } - .map { it -> ['LPO', it] } - ch_lco = ch_html_files - .filter { it.baseName.contains('LCO') } - .map { it -> ['LCO', it] } - ch_ldo = ch_html_files - .filter { it.baseName.contains('LDO') } - .map { it -> ['LDO', it] } - ch_html_files = ch_lpo.concat(ch_lco).concat(ch_ldo).groupTuple(by: 0) - - WRITE_HTML ( - params.run_id, - ch_html_files - ) - - WRITE_INDEX ( - params.run_id, - params.test_mode, - WRITE_HTML.out.html_out.count() - ) - } From 59f3d8cd0fa89a993dd4b163830b2618d146ec96 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 12 Jul 2024 15:18:18 +0200 Subject: [PATCH 042/257] checking args in drevalpy --- bin/check_params.py | 95 +++++++++++++-------------------------------- 1 file changed, 28 insertions(+), 67 deletions(-) diff --git a/bin/check_params.py b/bin/check_params.py index 63eec78..61a4502 100755 --- a/bin/check_params.py +++ b/bin/check_params.py @@ -8,70 +8,39 @@ import logging import sys -from drevalpy.models import MODEL_FACTORY -from drevalpy.datasets import RESPONSE_DATASET_FACTORY +from drevalpy.utils import check_arguments from drevalpy.evaluation import AVAILABLE_METRICS logger = logging.getLogger() -def check_arguments(args): - assert args.models, "At least one model must be specified" - assert all( - [model in MODEL_FACTORY for model in args.models] - ), f"Invalid model name. Available models are {list(MODEL_FACTORY.keys())}. If you want to use your own model, you need to implement a new model class and add it to the MODEL_FACTORY in the models init" - assert all( - [test in ["LPO", "LCO", "LDO"] for test in args.test_mode] - ), "Invalid test mode. Available test modes are LPO, LCO, LDO" - assert args.dataset_name in RESPONSE_DATASET_FACTORY, f"Invalid dataset name. Available datasets are {list(RESPONSE_DATASET_FACTORY.keys())} If you want to use your own dataset, you need to implement a new response dataset class and add it to the RESPONSE_DATASET_FACTORY in the response_datasets init" - - assert args.n_cv_splits > 1, "Number of cross-validation splits must be greater than 1" - - # TODO Allow for custom randomization tests maybe via config file - if args.randomization_mode[0] != "None": - assert all( - [randomization in ["SVCC", "SVRC", "SVSC", "SVRD"] for randomization in args.randomization_mode] - ), "At least one invalid randomization mode. Available randomization modes are SVCC, SVRC, SVSC, SVRD" - if args.curve_curator != 'false': - raise NotImplementedError("CurveCurator not implemented") - assert args.response_transformation in ["None", "standard", "minmax", "robust"], "Invalid response_transformation. Choose from None, standard, minmax, robust" - assert args.optim_metric in AVAILABLE_METRICS, f"Invalid optim_metric for hyperparameter tuning. Choose from {list(AVAILABLE_METRICS.keys())}" - - def parse_args(argv=None): """Define and immediately parse command line arguments.""" - parser = argparse.ArgumentParser( - description="Run the drug response prediction model test suite." - ) - parser.add_argument( - "--run_id", type=str, default="my_run", help="identifier to save the results" - ) - parser.add_argument( - "--models", nargs="+", help="model to evaluate or list of models to compare" - ) + parser = argparse.ArgumentParser(description="Run the drug response prediction model test suite.") + parser.add_argument("--run_id", type=str, default="my_run", help="identifier to save the results") + parser.add_argument("--models", nargs="+", help="model to evaluate or list of models to compare") parser.add_argument( "--test_mode", nargs="+", default=["LPO"], help="Which tests to run (LPO=Leave-random-Pairs-Out, " - "LCO=Leave-Cell-line-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO LCO LDO' to run all tests. Default is LPO", + "LCO=Leave-Cell-line-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO LCO LDO' to run all tests. Default is LPO", ) parser.add_argument( "--randomization_mode", nargs="+", default=["None"], help="Which randomization tests to run, additionally to the normal run. Default is None which means no randomization tests are run." - "Modes: SVCC, SVRC, SVCD, SVRD" - "Can be a list of randomization tests e.g. 'SCVC SCVD' to run two tests. Default is None" - "SVCC: Single View Constant for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." - "For each experiment one cell line view is held constant while the others are randomized. " - "SVRC Single View Random for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." - "For each experiment one cell line view is randomized while the others are held constant." - "SVCD: Single View Constant for Drugs: in this mode, one experiment is done for every drug view the model uses (e.g. fingerprints, target_information, ..)." - "For each experiment one drug view is held constant while the others are randomized." - "SVRD: Single View Random for Drugs: in this mode, one experiment is done for every drug view the model uses (e.g. gene expression, target_information, ..)." - "For each experiment one drug view is randomized while the others are held constant." - , + "Modes: SVCC, SVRC, SVCD, SVRD" + "Can be a list of randomization tests e.g. 'SCVC SCVD' to run two tests. Default is None" + "SVCC: Single View Constant for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." + "For each experiment one cell line view is held constant while the others are randomized. " + "SVRC Single View Random for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." + "For each experiment one cell line view is randomized while the others are held constant." + "SVCD: Single View Constant for Drugs: in this mode, one experiment is done for every drug view the model uses (e.g. fingerprints, target_information, ..)." + "For each experiment one drug view is held constant while the others are randomized." + "SVRD: Single View Random for Drugs: in this mode, one experiment is done for every drug view the model uses (e.g. gene expression, target_information, ..)." + "For each experiment one drug view is randomized while the others are held constant.", ) parser.add_argument( "--randomization_type", @@ -80,61 +49,53 @@ def parse_args(argv=None): help="""type of randomization to use. Choose from "gaussian", "zeroing", "permutation". Default is "permutation" "gaussian": replace the features with random values sampled from a gaussian distribution with the same mean and standard deviation "zeroing": replace the features with zeros - "permutation": permute the features over the instances, keeping the distribution of the features the same but dissolving the relationship to the target""" + "permutation": permute the features over the instances, keeping the distribution of the features the same but dissolving the relationship to the target""", ) parser.add_argument( "--n_trials_robustness", type=int, default=0, - help="Number of trials to run for the robustness test. Default is 0, which means no robustness test is run. The robustness test is a test where the model is trained with varying seeds. This is done multiple times to see how stable the model is." + help="Number of trials to run for the robustness test. Default is 0, which means no robustness test is run. The robustness test is a test where the model is trained with varying seeds. This is done multiple times to see how stable the model is.", ) - parser.add_argument( - "--dataset_name", - type=str, - default="GDSC1", - help="Name of the drug response dataset" - ) + parser.add_argument("--dataset_name", type=str, default="GDSC1", help="Name of the drug response dataset") - parser.add_argument( - "--outdir", type=str, default="results/", help="Path to the output directory" - ) + parser.add_argument("--outdir", type=str, default="results/", help="Path to the output directory") parser.add_argument( "--curve_curator", type=str, - default='false', + default="false", help="Whether to run " "CurveCurator " "to sort out " "non-reactive " "curves", ) parser.add_argument( "--overwrite", type=str, - default='false', + default="false", help="Overwrite existing results with the same path out and run_id? ", ) parser.add_argument( "--optim_metric", type=str, default="RMSE", - help=f'Metric for hyperparameter tuning choose from {list(AVAILABLE_METRICS.keys())} Default is RMSE.' + help=f"Metric for hyperparameter tuning choose from {list(AVAILABLE_METRICS.keys())} Default is RMSE.", ) parser.add_argument( - "--n_cv_splits", - type=int, - default=5, - help="Number of cross-validation splits to use for the evaluation" + "--n_cv_splits", type=int, default=5, help="Number of cross-validation splits to use for the evaluation" ) parser.add_argument( "--response_transformation", type=str, default="None", - help="Transformation to apply to the response variable possible values: standard, minmax, robust") + help="Transformation to apply to the response variable possible values: standard, minmax, robust", + ) parser.add_argument( "--multiprocessing", - action='store_true', + action="store_true", default=False, - help="Whether to use multiprocessing for the evaluation. Default is False") + help="Whether to use multiprocessing for the evaluation. Default is False", + ) parser.add_argument( "-l", "--log-level", From f15c829806b9a18051d1f6cade63dce32ac5eead Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Fri, 12 Jul 2024 15:39:26 +0200 Subject: [PATCH 043/257] response_transform --- bin/train_and_predict_final.py | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 60e94cb..7671244 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -10,11 +10,9 @@ from drevalpy.datasets.dataset import DrugResponseDataset from drevalpy.models.drp_model import DRPModel from sklearn.base import TransformerMixin -from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler - from drevalpy.models import MODEL_FACTORY from drevalpy.experiment import train_and_predict - +from drevalpy.utils import get_response_transformation def get_parser(): parser = argparse.ArgumentParser(description='Train and predict: either full mode, randomization mode, ' @@ -54,16 +52,7 @@ def prep_data(arguments): best_hpams = best_hpam_dict[f'{arguments.model_name}_{arguments.split_id}']['best_hpam_combi'] model = model_class(target='IC50') - if arguments.response_transformation == "None": - response_transform = None - elif arguments.response_transformation == "standard": - response_transform = StandardScaler() - elif arguments.response_transformation == "minmax": - response_transform = MinMaxScaler() - elif arguments.response_transformation == "robust": - response_transform = RobustScaler() - else: - raise ValueError("Invalid response_transform: ${response_transformation}. Choose robust, minmax or standard.") + response_transform = get_response_transformation(arguments.response_transformation) return model, best_hpams, train_dataset, test_dataset, es_dataset, response_transform From 61bcf8396b2565bac3b28df7805df0a633158244 Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Fri, 12 Jul 2024 16:18:01 +0200 Subject: [PATCH 044/257] rand test simplification --- bin/train_and_predict_final.py | 42 +++++++++++++++------------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 7671244..58c901a 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -11,7 +11,7 @@ from drevalpy.models.drp_model import DRPModel from sklearn.base import TransformerMixin from drevalpy.models import MODEL_FACTORY -from drevalpy.experiment import train_and_predict +from drevalpy.experiment import train_and_predict, randomize_train_predict from drevalpy.utils import get_response_transformation def get_parser(): @@ -73,30 +73,24 @@ def compute_randomization( drug_features = model.load_drug_features(data_path=path_data, dataset_name=train_dataset.dataset_name) randomization_test_file = f'randomization_{randomization_test_view["test_name"]}_{split_id}.csv' - - cl_features_rand = cl_features.copy() - drug_features_rand = drug_features.copy() - view = randomization_test_view['view'] - if view in cl_features.get_view_names(): - cl_features_rand.randomize_features(view, randomization_type=randomization_type) - elif view in drug_features.get_view_names(): - drug_features_rand.randomize_features(view, randomization_type=randomization_type) - else: - warnings.warn(f"View {view} not found in cell line or drug features. Skipping randomization {randomization_test_view['test_name']}.") + if (randomization_test_view["view"] not in cl_features.get_view_names()) and (randomization_test_view["view"] not in drug_features.get_view_names()): + warnings.warn(f"View {randomization_test_view["view"]} not found in features. Skipping randomization test {randomization_test_view["test_name"]} which includes this view.") return - - test_dataset = train_and_predict( - model=model, - hpams=hpam_set, - path_data=path_data, - train_dataset=train_dataset, - prediction_dataset=test_dataset, - early_stopping_dataset=early_stopping_dataset, - response_transformation=response_transformation, - cl_features=cl_features_rand, - drug_features=drug_features_rand - ) - test_dataset.save(randomization_test_file) + + randomize_train_predict( + view=randomization_test_view["view"], + randomization_type=randomization_type, + randomization_test_file=randomization_test_file, + model=model, + hpam_set=hpam_set, + path_data=path_data, + train_dataset=train_dataset, + test_dataset=test_dataset, + early_stopping_dataset=early_stopping_dataset, + response_transformation=response_transformation, + cl_features=cl_features, + drug_features=drug_features, + ) def compute_robustness( From 7572ce30e9da024a82266c7308d6f0187bb850ed Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Fri, 12 Jul 2024 16:40:07 +0200 Subject: [PATCH 045/257] robustness refactoring --- bin/train_and_predict_final.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 58c901a..3951f6c 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -11,7 +11,7 @@ from drevalpy.models.drp_model import DRPModel from sklearn.base import TransformerMixin from drevalpy.models import MODEL_FACTORY -from drevalpy.experiment import train_and_predict, randomize_train_predict +from drevalpy.experiment import train_and_predict, randomize_train_predict, robustness_train_predict from drevalpy.utils import get_response_transformation def get_parser(): @@ -106,20 +106,18 @@ def compute_robustness( response_transformation=Optional[TransformerMixin] ): robustness_test_file = f'robustness_{trial}_{split_id}.csv' - train_dataset.shuffle(random_state=trial) - test_dataset.shuffle(random_state=trial) - if early_stopping_dataset is not None: - early_stopping_dataset.shuffle(random_state=trial) - test_dataset = train_and_predict( - model=model, - hpams=hpam_set, - path_data=path_data, - train_dataset=train_dataset, - prediction_dataset=test_dataset, - early_stopping_dataset=early_stopping_dataset, - response_transformation=response_transformation - ) - test_dataset.save(robustness_test_file) + + robustness_train_predict( + trial=trial, + trial_file=robustness_test_file, + train_dataset=train_dataset, + test_dataset=test_dataset, + early_stopping_dataset=early_stopping_dataset, + model=model, + hpam_set=hpam_set, + path_data=path_data, + response_transformation=response_transformation, + ) if __name__ == "__main__": From b6dee762558d0e03d7aed06e228396e1f9d8592e Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Fri, 12 Jul 2024 17:02:43 +0200 Subject: [PATCH 046/257] response transform --- bin/train_and_predict_cv.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index 429d5c4..269cf97 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -4,12 +4,11 @@ import sys import pickle import yaml -from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler from drevalpy.models import MODEL_FACTORY from drevalpy.experiment import train_and_predict - +from drevalpy.utils import get_reponse_transformation def get_parser(): parser = argparse.ArgumentParser(description='Train and predict using a drug response prediction model.') @@ -36,16 +35,7 @@ def main(): else: es_dataset = None model = model_class(target='IC50') - if args.response_transformation == "None": - response_transform = None - elif args.response_transformation == "standard": - response_transform = StandardScaler() - elif args.response_transformation == "minmax": - response_transform = MinMaxScaler() - elif args.response_transformation == "robust": - response_transform = RobustScaler() - else: - raise ValueError(f"Invalid response_transform: {args.response_transformation}. Choose robust, minmax or standard.") + response_transform = get_reponse_transformation(args.response_transformation) validation_dataset = train_and_predict( model=model, hpams=hpams, From 0dd4b0c88e0b5203ac141470feff5b8309cbb504 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 12 Jul 2024 19:15:26 +0200 Subject: [PATCH 047/257] =?UTF-8?q?i=20hope=20i=20fixed=20things=20instead?= =?UTF-8?q?=20of=20breaking=20them=20=E2=80=A6=20still=20have=20to=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/collect_results.py | 56 ++++++++++++++------------- bin/draw_corr_comp.py | 23 +++++------ bin/draw_violin_and_heatmap.py | 29 +++++--------- modules/local/draw_regression/main.nf | 20 +++++----- modules/local/save_tables/main.nf | 53 ++++--------------------- 5 files changed, 66 insertions(+), 115 deletions(-) diff --git a/bin/collect_results.py b/bin/collect_results.py index 9cdf5da..149e1f1 100755 --- a/bin/collect_results.py +++ b/bin/collect_results.py @@ -2,13 +2,27 @@ import argparse import pandas as pd +from drevalpy.visualization.utils import prep_results + def get_parser(): - parser = argparse.ArgumentParser(description='Collect results and write to single files.') - parser.add_argument('--outfiles', type=str, nargs='+', required=True, help='Output files.') + parser = argparse.ArgumentParser(description="Collect results and write to single files.") + parser.add_argument("--outfiles", type=str, nargs="+", required=True, help="Output files.") return parser +def parse_results(args): + # get all files with the pattern f'{model_name}_evaluation_results.csv' from args.outfiles + result_files = [file for file in args.outfiles if "evaluation_results.csv" in file] + # get all files with the pattern f'{model_name}_evaluation_results_per_drug.csv' from args.outfiles + result_per_drug_files = [file for file in args.outfiles if "evaluation_results_per_drug.csv" in file] + # get all files with the pattern f'{model_name}_evaluation_results_per_cl.csv' from args.outfiles + result_per_cl_files = [file for file in args.outfiles if "evaluation_results_per_cl.csv" in file] + # get all files with the pattern f'{model_name}_true_vs_pred.csv' from args.outfiles + t_vs_pred_files = [file for file in args.outfiles if "true_vs_pred.csv" in file] + return result_files, result_per_drug_files, result_per_cl_files, t_vs_pred_files + + def collapse_file(files): out_df = None for file in files: @@ -21,34 +35,22 @@ def collapse_file(files): if __name__ == "__main__": args = get_parser().parse_args() - # get all files with the pattern f'{model_name}_evaluation_results.csv' from args.outfiles - eval_result_files = [file for file in args.outfiles if 'evaluation_results.csv' in file] - # get all files with the pattern f'{model_name}_evaluation_results_per_drug.csv' from args.outfiles - eval_result_per_drug_files = [file for file in args.outfiles if 'evaluation_results_per_drug.csv' in file] - # get all files with the pattern f'{model_name}_evaluation_results_per_cl.csv' from args.outfiles - eval_result_per_cl_files = [file for file in args.outfiles if 'evaluation_results_per_cl.csv' in file] - # get all files with the pattern f'{model_name}_true_vs_pred.csv' from args.outfiles - true_vs_pred_files = [file for file in args.outfiles if 'true_vs_pred.csv' in file] + # parse the results from args.outfiles + eval_result_files, eval_result_per_drug_files, eval_result_per_cl_files, true_vs_pred_files = parse_results(args) + # collapse the results into single dataframes eval_results = collapse_file(eval_result_files) eval_results_per_drug = collapse_file(eval_result_per_drug_files) eval_results_per_cell_line = collapse_file(eval_result_per_cl_files) t_vs_p = collapse_file(true_vs_pred_files) - new_columns = eval_results.index.str.split('_', expand=True).to_frame() - new_columns.columns = ['algorithm', 'rand_setting', 'LPO_LCO_LDO', 'split', 'CV_split'] - new_columns.index = eval_results.index - eval_results = pd.concat([new_columns.drop('split', axis=1), eval_results], axis=1) - eval_results_per_drug[['algorithm', 'rand_setting', 'LPO_LCO_LDO', 'split', 'CV_split']] = eval_results_per_drug[ - 'model'].str.split( - '_', expand=True) - eval_results_per_cell_line[['algorithm', 'rand_setting', 'LPO_LCO_LDO', 'split', 'CV_split']] = \ - eval_results_per_cell_line['model'].str.split( - '_', expand=True) - t_vs_p[['algorithm', 'rand_setting', 'LPO_LCO_LDO', 'split', 'CV_split']] = t_vs_p['model'].str.split( - '_', expand=True) - - eval_results.to_csv('evaluation_results.csv', index=True) - eval_results_per_drug.to_csv('evaluation_results_per_drug.csv', index=True) - eval_results_per_cell_line.to_csv('evaluation_results_per_cl.csv', index=True) - t_vs_p.to_csv('true_vs_pred.csv', index=True) + # prepare the results through introducing new columns algorithm, rand_setting, LPO_LCO_LDO, split, CV_split + eval_results, eval_results_per_drug, eval_results_per_cell_line, t_vs_p = prep_results( + eval_results, eval_results_per_drug, eval_results_per_cell_line, t_vs_p + ) + + # save the results to csv files + eval_results.to_csv("evaluation_results.csv", index=True) + eval_results_per_drug.to_csv("evaluation_results_per_drug.csv", index=True) + eval_results_per_cell_line.to_csv("evaluation_results_per_cl.csv", index=True) + t_vs_p.to_csv("true_vs_pred.csv", index=True) diff --git a/bin/draw_corr_comp.py b/bin/draw_corr_comp.py index a781aaa..a15ab21 100755 --- a/bin/draw_corr_comp.py +++ b/bin/draw_corr_comp.py @@ -2,7 +2,7 @@ import argparse import pandas as pd -from drevalpy.visualization.corr_comp_scatter import CorrelationComparisonScatter +from drevalpy.visualization.utils import draw_scatter_grids_per_group from drevalpy.models import MODEL_FACTORY @@ -15,23 +15,18 @@ def get_parser(): def draw_corr_comp(path_to_df: str, setting: str): df = pd.read_csv(path_to_df, index_col=0) - # extract which lpo_ldo_lco setting is used - lpo_lco_ldo = [name for name in ['LPO', 'LDO', 'LCO'] if name in setting][0] - # if setting ends with _drug, set group_by to 'drug' group_by = 'drug' if setting.endswith('_drug') else 'cell_line' - # if one of the names in model factory occurs in the setting, subset df accordingly + lpo_lco_ldo = [name for name in ['LPO', 'LDO', 'LCO'] if name in setting][0] if any(name in setting for name in MODEL_FACTORY): - # get the name of the algorithm algorithm = setting.split('_')[0] - # subset df such that the column 'algorithm' == algorithm - df = df[(df['LPO_LCO_LDO'] == lpo_lco_ldo) & (df['algorithm'] == algorithm)] - corr_comp = CorrelationComparisonScatter(df=df, color_by=group_by) else: - # subset df such that the column 'LPO_LCO_LDO' == lpo_lco_ldo - df = df[(df['LPO_LCO_LDO'] == lpo_lco_ldo) & (df['rand_setting'] == 'predictions')] - corr_comp = CorrelationComparisonScatter(df=df, color_by=group_by) - corr_comp.dropdown_fig.write_html(f'corr_comp_scatter_{setting}.html') - corr_comp.fig_overall.write_html(f'corr_comp_scatter_overall_{setting}.html') + algorithm = None + draw_scatter_grids_per_group(df=df, + group_by=group_by, + lpo_lco_ldo=lpo_lco_ldo, + out_prefix='', + algorithm=algorithm + ) if __name__ == "__main__": diff --git a/bin/draw_violin_and_heatmap.py b/bin/draw_violin_and_heatmap.py index bcbfcb1..7a95cfc 100755 --- a/bin/draw_violin_and_heatmap.py +++ b/bin/draw_violin_and_heatmap.py @@ -2,8 +2,7 @@ import argparse import pandas as pd -from drevalpy.visualization.violin import Violin -from drevalpy.visualization.heatmap import Heatmap +from drevalpy.visualization.utils import draw_violin_or_heatmap def get_parser(): @@ -14,37 +13,29 @@ def get_parser(): return parser -def draw_violin_or_heatmap(plot_type: str, path_to_df: str, setting: str): +def prep_df(plot_type: str, path_to_df: str, setting: str): df = pd.read_csv(path_to_df, index_col=0) if setting in ['LPO', 'LDO', 'LCO', 'LPO_normalized', 'LDO_normalized', 'LCO_normalized']: + # overview plots if setting in ['LPO', 'LDO', 'LCO']: - # subset df such that the column 'LPO_LCO_LDO' == setting and the column 'rand_setting' == 'predictions' + # overview for setting, only 'rand_setting' == 'predictions' df = df[(df['LPO_LCO_LDO'] == setting) & (df['rand_setting'] == 'predictions')] - if plot_type == 'violinplot': - out_plot = Violin(df=df, normalized_metrics=False, whole_name=False) - else: - out_plot = Heatmap(df=df, normalized_metrics=False, whole_name=False) + out_plot = draw_violin_or_heatmap(plot_type, df, normalized_metrics=False, whole_name=False) else: + # overview for normalized setting, only 'rand_setting' == 'predictions' lpo_lco_ldo = setting.split('_')[0] - # subset df such that the column 'LPO_LCO_LDO' == lpo_lco_ldo and the column 'rand_setting' == 'predictions' df = df[(df['LPO_LCO_LDO'] == lpo_lco_ldo) & (df['rand_setting'] == 'predictions')] - if plot_type == 'violinplot': - out_plot = Violin(df=df, normalized_metrics=True, whole_name=False) - else: - out_plot = Heatmap(df=df, normalized_metrics=True, whole_name=False) + out_plot = draw_violin_or_heatmap(plot_type, df, normalized_metrics=True, whole_name=False) else: + # algorithm-wise plots name_split = setting.split('_') lpo_lco_ldo = name_split[0] algorithm = name_split[1] - # subset df such that the column 'LPO_LCO_LDO' == lpo_lco_ldo and the column 'algorithm' == algorithm df = df[(df['LPO_LCO_LDO'] == lpo_lco_ldo) & (df['algorithm'] == algorithm)] - if plot_type == 'violinplot': - out_plot = Violin(df=df, normalized_metrics=False, whole_name=True) - else: - out_plot = Heatmap(df=df, normalized_metrics=False, whole_name=True) + out_plot = draw_violin_or_heatmap(plot_type, df, normalized_metrics=False, whole_name=True) out_plot.fig.write_html(f'{plot_type}_{setting}.html') if __name__ == "__main__": args = get_parser().parse_args() - draw_violin_or_heatmap(args.plot, args.data, args.name) + prep_df(args.plot, args.data, args.name) diff --git a/modules/local/draw_regression/main.nf b/modules/local/draw_regression/main.nf index db7fed3..37e2bb2 100644 --- a/modules/local/draw_regression/main.nf +++ b/modules/local/draw_regression/main.nf @@ -18,23 +18,25 @@ process DRAW_REGRESSION { """ #!/usr/bin/env python import pandas as pd - from drevalpy.visualization.regression_slider_plot import RegressionSliderPlot + from drevalpy.visualization.utils import draw_regr_slider + true_vs_pred = pd.read_csv('${true_vs_pred}', index_col=0) name_split = '${name}'.split('_') lpo_lco_ldo = name_split[0] group_by = name_split[1] if group_by == 'cell': group_by = 'cell_line' - normalized = '${name}'.endswith('normalized') - true_vs_pred = pd.read_csv('${true_vs_pred}') - true_vs_pred = true_vs_pred[(true_vs_pred['LPO_LCO_LDO'] == lpo_lco_ldo) & (true_vs_pred['algorithm'] == '${model}')] + normalize = '${name}'.endswith('normalized') - regr_slider = RegressionSliderPlot( - df=true_vs_pred, - group_by=group_by, - normalize=normalized + draw_regr_slider( + t_v_p=true_vs_pred, + lpo_lco_ldo=lpo_lco_ldo, + model='${model}', + grouping_slider=group_by, + out_prefix='', + name='${name}', + normalize=normalize ) - regr_slider.fig.write_html('regression_lines_${name}_${model}.html') """ } diff --git a/modules/local/save_tables/main.nf b/modules/local/save_tables/main.nf index 20118d0..e7fedad 100644 --- a/modules/local/save_tables/main.nf +++ b/modules/local/save_tables/main.nf @@ -18,59 +18,20 @@ process SAVE_TABLES { """ #!/usr/bin/env python import pandas as pd + from drevalpy.visualization.utils import export_setting_html_table df = pd.read_csv('${eval_results}') df = df[df['LPO_LCO_LDO'] == '${lpo_lco_ldo}'] - selected_columns = [ - "algorithm", - "rand_setting", - "CV_split", - "MSE", - "R^2", - "Pearson", - "RMSE", - "MAE", - "Spearman", - "Kendall", - "Partial_Correlation", - "LPO_LCO_LDO" - ] - if 'per_drug' in '${eval_results}': - extra = '_per_drug' - selected_columns = ['drug'] + selected_columns + grouping = 'drug' elif 'per_cl' in '${eval_results}': - extra = '_per_cl' - selected_columns = ['cell_line'] + selected_columns + grouping = 'cell_line' else: - extra = '' - selected_columns = [ - "algorithm", - "rand_setting", - "CV_split", - "MSE", - "R^2", - "Pearson", - "R^2: drug normalized", - "Pearson: drug normalized", - "R^2: cell_line normalized", - "Pearson: cell_line normalized", - "RMSE", - "MAE", - "Spearman", - "Kendall", - "Partial_Correlation", - "Spearman: drug normalized", - "Kendall: drug normalized", - "Partial_Correlation: drug normalized", - "Spearman: cell_line normalized", - "Kendall: cell_line normalized", - "Partial_Correlation: cell_line normalized", - "LPO_LCO_LDO" - ] - df = df[selected_columns] - df.to_html(f'table_${lpo_lco_ldo}{extra}.html', index=False) + grouping = 'all' + + export_path = f'table_{grouping}_${lpo_lco_ldo}.html' + export_setting_html_table(df=df, export_path=export_path, grouping=grouping) """ } From 307ed206f1cb9687a1e96f54c1d961d6f5ce3a08 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 17 Jul 2024 13:58:27 +0200 Subject: [PATCH 048/257] check params: redundancy removed! --- bin/check_params.py | 108 +---------------------------- bin/collect_results.py | 11 +-- bin/draw_corr_comp.py | 2 +- modules/local/params_check/main.nf | 29 +++++--- nextflow.config | 3 +- workflows/drugresponseeval.nf | 14 ++-- 6 files changed, 39 insertions(+), 128 deletions(-) diff --git a/bin/check_params.py b/bin/check_params.py index 61a4502..990e4e3 100755 --- a/bin/check_params.py +++ b/bin/check_params.py @@ -1,115 +1,11 @@ #!/usr/bin/env python - - -"""Provide a command line tool to validate and transform tabular samplesheets.""" - - -import argparse -import logging import sys - -from drevalpy.utils import check_arguments -from drevalpy.evaluation import AVAILABLE_METRICS - -logger = logging.getLogger() - - -def parse_args(argv=None): - """Define and immediately parse command line arguments.""" - parser = argparse.ArgumentParser(description="Run the drug response prediction model test suite.") - parser.add_argument("--run_id", type=str, default="my_run", help="identifier to save the results") - parser.add_argument("--models", nargs="+", help="model to evaluate or list of models to compare") - parser.add_argument( - "--test_mode", - nargs="+", - default=["LPO"], - help="Which tests to run (LPO=Leave-random-Pairs-Out, " - "LCO=Leave-Cell-line-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO LCO LDO' to run all tests. Default is LPO", - ) - parser.add_argument( - "--randomization_mode", - nargs="+", - default=["None"], - help="Which randomization tests to run, additionally to the normal run. Default is None which means no randomization tests are run." - "Modes: SVCC, SVRC, SVCD, SVRD" - "Can be a list of randomization tests e.g. 'SCVC SCVD' to run two tests. Default is None" - "SVCC: Single View Constant for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." - "For each experiment one cell line view is held constant while the others are randomized. " - "SVRC Single View Random for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." - "For each experiment one cell line view is randomized while the others are held constant." - "SVCD: Single View Constant for Drugs: in this mode, one experiment is done for every drug view the model uses (e.g. fingerprints, target_information, ..)." - "For each experiment one drug view is held constant while the others are randomized." - "SVRD: Single View Random for Drugs: in this mode, one experiment is done for every drug view the model uses (e.g. gene expression, target_information, ..)." - "For each experiment one drug view is randomized while the others are held constant.", - ) - parser.add_argument( - "--randomization_type", - type=str, - default="permutation", - help="""type of randomization to use. Choose from "gaussian", "zeroing", "permutation". Default is "permutation" - "gaussian": replace the features with random values sampled from a gaussian distribution with the same mean and standard deviation - "zeroing": replace the features with zeros - "permutation": permute the features over the instances, keeping the distribution of the features the same but dissolving the relationship to the target""", - ) - parser.add_argument( - "--n_trials_robustness", - type=int, - default=0, - help="Number of trials to run for the robustness test. Default is 0, which means no robustness test is run. The robustness test is a test where the model is trained with varying seeds. This is done multiple times to see how stable the model is.", - ) - - parser.add_argument("--dataset_name", type=str, default="GDSC1", help="Name of the drug response dataset") - - parser.add_argument("--outdir", type=str, default="results/", help="Path to the output directory") - - parser.add_argument( - "--curve_curator", - type=str, - default="false", - help="Whether to run " "CurveCurator " "to sort out " "non-reactive " "curves", - ) - parser.add_argument( - "--overwrite", - type=str, - default="false", - help="Overwrite existing results with the same path out and run_id? ", - ) - parser.add_argument( - "--optim_metric", - type=str, - default="RMSE", - help=f"Metric for hyperparameter tuning choose from {list(AVAILABLE_METRICS.keys())} Default is RMSE.", - ) - parser.add_argument( - "--n_cv_splits", type=int, default=5, help="Number of cross-validation splits to use for the evaluation" - ) - - parser.add_argument( - "--response_transformation", - type=str, - default="None", - help="Transformation to apply to the response variable possible values: standard, minmax, robust", - ) - parser.add_argument( - "--multiprocessing", - action="store_true", - default=False, - help="Whether to use multiprocessing for the evaluation. Default is False", - ) - parser.add_argument( - "-l", - "--log-level", - help="The desired log level (default WARNING).", - choices=("CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"), - default="WARNING", - ) - return parser.parse_args(argv) +from drevalpy.utils import get_parser, check_arguments def main(argv=None): """Coordinate argument parsing and program execution.""" - args = parse_args(argv) - logging.basicConfig(level=args.log_level, format="[%(levelname)s] %(message)s") + args = get_parser().parse_args(argv) check_arguments(args) diff --git a/bin/collect_results.py b/bin/collect_results.py index 149e1f1..14b2d6f 100755 --- a/bin/collect_results.py +++ b/bin/collect_results.py @@ -2,7 +2,7 @@ import argparse import pandas as pd -from drevalpy.visualization.utils import prep_results +from drevalpy.visualization.utils import prep_results, write_results def get_parser(): @@ -50,7 +50,8 @@ def collapse_file(files): ) # save the results to csv files - eval_results.to_csv("evaluation_results.csv", index=True) - eval_results_per_drug.to_csv("evaluation_results_per_drug.csv", index=True) - eval_results_per_cell_line.to_csv("evaluation_results_per_cl.csv", index=True) - t_vs_p.to_csv("true_vs_pred.csv", index=True) + write_results(path_out="", + eval_results=eval_results, + eval_results_per_drug=eval_results_per_drug, + eval_results_per_cl=eval_results_per_cell_line, + t_vs_p=t_vs_p) diff --git a/bin/draw_corr_comp.py b/bin/draw_corr_comp.py index a15ab21..20050f2 100755 --- a/bin/draw_corr_comp.py +++ b/bin/draw_corr_comp.py @@ -20,7 +20,7 @@ def draw_corr_comp(path_to_df: str, setting: str): if any(name in setting for name in MODEL_FACTORY): algorithm = setting.split('_')[0] else: - algorithm = None + algorithm = "all" draw_scatter_grids_per_group(df=df, group_by=group_by, lpo_lco_ldo=lpo_lco_ldo, diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index c1db0d9..4eb69c1 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -8,15 +8,19 @@ process PARAMS_CHECK { // 'biocontainers/python:3.8.3' }" input: - val baselines + val run_id val models + val baselines val test_mode - val dataset_name - val n_cv_splits val randomization_mode + val randomization_type + val n_trials_robustness + val dataset_name + val cross_study_datasets val curve_curator - val response_transformation val optim_metric + val n_cv_splits + val response_transformation output: @@ -24,16 +28,21 @@ process PARAMS_CHECK { when: task.ext.when == null || task.ext.when - script: // This script is bundled with the pipeline, in nf-core/drugresponseeval/bin/ + script: """ check_params.py \\ - --models ${models.replace(',', ' ')} ${baselines.replace(',', ' ')} \\ + --run_id $run_id \\ + --models ${models.replace(',', ' ')} \\ + --baselines ${baselines.replace(',', ' ')} \\ --test_mode ${test_mode.replace(',', ' ')} \\ + --randomization_mode ${randomization_mode.replace(',', ' ')} \\ + --randomization_type $randomization_type \\ + --n_trials_robustness $n_trials_robustness \\ --dataset_name $dataset_name \\ + ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} \\ + ${curve_curator ? '--curve_curator' : ''} \\ + --optim_metric $optim_metric \\ --n_cv_splits $n_cv_splits \\ - --randomization_mode ${randomization_mode.replace(',', ' ')} \\ - --curve_curator $curve_curator \\ - --response_transformation $response_transformation \\ - --optim_metric $optim_metric + --response_transformation $response_transformation """ } diff --git a/nextflow.config b/nextflow.config index d70c780..607b238 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,13 +11,14 @@ params { // For this pipeline run_id = 'my_run' - baselines = 'NaivePredictor' models = 'SimpleNeuralNetwork' + baselines = 'NaivePredictor' test_mode = 'LPO' randomization_mode = 'None' randomization_type = 'permutation' n_trials_robustness = 0 dataset_name = 'GDSC1' + cross_study_datasets = '' curve_curator = false overwrite = false optim_metric = 'RMSE' diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index fe84926..b352b17 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -76,15 +76,19 @@ workflow DRUGRESPONSEEVAL { ch_models_baselines = ch_models.concat(ch_baselines) PARAMS_CHECK ( - params.baselines, + params.run_id, params.models, + params.baselines, params.test_mode, - params.dataset_name, - params.n_cv_splits, params.randomization_mode, + params.randomization_type, + params.n_trials_robustness, + params.dataset_name, + params.cross_study_datasets, params.curve_curator, - params.response_transformation, - params.optim_metric + params.optim_metric, + params.n_cv_splits, + params.response_transformation ) RUN_CV ( From 6e8f5232fa870451b7beff767be9c469cf8e4fdd Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 17 Jul 2024 15:50:54 +0200 Subject: [PATCH 049/257] black + load_response: redundancy removed --- bin/collect_results.py | 12 +- bin/cv_split.py | 16 +-- bin/draw_corr_comp.py | 19 ++-- bin/draw_violin_and_heatmap.py | 24 ++-- bin/evaluate_and_find_max.py | 30 ++--- bin/evaluate_final.py | 100 +++++++++-------- bin/hpam_split.py | 9 +- bin/load_response.py | 33 ++++-- bin/train_and_predict_cv.py | 29 ++--- bin/train_and_predict_final.py | 163 +++++++++++++++------------- bin/write_html.py | 24 ++-- modules/local/load_response/main.nf | 9 +- subworkflows/local/run_cv/main.nf | 2 +- 13 files changed, 253 insertions(+), 217 deletions(-) diff --git a/bin/collect_results.py b/bin/collect_results.py index 14b2d6f..8d9adc0 100755 --- a/bin/collect_results.py +++ b/bin/collect_results.py @@ -50,8 +50,10 @@ def collapse_file(files): ) # save the results to csv files - write_results(path_out="", - eval_results=eval_results, - eval_results_per_drug=eval_results_per_drug, - eval_results_per_cl=eval_results_per_cell_line, - t_vs_p=t_vs_p) + write_results( + path_out="", + eval_results=eval_results, + eval_results_per_drug=eval_results_per_drug, + eval_results_per_cl=eval_results_per_cell_line, + t_vs_p=t_vs_p, + ) diff --git a/bin/cv_split.py b/bin/cv_split.py index 9cc3f3a..fa73067 100755 --- a/bin/cv_split.py +++ b/bin/cv_split.py @@ -6,23 +6,19 @@ def get_parser(): - parser = argparse.ArgumentParser(description='Split data into CV splits') - parser.add_argument('--response', type=str, required=True, help='Path to response data') - parser.add_argument('--n_cv_splits', type=int, required=True, help='Number of CV splits') - parser.add_argument('--test_mode', type=str, default='LPO', help='Test mode (LPO, LCO, LDO)') + parser = argparse.ArgumentParser(description="Split data into CV splits") + parser.add_argument("--response", type=str, required=True, help="Path to response data") + parser.add_argument("--n_cv_splits", type=int, required=True, help="Number of CV splits") + parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LDO)") return parser def main(): parser = get_parser() args = parser.parse_args() - response_data = pickle.load(open(args.response, 'rb')) + response_data = pickle.load(open(args.response, "rb")) response_data.split_dataset( - n_cv_splits=args.n_cv_splits, - mode=args.test_mode, - split_validation=True, - validation_ratio=0.1, - random_state=42 + n_cv_splits=args.n_cv_splits, mode=args.test_mode, split_validation=True, validation_ratio=0.1, random_state=42 ) for split_index, split in enumerate(response_data.cv_splits): with open(f"split_{split_index}.pkl", "wb") as f: diff --git a/bin/draw_corr_comp.py b/bin/draw_corr_comp.py index 20050f2..850cb9e 100755 --- a/bin/draw_corr_comp.py +++ b/bin/draw_corr_comp.py @@ -7,26 +7,21 @@ def get_parser(): - parser = argparse.ArgumentParser(description='Draw violin plots.') - parser.add_argument('--name', type=str, required=True, help='Name/Setting of plot.') - parser.add_argument('--data', type=str, required=True, help='Path to data.') + parser = argparse.ArgumentParser(description="Draw violin plots.") + parser.add_argument("--name", type=str, required=True, help="Name/Setting of plot.") + parser.add_argument("--data", type=str, required=True, help="Path to data.") return parser def draw_corr_comp(path_to_df: str, setting: str): df = pd.read_csv(path_to_df, index_col=0) - group_by = 'drug' if setting.endswith('_drug') else 'cell_line' - lpo_lco_ldo = [name for name in ['LPO', 'LDO', 'LCO'] if name in setting][0] + group_by = "drug" if setting.endswith("_drug") else "cell_line" + lpo_lco_ldo = [name for name in ["LPO", "LDO", "LCO"] if name in setting][0] if any(name in setting for name in MODEL_FACTORY): - algorithm = setting.split('_')[0] + algorithm = setting.split("_")[0] else: algorithm = "all" - draw_scatter_grids_per_group(df=df, - group_by=group_by, - lpo_lco_ldo=lpo_lco_ldo, - out_prefix='', - algorithm=algorithm - ) + draw_scatter_grids_per_group(df=df, group_by=group_by, lpo_lco_ldo=lpo_lco_ldo, out_prefix="", algorithm=algorithm) if __name__ == "__main__": diff --git a/bin/draw_violin_and_heatmap.py b/bin/draw_violin_and_heatmap.py index 7a95cfc..de316aa 100755 --- a/bin/draw_violin_and_heatmap.py +++ b/bin/draw_violin_and_heatmap.py @@ -6,34 +6,34 @@ def get_parser(): - parser = argparse.ArgumentParser(description='Draw violin plots or heatmaps.') - parser.add_argument('--plot', type=str, default='violinplot', help='Type of plot (violin or heatmap).') - parser.add_argument('--name', type=str, required=True, help='Name/Setting of plot.') - parser.add_argument('--data', type=str, required=True, help='Path to data.') + parser = argparse.ArgumentParser(description="Draw violin plots or heatmaps.") + parser.add_argument("--plot", type=str, default="violinplot", help="Type of plot (violin or heatmap).") + parser.add_argument("--name", type=str, required=True, help="Name/Setting of plot.") + parser.add_argument("--data", type=str, required=True, help="Path to data.") return parser def prep_df(plot_type: str, path_to_df: str, setting: str): df = pd.read_csv(path_to_df, index_col=0) - if setting in ['LPO', 'LDO', 'LCO', 'LPO_normalized', 'LDO_normalized', 'LCO_normalized']: + if setting in ["LPO", "LDO", "LCO", "LPO_normalized", "LDO_normalized", "LCO_normalized"]: # overview plots - if setting in ['LPO', 'LDO', 'LCO']: + if setting in ["LPO", "LDO", "LCO"]: # overview for setting, only 'rand_setting' == 'predictions' - df = df[(df['LPO_LCO_LDO'] == setting) & (df['rand_setting'] == 'predictions')] + df = df[(df["LPO_LCO_LDO"] == setting) & (df["rand_setting"] == "predictions")] out_plot = draw_violin_or_heatmap(plot_type, df, normalized_metrics=False, whole_name=False) else: # overview for normalized setting, only 'rand_setting' == 'predictions' - lpo_lco_ldo = setting.split('_')[0] - df = df[(df['LPO_LCO_LDO'] == lpo_lco_ldo) & (df['rand_setting'] == 'predictions')] + lpo_lco_ldo = setting.split("_")[0] + df = df[(df["LPO_LCO_LDO"] == lpo_lco_ldo) & (df["rand_setting"] == "predictions")] out_plot = draw_violin_or_heatmap(plot_type, df, normalized_metrics=True, whole_name=False) else: # algorithm-wise plots - name_split = setting.split('_') + name_split = setting.split("_") lpo_lco_ldo = name_split[0] algorithm = name_split[1] - df = df[(df['LPO_LCO_LDO'] == lpo_lco_ldo) & (df['algorithm'] == algorithm)] + df = df[(df["LPO_LCO_LDO"] == lpo_lco_ldo) & (df["algorithm"] == algorithm)] out_plot = draw_violin_or_heatmap(plot_type, df, normalized_metrics=False, whole_name=True) - out_plot.fig.write_html(f'{plot_type}_{setting}.html') + out_plot.fig.write_html(f"{plot_type}_{setting}.html") if __name__ == "__main__": diff --git a/bin/evaluate_and_find_max.py b/bin/evaluate_and_find_max.py index 23d111b..8c5db07 100755 --- a/bin/evaluate_and_find_max.py +++ b/bin/evaluate_and_find_max.py @@ -8,17 +8,19 @@ def get_parser(): - parser = argparse.ArgumentParser(description='Take model name, get hyperparameters, and split into single hyperparameter combinations') - parser.add_argument('--model_name', type=str, help='model name') - parser.add_argument('--split_id', type=str, help='split id') - parser.add_argument('--hpam_yamls', nargs='+', help='paths to hpam yamls') - parser.add_argument('--pred_datas', nargs='+', help='paths to pred datas') - parser.add_argument('--metric', type=str, help='metric') + parser = argparse.ArgumentParser( + description="Take model name, get hyperparameters, and split into single hyperparameter combinations" + ) + parser.add_argument("--model_name", type=str, help="model name") + parser.add_argument("--split_id", type=str, help="split id") + parser.add_argument("--hpam_yamls", nargs="+", help="paths to hpam yamls") + parser.add_argument("--pred_datas", nargs="+", help="paths to pred datas") + parser.add_argument("--metric", type=str, help="metric") return parser def best_metric(metric, current_metric, best_metric): - if metric in ['MSE', 'RMSE', 'MAE']: + if metric in ["MSE", "RMSE", "MAE"]: if current_metric < best_metric: return True else: @@ -40,8 +42,8 @@ def best_metric(metric, current_metric, best_metric): best_hpam_combi = None best_result = None for i in range(0, len(pred_datas)): - pred_data = pickle.load(open(pred_datas[i], 'rb')) - with open(hpam_yamls[i], 'r') as yaml_file: + pred_data = pickle.load(open(pred_datas[i], "rb")) + with open(hpam_yamls[i], "r") as yaml_file: hpam_combi = yaml.load(yaml_file, Loader=yaml.FullLoader) results = evaluate(pred_data, args.metric) if best_result is None: @@ -50,10 +52,8 @@ def best_metric(metric, current_metric, best_metric): elif best_metric(args.metric, results[args.metric], best_result): best_result = results[args.metric] best_hpam_combi = hpam_combi - final_result = {f'{args.model_name}_{args.split_id}': { - 'best_hpam_combi': best_hpam_combi, - 'best_result': best_result - }} - with open(f'best_hpam_combi_{args.split_id}.yaml', 'w') as yaml_file: + final_result = { + f"{args.model_name}_{args.split_id}": {"best_hpam_combi": best_hpam_combi, "best_result": best_result} + } + with open(f"best_hpam_combi_{args.split_id}.yaml", "w") as yaml_file: yaml.dump(final_result, yaml_file, default_flow_style=False) - diff --git a/bin/evaluate_final.py b/bin/evaluate_final.py index 4cb889e..feb4b84 100755 --- a/bin/evaluate_final.py +++ b/bin/evaluate_final.py @@ -9,87 +9,95 @@ def get_parser(): - parser = argparse.ArgumentParser(description='Evaluate the predictions from the final model.') - parser.add_argument('--test_mode', type=str, default='LPO', help='Test mode (LPO, LCO, LDO).') - parser.add_argument('--model_name', type=str, required=True, help='Model name.') - parser.add_argument('--pred_file', type=str, required=True, help='Path to predictions.') + parser = argparse.ArgumentParser(description="Evaluate the predictions from the final model.") + parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LDO).") + parser.add_argument("--model_name", type=str, required=True, help="Model name.") + parser.add_argument("--pred_file", type=str, required=True, help="Path to predictions.") return parser def generate_name(test_mode, model_name, pred_file): - pred_rand_rob = os.path.basename(pred_file).split('_')[0] - if pred_rand_rob == 'predictions': - pred_setting = 'predictions' - elif pred_rand_rob == 'randomization': - pred_setting = 'randomize-' + '-'.join(os.path.basename(pred_file).split('_')[1:-2]) + pred_rand_rob = os.path.basename(pred_file).split("_")[0] + if pred_rand_rob == "predictions": + pred_setting = "predictions" + elif pred_rand_rob == "randomization": + pred_setting = "randomize-" + "-".join(os.path.basename(pred_file).split("_")[1:-2]) else: - pred_setting = "-".join(os.path.basename(pred_file).split('_')[:2]) - split = '_'.join(os.path.basename(pred_file).split('.')[0].split('_')[-2:]) - return f'{model_name}_{pred_setting}_{test_mode}_{split}' + pred_setting = "-".join(os.path.basename(pred_file).split("_")[:2]) + split = "_".join(os.path.basename(pred_file).split(".")[0].split("_")[-2:]) + return f"{model_name}_{pred_setting}_{test_mode}_{split}" def evaluate_file(test_mode, model_name, pred_file): - print('Parsing file:', os.path.normpath(pred_file)) + print("Parsing file:", os.path.normpath(pred_file)) result = pd.read_csv(pred_file) dataset = DrugResponseDataset( - response=result['response'], - cell_line_ids=result['cell_line_ids'], - drug_ids=result['drug_ids'], - predictions=result['predictions'] + response=result["response"], + cell_line_ids=result["cell_line_ids"], + drug_ids=result["drug_ids"], + predictions=result["predictions"], ) model = generate_name(test_mode, model_name, pred_file) overall_eval = {model: evaluate(dataset, AVAILABLE_METRICS.keys())} - true_vs_pred = pd.DataFrame({ - 'model': [model for _ in range(len(dataset.response))], - 'drug': dataset.drug_ids, - 'cell_line': dataset.cell_line_ids, - 'y_true': dataset.response, - 'y_pred': dataset.predictions}) + true_vs_pred = pd.DataFrame( + { + "model": [model for _ in range(len(dataset.response))], + "drug": dataset.drug_ids, + "cell_line": dataset.cell_line_ids, + "y_true": dataset.response, + "y_pred": dataset.predictions, + } + ) evaluation_results_per_drug = None evaluation_results_per_cl = None norm_drug_eval_results = {} norm_cl_eval_results = {} - if 'LPO' == test_mode or 'LCO' == test_mode: - norm_drug_eval_results, evaluation_results_per_drug = evaluate_per_group(df=true_vs_pred, - group_by='drug', - norm_group_eval_results=norm_drug_eval_results, - eval_results_per_group=evaluation_results_per_drug, - model=model) - if 'LPO' == test_mode or 'LDO' == test_mode: - norm_cl_eval_results, evaluation_results_per_cl = evaluate_per_group(df=true_vs_pred, - group_by='cell_line', - norm_group_eval_results=norm_cl_eval_results, - eval_results_per_group=evaluation_results_per_cl, - model=model) - overall_eval = pd.DataFrame.from_dict(overall_eval, orient='index') + if "LPO" == test_mode or "LCO" == test_mode: + norm_drug_eval_results, evaluation_results_per_drug = evaluate_per_group( + df=true_vs_pred, + group_by="drug", + norm_group_eval_results=norm_drug_eval_results, + eval_results_per_group=evaluation_results_per_drug, + model=model, + ) + if "LPO" == test_mode or "LDO" == test_mode: + norm_cl_eval_results, evaluation_results_per_cl = evaluate_per_group( + df=true_vs_pred, + group_by="cell_line", + norm_group_eval_results=norm_cl_eval_results, + eval_results_per_group=evaluation_results_per_cl, + model=model, + ) + overall_eval = pd.DataFrame.from_dict(overall_eval, orient="index") if norm_drug_eval_results != {}: - overall_eval = concat_results(norm_drug_eval_results, 'drug', overall_eval) + overall_eval = concat_results(norm_drug_eval_results, "drug", overall_eval) if norm_cl_eval_results != {}: - overall_eval = concat_results(norm_cl_eval_results, 'cell_line', overall_eval) + overall_eval = concat_results(norm_cl_eval_results, "cell_line", overall_eval) return overall_eval, evaluation_results_per_drug, evaluation_results_per_cl, true_vs_pred, model def write_results(overall_eval, evaluation_results_per_drug, evaluation_results_per_cl, true_vs_pred, model_name): - overall_eval.to_csv(f'{model_name}_evaluation_results.csv') + overall_eval.to_csv(f"{model_name}_evaluation_results.csv") if evaluation_results_per_drug is not None: - evaluation_results_per_drug.to_csv(f'{model_name}_evaluation_results_per_drug.csv') + evaluation_results_per_drug.to_csv(f"{model_name}_evaluation_results_per_drug.csv") if evaluation_results_per_cl is not None: - evaluation_results_per_cl.to_csv(f'{model_name}_evaluation_results_per_cl.csv') - true_vs_pred.to_csv(f'{model_name}_true_vs_pred.csv') + evaluation_results_per_cl.to_csv(f"{model_name}_evaluation_results_per_cl.csv") + true_vs_pred.to_csv(f"{model_name}_true_vs_pred.csv") def concat_results(norm_group_res, group_by, eval_res): - norm_group_res = pd.DataFrame.from_dict(norm_group_res, orient='index') + norm_group_res = pd.DataFrame.from_dict(norm_group_res, orient="index") # append 'group normalized ' to the column names - norm_group_res.columns = [f'{col}: {group_by} normalized' for col in norm_group_res.columns] + norm_group_res.columns = [f"{col}: {group_by} normalized" for col in norm_group_res.columns] eval_res = pd.concat([eval_res, norm_group_res], axis=1) return eval_res if __name__ == "__main__": args = get_parser().parse_args() - results_all, eval_res_d, eval_res_cl, t_vs_pred, mname = evaluate_file(args.test_mode, args.model_name, args.pred_file) + results_all, eval_res_d, eval_res_cl, t_vs_pred, mname = evaluate_file( + args.test_mode, args.model_name, args.pred_file + ) write_results(results_all, eval_res_d, eval_res_cl, t_vs_pred, mname) - diff --git a/bin/hpam_split.py b/bin/hpam_split.py index ca168ec..fc4651b 100755 --- a/bin/hpam_split.py +++ b/bin/hpam_split.py @@ -6,8 +6,10 @@ def get_parser(): - parser = argparse.ArgumentParser(description='Take model name, get hyperparameters, and split into single hyperparameter combinations') - parser.add_argument('--model_name', type=str, help='model name') + parser = argparse.ArgumentParser( + description="Take model name, get hyperparameters, and split into single hyperparameter combinations" + ) + parser.add_argument("--model_name", type=str, help="model name") return parser @@ -18,7 +20,6 @@ def get_parser(): hyperparameters = model_class.get_hyperparameter_set() hpam_idx = 0 for hpam_combi in hyperparameters: - with open(f'hpam_{hpam_idx}.yaml', 'w') as yaml_file: + with open(f"hpam_{hpam_idx}.yaml", "w") as yaml_file: hpam_idx += 1 yaml.dump(hpam_combi, yaml_file, default_flow_style=False) - diff --git a/bin/load_response.py b/bin/load_response.py index 54350d0..afd2c39 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -1,22 +1,35 @@ #!/usr/bin/env python import argparse -from drevalpy.datasets import RESPONSE_DATASET_FACTORY import pickle +from drevalpy.utils import load_data def get_parser(): - parser = argparse.ArgumentParser(description='Load response data') - parser.add_argument('--dataset_name', type=str, required=True, help='Name of the dataset to load') - parser.add_argument('--path_data', type=str, default='data', help='Data directory path') + parser = argparse.ArgumentParser(description="Load data for drug response prediction.") + parser.add_argument("--dataset_name", type=str, required=True, help="Name of the dataset to load.") + parser.add_argument("--path_data", type=str, default="data", help="Path to the data directory.") + parser.add_argument("--cross_study_datasets", nargs='+', default=[], + help="List of datasets to use to evaluate predictions across studies. " + "Default is empty list which means no cross-study datasets are used.") return parser -if __name__ == "__main__": - args = get_parser().parse_args() - assert args.dataset_name in RESPONSE_DATASET_FACTORY, f"Invalid dataset name. Available datasets are {list(RESPONSE_DATASET_FACTORY.keys())} If you want to use your own dataset, you need to implement a new response dataset class and add it to the RESPONSE_DATASET_FACTORY in the response_datasets init" - - response_data = RESPONSE_DATASET_FACTORY[args.dataset_name](path_data=args.path_data) +def main(args): + response_data, cross_study_datasets = load_data( + dataset_name=args.dataset_name, cross_study_datasets=args.cross_study_datasets, path_data=args.path_data + ) # Pickle the object to a file - with open("response_dataset.pkl", 'wb') as f: + with open("response_dataset.pkl", "wb") as f: pickle.dump(response_data, f) + + for cs_dataset in cross_study_datasets: + ds_name = cs_dataset.dataset_name + with open(f"cross_study_{ds_name}.pkl", "wb") as f: + pickle.dump(cs_dataset, f) + + +if __name__ == "__main__": + arg_parser = get_parser() + args = arg_parser.parse_args() + main(args) diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index 269cf97..9e3f450 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -8,16 +8,17 @@ from drevalpy.models import MODEL_FACTORY from drevalpy.experiment import train_and_predict -from drevalpy.utils import get_reponse_transformation +from drevalpy.utils import get_response_transformation + def get_parser(): - parser = argparse.ArgumentParser(description='Train and predict using a drug response prediction model.') - parser.add_argument('--model_name', type=str, help='model to evaluate or list of models to compare') - parser.add_argument('--path_data', type=str, default='data', help='Data directory path') - parser.add_argument('--test_mode', type=str, default='LPO', help='Test mode (LPO, LCO, LDO)') - parser.add_argument('--hyperparameters', type=str, help='hyperparameters for the model') - parser.add_argument('--cv_data', type=str, help='path to the cv data split') - parser.add_argument('--response_transformation', type=str, help='response transformation to apply to the dataset') + parser = argparse.ArgumentParser(description="Train and predict using a drug response prediction model.") + parser.add_argument("--model_name", type=str, help="model to evaluate or list of models to compare") + parser.add_argument("--path_data", type=str, default="data", help="Data directory path") + parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LDO)") + parser.add_argument("--hyperparameters", type=str, help="hyperparameters for the model") + parser.add_argument("--cv_data", type=str, help="path to the cv data split") + parser.add_argument("--response_transformation", type=str, help="response transformation to apply to the dataset") return parser @@ -25,17 +26,17 @@ def main(): parser = get_parser() args = parser.parse_args() model_class = MODEL_FACTORY[args.model_name] - split = pickle.load(open(args.cv_data, 'rb')) + split = pickle.load(open(args.cv_data, "rb")) train_dataset = split["train"] validation_dataset = split["validation"] - hpams = yaml.load(open(args.hyperparameters, 'r'), Loader=yaml.FullLoader) + hpams = yaml.load(open(args.hyperparameters, "r"), Loader=yaml.FullLoader) if model_class.early_stopping: validation_dataset = split["validation_es"] es_dataset = split["early_stopping"] else: es_dataset = None - model = model_class(target='IC50') - response_transform = get_reponse_transformation(args.response_transformation) + model = model_class(target="IC50") + response_transform = get_response_transformation(args.response_transformation) validation_dataset = train_and_predict( model=model, hpams=hpams, @@ -43,9 +44,9 @@ def main(): train_dataset=train_dataset, prediction_dataset=validation_dataset, early_stopping_dataset=es_dataset, - response_transformation=response_transform + response_transformation=response_transform, ) - with open(f'prediction_dataset_{validation_dataset.__hash__()}.pkl', 'wb') as f: + with open(f"prediction_dataset_{validation_dataset.__hash__()}.pkl", "wb") as f: pickle.dump(validation_dataset, f) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 3951f6c..c67574c 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -14,28 +14,35 @@ from drevalpy.experiment import train_and_predict, randomize_train_predict, robustness_train_predict from drevalpy.utils import get_response_transformation + def get_parser(): - parser = argparse.ArgumentParser(description='Train and predict: either full mode, randomization mode, ' - 'or robustness mode.') - parser.add_argument('--mode', type=str, default='full', help='Mode: full, randomization, or robustness.') - parser.add_argument('--model_name', type=str, required=True, help='Model name.') - parser.add_argument('--split_id', type=str, required=True, help='Split id.') - parser.add_argument('--split_dataset_path', type=str, required=True, help='Path to split dataset.') - parser.add_argument('--hyperparameters_path', type=str, required=True, help='Path to hyperparameters.') - parser.add_argument('--response_transformation', type=str, default='None', help='Response transformation.') - parser.add_argument('--test_mode', type=str, default='LPO', help='Test mode (LPO, LCO, LDO).') - parser.add_argument('--path_data', type=str, required=True, help='Path to data.') - parser.add_argument('--randomization_views_path', type=str, default=None, help='Path to randomization views.') - parser.add_argument('--randomization_type', type=str, default='permutation', help='Randomization type (permutation, zeroing, gaussian).') - parser.add_argument('--robustness_trial', type=int, help='Robustness trial index.') + parser = argparse.ArgumentParser( + description="Train and predict: either full mode, randomization mode, " "or robustness mode." + ) + parser.add_argument("--mode", type=str, default="full", help="Mode: full, randomization, or robustness.") + parser.add_argument("--model_name", type=str, required=True, help="Model name.") + parser.add_argument("--split_id", type=str, required=True, help="Split id.") + parser.add_argument("--split_dataset_path", type=str, required=True, help="Path to split dataset.") + parser.add_argument("--hyperparameters_path", type=str, required=True, help="Path to hyperparameters.") + parser.add_argument("--response_transformation", type=str, default="None", help="Response transformation.") + parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LDO).") + parser.add_argument("--path_data", type=str, required=True, help="Path to data.") + parser.add_argument("--randomization_views_path", type=str, default=None, help="Path to randomization views.") + parser.add_argument( + "--randomization_type", + type=str, + default="permutation", + help="Randomization type (permutation, zeroing, gaussian).", + ) + parser.add_argument("--robustness_trial", type=int, help="Robustness trial index.") return parser def prep_data(arguments): - split = pickle.load(open(arguments.split_dataset_path, 'rb')) - train_dataset = split['train'] - validation_dataset = split['validation'] - test_dataset = split['test'] + split = pickle.load(open(arguments.split_dataset_path, "rb")) + train_dataset = split["train"] + validation_dataset = split["validation"] + test_dataset = split["test"] model_class = MODEL_FACTORY[arguments.model_name] if model_class.early_stopping: @@ -47,77 +54,81 @@ def prep_data(arguments): train_dataset.add_rows(validation_dataset) train_dataset.shuffle(random_state=42) - with open(arguments.hyperparameters_path, 'r') as f: + with open(arguments.hyperparameters_path, "r") as f: best_hpam_dict = yaml.safe_load(f) - best_hpams = best_hpam_dict[f'{arguments.model_name}_{arguments.split_id}']['best_hpam_combi'] + best_hpams = best_hpam_dict[f"{arguments.model_name}_{arguments.split_id}"]["best_hpam_combi"] - model = model_class(target='IC50') + model = model_class(target="IC50") response_transform = get_response_transformation(arguments.response_transformation) return model, best_hpams, train_dataset, test_dataset, es_dataset, response_transform def compute_randomization( - randomization_test_view: Dict[str, str], - model: DRPModel, - hpam_set: Dict, - path_data: str, - train_dataset: DrugResponseDataset, - test_dataset: DrugResponseDataset, - early_stopping_dataset: Optional[DrugResponseDataset], - split_id: str, - test_mode: str, - randomization_type: str = "permutation", - response_transformation=Optional[TransformerMixin] + randomization_test_view: Dict[str, str], + model: DRPModel, + hpam_set: Dict, + path_data: str, + train_dataset: DrugResponseDataset, + test_dataset: DrugResponseDataset, + early_stopping_dataset: Optional[DrugResponseDataset], + split_id: str, + test_mode: str, + randomization_type: str = "permutation", + response_transformation=Optional[TransformerMixin], ): cl_features = model.load_cell_line_features(data_path=path_data, dataset_name=train_dataset.dataset_name) drug_features = model.load_drug_features(data_path=path_data, dataset_name=train_dataset.dataset_name) randomization_test_file = f'randomization_{randomization_test_view["test_name"]}_{split_id}.csv' - if (randomization_test_view["view"] not in cl_features.get_view_names()) and (randomization_test_view["view"] not in drug_features.get_view_names()): - warnings.warn(f"View {randomization_test_view["view"]} not found in features. Skipping randomization test {randomization_test_view["test_name"]} which includes this view.") + if (randomization_test_view["view"] not in cl_features.get_view_names()) and ( + randomization_test_view["view"] not in drug_features.get_view_names() + ): + warnings.warn( + f"View {randomization_test_view['view']} not found in features. Skipping randomization test {randomization_test_view['test_name']} which includes this view." + ) return - + randomize_train_predict( - view=randomization_test_view["view"], - randomization_type=randomization_type, - randomization_test_file=randomization_test_file, - model=model, - hpam_set=hpam_set, - path_data=path_data, - train_dataset=train_dataset, - test_dataset=test_dataset, - early_stopping_dataset=early_stopping_dataset, - response_transformation=response_transformation, - cl_features=cl_features, - drug_features=drug_features, - ) + view=randomization_test_view["view"], + randomization_type=randomization_type, + randomization_test_file=randomization_test_file, + model=model, + hpam_set=hpam_set, + path_data=path_data, + train_dataset=train_dataset, + test_dataset=test_dataset, + early_stopping_dataset=early_stopping_dataset, + response_transformation=response_transformation, + cl_features=cl_features, + drug_features=drug_features, + ) def compute_robustness( - model: DRPModel, - hpam_set: Dict, - path_data: str, - train_dataset: DrugResponseDataset, - test_dataset: DrugResponseDataset, - early_stopping_dataset: Optional[DrugResponseDataset], - split_id: str, - test_mode: str, - trial: int, - response_transformation=Optional[TransformerMixin] + model: DRPModel, + hpam_set: Dict, + path_data: str, + train_dataset: DrugResponseDataset, + test_dataset: DrugResponseDataset, + early_stopping_dataset: Optional[DrugResponseDataset], + split_id: str, + test_mode: str, + trial: int, + response_transformation=Optional[TransformerMixin], ): - robustness_test_file = f'robustness_{trial}_{split_id}.csv' + robustness_test_file = f"robustness_{trial}_{split_id}.csv" robustness_train_predict( - trial=trial, - trial_file=robustness_test_file, - train_dataset=train_dataset, - test_dataset=test_dataset, - early_stopping_dataset=early_stopping_dataset, - model=model, - hpam_set=hpam_set, - path_data=path_data, - response_transformation=response_transformation, - ) + trial=trial, + trial_file=robustness_test_file, + train_dataset=train_dataset, + test_dataset=test_dataset, + early_stopping_dataset=early_stopping_dataset, + model=model, + hpam_set=hpam_set, + path_data=path_data, + response_transformation=response_transformation, + ) if __name__ == "__main__": @@ -125,7 +136,7 @@ def compute_robustness( args = arg_parser.parse_args() selected_model, hpam_combi, train_set, test_set, es_set, transformation = prep_data(args) - if args.mode == 'full': + if args.mode == "full": test_set = train_and_predict( model=selected_model, hpams=hpam_combi, @@ -133,12 +144,12 @@ def compute_robustness( train_dataset=train_set, prediction_dataset=test_set, early_stopping_dataset=es_set, - response_transformation=transformation + response_transformation=transformation, ) - prediction_dataset = f'predictions_{args.split_id}.csv' + prediction_dataset = f"predictions_{args.split_id}.csv" test_set.save(prediction_dataset) - elif args.mode == 'randomization': - with open(args.randomization_views_path, 'r') as f: + elif args.mode == "randomization": + with open(args.randomization_views_path, "r") as f: rand_test_view = yaml.safe_load(f) compute_randomization( randomization_test_view=rand_test_view, @@ -151,9 +162,9 @@ def compute_robustness( split_id=args.split_id, test_mode=args.test_mode, randomization_type=args.randomization_type, - response_transformation=transformation + response_transformation=transformation, ) - elif args.mode == 'robustness': + elif args.mode == "robustness": compute_robustness( model=selected_model, hpam_set=hpam_combi, @@ -164,7 +175,7 @@ def compute_robustness( split_id=args.split_id, test_mode=args.test_mode, trial=args.robustness_trial, - response_transformation=transformation + response_transformation=transformation, ) else: raise ValueError(f"Invalid mode: {args.mode}. Choose full, randomization, or robustness.") diff --git a/bin/write_html.py b/bin/write_html.py index e41d6db..2685d11 100755 --- a/bin/write_html.py +++ b/bin/write_html.py @@ -19,9 +19,9 @@ def get_plot_list(files: list, lpo_lco_ldo: str, plot_type: str): f for f in files if lpo_lco_ldo in f - and f.startswith(plot_type) - and f != f"{plot_type}_{lpo_lco_ldo}.html" - and f != f"{plot_type}_{lpo_lco_ldo}_normalized.html" + and f.startswith(plot_type) + and f != f"{plot_type}_{lpo_lco_ldo}.html" + and f != f"{plot_type}_{lpo_lco_ldo}_normalized.html" ] @@ -44,9 +44,9 @@ def write_html(run_id: str, lpo_lco_ldo: str, files: list): f.write(f"

Results for {run_id}: {lpo_lco_ldo}

\n") plot_list = get_plot_list(files=files, lpo_lco_ldo=lpo_lco_ldo, plot_type="violinplot") - write_violins_and_heatmaps(f=f, setting=lpo_lco_ldo, plot_list=plot_list, plot='Violin') + write_violins_and_heatmaps(f=f, setting=lpo_lco_ldo, plot_list=plot_list, plot="Violin") plot_list = get_plot_list(files=files, lpo_lco_ldo=lpo_lco_ldo, plot_type="heatmap") - write_violins_and_heatmaps(f=f, setting=lpo_lco_ldo, plot_list=plot_list, plot='Heatmap') + write_violins_and_heatmaps(f=f, setting=lpo_lco_ldo, plot_list=plot_list, plot="Heatmap") f.write('

Regression plots

\n') f.write("
    \n") @@ -56,23 +56,27 @@ def write_html(run_id: str, lpo_lco_ldo: str, files: list): f.write("
\n") f.write('

Comparison of correlation metrics

\n') - corr_files = [f for f in files if lpo_lco_ldo in f and f.startswith("corr_comp_scatter") and f.endswith("drug.html")] + corr_files = [ + f for f in files if lpo_lco_ldo in f and f.startswith("corr_comp_scatter") and f.endswith("drug.html") + ] write_scatter_eval_models(f=f, setting=lpo_lco_ldo, group_by="drug", plot_list=corr_files) - corr_files = [f for f in files if lpo_lco_ldo in f and f.startswith("corr_comp_scatter") and f.endswith("cell_line.html")] + corr_files = [ + f for f in files if lpo_lco_ldo in f and f.startswith("corr_comp_scatter") and f.endswith("cell_line.html") + ] write_scatter_eval_models(f=f, setting=lpo_lco_ldo, group_by="cell_line", plot_list=corr_files) f.write('

Evaluation Results Table

\n') - whole_table = [f for f in files if f == f'table_{lpo_lco_ldo}.html'][0] + whole_table = [f for f in files if f == f"table_{lpo_lco_ldo}.html"][0] write_table(f=f, table=whole_table) if lpo_lco_ldo != "LCO": f.write("

Evaluation Results per Cell Line Table

\n") - cell_line_table = [f for f in files if f == f'table_{lpo_lco_ldo}_per_cl.html'][0] + cell_line_table = [f for f in files if f == f"table_{lpo_lco_ldo}_per_cl.html"][0] write_table(f=f, table=cell_line_table) if lpo_lco_ldo != "LDO": f.write("

Evaluation Results per Drug Table

\n") - drug_table = [f for f in files if f == f'table_{lpo_lco_ldo}_per_drug.html'][0] + drug_table = [f for f in files if f == f"table_{lpo_lco_ldo}_per_drug.html"][0] write_table(f=f, table=drug_table) f.write("\n") diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index c028c2b..8572121 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -9,12 +9,17 @@ process LOAD_RESPONSE { input: val dataset_name val path_data + val cross_study_datasets output: - path 'response_dataset.pkl', emit: response_dataset + path 'response_dataset.pkl', emit: response_dataset + path 'cross_study_*.pkl', emit: cross_study_datasets, optional: true script: """ - load_response.py --dataset_name ${dataset_name} --path_data ${path_data} + load_response.py \\ + --dataset_name ${dataset_name} \\ + --path_data ${path_data} \\ + ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} """ } diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 845f846..b9e6ecf 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -11,7 +11,7 @@ workflow RUN_CV { baselines // model names for comparison main: - LOAD_RESPONSE(params.dataset_name, params.path_data) + LOAD_RESPONSE(params.dataset_name, params.path_data, params.cross_study_datasets) ch_test_modes = channel.from(test_modes) ch_data = ch_test_modes.combine(LOAD_RESPONSE.out.response_dataset) From 29d733e2d1faed959bc7e461b4080b82a9fcff6c Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 17 Jul 2024 16:43:55 +0200 Subject: [PATCH 050/257] small adjustment --- bin/train_and_predict_cv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index 9e3f450..ba0c461 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -35,7 +35,7 @@ def main(): es_dataset = split["early_stopping"] else: es_dataset = None - model = model_class(target="IC50") + model = model_class() response_transform = get_response_transformation(args.response_transformation) validation_dataset = train_and_predict( model=model, From b24fada13dcf9c00a3bcfea0cccc47ab2a3e0d77 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 17 Jul 2024 16:50:52 +0200 Subject: [PATCH 051/257] small adjustment for evaluate_and_find_max.py --- bin/evaluate_and_find_max.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/evaluate_and_find_max.py b/bin/evaluate_and_find_max.py index 8c5db07..ae3eede 100755 --- a/bin/evaluate_and_find_max.py +++ b/bin/evaluate_and_find_max.py @@ -4,7 +4,7 @@ import pickle import yaml -from drevalpy.experiment import evaluate +from drevalpy.evaluation import evaluate def get_parser(): From aa5a00776fe4ec9823bb5d0cc282a3106e31739a Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 17 Jul 2024 16:59:27 +0200 Subject: [PATCH 052/257] small adjustment for randomization_split.py --- bin/randomization_split.py | 37 +++++++++++++++++++++++ modules/local/randomization_split/main.nf | 22 +------------- 2 files changed, 38 insertions(+), 21 deletions(-) create mode 100755 bin/randomization_split.py diff --git a/bin/randomization_split.py b/bin/randomization_split.py new file mode 100755 index 0000000..d84a56d --- /dev/null +++ b/bin/randomization_split.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python +import argparse +import yaml + +from drevalpy.models import MODEL_FACTORY +from drevalpy.experiment import get_randomization_test_views + + +def get_parser(): + parser = argparse.ArgumentParser(description="Create randomization test views.") + parser.add_argument("--model_name", type=str, required=True, help="Name of the model to use.") + parser.add_argument("--randomization_mode", type=str, required=True, help="Randomization mode to use.") + return parser + + +def main(args): + model_class = MODEL_FACTORY[args.model_name] + model = model_class() + + randomization_test_views = get_randomization_test_views( + model=model, + randomization_mode=[args.randomization_mode] + ) + + key = list(randomization_test_views.keys())[0] + # create as many dicts as there are elements in the value list of the key + randomization_test_view_dicts = [{'test_name': key, 'view': value} for value in randomization_test_views[key]] + + for rand_dict in randomization_test_view_dicts: + with open(f'randomization_test_view_{rand_dict["test_name"]}.yaml', 'w') as f: + yaml.dump(rand_dict, f) + + +if __name__ == "__main__": + arg_parser = get_parser() + all_args = arg_parser.parse_args() + main(all_args) diff --git a/modules/local/randomization_split/main.nf b/modules/local/randomization_split/main.nf index 028c07a..24ad31e 100644 --- a/modules/local/randomization_split/main.nf +++ b/modules/local/randomization_split/main.nf @@ -14,27 +14,7 @@ process RANDOMIZATION_SPLIT { script: """ - #!/usr/bin/env python - import pickle - import yaml - from drevalpy.models import MODEL_FACTORY - from drevalpy.experiment import get_randomization_test_views - - model_class = MODEL_FACTORY['${model_name}'] - model = model_class(target='IC50') - - randomization_test_views = get_randomization_test_views( - model=model, - randomization_mode=['${randomization_mode}'] - ) - - key = list(randomization_test_views.keys())[0] - # create as many dicts as there are elements in the value list of the key - randomization_test_view_dicts = [{'test_name': key, 'view': value} for value in randomization_test_views[key]] - - for rand_dict in randomization_test_view_dicts: - with open(f'randomization_test_view_{rand_dict["test_name"]}.yaml', 'w') as f: - yaml.dump(rand_dict, f) + randomization_split.py --model_name ${model_name} --randomization_mode ${randomization_mode} """ } From 85ebc31d77bcde67d42407807de55f348688a7ce Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 17 Jul 2024 17:04:26 +0200 Subject: [PATCH 053/257] minor changes --- bin/train_and_predict_final.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index c67574c..0476a46 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -5,11 +5,11 @@ import pickle import warnings from typing import Dict, Optional - import yaml +from sklearn.base import TransformerMixin + from drevalpy.datasets.dataset import DrugResponseDataset from drevalpy.models.drp_model import DRPModel -from sklearn.base import TransformerMixin from drevalpy.models import MODEL_FACTORY from drevalpy.experiment import train_and_predict, randomize_train_predict, robustness_train_predict from drevalpy.utils import get_response_transformation @@ -45,6 +45,8 @@ def prep_data(arguments): test_dataset = split["test"] model_class = MODEL_FACTORY[arguments.model_name] + model = model_class() + if model_class.early_stopping: validation_dataset = split["validation_es"] es_dataset = split["early_stopping"] @@ -58,7 +60,6 @@ def prep_data(arguments): best_hpam_dict = yaml.safe_load(f) best_hpams = best_hpam_dict[f"{arguments.model_name}_{arguments.split_id}"]["best_hpam_combi"] - model = model_class(target="IC50") response_transform = get_response_transformation(arguments.response_transformation) return model, best_hpams, train_dataset, test_dataset, es_dataset, response_transform From b8dcccaff0b591f46d09f8c11ea789ba438691e9 Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Wed, 17 Jul 2024 17:17:20 +0200 Subject: [PATCH 054/257] instantiate model harmonization --- bin/train_and_predict_cv.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index ba0c461..4b1ca7f 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -7,10 +7,9 @@ from drevalpy.models import MODEL_FACTORY -from drevalpy.experiment import train_and_predict +from drevalpy.experiment import train_and_predict, instantiate_model from drevalpy.utils import get_response_transformation - def get_parser(): parser = argparse.ArgumentParser(description="Train and predict using a drug response prediction model.") parser.add_argument("--model_name", type=str, help="model to evaluate or list of models to compare") @@ -30,12 +29,14 @@ def main(): train_dataset = split["train"] validation_dataset = split["validation"] hpams = yaml.load(open(args.hyperparameters, "r"), Loader=yaml.FullLoader) + if model_class.early_stopping: validation_dataset = split["validation_es"] es_dataset = split["early_stopping"] else: es_dataset = None - model = model_class() + + model = instantiate_model(model_class) response_transform = get_response_transformation(args.response_transformation) validation_dataset = train_and_predict( model=model, From b97f91b73a4e4a8ed8a5d48da8692cd12ba45662 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 17 Jul 2024 17:30:31 +0200 Subject: [PATCH 055/257] minor changes --- bin/cv_split.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cv_split.py b/bin/cv_split.py index fa73067..f20dba3 100755 --- a/bin/cv_split.py +++ b/bin/cv_split.py @@ -18,7 +18,7 @@ def main(): args = parser.parse_args() response_data = pickle.load(open(args.response, "rb")) response_data.split_dataset( - n_cv_splits=args.n_cv_splits, mode=args.test_mode, split_validation=True, validation_ratio=0.1, random_state=42 + n_cv_splits=args.n_cv_splits, mode=args.test_mode, split_validation=True, split_early_stopping=True, validation_ratio=0.1, random_state=42 ) for split_index, split in enumerate(response_data.cv_splits): with open(f"split_{split_index}.pkl", "wb") as f: From 71951cad488f2e850b7e9f2c47e9e4b726e4bd06 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 18 Jul 2024 15:00:57 +0200 Subject: [PATCH 056/257] redundancy removed in evaluate_final.py --- bin/evaluate_final.py | 76 +------------------------------------------ 1 file changed, 1 insertion(+), 75 deletions(-) diff --git a/bin/evaluate_final.py b/bin/evaluate_final.py index feb4b84..d924aa9 100755 --- a/bin/evaluate_final.py +++ b/bin/evaluate_final.py @@ -1,11 +1,7 @@ #!/usr/bin/env python -import os import argparse -import pandas as pd -from drevalpy.datasets.dataset import DrugResponseDataset -from drevalpy.evaluation import evaluate, AVAILABLE_METRICS -from drevalpy.visualization.utils import evaluate_per_group +from drevalpy.visualization.utils import evaluate_file def get_parser(): @@ -16,68 +12,6 @@ def get_parser(): return parser -def generate_name(test_mode, model_name, pred_file): - pred_rand_rob = os.path.basename(pred_file).split("_")[0] - if pred_rand_rob == "predictions": - pred_setting = "predictions" - elif pred_rand_rob == "randomization": - pred_setting = "randomize-" + "-".join(os.path.basename(pred_file).split("_")[1:-2]) - else: - pred_setting = "-".join(os.path.basename(pred_file).split("_")[:2]) - split = "_".join(os.path.basename(pred_file).split(".")[0].split("_")[-2:]) - return f"{model_name}_{pred_setting}_{test_mode}_{split}" - - -def evaluate_file(test_mode, model_name, pred_file): - print("Parsing file:", os.path.normpath(pred_file)) - result = pd.read_csv(pred_file) - dataset = DrugResponseDataset( - response=result["response"], - cell_line_ids=result["cell_line_ids"], - drug_ids=result["drug_ids"], - predictions=result["predictions"], - ) - model = generate_name(test_mode, model_name, pred_file) - overall_eval = {model: evaluate(dataset, AVAILABLE_METRICS.keys())} - true_vs_pred = pd.DataFrame( - { - "model": [model for _ in range(len(dataset.response))], - "drug": dataset.drug_ids, - "cell_line": dataset.cell_line_ids, - "y_true": dataset.response, - "y_pred": dataset.predictions, - } - ) - - evaluation_results_per_drug = None - evaluation_results_per_cl = None - norm_drug_eval_results = {} - norm_cl_eval_results = {} - if "LPO" == test_mode or "LCO" == test_mode: - norm_drug_eval_results, evaluation_results_per_drug = evaluate_per_group( - df=true_vs_pred, - group_by="drug", - norm_group_eval_results=norm_drug_eval_results, - eval_results_per_group=evaluation_results_per_drug, - model=model, - ) - if "LPO" == test_mode or "LDO" == test_mode: - norm_cl_eval_results, evaluation_results_per_cl = evaluate_per_group( - df=true_vs_pred, - group_by="cell_line", - norm_group_eval_results=norm_cl_eval_results, - eval_results_per_group=evaluation_results_per_cl, - model=model, - ) - overall_eval = pd.DataFrame.from_dict(overall_eval, orient="index") - if norm_drug_eval_results != {}: - overall_eval = concat_results(norm_drug_eval_results, "drug", overall_eval) - if norm_cl_eval_results != {}: - overall_eval = concat_results(norm_cl_eval_results, "cell_line", overall_eval) - - return overall_eval, evaluation_results_per_drug, evaluation_results_per_cl, true_vs_pred, model - - def write_results(overall_eval, evaluation_results_per_drug, evaluation_results_per_cl, true_vs_pred, model_name): overall_eval.to_csv(f"{model_name}_evaluation_results.csv") if evaluation_results_per_drug is not None: @@ -87,14 +21,6 @@ def write_results(overall_eval, evaluation_results_per_drug, evaluation_results_ true_vs_pred.to_csv(f"{model_name}_true_vs_pred.csv") -def concat_results(norm_group_res, group_by, eval_res): - norm_group_res = pd.DataFrame.from_dict(norm_group_res, orient="index") - # append 'group normalized ' to the column names - norm_group_res.columns = [f"{col}: {group_by} normalized" for col in norm_group_res.columns] - eval_res = pd.concat([eval_res, norm_group_res], axis=1) - return eval_res - - if __name__ == "__main__": args = get_parser().parse_args() results_all, eval_res_d, eval_res_cl, t_vs_pred, mname = evaluate_file( From 572eef929aa3b35376c7e077a57fd9ac2ff3d749 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 18 Jul 2024 15:13:11 +0200 Subject: [PATCH 057/257] redundancy removed --- bin/cv_split.py | 7 ++++- bin/draw_regression.py | 39 +++++++++++++++++++++++++++ bin/load_response.py | 10 ++++--- bin/randomization_split.py | 9 +++---- bin/train_and_predict_cv.py | 1 + modules/local/draw_regression/main.nf | 25 +++-------------- 6 files changed, 60 insertions(+), 31 deletions(-) create mode 100755 bin/draw_regression.py diff --git a/bin/cv_split.py b/bin/cv_split.py index f20dba3..3fa5282 100755 --- a/bin/cv_split.py +++ b/bin/cv_split.py @@ -18,7 +18,12 @@ def main(): args = parser.parse_args() response_data = pickle.load(open(args.response, "rb")) response_data.split_dataset( - n_cv_splits=args.n_cv_splits, mode=args.test_mode, split_validation=True, split_early_stopping=True, validation_ratio=0.1, random_state=42 + n_cv_splits=args.n_cv_splits, + mode=args.test_mode, + split_validation=True, + split_early_stopping=True, + validation_ratio=0.1, + random_state=42, ) for split_index, split in enumerate(response_data.cv_splits): with open(f"split_{split_index}.pkl", "wb") as f: diff --git a/bin/draw_regression.py b/bin/draw_regression.py new file mode 100755 index 0000000..056e9bb --- /dev/null +++ b/bin/draw_regression.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +import argparse +import pandas as pd + +from drevalpy.visualization.utils import draw_regr_slider + + +def get_parser(): + parser = argparse.ArgumentParser(description="Draw regression plot.") + parser.add_argument("--path_t_vs_p", type=str, required=True, help="Path to true_vs_pred.csv.") + parser.add_argument("--name", type=str, required=True, help="Setting name.") + parser.add_argument("--model", type=str, required=True, help="Model name.") + return parser + + +def main(path_to_true_vs_pred: str, name: str, model: str): + true_vs_pred = pd.read_csv(path_to_true_vs_pred, index_col=0) + + name_split = name.split("_") + lpo_lco_ldo = name_split[0] + group_by = name_split[1] + if group_by == "cell": + group_by = "cell_line" + normalize = name.endswith("normalized") + + draw_regr_slider( + t_v_p=true_vs_pred, + lpo_lco_ldo=lpo_lco_ldo, + model=model, + grouping_slider=group_by, + out_prefix="", + name=name, + normalize=normalize, + ) + + +if __name__ == "__main__": + args = get_parser().parse_args() + main(args.path_t_vs_p, args.name, args.model) diff --git a/bin/load_response.py b/bin/load_response.py index afd2c39..29a66e6 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -8,9 +8,13 @@ def get_parser(): parser = argparse.ArgumentParser(description="Load data for drug response prediction.") parser.add_argument("--dataset_name", type=str, required=True, help="Name of the dataset to load.") parser.add_argument("--path_data", type=str, default="data", help="Path to the data directory.") - parser.add_argument("--cross_study_datasets", nargs='+', default=[], - help="List of datasets to use to evaluate predictions across studies. " - "Default is empty list which means no cross-study datasets are used.") + parser.add_argument( + "--cross_study_datasets", + nargs="+", + default=[], + help="List of datasets to use to evaluate predictions across studies. " + "Default is empty list which means no cross-study datasets are used.", + ) return parser diff --git a/bin/randomization_split.py b/bin/randomization_split.py index d84a56d..c58b957 100755 --- a/bin/randomization_split.py +++ b/bin/randomization_split.py @@ -17,17 +17,14 @@ def main(args): model_class = MODEL_FACTORY[args.model_name] model = model_class() - randomization_test_views = get_randomization_test_views( - model=model, - randomization_mode=[args.randomization_mode] - ) + randomization_test_views = get_randomization_test_views(model=model, randomization_mode=[args.randomization_mode]) key = list(randomization_test_views.keys())[0] # create as many dicts as there are elements in the value list of the key - randomization_test_view_dicts = [{'test_name': key, 'view': value} for value in randomization_test_views[key]] + randomization_test_view_dicts = [{"test_name": key, "view": value} for value in randomization_test_views[key]] for rand_dict in randomization_test_view_dicts: - with open(f'randomization_test_view_{rand_dict["test_name"]}.yaml', 'w') as f: + with open(f'randomization_test_view_{rand_dict["test_name"]}.yaml', "w") as f: yaml.dump(rand_dict, f) diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index 4b1ca7f..e7f1999 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -10,6 +10,7 @@ from drevalpy.experiment import train_and_predict, instantiate_model from drevalpy.utils import get_response_transformation + def get_parser(): parser = argparse.ArgumentParser(description="Train and predict using a drug response prediction model.") parser.add_argument("--model_name", type=str, help="model to evaluate or list of models to compare") diff --git a/modules/local/draw_regression/main.nf b/modules/local/draw_regression/main.nf index 37e2bb2..613c34e 100644 --- a/modules/local/draw_regression/main.nf +++ b/modules/local/draw_regression/main.nf @@ -16,27 +16,10 @@ process DRAW_REGRESSION { script: """ - #!/usr/bin/env python - import pandas as pd - from drevalpy.visualization.utils import draw_regr_slider - - true_vs_pred = pd.read_csv('${true_vs_pred}', index_col=0) - name_split = '${name}'.split('_') - lpo_lco_ldo = name_split[0] - group_by = name_split[1] - if group_by == 'cell': - group_by = 'cell_line' - normalize = '${name}'.endswith('normalized') - - draw_regr_slider( - t_v_p=true_vs_pred, - lpo_lco_ldo=lpo_lco_ldo, - model='${model}', - grouping_slider=group_by, - out_prefix='', - name='${name}', - normalize=normalize - ) + draw_regression.py \\ + --path_t_vs_p ${true_vs_pred} \\ + --name ${name} \\ + --model ${model} """ } From 86e2b71e35b549f40422b0f0683d180290116486 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 18 Jul 2024 15:21:51 +0200 Subject: [PATCH 058/257] redundancy removed --- bin/save_tables.py | 32 +++++++++++++++++++++++++++++++ modules/local/save_tables/main.nf | 19 +++--------------- 2 files changed, 35 insertions(+), 16 deletions(-) create mode 100755 bin/save_tables.py diff --git a/bin/save_tables.py b/bin/save_tables.py new file mode 100755 index 0000000..e322629 --- /dev/null +++ b/bin/save_tables.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python +import argparse +import pandas as pd + +from drevalpy.visualization.utils import export_html_table + + +def get_parser(): + parser = argparse.ArgumentParser(description="Save table as html.") + parser.add_argument("--path_eval_results", type=str, required=True, help="Path to evaluation results.") + parser.add_argument("--lpo_lco_ldo", type=str, required=True, help="LPO_LCO_LDO.") + return parser + + +def main(path_eval_results: str, lpo_lco_ldo: str): + df = pd.read_csv(path_eval_results) + df = df[df["LPO_LCO_LDO"] == lpo_lco_ldo] + + if "per_drug" in path_eval_results: + grouping = "drug" + elif "per_cl" in path_eval_results: + grouping = "cell_line" + else: + grouping = "all" + + export_path = f"table_{grouping}_{lpo_lco_ldo}.html" + export_html_table(df=df, export_path=export_path, grouping=grouping) + + +if __name__ == "__main__": + args = get_parser().parse_args() + main(args.path_eval_results, args.lpo_lco_ldo) diff --git a/modules/local/save_tables/main.nf b/modules/local/save_tables/main.nf index e7fedad..69272ed 100644 --- a/modules/local/save_tables/main.nf +++ b/modules/local/save_tables/main.nf @@ -16,22 +16,9 @@ process SAVE_TABLES { script: """ - #!/usr/bin/env python - import pandas as pd - from drevalpy.visualization.utils import export_setting_html_table - - df = pd.read_csv('${eval_results}') - df = df[df['LPO_LCO_LDO'] == '${lpo_lco_ldo}'] - - if 'per_drug' in '${eval_results}': - grouping = 'drug' - elif 'per_cl' in '${eval_results}': - grouping = 'cell_line' - else: - grouping = 'all' - - export_path = f'table_{grouping}_${lpo_lco_ldo}.html' - export_setting_html_table(df=df, export_path=export_path, grouping=grouping) + save_tables.py \\ + --path_eval_results ${eval_results} \\ + --lpo_lco_ldo ${lpo_lco_ldo} """ } From 378465b2a5bbd2a2c56fe2654bd679e3e2153910 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 19 Jul 2024 10:19:10 +0200 Subject: [PATCH 059/257] redundancy removed in write_index.py --- bin/write_html.py | 6 ++--- bin/write_index.py | 17 ++++++++++++++ modules/local/write_index/main.nf | 38 +++---------------------------- 3 files changed, 23 insertions(+), 38 deletions(-) create mode 100755 bin/write_index.py diff --git a/bin/write_html.py b/bin/write_html.py index 2685d11..9ac02be 100755 --- a/bin/write_html.py +++ b/bin/write_html.py @@ -3,7 +3,7 @@ import shutil import importlib.resources as pkg_resources -from drevalpy.visualization.utils import parse_layout, write_violins_and_heatmaps, write_scatter_eval_models +from drevalpy.visualization.utils import parse_layout, write_violins_and_heatmaps, write_corr_comp_scatter def get_parser(): @@ -59,11 +59,11 @@ def write_html(run_id: str, lpo_lco_ldo: str, files: list): corr_files = [ f for f in files if lpo_lco_ldo in f and f.startswith("corr_comp_scatter") and f.endswith("drug.html") ] - write_scatter_eval_models(f=f, setting=lpo_lco_ldo, group_by="drug", plot_list=corr_files) + write_corr_comp_scatter(f=f, setting=lpo_lco_ldo, group_by="drug", plot_list=corr_files) corr_files = [ f for f in files if lpo_lco_ldo in f and f.startswith("corr_comp_scatter") and f.endswith("cell_line.html") ] - write_scatter_eval_models(f=f, setting=lpo_lco_ldo, group_by="cell_line", plot_list=corr_files) + write_corr_comp_scatter(f=f, setting=lpo_lco_ldo, group_by="cell_line", plot_list=corr_files) f.write('

Evaluation Results Table

\n') whole_table = [f for f in files if f == f"table_{lpo_lco_ldo}.html"][0] diff --git a/bin/write_index.py b/bin/write_index.py new file mode 100755 index 0000000..f2d6ddf --- /dev/null +++ b/bin/write_index.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python +import argparse + +from drevalpy.visualization.utils import create_index_html + + +def get_parser(): + parser = argparse.ArgumentParser(description="Write index.html.") + parser.add_argument("--run_id", type=str, required=True, help="Run ID.") + parser.add_argument("--test_modes", type=str, required=True, help="Test modes.") + return parser + + +if __name__ == "__main__": + args = get_parser().parse_args() + settings = args.test_modes.split(",") + create_index_html(custom_id=args.run_id, test_modes=settings, prefix_results="") diff --git a/modules/local/write_index/main.nf b/modules/local/write_index/main.nf index 1aba162..88b2d76 100644 --- a/modules/local/write_index/main.nf +++ b/modules/local/write_index/main.nf @@ -18,41 +18,9 @@ process WRITE_INDEX { script: """ - #!/usr/bin/env python - import shutil - import importlib.resources as pkg_resources - from drevalpy.visualization.utils import parse_layout - - files_to_copy = [ - "favicon.png", - "nf-core-drugresponseeval_logo_light.png", - ] - for file in files_to_copy: - file_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils", file)) - shutil.copyfile(file_path, file) - - layout_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/index_layout.html")) - - with open("index.html", "w") as f: - parse_layout(f=f, path_to_layout=layout_path) - f.write('
\\n') - f.write('Logo\\n') - f.write("

Results for $run_id

\\n") - f.write("

Available settings

\\n") - f.write('
\\n') - f.write("

Click on the images to open the respective report in a new tab.

\\n") - settings = '$test_modes'.split(",") - settings.sort() - for setting in settings: - img_path = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils", f"{setting}.png")) - shutil.copyfile(img_path, f"{setting}.png") - f.write( - f'\\n' - ) - f.write("
\\n") - f.write("
\\n") - f.write("\\n") - f.write("\\n") + write_index.py \\ + --run_id ${run_id} \\ + --test_modes ${test_modes} """ } From 575c4764104fa5bf20e83076933f6752160f23b5 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 19 Jul 2024 14:26:04 +0200 Subject: [PATCH 060/257] redundancy removed in write_html.py --- bin/save_tables.py | 5 +-- bin/write_html.py | 82 ++++------------------------------------------ 2 files changed, 10 insertions(+), 77 deletions(-) diff --git a/bin/save_tables.py b/bin/save_tables.py index e322629..c3dc454 100755 --- a/bin/save_tables.py +++ b/bin/save_tables.py @@ -2,7 +2,7 @@ import argparse import pandas as pd -from drevalpy.visualization.utils import export_html_table +from drevalpy.visualization import HTMLTable def get_parser(): @@ -24,7 +24,8 @@ def main(path_eval_results: str, lpo_lco_ldo: str): grouping = "all" export_path = f"table_{grouping}_{lpo_lco_ldo}.html" - export_html_table(df=df, export_path=export_path, grouping=grouping) + html_table = HTMLTable(df=df, export_path=export_path, grouping=grouping) + html_table.export_html_table() if __name__ == "__main__": diff --git a/bin/write_html.py b/bin/write_html.py index 9ac02be..2389b9d 100755 --- a/bin/write_html.py +++ b/bin/write_html.py @@ -1,9 +1,6 @@ #!/usr/bin/env python import argparse -import shutil -import importlib.resources as pkg_resources - -from drevalpy.visualization.utils import parse_layout, write_violins_and_heatmaps, write_corr_comp_scatter +from drevalpy.visualization.utils import create_html def get_parser(): @@ -14,76 +11,11 @@ def get_parser(): return parser -def get_plot_list(files: list, lpo_lco_ldo: str, plot_type: str): - return [ - f - for f in files - if lpo_lco_ldo in f - and f.startswith(plot_type) - and f != f"{plot_type}_{lpo_lco_ldo}.html" - and f != f"{plot_type}_{lpo_lco_ldo}_normalized.html" - ] - - -def write_table(f, table): - with open(table, "r") as eval_f: - eval_results = eval_f.readlines() - eval_results[0] = eval_results[0].replace( - '
', - '
', - ) - for line in eval_results: - f.write(line) - - -def write_html(run_id: str, lpo_lco_ldo: str, files: list): - page_layout = str(pkg_resources.files("drevalpy").joinpath("visualization/style_utils/page_layout.html")) - - with open(f"{lpo_lco_ldo}.html", "w") as f: - parse_layout(f=f, path_to_layout=page_layout) - f.write(f"

Results for {run_id}: {lpo_lco_ldo}

\n") - - plot_list = get_plot_list(files=files, lpo_lco_ldo=lpo_lco_ldo, plot_type="violinplot") - write_violins_and_heatmaps(f=f, setting=lpo_lco_ldo, plot_list=plot_list, plot="Violin") - plot_list = get_plot_list(files=files, lpo_lco_ldo=lpo_lco_ldo, plot_type="heatmap") - write_violins_and_heatmaps(f=f, setting=lpo_lco_ldo, plot_list=plot_list, plot="Heatmap") - - f.write('

Regression plots

\n') - f.write("
    \n") - regr_files = [f for f in files if lpo_lco_ldo in f and f.startswith("regression_lines")] - for regr_file in regr_files: - f.write(f'
  • {regr_file}
  • \n') - f.write("
\n") - - f.write('

Comparison of correlation metrics

\n') - corr_files = [ - f for f in files if lpo_lco_ldo in f and f.startswith("corr_comp_scatter") and f.endswith("drug.html") - ] - write_corr_comp_scatter(f=f, setting=lpo_lco_ldo, group_by="drug", plot_list=corr_files) - corr_files = [ - f for f in files if lpo_lco_ldo in f and f.startswith("corr_comp_scatter") and f.endswith("cell_line.html") - ] - write_corr_comp_scatter(f=f, setting=lpo_lco_ldo, group_by="cell_line", plot_list=corr_files) - - f.write('

Evaluation Results Table

\n') - whole_table = [f for f in files if f == f"table_{lpo_lco_ldo}.html"][0] - write_table(f=f, table=whole_table) - - if lpo_lco_ldo != "LCO": - f.write("

Evaluation Results per Cell Line Table

\n") - cell_line_table = [f for f in files if f == f"table_{lpo_lco_ldo}_per_cl.html"][0] - write_table(f=f, table=cell_line_table) - - if lpo_lco_ldo != "LDO": - f.write("

Evaluation Results per Drug Table

\n") - drug_table = [f for f in files if f == f"table_{lpo_lco_ldo}_per_drug.html"][0] - write_table(f=f, table=drug_table) - - f.write("\n") - f.write("\n") - f.write("\n") - - if __name__ == "__main__": args = get_parser().parse_args() - write_html(args.run_id, args.test_mode, args.files) + create_html( + run_id=args.run_id, + lpo_lco_ldo=args.test_mode, + files=args.files, + prefix_results="" + ) From ae78521bc39a3c02bb8c99d68ca173ffed1b70bc Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 19 Jul 2024 16:58:51 +0200 Subject: [PATCH 061/257] redundancy removed for visualization --- bin/draw_corr_comp.py | 10 ++++++++-- bin/draw_regression.py | 11 +++++------ bin/draw_violin_and_heatmap.py | 28 +++++++++++++++++++++++----- bin/save_tables.py | 13 ++++++++++--- 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/bin/draw_corr_comp.py b/bin/draw_corr_comp.py index 850cb9e..b1bba3e 100755 --- a/bin/draw_corr_comp.py +++ b/bin/draw_corr_comp.py @@ -2,7 +2,7 @@ import argparse import pandas as pd -from drevalpy.visualization.utils import draw_scatter_grids_per_group +from drevalpy.visualization.utils import CorrelationComparisonScatter from drevalpy.models import MODEL_FACTORY @@ -21,7 +21,13 @@ def draw_corr_comp(path_to_df: str, setting: str): algorithm = setting.split("_")[0] else: algorithm = "all" - draw_scatter_grids_per_group(df=df, group_by=group_by, lpo_lco_ldo=lpo_lco_ldo, out_prefix="", algorithm=algorithm) + corr_comp = CorrelationComparisonScatter( + df=df, + color_by=group_by, + lpo_lco_ldo=lpo_lco_ldo, + algorithm=algorithm + ) + corr_comp.draw_and_save(out_prefix="", out_suffix=corr_comp.name) if __name__ == "__main__": diff --git a/bin/draw_regression.py b/bin/draw_regression.py index 056e9bb..1c5d4b6 100755 --- a/bin/draw_regression.py +++ b/bin/draw_regression.py @@ -2,7 +2,7 @@ import argparse import pandas as pd -from drevalpy.visualization.utils import draw_regr_slider +from drevalpy.visualization import RegressionSliderPlot def get_parser(): @@ -23,15 +23,14 @@ def main(path_to_true_vs_pred: str, name: str, model: str): group_by = "cell_line" normalize = name.endswith("normalized") - draw_regr_slider( - t_v_p=true_vs_pred, + regr_slider = RegressionSliderPlot( + df=true_vs_pred, lpo_lco_ldo=lpo_lco_ldo, model=model, - grouping_slider=group_by, - out_prefix="", - name=name, + group_by=group_by, normalize=normalize, ) + regr_slider.draw_and_save(out_prefix="", out_suffix=f"{name}_{model}") if __name__ == "__main__": diff --git a/bin/draw_violin_and_heatmap.py b/bin/draw_violin_and_heatmap.py index de316aa..d710148 100755 --- a/bin/draw_violin_and_heatmap.py +++ b/bin/draw_violin_and_heatmap.py @@ -2,7 +2,7 @@ import argparse import pandas as pd -from drevalpy.visualization.utils import draw_violin_or_heatmap +from drevalpy.visualization import Violin, Heatmap def get_parser(): @@ -20,20 +20,38 @@ def prep_df(plot_type: str, path_to_df: str, setting: str): if setting in ["LPO", "LDO", "LCO"]: # overview for setting, only 'rand_setting' == 'predictions' df = df[(df["LPO_LCO_LDO"] == setting) & (df["rand_setting"] == "predictions")] - out_plot = draw_violin_or_heatmap(plot_type, df, normalized_metrics=False, whole_name=False) + normalized_metrics = False + whole_name = False + out_suffix = f"algorithms_{setting}" else: # overview for normalized setting, only 'rand_setting' == 'predictions' lpo_lco_ldo = setting.split("_")[0] df = df[(df["LPO_LCO_LDO"] == lpo_lco_ldo) & (df["rand_setting"] == "predictions")] - out_plot = draw_violin_or_heatmap(plot_type, df, normalized_metrics=True, whole_name=False) + normalized_metrics = True + whole_name = False + out_suffix = f"algorithms_{lpo_lco_ldo}_normalized" else: # algorithm-wise plots name_split = setting.split("_") lpo_lco_ldo = name_split[0] algorithm = name_split[1] df = df[(df["LPO_LCO_LDO"] == lpo_lco_ldo) & (df["algorithm"] == algorithm)] - out_plot = draw_violin_or_heatmap(plot_type, df, normalized_metrics=False, whole_name=True) - out_plot.fig.write_html(f"{plot_type}_{setting}.html") + normalized_metrics = False + whole_name = True + out_suffix = f"{algorithm}_{lpo_lco_ldo}" + if plot_type == "violin": + out_plot = Violin( + df=df, + normalized_metrics=normalized_metrics, + whole_name=whole_name + ) + else: + out_plot = Heatmap( + df=df, + normalized_metrics=normalized_metrics, + whole_name=whole_name + ) + out_plot.draw_and_save(out_prefix="", out_suffix=out_suffix) if __name__ == "__main__": diff --git a/bin/save_tables.py b/bin/save_tables.py index c3dc454..9b2cffa 100755 --- a/bin/save_tables.py +++ b/bin/save_tables.py @@ -18,14 +18,21 @@ def main(path_eval_results: str, lpo_lco_ldo: str): if "per_drug" in path_eval_results: grouping = "drug" + out_suffix = f"{grouping}_{lpo_lco_ldo}" elif "per_cl" in path_eval_results: grouping = "cell_line" + out_suffix = f"{grouping}_{lpo_lco_ldo}" else: grouping = "all" + out_suffix = lpo_lco_ldo - export_path = f"table_{grouping}_{lpo_lco_ldo}.html" - html_table = HTMLTable(df=df, export_path=export_path, grouping=grouping) - html_table.export_html_table() + html_table = HTMLTable(df=df, + group_by=grouping) + html_table.draw_and_save( + out_prefix="", + out_suffix=out_suffix + + ) if __name__ == "__main__": From 13c8892e15b5217e586fb2e9b5b8895d26f6ed84 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 19 Jul 2024 16:59:46 +0200 Subject: [PATCH 062/257] redundancy removed for visualization --- bin/save_tables.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bin/save_tables.py b/bin/save_tables.py index 9b2cffa..1166d50 100755 --- a/bin/save_tables.py +++ b/bin/save_tables.py @@ -18,13 +18,12 @@ def main(path_eval_results: str, lpo_lco_ldo: str): if "per_drug" in path_eval_results: grouping = "drug" - out_suffix = f"{grouping}_{lpo_lco_ldo}" elif "per_cl" in path_eval_results: grouping = "cell_line" - out_suffix = f"{grouping}_{lpo_lco_ldo}" else: grouping = "all" - out_suffix = lpo_lco_ldo + + out_suffix = f"{grouping}_{lpo_lco_ldo}" if grouping != "all" else lpo_lco_ldo html_table = HTMLTable(df=df, group_by=grouping) From 15de7032739592243707392904c48b414cac24eb Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Mon, 22 Jul 2024 10:18:32 +0200 Subject: [PATCH 063/257] test mode not needed --- bin/train_and_predict_final.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 0476a46..cc7663b 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -73,7 +73,6 @@ def compute_randomization( test_dataset: DrugResponseDataset, early_stopping_dataset: Optional[DrugResponseDataset], split_id: str, - test_mode: str, randomization_type: str = "permutation", response_transformation=Optional[TransformerMixin], ): @@ -161,7 +160,6 @@ def compute_robustness( test_dataset=test_set, early_stopping_dataset=es_set, split_id=args.split_id, - test_mode=args.test_mode, randomization_type=args.randomization_type, response_transformation=transformation, ) From d9a602667aaebd76b0f0f431a606777f413a0476 Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Mon, 22 Jul 2024 10:18:59 +0200 Subject: [PATCH 064/257] black --- bin/draw_corr_comp.py | 7 +------ bin/draw_violin_and_heatmap.py | 12 ++---------- bin/save_tables.py | 9 ++------- bin/write_html.py | 7 +------ 4 files changed, 6 insertions(+), 29 deletions(-) diff --git a/bin/draw_corr_comp.py b/bin/draw_corr_comp.py index b1bba3e..85bf148 100755 --- a/bin/draw_corr_comp.py +++ b/bin/draw_corr_comp.py @@ -21,12 +21,7 @@ def draw_corr_comp(path_to_df: str, setting: str): algorithm = setting.split("_")[0] else: algorithm = "all" - corr_comp = CorrelationComparisonScatter( - df=df, - color_by=group_by, - lpo_lco_ldo=lpo_lco_ldo, - algorithm=algorithm - ) + corr_comp = CorrelationComparisonScatter(df=df, color_by=group_by, lpo_lco_ldo=lpo_lco_ldo, algorithm=algorithm) corr_comp.draw_and_save(out_prefix="", out_suffix=corr_comp.name) diff --git a/bin/draw_violin_and_heatmap.py b/bin/draw_violin_and_heatmap.py index d710148..dcfc2a3 100755 --- a/bin/draw_violin_and_heatmap.py +++ b/bin/draw_violin_and_heatmap.py @@ -40,17 +40,9 @@ def prep_df(plot_type: str, path_to_df: str, setting: str): whole_name = True out_suffix = f"{algorithm}_{lpo_lco_ldo}" if plot_type == "violin": - out_plot = Violin( - df=df, - normalized_metrics=normalized_metrics, - whole_name=whole_name - ) + out_plot = Violin(df=df, normalized_metrics=normalized_metrics, whole_name=whole_name) else: - out_plot = Heatmap( - df=df, - normalized_metrics=normalized_metrics, - whole_name=whole_name - ) + out_plot = Heatmap(df=df, normalized_metrics=normalized_metrics, whole_name=whole_name) out_plot.draw_and_save(out_prefix="", out_suffix=out_suffix) diff --git a/bin/save_tables.py b/bin/save_tables.py index 1166d50..7cbff5b 100755 --- a/bin/save_tables.py +++ b/bin/save_tables.py @@ -25,13 +25,8 @@ def main(path_eval_results: str, lpo_lco_ldo: str): out_suffix = f"{grouping}_{lpo_lco_ldo}" if grouping != "all" else lpo_lco_ldo - html_table = HTMLTable(df=df, - group_by=grouping) - html_table.draw_and_save( - out_prefix="", - out_suffix=out_suffix - - ) + html_table = HTMLTable(df=df, group_by=grouping) + html_table.draw_and_save(out_prefix="", out_suffix=out_suffix) if __name__ == "__main__": diff --git a/bin/write_html.py b/bin/write_html.py index 2389b9d..a5272d0 100755 --- a/bin/write_html.py +++ b/bin/write_html.py @@ -13,9 +13,4 @@ def get_parser(): if __name__ == "__main__": args = get_parser().parse_args() - create_html( - run_id=args.run_id, - lpo_lco_ldo=args.test_mode, - files=args.files, - prefix_results="" - ) + create_html(run_id=args.run_id, lpo_lco_ldo=args.test_mode, files=args.files, prefix_results="") From d69219c64f108589609ba3bbce2cbafc91f7628f Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 1 Aug 2024 16:56:25 +0200 Subject: [PATCH 065/257] todos for @Pascal #8 --- bin/randomization_split.py | 1 + bin/train_and_predict_final.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/bin/randomization_split.py b/bin/randomization_split.py index c58b957..dab4956 100755 --- a/bin/randomization_split.py +++ b/bin/randomization_split.py @@ -14,6 +14,7 @@ def get_parser(): def main(args): + # TODO: remove redundancy to drevalpy model_class = MODEL_FACTORY[args.model_name] model = model_class() diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 0476a46..a58bf43 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -77,10 +77,12 @@ def compute_randomization( randomization_type: str = "permutation", response_transformation=Optional[TransformerMixin], ): + # TODO: remove redundancy to drevalpy cl_features = model.load_cell_line_features(data_path=path_data, dataset_name=train_dataset.dataset_name) drug_features = model.load_drug_features(data_path=path_data, dataset_name=train_dataset.dataset_name) randomization_test_file = f'randomization_{randomization_test_view["test_name"]}_{split_id}.csv' + # TODO: remove redundancy to drevalpy if (randomization_test_view["view"] not in cl_features.get_view_names()) and ( randomization_test_view["view"] not in drug_features.get_view_names() ): From fbba7b882d48cc842349ebdfa11b72a97b7fbc16 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 1 Aug 2024 16:56:25 +0200 Subject: [PATCH 066/257] todos for @PascalIversen #8 --- bin/randomization_split.py | 1 + bin/train_and_predict_final.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/bin/randomization_split.py b/bin/randomization_split.py index c58b957..dab4956 100755 --- a/bin/randomization_split.py +++ b/bin/randomization_split.py @@ -14,6 +14,7 @@ def get_parser(): def main(args): + # TODO: remove redundancy to drevalpy model_class = MODEL_FACTORY[args.model_name] model = model_class() diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 0476a46..a58bf43 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -77,10 +77,12 @@ def compute_randomization( randomization_type: str = "permutation", response_transformation=Optional[TransformerMixin], ): + # TODO: remove redundancy to drevalpy cl_features = model.load_cell_line_features(data_path=path_data, dataset_name=train_dataset.dataset_name) drug_features = model.load_drug_features(data_path=path_data, dataset_name=train_dataset.dataset_name) randomization_test_file = f'randomization_{randomization_test_view["test_name"]}_{split_id}.csv' + # TODO: remove redundancy to drevalpy if (randomization_test_view["view"] not in cl_features.get_view_names()) and ( randomization_test_view["view"] not in drug_features.get_view_names() ): From 3af2b0bb7dd6604b9de8a64977c99cb8c20afaa3 Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Mon, 22 Jul 2024 10:18:32 +0200 Subject: [PATCH 067/257] test mode not needed --- bin/train_and_predict_final.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index a58bf43..e140a87 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -73,7 +73,6 @@ def compute_randomization( test_dataset: DrugResponseDataset, early_stopping_dataset: Optional[DrugResponseDataset], split_id: str, - test_mode: str, randomization_type: str = "permutation", response_transformation=Optional[TransformerMixin], ): @@ -163,7 +162,6 @@ def compute_robustness( test_dataset=test_set, early_stopping_dataset=es_set, split_id=args.split_id, - test_mode=args.test_mode, randomization_type=args.randomization_type, response_transformation=transformation, ) From 7382c8b34325587847877d41195d8a31ff8242e4 Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Mon, 22 Jul 2024 10:18:59 +0200 Subject: [PATCH 068/257] black --- bin/draw_corr_comp.py | 7 +------ bin/draw_violin_and_heatmap.py | 12 ++---------- bin/save_tables.py | 9 ++------- bin/write_html.py | 7 +------ 4 files changed, 6 insertions(+), 29 deletions(-) diff --git a/bin/draw_corr_comp.py b/bin/draw_corr_comp.py index b1bba3e..85bf148 100755 --- a/bin/draw_corr_comp.py +++ b/bin/draw_corr_comp.py @@ -21,12 +21,7 @@ def draw_corr_comp(path_to_df: str, setting: str): algorithm = setting.split("_")[0] else: algorithm = "all" - corr_comp = CorrelationComparisonScatter( - df=df, - color_by=group_by, - lpo_lco_ldo=lpo_lco_ldo, - algorithm=algorithm - ) + corr_comp = CorrelationComparisonScatter(df=df, color_by=group_by, lpo_lco_ldo=lpo_lco_ldo, algorithm=algorithm) corr_comp.draw_and_save(out_prefix="", out_suffix=corr_comp.name) diff --git a/bin/draw_violin_and_heatmap.py b/bin/draw_violin_and_heatmap.py index d710148..dcfc2a3 100755 --- a/bin/draw_violin_and_heatmap.py +++ b/bin/draw_violin_and_heatmap.py @@ -40,17 +40,9 @@ def prep_df(plot_type: str, path_to_df: str, setting: str): whole_name = True out_suffix = f"{algorithm}_{lpo_lco_ldo}" if plot_type == "violin": - out_plot = Violin( - df=df, - normalized_metrics=normalized_metrics, - whole_name=whole_name - ) + out_plot = Violin(df=df, normalized_metrics=normalized_metrics, whole_name=whole_name) else: - out_plot = Heatmap( - df=df, - normalized_metrics=normalized_metrics, - whole_name=whole_name - ) + out_plot = Heatmap(df=df, normalized_metrics=normalized_metrics, whole_name=whole_name) out_plot.draw_and_save(out_prefix="", out_suffix=out_suffix) diff --git a/bin/save_tables.py b/bin/save_tables.py index 1166d50..7cbff5b 100755 --- a/bin/save_tables.py +++ b/bin/save_tables.py @@ -25,13 +25,8 @@ def main(path_eval_results: str, lpo_lco_ldo: str): out_suffix = f"{grouping}_{lpo_lco_ldo}" if grouping != "all" else lpo_lco_ldo - html_table = HTMLTable(df=df, - group_by=grouping) - html_table.draw_and_save( - out_prefix="", - out_suffix=out_suffix - - ) + html_table = HTMLTable(df=df, group_by=grouping) + html_table.draw_and_save(out_prefix="", out_suffix=out_suffix) if __name__ == "__main__": diff --git a/bin/write_html.py b/bin/write_html.py index 2389b9d..a5272d0 100755 --- a/bin/write_html.py +++ b/bin/write_html.py @@ -13,9 +13,4 @@ def get_parser(): if __name__ == "__main__": args = get_parser().parse_args() - create_html( - run_id=args.run_id, - lpo_lco_ldo=args.test_mode, - files=args.files, - prefix_results="" - ) + create_html(run_id=args.run_id, lpo_lco_ldo=args.test_mode, files=args.files, prefix_results="") From b8e62be08af290d32c74aa179313381ec71374e2 Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Mon, 22 Jul 2024 10:18:32 +0200 Subject: [PATCH 069/257] Revert "todos for @Pascal #8" This reverts commit d69219c64f108589609ba3bbce2cbafc91f7628f. --- bin/randomization_split.py | 1 - bin/train_and_predict_final.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/bin/randomization_split.py b/bin/randomization_split.py index dab4956..c58b957 100755 --- a/bin/randomization_split.py +++ b/bin/randomization_split.py @@ -14,7 +14,6 @@ def get_parser(): def main(args): - # TODO: remove redundancy to drevalpy model_class = MODEL_FACTORY[args.model_name] model = model_class() diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index e140a87..cc7663b 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -76,12 +76,10 @@ def compute_randomization( randomization_type: str = "permutation", response_transformation=Optional[TransformerMixin], ): - # TODO: remove redundancy to drevalpy cl_features = model.load_cell_line_features(data_path=path_data, dataset_name=train_dataset.dataset_name) drug_features = model.load_drug_features(data_path=path_data, dataset_name=train_dataset.dataset_name) randomization_test_file = f'randomization_{randomization_test_view["test_name"]}_{split_id}.csv' - # TODO: remove redundancy to drevalpy if (randomization_test_view["view"] not in cl_features.get_view_names()) and ( randomization_test_view["view"] not in drug_features.get_view_names() ): From c1e78a0345066724bce42d44b565e71122dbb072 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 2 Aug 2024 14:36:15 +0200 Subject: [PATCH 070/257] redundancy removed, closes #8 --- bin/train_and_predict_final.py | 18 +++--------------- nextflow_schema.json | 2 +- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index cc7663b..4440a98 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -3,7 +3,6 @@ import sys import argparse import pickle -import warnings from typing import Dict, Optional import yaml from sklearn.base import TransformerMixin @@ -32,7 +31,7 @@ def get_parser(): "--randomization_type", type=str, default="permutation", - help="Randomization type (permutation, zeroing, gaussian).", + help="Randomization type (permutation, invariant).", ) parser.add_argument("--robustness_trial", type=int, help="Robustness trial index.") return parser @@ -76,20 +75,11 @@ def compute_randomization( randomization_type: str = "permutation", response_transformation=Optional[TransformerMixin], ): - cl_features = model.load_cell_line_features(data_path=path_data, dataset_name=train_dataset.dataset_name) - drug_features = model.load_drug_features(data_path=path_data, dataset_name=train_dataset.dataset_name) - randomization_test_file = f'randomization_{randomization_test_view["test_name"]}_{split_id}.csv' - if (randomization_test_view["view"] not in cl_features.get_view_names()) and ( - randomization_test_view["view"] not in drug_features.get_view_names() - ): - warnings.warn( - f"View {randomization_test_view['view']} not found in features. Skipping randomization test {randomization_test_view['test_name']} which includes this view." - ) - return randomize_train_predict( view=randomization_test_view["view"], + test_name=randomization_test_view["test_name"], randomization_type=randomization_type, randomization_test_file=randomization_test_file, model=model, @@ -98,9 +88,7 @@ def compute_randomization( train_dataset=train_dataset, test_dataset=test_dataset, early_stopping_dataset=early_stopping_dataset, - response_transformation=response_transformation, - cl_features=cl_features, - drug_features=drug_features, + response_transformation=response_transformation ) diff --git a/nextflow_schema.json b/nextflow_schema.json index 96f07e9..5242639 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -86,7 +86,7 @@ "type": "string", "default": "permutation", "description": "Randomization type for the pipeline.", - "help_text": "type of randomization to use. Choose from \"gaussian\", \"zeroing\", \"permutation\". Default is \"permutation" + "help_text": "type of randomization to use. Choose from \"permutation\", \"invariant\". Default is \"permutation" } } }, From 9c2193681760c01b79bfcdf247b884fe6e387f77 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 9 Aug 2024 16:00:14 +0200 Subject: [PATCH 071/257] Cross-study prediction is now supported, closes #2. Also some visualization fixes --- bin/draw_corr_comp.py | 5 +-- bin/draw_violin_and_heatmap.py | 2 +- bin/evaluate_final.py | 2 +- bin/train_and_predict_final.py | 46 ++++++++++++++++++++++-- modules/local/draw_corr_comp/main.nf | 2 +- modules/local/draw_violin/main.nf | 2 +- modules/local/load_response/main.nf | 3 +- modules/local/predict_full/main.nf | 10 +++--- nextflow_schema.json | 5 +++ subworkflows/local/model_testing/main.nf | 22 ++++++++++-- subworkflows/local/run_cv/main.nf | 1 + workflows/drugresponseeval.nf | 3 +- 12 files changed, 86 insertions(+), 17 deletions(-) diff --git a/bin/draw_corr_comp.py b/bin/draw_corr_comp.py index 85bf148..8e8f606 100755 --- a/bin/draw_corr_comp.py +++ b/bin/draw_corr_comp.py @@ -22,9 +22,10 @@ def draw_corr_comp(path_to_df: str, setting: str): else: algorithm = "all" corr_comp = CorrelationComparisonScatter(df=df, color_by=group_by, lpo_lco_ldo=lpo_lco_ldo, algorithm=algorithm) - corr_comp.draw_and_save(out_prefix="", out_suffix=corr_comp.name) + if corr_comp.name is not None: + corr_comp.draw_and_save(out_prefix="", out_suffix=corr_comp.name) if __name__ == "__main__": args = get_parser().parse_args() - draw_corr_comp(args.data, args.name) + draw_corr_comp(path_to_df=args.data, setting=args.name) diff --git a/bin/draw_violin_and_heatmap.py b/bin/draw_violin_and_heatmap.py index dcfc2a3..f5de956 100755 --- a/bin/draw_violin_and_heatmap.py +++ b/bin/draw_violin_and_heatmap.py @@ -39,7 +39,7 @@ def prep_df(plot_type: str, path_to_df: str, setting: str): normalized_metrics = False whole_name = True out_suffix = f"{algorithm}_{lpo_lco_ldo}" - if plot_type == "violin": + if plot_type == "violinplot": out_plot = Violin(df=df, normalized_metrics=normalized_metrics, whole_name=whole_name) else: out_plot = Heatmap(df=df, normalized_metrics=normalized_metrics, whole_name=whole_name) diff --git a/bin/evaluate_final.py b/bin/evaluate_final.py index d924aa9..6e0bc1d 100755 --- a/bin/evaluate_final.py +++ b/bin/evaluate_final.py @@ -24,6 +24,6 @@ def write_results(overall_eval, evaluation_results_per_drug, evaluation_results_ if __name__ == "__main__": args = get_parser().parse_args() results_all, eval_res_d, eval_res_cl, t_vs_pred, mname = evaluate_file( - args.test_mode, args.model_name, args.pred_file + test_mode=args.test_mode, model_name=args.model_name, pred_file=args.pred_file ) write_results(results_all, eval_res_d, eval_res_cl, t_vs_pred, mname) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 4440a98..b74a603 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -10,7 +10,7 @@ from drevalpy.datasets.dataset import DrugResponseDataset from drevalpy.models.drp_model import DRPModel from drevalpy.models import MODEL_FACTORY -from drevalpy.experiment import train_and_predict, randomize_train_predict, robustness_train_predict +from drevalpy.experiment import train_and_predict, randomize_train_predict, robustness_train_predict, cross_study_prediction from drevalpy.utils import get_response_transformation @@ -34,6 +34,7 @@ def get_parser(): help="Randomization type (permutation, invariant).", ) parser.add_argument("--robustness_trial", type=int, help="Robustness trial index.") + parser.add_argument("--cross_study_datasets", nargs="+", help="Path to cross study datasets.") return parser @@ -100,7 +101,6 @@ def compute_robustness( test_dataset: DrugResponseDataset, early_stopping_dataset: Optional[DrugResponseDataset], split_id: str, - test_mode: str, trial: int, response_transformation=Optional[TransformerMixin], ): @@ -119,6 +119,34 @@ def compute_robustness( ) +def compute_cross( + cross_study_dataset, + model, + test_mode, + train_dataset, + path_data, + early_stopping_dataset, + response_transformation, + split_index +): + split_index = split_index.split("split_")[1] + cross_study_dataset = pickle.load(open(cross_study_dataset, "rb")) + cross_study_dataset.remove_nan_responses() + cross_study_prediction( + dataset=cross_study_dataset, + model=model, + test_mode=test_mode, + train_dataset=train_dataset, + path_data=path_data, + early_stopping_dataset=( + early_stopping_dataset if model.early_stopping else None + ), + response_transformation=response_transformation, + predictions_path='', + split_index=split_index, + ) + + if __name__ == "__main__": arg_parser = get_parser() args = arg_parser.parse_args() @@ -136,6 +164,19 @@ def compute_robustness( ) prediction_dataset = f"predictions_{args.split_id}.csv" test_set.save(prediction_dataset) + for ds in args.cross_study_datasets: + if ds == "NONE.csv": + continue + compute_cross( + cross_study_dataset=ds, + model=selected_model, + test_mode=args.test_mode, + train_dataset=train_set, + path_data=args.path_data, + early_stopping_dataset=es_set, + response_transformation=transformation, + split_index=args.split_id + ) elif args.mode == "randomization": with open(args.randomization_views_path, "r") as f: rand_test_view = yaml.safe_load(f) @@ -160,7 +201,6 @@ def compute_robustness( test_dataset=test_set, early_stopping_dataset=es_set, split_id=args.split_id, - test_mode=args.test_mode, trial=args.robustness_trial, response_transformation=transformation, ) diff --git a/modules/local/draw_corr_comp/main.nf b/modules/local/draw_corr_comp/main.nf index cf9b7cd..17c9058 100644 --- a/modules/local/draw_corr_comp/main.nf +++ b/modules/local/draw_corr_comp/main.nf @@ -12,7 +12,7 @@ process DRAW_CORR_COMP { tuple val(name), path(eval_results_per_group) output: - path('corr_comp_scatter*.html'), emit: corr_comp_scatter + path('corr_comp_scatter*.html'), emit: corr_comp_scatter, optional: true script: """ diff --git a/modules/local/draw_violin/main.nf b/modules/local/draw_violin/main.nf index 6ae6bb7..8e2a3b1 100644 --- a/modules/local/draw_violin/main.nf +++ b/modules/local/draw_violin/main.nf @@ -13,7 +13,7 @@ process DRAW_VIOLIN { path(eval_results) output: - path('violinplot*.html'), emit: violin_plot + path('violin*.html'), emit: violin_plot script: """ diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index 8572121..3221d63 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -1,6 +1,7 @@ process LOAD_RESPONSE { - //tag "$samplesheet" + tag "${dataset_name} (cross: ${cross_study_datasets})" //label 'process_single' + publishDir "${path_data}", mode: 'copy' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 815c85e..b4c822c 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -1,19 +1,20 @@ process PREDICT_FULL { tag "${test_mode}_${model_name}_${split_id}" label 'process_single' - publishDir "${params.outdir}/${params.run_id}/${test_mode}/${model_name}/predictions" + publishDir "${params.outdir}/${params.run_id}/${test_mode}/${model_name}/predictions", mode: 'copy' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : // 'biocontainers/python:3.8.3' }" input: - tuple val(split_id), val(test_mode), path(split_dataset), val(model_name), path(hpam_combi) + tuple path(cross_study_datasets), val(model_name), val(test_mode), val(split_id), path(split_dataset), path(hpam_combi) val(response_transformation) val(path_data) output: - tuple val(test_mode), val(model_name), path('predictions_*.csv'), emit: ch_vis + tuple val(test_mode), val(model_name), path('predictions_*.csv'), emit: ch_vis + path('cross_study/cross_study*.csv'), emit: ch_cross, optional: true script: """ @@ -25,7 +26,8 @@ process PREDICT_FULL { --hyperparameters_path $hpam_combi \\ --response_transformation $response_transformation \\ --test_mode $test_mode \\ - --path_data $path_data + --path_data $path_data \\ + --cross_study_datasets $cross_study_datasets """ } diff --git a/nextflow_schema.json b/nextflow_schema.json index 5242639..0ea4ed7 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -142,6 +142,11 @@ "format": "directory-path", "description": "Path to the data directory.", "help_text": "Path to the data directory." + }, + "cross_study_datasets": { + "type": "string", + "description": "Datasets for cross-study prediction.", + "help_text": "List of datasets to use to evaluate predictions across studies. Default is empty string which means no cross-study datasets are used." } } }, diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 8795585..9a36c71 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -9,14 +9,32 @@ include { COLLECT_RESULTS } from '../../../modules/local/collect_r workflow MODEL_TESTING { take: models // from input - best_hpam_per_split // from RUN_CV + best_hpam_per_split // from RUN_CV: [split_id, test_mode, split_dataset, model_name, best_hpam_combi_X.yaml] randomizations // from input + cross_study_datasets // from LOAD_RESPONSE main: ch_models = channel.from(models) + if (params.cross_study_datasets == '') { + cross_study_datasets = Channel.fromPath(['./NONE.csv']) + } + ch_tmp = best_hpam_per_split.map{ + split_id, test_mode, path_to_split, model_name, path_to_hpams -> + return ["dummy", model_name, test_mode, split_id, path_to_split, path_to_hpams] + } + ch_tmp2 = cross_study_datasets + .collect() + .map{it -> ["dummy", it]} + ch_predict_final = ch_tmp2.combine(ch_tmp, by: 0) + // remove dummy from the beginning + ch_predict_final = ch_predict_final + .map{ + dummy, cross_study_datasets, model_name, test_mode, split_id, path_to_split, path_to_hpams -> + return [cross_study_datasets, model_name, test_mode, split_id, path_to_split, path_to_hpams] + } PREDICT_FULL ( - best_hpam_per_split, + ch_predict_final, params.response_transformation, params.path_data ) diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index b9e6ecf..41724ca 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -62,5 +62,6 @@ workflow RUN_CV { emit: best_hpam_per_split = ch_best_hpams_per_split + cross_study_datasets = LOAD_RESPONSE.out.cross_study_datasets } diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index b352b17..a5eb5f5 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -100,7 +100,8 @@ workflow DRUGRESPONSEEVAL { MODEL_TESTING ( models, RUN_CV.out.best_hpam_per_split, - randomizations + randomizations, + RUN_CV.out.cross_study_datasets ) VISUALIZATION ( From 73ab05351ae0d6e7c33f89b106e5d2fd0537dfb2 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 19 Aug 2024 10:46:33 +0200 Subject: [PATCH 072/257] Critical difference plot included and drawn successfully --- bin/draw_cd.py | 30 +++++++++++++++++++ .../local/draw_critical_difference/main.nf | 24 +++++++++++++++ subworkflows/local/visualization/main.nf | 23 +++++++++----- 3 files changed, 69 insertions(+), 8 deletions(-) create mode 100755 bin/draw_cd.py create mode 100644 modules/local/draw_critical_difference/main.nf diff --git a/bin/draw_cd.py b/bin/draw_cd.py new file mode 100755 index 0000000..5289ad6 --- /dev/null +++ b/bin/draw_cd.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +import argparse +import pandas as pd + +from drevalpy.visualization.utils import CriticalDifferencePlot + + +def get_parser(): + parser = argparse.ArgumentParser(description="Draw critical difference plots.") + parser.add_argument("--name", type=str, required=True, help="Name/Setting of plot.") + parser.add_argument("--data", type=str, required=True, help="Path to data.") + return parser + + +def draw_cd(path_to_df: str, setting: str): + df = pd.read_csv(path_to_df, index_col=0) + df = df[(df["LPO_LCO_LDO"] == setting) & (df["rand_setting"] == "predictions")] + cd_plot = CriticalDifferencePlot( + eval_results_preds=df, + metric='MSE' + ) + cd_plot.draw_and_save( + out_prefix='', + out_suffix=setting + ) + + +if __name__ == "__main__": + args = get_parser().parse_args() + draw_cd(path_to_df=args.data, setting=args.name) diff --git a/modules/local/draw_critical_difference/main.nf b/modules/local/draw_critical_difference/main.nf new file mode 100644 index 0000000..1c03ee0 --- /dev/null +++ b/modules/local/draw_critical_difference/main.nf @@ -0,0 +1,24 @@ +process DRAW_CRITICAL_DIFFERENCE { + tag "${lpo_lco_ldo}" + label 'process_single' + publishDir "${params.outdir}/${params.run_id}/critical_difference_plots" + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + tuple val(lpo_lco_ldo), path(eval_results) + + output: + path('critical_difference*.svg'), emit: critical_difference + + script: + """ + draw_cd.py \\ + --name $lpo_lco_ldo \\ + --data $eval_results + """ + +} diff --git a/subworkflows/local/visualization/main.nf b/subworkflows/local/visualization/main.nf index c24d70f..db70508 100644 --- a/subworkflows/local/visualization/main.nf +++ b/subworkflows/local/visualization/main.nf @@ -1,10 +1,11 @@ -include { DRAW_VIOLIN } from '../../../modules/local/draw_violin' -include { DRAW_HEATMAP } from '../../../modules/local/draw_heatmap' -include { DRAW_CORR_COMP } from '../../../modules/local/draw_corr_comp' -include { DRAW_REGRESSION } from '../../../modules/local/draw_regression' -include { SAVE_TABLES } from '../../../modules/local/save_tables' -include { WRITE_HTML } from '../../../modules/local/write_html' -include { WRITE_INDEX } from '../../../modules/local/write_index' +include { DRAW_CRITICAL_DIFFERENCE } from '../../../modules/local/draw_critical_difference' +include { DRAW_VIOLIN } from '../../../modules/local/draw_violin' +include { DRAW_HEATMAP } from '../../../modules/local/draw_heatmap' +include { DRAW_CORR_COMP } from '../../../modules/local/draw_corr_comp' +include { DRAW_REGRESSION } from '../../../modules/local/draw_regression' +include { SAVE_TABLES } from '../../../modules/local/save_tables' +include { WRITE_HTML } from '../../../modules/local/write_html' +include { WRITE_INDEX } from '../../../modules/local/write_index' workflow VISUALIZATION { @@ -28,6 +29,11 @@ workflow VISUALIZATION { ch_combined = ch_test_modes.combine(ch_models_baselines) ch_combined_mapped = ch_combined.map { it[0] + "_" + it[1] } + ch_cd = ch_test_modes.combine(evaluation_results) + DRAW_CRITICAL_DIFFERENCE( + ch_cd + ) + ch_vio_heat = ch_test_modes.concat(ch_test_modes_normalized).concat(ch_combined_mapped) DRAW_VIOLIN ( @@ -95,7 +101,8 @@ workflow VISUALIZATION { ch_tables ) - ch_html_files = DRAW_VIOLIN.out.violin_plot + ch_html_files = DRAW_CRITICAL_DIFFERENCE.out.critical_difference + .concat(DRAW_VIOLIN.out.violin_plot) .concat(DRAW_HEATMAP.out.heatmap) .concat(DRAW_CORR_COMP.out.corr_comp_scatter) .concat(DRAW_REGRESSION.out.regression_lines) From ad72844a662ca50cdace3876190d180f638455cb Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 19 Aug 2024 14:32:13 +0200 Subject: [PATCH 073/257] Added docker and singluarity containers to config - testing wave, might switch back though --- nextflow.config | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nextflow.config b/nextflow.config index 607b238..b7add8d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -6,6 +6,13 @@ ---------------------------------------------------------------------------------------- */ +// Docker: Comment in for ARM64 build: +// process.container = 'community.wave.seqera.io/library/pip_drevalpy:23d68e736486ab16' +// Docker: Comment in for AMD64 build: +// process.container = 'community.wave.seqera.io/library/pip_drevalpy:7d8f30cda5f4887b' +// Singularity: Comment in for AMD64 build: +process.container = 'oras://community.wave.seqera.io/library/pip_drevalpy:6ca244fae0c2fa29' + // Global default params, used in configs params { From fde1769fbe756109f432acd5818a0078cb3fc642 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 21 Aug 2024 15:25:20 +0200 Subject: [PATCH 074/257] 3 cpus allowed for training --- modules/local/train_and_predict_cv/main.nf | 1 + nextflow.config | 1 + 2 files changed, 2 insertions(+) diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 9ea64df..8b80bb3 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -1,6 +1,7 @@ process TRAIN_AND_PREDICT_CV { tag "${model_name}_${test_mode}" label 'process_single' + cpus 3 input: tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters) diff --git a/nextflow.config b/nextflow.config index b7add8d..a167e71 100644 --- a/nextflow.config +++ b/nextflow.config @@ -6,6 +6,7 @@ ---------------------------------------------------------------------------------------- */ +// Wave containers // Docker: Comment in for ARM64 build: // process.container = 'community.wave.seqera.io/library/pip_drevalpy:23d68e736486ab16' // Docker: Comment in for AMD64 build: From 149d057075cdcf08fc3e12d94c45f8b1dcf6f204 Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Thu, 29 Aug 2024 14:22:32 +0200 Subject: [PATCH 075/257] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 35e01e8..c4500d3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ![nf-core/drugresponseeval](docs/images/nf-core-drugresponseeval_logo_light.png#gh-light-mode-only) ![nf-core/drugresponseeval](docs/images/nf-core-drugresponseeval_logo_dark.png#gh-dark-mode-only) -# ![DrEval_pipeline](https://github.com/JudithBernett/nf-core-drugresponseeval/assets/38618495/2cca1d76-7814-479e-b34c-02e162a614b7) +# ![DrEval_pipeline_simplified](https://github.com/user-attachments/assets/12a077a0-4de2-4aaa-9f70-7166715be36a) [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) From 50d17f47ef2ead3a6c735d085f6980f0c1e413ef Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 30 Aug 2024 15:16:59 +0200 Subject: [PATCH 076/257] trying to restructure everything such that SingleDrugModels can be trained in parallel --- bin/cv_split.py | 1 + bin/hpam_split.py | 11 ++++++-- bin/make_model_channel.py | 29 ++++++++++++++++++++++ bin/train_and_predict_cv.py | 20 +++++++-------- modules/local/evaluate_final/main.nf | 2 +- modules/local/evaluate_find_max/main.nf | 2 +- modules/local/hpam_split/main.nf | 2 +- modules/local/make_model_channel/main.nf | 22 ++++++++++++++++ modules/local/predict_full/main.nf | 2 +- modules/local/randomization_split/main.nf | 2 +- modules/local/randomization_test/main.nf | 2 +- modules/local/robustness_test/main.nf | 2 +- modules/local/train_and_predict_cv/main.nf | 2 +- subworkflows/local/model_testing/main.nf | 9 ++++--- subworkflows/local/run_cv/main.nf | 22 ++++++++++++++++ workflows/drugresponseeval.nf | 4 +-- 16 files changed, 108 insertions(+), 26 deletions(-) create mode 100755 bin/make_model_channel.py create mode 100644 modules/local/make_model_channel/main.nf diff --git a/bin/cv_split.py b/bin/cv_split.py index 3fa5282..8e54a65 100755 --- a/bin/cv_split.py +++ b/bin/cv_split.py @@ -17,6 +17,7 @@ def main(): parser = get_parser() args = parser.parse_args() response_data = pickle.load(open(args.response, "rb")) + response_data.remove_nan_responses() response_data.split_dataset( n_cv_splits=args.n_cv_splits, mode=args.test_mode, diff --git a/bin/hpam_split.py b/bin/hpam_split.py index fc4651b..b2d2744 100755 --- a/bin/hpam_split.py +++ b/bin/hpam_split.py @@ -2,7 +2,7 @@ import argparse import yaml -from drevalpy.models import MODEL_FACTORY +from drevalpy.models import MODEL_FACTORY, SINGLE_DRUG_MODEL_FACTORY def get_parser(): @@ -16,7 +16,14 @@ def get_parser(): if __name__ == "__main__": parser = get_parser() args = parser.parse_args() - model_class = MODEL_FACTORY[args.model_name] + if args.model_name in MODEL_FACTORY: + model_name = args.model_name + else: + model_name = str(args.model_name).split(".")[0] + assert model_name in SINGLE_DRUG_MODEL_FACTORY, (f"{model_name} neither in " + f"SINGLE_DRUG_MODEL_FACTORY nor in " + f"MODEL_FACTORY.") + model_class = MODEL_FACTORY[model_name] hyperparameters = model_class.get_hyperparameter_set() hpam_idx = 0 for hpam_combi in hyperparameters: diff --git a/bin/make_model_channel.py b/bin/make_model_channel.py new file mode 100755 index 0000000..57bebf9 --- /dev/null +++ b/bin/make_model_channel.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +import argparse +import pickle + +from drevalpy.experiment import make_model_list + + +def get_parser(): + parser = argparse.ArgumentParser(description="Split data into CV splits") + parser.add_argument("--models", type=str, required=True, help="List of models") + parser.add_argument("--data", type=str, required=True, help="Path to response data") + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + models = args.models.replace("[", "").replace("]", "").split(", ") + response_data = pickle.load(open(args.data, "rb")) + dataset_name = response_data.dataset_name + all_models = make_model_list(models, response_data) + with open(f'models_{dataset_name}.txt', 'w', encoding='utf-8') as f: + for model in all_models: + f.write(f"{model}\n") + + +if __name__ == "__main__": + main() diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index e7f1999..fe2dc02 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -7,7 +7,7 @@ from drevalpy.models import MODEL_FACTORY -from drevalpy.experiment import train_and_predict, instantiate_model +from drevalpy.experiment import train_and_predict, get_model_name_and_drug_id, get_datasets_from_cv_split from drevalpy.utils import get_response_transformation @@ -25,20 +25,18 @@ def get_parser(): def main(): parser = get_parser() args = parser.parse_args() - model_class = MODEL_FACTORY[args.model_name] + + model_name, drug_id = get_model_name_and_drug_id(args.model_name) + + model_class = MODEL_FACTORY[model_name] split = pickle.load(open(args.cv_data, "rb")) - train_dataset = split["train"] - validation_dataset = split["validation"] - hpams = yaml.load(open(args.hyperparameters, "r"), Loader=yaml.FullLoader) - if model_class.early_stopping: - validation_dataset = split["validation_es"] - es_dataset = split["early_stopping"] - else: - es_dataset = None + train_dataset, validation_dataset, es_dataset, test_dataset = get_datasets_from_cv_split( + split, model_class, model_name, drug_id) - model = instantiate_model(model_class) response_transform = get_response_transformation(args.response_transformation) + hpams = yaml.load(open(args.hyperparameters, "r"), Loader=yaml.FullLoader) + model = model_class() validation_dataset = train_and_predict( model=model, hpams=hpams, diff --git a/modules/local/evaluate_final/main.nf b/modules/local/evaluate_final/main.nf index f509944..f72de96 100644 --- a/modules/local/evaluate_final/main.nf +++ b/modules/local/evaluate_final/main.nf @@ -18,7 +18,7 @@ process EVALUATE_FINAL { """ evaluate_final.py \\ --test_mode $test_mode \\ - --model_name $model_name \\ + --model_name "${model_name}" \\ --pred_file $pred_file """ diff --git a/modules/local/evaluate_find_max/main.nf b/modules/local/evaluate_find_max/main.nf index 31e4f6e..34acca5 100644 --- a/modules/local/evaluate_find_max/main.nf +++ b/modules/local/evaluate_find_max/main.nf @@ -16,7 +16,7 @@ process EVALUATE_FIND_MAX { script: """ evaluate_and_find_max.py \\ - --model_name $model_name \\ + --model_name "${model_name}" \\ --split_id $split_id \\ --hpam_yamls $hpam_yamls \\ --pred_datas $pred_datas \\ diff --git a/modules/local/hpam_split/main.nf b/modules/local/hpam_split/main.nf index 8443a22..70dc028 100644 --- a/modules/local/hpam_split/main.nf +++ b/modules/local/hpam_split/main.nf @@ -16,7 +16,7 @@ process HPAM_SPLIT { script: """ hpam_split.py \\ - --model_name $model_name + --model_name "${model_name}" """ } diff --git a/modules/local/make_model_channel/main.nf b/modules/local/make_model_channel/main.nf new file mode 100644 index 0000000..c7dbb22 --- /dev/null +++ b/modules/local/make_model_channel/main.nf @@ -0,0 +1,22 @@ +process MAKE_MODEL_CHANNEL { + tag "Make model channel" + //label 'process_single' + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + input: + tuple val(models), path(response_data) + + output: + path 'models*.txt', emit: all_models + + script: + """ + make_model_channel.py \\ + --models "${models}" \\ + --data ${response_data} + """ + +} diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index b4c822c..be63f67 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -20,7 +20,7 @@ process PREDICT_FULL { """ train_and_predict_final.py \\ --mode full \\ - --model_name $model_name \\ + --model_name "${model_name}" \\ --split_id $split_id \\ --split_dataset_path $split_dataset \\ --hyperparameters_path $hpam_combi \\ diff --git a/modules/local/randomization_split/main.nf b/modules/local/randomization_split/main.nf index 24ad31e..a71c426 100644 --- a/modules/local/randomization_split/main.nf +++ b/modules/local/randomization_split/main.nf @@ -14,7 +14,7 @@ process RANDOMIZATION_SPLIT { script: """ - randomization_split.py --model_name ${model_name} --randomization_mode ${randomization_mode} + randomization_split.py --model_name "${model_name}" --randomization_mode ${randomization_mode} """ } diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index 3a20510..c368b6f 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -20,7 +20,7 @@ process RANDOMIZATION_TEST { """ train_and_predict_final.py \\ --mode randomization \\ - --model_name $model_name \\ + --model_name "${model_name}" \\ --split_id $split_id \\ --split_dataset_path $split_dataset \\ --hyperparameters_path $best_hpams \\ diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index 0b3aec1..d12c7ff 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -20,7 +20,7 @@ process ROBUSTNESS_TEST { """ train_and_predict_final.py \\ --mode robustness \\ - --model_name $model_name \\ + --model_name "${model_name}" \\ --split_id $split_id \\ --split_dataset_path $split_dataset \\ --hyperparameters_path $best_hpams \\ diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 8b80bb3..70d126f 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -14,7 +14,7 @@ process TRAIN_AND_PREDICT_CV { script: """ train_and_predict_cv.py \\ - --model_name $model_name \\ + --model_name "${model_name}" \\ --path_data $path_data \\ --test_mode $test_mode \\ --hyperparameters $hyperparameters \\ diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 9a36c71..40e2a0c 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -51,8 +51,10 @@ workflow MODEL_TESTING { split_id, test_mode, path_to_split, model_name, path_to_hpams -> return [model_name, test_mode, split_id, path_to_split, path_to_hpams] } - // [model_name, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, randomization_views] - ch_randomization = ch_best_hpams_per_split_rand.combine(RANDOMIZATION_SPLIT.out.randomization_test_views, by: 0) + // [model_name, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, + // randomization_views] + ch_randomization = ch_best_hpams_per_split_rand + .combine(RANDOMIZATION_SPLIT.out.randomization_test_views, by: 0) RANDOMIZATION_TEST ( ch_randomization, params.path_data, @@ -71,7 +73,8 @@ workflow MODEL_TESTING { return [model_name, test_mode, split_id, path_to_split, path_to_hpams] } - // [model_name, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, robustness_iteration] + // [model_name, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, + // robustness_iteration] ch_robustness = ch_best_hpams_per_split_rob.combine(ch_trials_robustness, by: 0) ROBUSTNESS_TEST ( ch_robustness, diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 41724ca..8ea5745 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -1,4 +1,5 @@ include { LOAD_RESPONSE } from '../../../modules/local/load_response' +include { MAKE_MODEL_CHANNEL } from '../../../modules/local/make_model_channel' include { CV_SPLIT } from '../../../modules/local/cv_split' include { HPAM_SPLIT } from '../../../modules/local/hpam_split' include { TRAIN_AND_PREDICT_CV } from '../../../modules/local/train_and_predict_cv' @@ -26,6 +27,26 @@ workflow RUN_CV { ch_models = channel.from(models) ch_baselines = channel.from(baselines) ch_models_baselines = ch_models.concat(ch_baselines) + if (params.cross_study_datasets) { + all_data = LOAD_RESPONSE.out.response_dataset + .combine(LOAD_RESPONSE.out.cross_study_datasets) + } else { + all_data = LOAD_RESPONSE.out.response_dataset + } + all_data = all_data.flatten() + ch_input_models = ch_models_baselines + .collect() + .map { models -> [models] } + .combine(all_data) + + MAKE_MODEL_CHANNEL ( + ch_input_models + ) + + ch_models_baselines = MAKE_MODEL_CHANNEL.out.all_models + .splitCsv(strip: true) + .flatten() + HPAM_SPLIT ( ch_models_baselines ) @@ -48,6 +69,7 @@ workflow RUN_CV { ) // [model_name, test_mode, split_id, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], [prediction_dataset_0.pkl, prediction_dataset_1.pkl, ..., prediction_dataset_n.pkl]] ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.groupTuple(by: [0,1,2]) + ch_combined_hpams.view() EVALUATE_FIND_MAX ( ch_combined_hpams, diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index a5eb5f5..7fbf282 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -96,7 +96,7 @@ workflow DRUGRESPONSEEVAL { models, baselines ) - +/* MODEL_TESTING ( models, RUN_CV.out.best_hpam_per_split, @@ -112,7 +112,7 @@ workflow DRUGRESPONSEEVAL { MODEL_TESTING.out.evaluation_results_per_drug, MODEL_TESTING.out.evaluation_results_per_cl, MODEL_TESTING.out.true_vs_predicted - ) + )*/ } From 9e0d1ec0bc1b744fe8da73a226ea4c0ef4aa19ef Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Thu, 12 Sep 2024 09:26:53 +0200 Subject: [PATCH 077/257] fix make model channel --- bin/make_model_channel.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/make_model_channel.py b/bin/make_model_channel.py index 57bebf9..7a80d6a 100755 --- a/bin/make_model_channel.py +++ b/bin/make_model_channel.py @@ -4,7 +4,7 @@ import pickle from drevalpy.experiment import make_model_list - +from drevalpy.models import FULL_MODEL_FACTORY def get_parser(): parser = argparse.ArgumentParser(description="Split data into CV splits") @@ -19,6 +19,7 @@ def main(): models = args.models.replace("[", "").replace("]", "").split(", ") response_data = pickle.load(open(args.data, "rb")) dataset_name = response_data.dataset_name + models = [FULL_MODEL_FACTORY[model] for model in models] all_models = make_model_list(models, response_data) with open(f'models_{dataset_name}.txt', 'w', encoding='utf-8') as f: for model in all_models: From d788b6654603d2bbf902531ea69d2abf40820882 Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Thu, 12 Sep 2024 11:14:44 +0200 Subject: [PATCH 078/257] fixing commas --- bin/hpam_split.py | 6 +++--- bin/make_model_channel.py | 4 ++-- nextflow.config | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bin/hpam_split.py b/bin/hpam_split.py index b2d2744..74fc567 100755 --- a/bin/hpam_split.py +++ b/bin/hpam_split.py @@ -2,7 +2,7 @@ import argparse import yaml -from drevalpy.models import MODEL_FACTORY, SINGLE_DRUG_MODEL_FACTORY +from drevalpy.models import MODEL_FACTORY, MULTI_DRUG_MODEL_FACTORY, SINGLE_DRUG_MODEL_FACTORY def get_parser(): @@ -16,13 +16,13 @@ def get_parser(): if __name__ == "__main__": parser = get_parser() args = parser.parse_args() - if args.model_name in MODEL_FACTORY: + if args.model_name in MULTI_DRUG_MODEL_FACTORY: model_name = args.model_name else: model_name = str(args.model_name).split(".")[0] assert model_name in SINGLE_DRUG_MODEL_FACTORY, (f"{model_name} neither in " f"SINGLE_DRUG_MODEL_FACTORY nor in " - f"MODEL_FACTORY.") + f"MULTI_DRUG_MODEL_FACTORY.") model_class = MODEL_FACTORY[model_name] hyperparameters = model_class.get_hyperparameter_set() hpam_idx = 0 diff --git a/bin/make_model_channel.py b/bin/make_model_channel.py index 7a80d6a..6fbded4 100755 --- a/bin/make_model_channel.py +++ b/bin/make_model_channel.py @@ -4,7 +4,7 @@ import pickle from drevalpy.experiment import make_model_list -from drevalpy.models import FULL_MODEL_FACTORY +from drevalpy.models import MODEL_FACTORY def get_parser(): parser = argparse.ArgumentParser(description="Split data into CV splits") @@ -19,7 +19,7 @@ def main(): models = args.models.replace("[", "").replace("]", "").split(", ") response_data = pickle.load(open(args.data, "rb")) dataset_name = response_data.dataset_name - models = [FULL_MODEL_FACTORY[model] for model in models] + models = [MODEL_FACTORY[model] for model in models] all_models = make_model_list(models, response_data) with open(f'models_{dataset_name}.txt', 'w', encoding='utf-8') as f: for model in all_models: diff --git a/nextflow.config b/nextflow.config index a167e71..f081b2c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -45,7 +45,7 @@ params { hook_url = null help = false version = false - + debug = true // Config options config_profile_name = null config_profile_description = null From a0e1eed64802dfe29c264e7e0f50d3aeae41177b Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Thu, 12 Sep 2024 13:36:14 +0200 Subject: [PATCH 079/257] . --- nextflow.config | 1 - 1 file changed, 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index f081b2c..27cdeea 100644 --- a/nextflow.config +++ b/nextflow.config @@ -45,7 +45,6 @@ params { hook_url = null help = false version = false - debug = true // Config options config_profile_name = null config_profile_description = null From 74773de1ead734aba5091cf5c04ceeb33135697d Mon Sep 17 00:00:00 2001 From: PascalIversen Date: Thu, 12 Sep 2024 14:32:43 +0200 Subject: [PATCH 080/257] improves eval code --- bin/evaluate_and_find_max.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/bin/evaluate_and_find_max.py b/bin/evaluate_and_find_max.py index ae3eede..b438347 100755 --- a/bin/evaluate_and_find_max.py +++ b/bin/evaluate_and_find_max.py @@ -5,7 +5,7 @@ import yaml from drevalpy.evaluation import evaluate - +from drevalpy.evaluation import MAXIMIZATION_METRICS, MINIMIZATION_METRICS def get_parser(): parser = argparse.ArgumentParser( @@ -20,12 +20,14 @@ def get_parser(): def best_metric(metric, current_metric, best_metric): - if metric in ["MSE", "RMSE", "MAE"]: + if metric in MINIMIZATION_METRICS: if current_metric < best_metric: return True - else: + elif metric in MAXIMIZATION_METRICS: if current_metric > best_metric: return True + else: + raise ValueError(f"Metric {metric} not recognized.") return False From 5837dde42a55e29380cfabb8f15d163110a24851 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 17 Sep 2024 14:10:26 +0200 Subject: [PATCH 081/257] pipeline runs for elasticnet + toydata --- bin/train_and_predict_cv.py | 4 +++- modules/local/draw_critical_difference/main.nf | 2 +- subworkflows/local/model_testing/main.nf | 12 +++--------- subworkflows/local/run_cv/main.nf | 6 ++++-- workflows/drugresponseeval.nf | 4 ++-- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index fe2dc02..9380281 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -46,7 +46,9 @@ def main(): early_stopping_dataset=es_dataset, response_transformation=response_transform, ) - with open(f"prediction_dataset_{validation_dataset.__hash__()}.pkl", "wb") as f: + with open(f"prediction_dataset_{model_name}_{str(args.cv_data).split('.pkl')[0]}_" + f"{str(args.hyperparameters).split('.yaml')[0]}.pkl", + "wb") as f: pickle.dump(validation_dataset, f) diff --git a/modules/local/draw_critical_difference/main.nf b/modules/local/draw_critical_difference/main.nf index 1c03ee0..14316b7 100644 --- a/modules/local/draw_critical_difference/main.nf +++ b/modules/local/draw_critical_difference/main.nf @@ -12,7 +12,7 @@ process DRAW_CRITICAL_DIFFERENCE { tuple val(lpo_lco_ldo), path(eval_results) output: - path('critical_difference*.svg'), emit: critical_difference + path('critical_difference*.svg'), emit: critical_difference, optional: true script: """ diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 40e2a0c..41af90b 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -20,18 +20,12 @@ workflow MODEL_TESTING { } ch_tmp = best_hpam_per_split.map{ split_id, test_mode, path_to_split, model_name, path_to_hpams -> - return ["dummy", model_name, test_mode, split_id, path_to_split, path_to_hpams] + return [model_name, test_mode, split_id, path_to_split, path_to_hpams] } ch_tmp2 = cross_study_datasets .collect() - .map{it -> ["dummy", it]} - ch_predict_final = ch_tmp2.combine(ch_tmp, by: 0) - // remove dummy from the beginning - ch_predict_final = ch_predict_final - .map{ - dummy, cross_study_datasets, model_name, test_mode, split_id, path_to_split, path_to_hpams -> - return [cross_study_datasets, model_name, test_mode, split_id, path_to_split, path_to_hpams] - } + .map{it -> [it]} + ch_predict_final = ch_tmp2.combine(ch_tmp) PREDICT_FULL ( ch_predict_final, diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 8ea5745..16ab31f 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -67,9 +67,11 @@ workflow RUN_CV { params.path_data, params.response_transformation ) - // [model_name, test_mode, split_id, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], [prediction_dataset_0.pkl, prediction_dataset_1.pkl, ..., prediction_dataset_n.pkl]] + // [model_name, test_mode, split_id, + // [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], + // [prediction_dataset_0.pkl, ..., prediction_dataset_n.pkl] ] ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.groupTuple(by: [0,1,2]) - ch_combined_hpams.view() + //ch_combined_hpams.view() EVALUATE_FIND_MAX ( ch_combined_hpams, diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 7fbf282..a5eb5f5 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -96,7 +96,7 @@ workflow DRUGRESPONSEEVAL { models, baselines ) -/* + MODEL_TESTING ( models, RUN_CV.out.best_hpam_per_split, @@ -112,7 +112,7 @@ workflow DRUGRESPONSEEVAL { MODEL_TESTING.out.evaluation_results_per_drug, MODEL_TESTING.out.evaluation_results_per_cl, MODEL_TESTING.out.true_vs_predicted - )*/ + ) } From bcb8fcee19b662207ad3b1624b4bca7ca13de94e Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 17 Sep 2024 14:39:14 +0200 Subject: [PATCH 082/257] fixed cross study --- subworkflows/local/run_cv/main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 16ab31f..a30ee24 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -27,17 +27,17 @@ workflow RUN_CV { ch_models = channel.from(models) ch_baselines = channel.from(baselines) ch_models_baselines = ch_models.concat(ch_baselines) - if (params.cross_study_datasets) { + /*if (params.cross_study_datasets) { all_data = LOAD_RESPONSE.out.response_dataset .combine(LOAD_RESPONSE.out.cross_study_datasets) } else { all_data = LOAD_RESPONSE.out.response_dataset } - all_data = all_data.flatten() + all_data = all_data.flatten()*/ ch_input_models = ch_models_baselines .collect() .map { models -> [models] } - .combine(all_data) + .combine(LOAD_RESPONSE.out.response_dataset) MAKE_MODEL_CHANNEL ( ch_input_models From 5d20b305a16c7cd4b5bfe93c728360091ac04358 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 18 Sep 2024 13:00:28 +0200 Subject: [PATCH 083/257] I think it's fixed for singledrugmodels? --- bin/train_and_predict_final.py | 19 ++++++++++++------- subworkflows/local/run_cv/main.nf | 1 - 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index b74a603..ba2dd70 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -10,7 +10,12 @@ from drevalpy.datasets.dataset import DrugResponseDataset from drevalpy.models.drp_model import DRPModel from drevalpy.models import MODEL_FACTORY -from drevalpy.experiment import train_and_predict, randomize_train_predict, robustness_train_predict, cross_study_prediction +from drevalpy.experiment import (get_model_name_and_drug_id, + get_datasets_from_cv_split, + train_and_predict, + randomize_train_predict, + robustness_train_predict, + cross_study_prediction) from drevalpy.utils import get_response_transformation @@ -39,14 +44,14 @@ def get_parser(): def prep_data(arguments): - split = pickle.load(open(arguments.split_dataset_path, "rb")) - train_dataset = split["train"] - validation_dataset = split["validation"] - test_dataset = split["test"] - - model_class = MODEL_FACTORY[arguments.model_name] + model_name, drug_id = get_model_name_and_drug_id(arguments.model_name) + model_class = MODEL_FACTORY[model_name] model = model_class() + split = pickle.load(open(arguments.split_dataset_path, "rb")) + train_dataset, validation_dataset, es_dataset, test_dataset = get_datasets_from_cv_split( + split, model_class, model_name, drug_id) + if model_class.early_stopping: validation_dataset = split["validation_es"] es_dataset = split["early_stopping"] diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index a30ee24..9da62a1 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -71,7 +71,6 @@ workflow RUN_CV { // [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], // [prediction_dataset_0.pkl, ..., prediction_dataset_n.pkl] ] ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.groupTuple(by: [0,1,2]) - //ch_combined_hpams.view() EVALUATE_FIND_MAX ( ch_combined_hpams, From 36c462e5d084c698d4bfd7b98890f56cbce788f4 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 24 Sep 2024 12:52:35 +0200 Subject: [PATCH 084/257] updated readme --- README.md | 65 +++++++++++++++----------- assets/DrEval_pipeline_simplified.png | Bin 0 -> 381627 bytes assets/drevalpy-2-qr.svg | 1 + 3 files changed, 40 insertions(+), 26 deletions(-) create mode 100644 assets/DrEval_pipeline_simplified.png create mode 100644 assets/drevalpy-2-qr.svg diff --git a/README.md b/README.md index 35e01e8..7721fcb 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,10 @@ -# ![nf-core/drugresponseeval](docs/images/nf-core-drugresponseeval_logo_light.png#gh-light-mode-only) ![nf-core/drugresponseeval](docs/images/nf-core-drugresponseeval_logo_dark.png#gh-dark-mode-only) -# ![DrEval_pipeline](https://github.com/JudithBernett/nf-core-drugresponseeval/assets/38618495/2cca1d76-7814-479e-b34c-02e162a614b7) + +# ![drevalpy_summary](assets/drevalpy-2-qr.svg) -[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) + ## Introduction -**nf-core/drugresponseeval** is a bioinformatics pipeline that ... +**DrEval** is a bioinformatics framework which includes a PyPI package (drevalpy) and a Nextflow +pipeline (this repo). DrEval ensures that evaluations are statistically sound, biologically +meaningful, and reproducible. DrEval simplifies the implementation of drug response prediction +models, allowing researchers to focus on advancing their modeling innovations by automating +standardized evaluation protocols and preprocessing workflows. With DrEval, hyperparameter +tuning is fair and consistent. With its flexible model interface, DrEval supports any model type, +ranging from statistical models to complex neural networks. By contributing your model to the +DrEval catalog, you can increase your work's exposure, reusability, and transferability. +# ![DrEval_pipeline](assets/DrEval_pipeline_simplified.png) -1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) -2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) +1. The response data is loaded +2. All models are trained and evaluated in a cross-validation setting +3. For each CV split, the best hyperparameters are determined using a grid search per model +4. The model is trained on the full training set (train & validation) with the best + hyperparameters to predict the test set +5. If randomization tests are enabled, the model is trained on the full training set with the best + hyperparameters to predict the randomized test set +6. If robustness tests are enabled, the model is trained N times on the full training set with the + best hyperparameters +7. Plots are created summarizing the results + +For baseline models, no randomization or robustness tests are performed. ## Usage @@ -35,22 +61,6 @@ > to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) > with `-profile test` before running the workflow on actual data. - - Now, you can run the pipeline using: @@ -58,8 +68,10 @@ Now, you can run the pipeline using: ```bash nextflow run nf-core/drugresponseeval \ -profile \ - --input samplesheet.csv \ - --outdir + --models \ + --baselines \ + --dataset_name \ + --path_data \ ``` > **Warning:** @@ -77,7 +89,8 @@ For more details about the output files and reports, please refer to the ## Credits -nf-core/drugresponseeval was originally written by Judith Bernett. +nf-core/drugresponseeval was originally written by Judith Bernett (TUM) and Pascal Iversen (FU +Berlin). We thank the following people for their extensive assistance in the development of this pipeline: diff --git a/assets/DrEval_pipeline_simplified.png b/assets/DrEval_pipeline_simplified.png new file mode 100644 index 0000000000000000000000000000000000000000..4342280f28a2dafd098c60e498ea4e30e7a21bc6 GIT binary patch literal 381627 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
t9=$%-y;aBzD;4Y4KVc&c`9cy0 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 literal 0 HcmV?d00001 diff --git a/assets/drevalpy-2-qr.svg b/assets/drevalpy-2-qr.svg new file mode 100644 index 0000000..fe98ebf --- /dev/null +++ b/assets/drevalpy-2-qr.svg @@ -0,0 +1 @@ + \ No newline at end of file From 637918e398267250072b3d5fd915068bdb9b8e10 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 2 Oct 2024 10:26:31 +0200 Subject: [PATCH 085/257] trying to consolidate results - does not work yet --- bin/consolidate_results.py | 30 ++++++++++ bin/make_model_channel.py | 7 ++- bin/train_and_predict_final.py | 67 ++++++++++++++++++++--- modules/local/consolidate_results/main.nf | 26 +++++++++ modules/local/evaluate_final/main.nf | 2 +- modules/local/make_model_channel/main.nf | 6 +- modules/local/predict_full/main.nf | 7 ++- modules/local/randomization_test/main.nf | 4 +- modules/local/robustness_test/main.nf | 4 +- subworkflows/local/model_testing/main.nf | 28 ++++++++-- subworkflows/local/run_cv/main.nf | 29 +++++++--- workflows/drugresponseeval.nf | 7 ++- 12 files changed, 179 insertions(+), 38 deletions(-) create mode 100755 bin/consolidate_results.py create mode 100644 modules/local/consolidate_results/main.nf diff --git a/bin/consolidate_results.py b/bin/consolidate_results.py new file mode 100755 index 0000000..1a0abc3 --- /dev/null +++ b/bin/consolidate_results.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +import argparse + + +def get_parser(): + parser = argparse.ArgumentParser(description="Consolidate results for SingleDrugModels") + parser.add_argument("--test_mode", type=str, required=True, help="Test mode (LPO, LCO, LDO)") + parser.add_argument("--model_names", type=str, nargs="+", required=True, help="All Model " + "names") + parser.add_argument("--pred_files", type=str, nargs="+", required=True, help="All prediction " + "files") + parser.add_argument("--n_cv_splits", type=int, required=True, help="Number of CV splits") + parser.add_argument("--cross_study_datasets", type=str, nargs="+", help="All " + "cross-study " + "datasets") + parser.add_argument("--randomizations", type=str, nargs="+", required=True, help="All " + "randomizations") + parser.add_argument("--n_trials_robustness", type=int, required=True, help="Number of trials") + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + print(args) + + +if __name__ == "__main__": + main() diff --git a/bin/make_model_channel.py b/bin/make_model_channel.py index 6fbded4..b4f7081 100755 --- a/bin/make_model_channel.py +++ b/bin/make_model_channel.py @@ -10,6 +10,7 @@ def get_parser(): parser = argparse.ArgumentParser(description="Split data into CV splits") parser.add_argument("--models", type=str, required=True, help="List of models") parser.add_argument("--data", type=str, required=True, help="Path to response data") + parser.add_argument("--file_name", type=str, required=True, help="Name of the file") return parser @@ -21,9 +22,9 @@ def main(): dataset_name = response_data.dataset_name models = [MODEL_FACTORY[model] for model in models] all_models = make_model_list(models, response_data) - with open(f'models_{dataset_name}.txt', 'w', encoding='utf-8') as f: - for model in all_models: - f.write(f"{model}\n") + with open(f'{args.file_name}_{dataset_name}.txt', 'w', encoding='utf-8') as f: + for model, model_class in all_models.items(): + f.write(f"{model_class},{model}\n") if __name__ == "__main__": diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index ba2dd70..5ed09a0 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -1,5 +1,6 @@ #!/usr/bin/env python - +import os +import json import sys import argparse import pickle @@ -12,6 +13,7 @@ from drevalpy.models import MODEL_FACTORY from drevalpy.experiment import (get_model_name_and_drug_id, get_datasets_from_cv_split, + generate_data_saving_path, train_and_predict, randomize_train_predict, robustness_train_predict, @@ -66,7 +68,7 @@ def prep_data(arguments): best_hpams = best_hpam_dict[f"{arguments.model_name}_{arguments.split_id}"]["best_hpam_combi"] response_transform = get_response_transformation(arguments.response_transformation) - return model, best_hpams, train_dataset, test_dataset, es_dataset, response_transform + return model, drug_id, best_hpams, train_dataset, test_dataset, es_dataset, response_transform def compute_randomization( @@ -80,9 +82,12 @@ def compute_randomization( split_id: str, randomization_type: str = "permutation", response_transformation=Optional[TransformerMixin], + randomization_test_path: str = "" ): - randomization_test_file = f'randomization_{randomization_test_view["test_name"]}_{split_id}.csv' - + randomization_test_file = os.path.join( + randomization_test_path, + f'randomization_{randomization_test_view["test_name"]}_{split_id}.csv' + ) randomize_train_predict( view=randomization_test_view["view"], test_name=randomization_test_view["test_name"], @@ -108,9 +113,12 @@ def compute_robustness( split_id: str, trial: int, response_transformation=Optional[TransformerMixin], + rob_path: str = "" ): - robustness_test_file = f"robustness_{trial}_{split_id}.csv" - + robustness_test_file = os.path.join( + rob_path, + f"robustness_{trial}_{split_id}.csv", + ) robustness_train_predict( trial=trial, trial_file=robustness_test_file, @@ -132,6 +140,7 @@ def compute_cross( path_data, early_stopping_dataset, response_transformation, + path_out, split_index ): split_index = split_index.split("split_")[1] @@ -147,7 +156,7 @@ def compute_cross( early_stopping_dataset if model.early_stopping else None ), response_transformation=response_transformation, - predictions_path='', + path_out=path_out, split_index=split_index, ) @@ -155,9 +164,31 @@ def compute_cross( if __name__ == "__main__": arg_parser = get_parser() args = arg_parser.parse_args() - selected_model, hpam_combi, train_set, test_set, es_set, transformation = prep_data(args) + selected_model, drug_id, hpam_combi, train_set, test_set, es_set, transformation = prep_data( + args) if args.mode == "full": + predictions_path = generate_data_saving_path( + model_name=selected_model.model_name, + drug_id=drug_id, + result_path='', + suffix='predictions', + ) + hpam_path = generate_data_saving_path( + model_name=selected_model.model_name, + drug_id=drug_id, + result_path='', + suffix='best_hpams', + ) + hpam_path = os.path.join(hpam_path, f"best_hpams_{args.split_id}.json") + # save the best hyperparameters as json + with open( + hpam_path, + "w", + encoding="utf-8", + ) as f: + json.dump(hpam_combi, f) + test_set = train_and_predict( model=selected_model, hpams=hpam_combi, @@ -167,7 +198,10 @@ def compute_cross( early_stopping_dataset=es_set, response_transformation=transformation, ) - prediction_dataset = f"predictions_{args.split_id}.csv" + prediction_dataset = os.path.join( + predictions_path, + f"predictions_{args.split_id}.csv", + ) test_set.save(prediction_dataset) for ds in args.cross_study_datasets: if ds == "NONE.csv": @@ -180,11 +214,18 @@ def compute_cross( path_data=args.path_data, early_stopping_dataset=es_set, response_transformation=transformation, + path_out=os.path.dirname(predictions_path), split_index=args.split_id ) elif args.mode == "randomization": with open(args.randomization_views_path, "r") as f: rand_test_view = yaml.safe_load(f) + rand_path = generate_data_saving_path( + model_name=selected_model.model_name, + drug_id=drug_id, + result_path='', + suffix='randomization', + ) compute_randomization( randomization_test_view=rand_test_view, model=selected_model, @@ -196,8 +237,15 @@ def compute_cross( split_id=args.split_id, randomization_type=args.randomization_type, response_transformation=transformation, + randomization_test_path=rand_path, ) elif args.mode == "robustness": + rob_path = generate_data_saving_path( + model_name=selected_model.model_name, + drug_id=drug_id, + result_path='', + suffix='robustness', + ) compute_robustness( model=selected_model, hpam_set=hpam_combi, @@ -208,6 +256,7 @@ def compute_cross( split_id=args.split_id, trial=args.robustness_trial, response_transformation=transformation, + rob_path=rob_path ) else: raise ValueError(f"Invalid mode: {args.mode}. Choose full, randomization, or robustness.") diff --git a/modules/local/consolidate_results/main.nf b/modules/local/consolidate_results/main.nf new file mode 100644 index 0000000..5bc0da7 --- /dev/null +++ b/modules/local/consolidate_results/main.nf @@ -0,0 +1,26 @@ +process CONSOLIDATE_RESULTS { + tag "Consolidate" + label 'process_single' + publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' + + input: + tuple val(test_mode), val(model_names), val(pred_files) + val(rand_modes) + + output: + tuple val(test_mode), val(model_names), val(pred_files) + + script: + """ + consolidate_results.py \\ + --test_mode ${test_mode} \\ + --model_names "${model_names}" \\ + --pred_files "${pred_files}" \\ + --n_cv_splits ${params.n_cv_splits} \\ + ${params.cross_study_datasets != '' ? '--cross_study_datasets ' + params + .cross_study_datasets.replace(',', ' ') : ''} \\ + --randomizations ${rand_modes}\\ + --n_trials_robustness ${params.n_trials_robustness} + + """ +} diff --git a/modules/local/evaluate_final/main.nf b/modules/local/evaluate_final/main.nf index f72de96..1270ee5 100644 --- a/modules/local/evaluate_final/main.nf +++ b/modules/local/evaluate_final/main.nf @@ -9,7 +9,7 @@ process EVALUATE_FINAL { // 'biocontainers/python:3.8.3' }" input: - tuple val(test_mode), val(model_name), path(pred_file) + tuple val(test_mode), val(model_names), path(pred_file) output: path('*.csv'), emit: ch_individual_results diff --git a/modules/local/make_model_channel/main.nf b/modules/local/make_model_channel/main.nf index c7dbb22..aa8cf87 100644 --- a/modules/local/make_model_channel/main.nf +++ b/modules/local/make_model_channel/main.nf @@ -8,15 +8,17 @@ process MAKE_MODEL_CHANNEL { // 'biocontainers/python:3.8.3' }" input: tuple val(models), path(response_data) + val(name) output: - path 'models*.txt', emit: all_models + path '{models,baselines}*.txt', emit: all_models script: """ make_model_channel.py \\ --models "${models}" \\ - --data ${response_data} + --data ${response_data} \\ + --file_name ${name} """ } diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index be63f67..2d8a563 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -1,7 +1,7 @@ process PREDICT_FULL { tag "${test_mode}_${model_name}_${split_id}" label 'process_single' - publishDir "${params.outdir}/${params.run_id}/${test_mode}/${model_name}/predictions", mode: 'copy' + publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -13,8 +13,9 @@ process PREDICT_FULL { val(path_data) output: - tuple val(test_mode), val(model_name), path('predictions_*.csv'), emit: ch_vis - path('cross_study/cross_study*.csv'), emit: ch_cross, optional: true + tuple val(test_mode), val(model_name), path('**predictions*.csv'), emit: ch_vis + path('cross_study/cross_study*.csv'), emit: ch_cross, optional: true + path('**best_hpams*.json'), emit: ch_hpams script: """ diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index c368b6f..ffce0f4 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -1,7 +1,7 @@ process RANDOMIZATION_TEST { tag "${test_mode}_${model_name}_${randomization_type}" label 'process_single' - publishDir "${params.outdir}/${params.run_id}/${test_mode}/${model_name}/randomization_test" + publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -14,7 +14,7 @@ process RANDOMIZATION_TEST { val(response_transformation) output: - tuple val(test_mode), val(model_name), path('randomization_*.csv'), emit: ch_vis + tuple val(test_mode), val(model_name), path('**randomization*.csv'), emit: ch_vis script: """ diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index d12c7ff..fe54499 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -1,7 +1,7 @@ process ROBUSTNESS_TEST { tag "${model_name}_${robustness_iteration}" label 'process_single' - publishDir "${params.outdir}/${params.run_id}/${test_mode}/${model_name}/robustness_test" + publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -14,7 +14,7 @@ process ROBUSTNESS_TEST { val(response_transformation) output: - tuple val(test_mode), val(model_name), path('robustness_*.csv'), emit: ch_vis + tuple val(test_mode), val(model_name), path('**robustness*.csv'), emit: ch_vis script: """ diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 41af90b..b5d1ce7 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -2,6 +2,7 @@ include { PREDICT_FULL } from '../../../modules/local/predict_f include { RANDOMIZATION_SPLIT } from '../../../modules/local/randomization_split' include { RANDOMIZATION_TEST } from '../../../modules/local/randomization_test' include { ROBUSTNESS_TEST } from '../../../modules/local/robustness_test' +include { CONSOLIDATE_RESULTS } from '../../../modules/local/consolidate_results' include { EVALUATE_FINAL } from '../../../modules/local/evaluate_final' include { COLLECT_RESULTS } from '../../../modules/local/collect_results' @@ -12,9 +13,9 @@ workflow MODEL_TESTING { best_hpam_per_split // from RUN_CV: [split_id, test_mode, split_dataset, model_name, best_hpam_combi_X.yaml] randomizations // from input cross_study_datasets // from LOAD_RESPONSE + ch_models // from RUN_CV main: - ch_models = channel.from(models) if (params.cross_study_datasets == '') { cross_study_datasets = Channel.fromPath(['./NONE.csv']) } @@ -26,7 +27,6 @@ workflow MODEL_TESTING { .collect() .map{it -> [it]} ch_predict_final = ch_tmp2.combine(ch_tmp) - PREDICT_FULL ( ch_predict_final, params.response_transformation, @@ -37,10 +37,17 @@ workflow MODEL_TESTING { if (params.randomization_mode != 'None') { ch_randomization = channel.from(randomizations) // randomizations only for models, not for baselines - ch_models_rand = ch_models.combine(ch_randomization) + ch_models_rand = ch_models + .map{it -> it[0]} + .unique() + .combine(ch_randomization) RANDOMIZATION_SPLIT ( ch_models_rand ) + ch_rand_views = ch_models + .combine(RANDOMIZATION_SPLIT.out.randomization_test_views, by: 0) + .map{ model_class, model_name, rand_file -> [model_name, rand_file] } + ch_best_hpams_per_split_rand = best_hpam_per_split.map { split_id, test_mode, path_to_split, model_name, path_to_hpams -> return [model_name, test_mode, split_id, path_to_split, path_to_hpams] @@ -48,7 +55,8 @@ workflow MODEL_TESTING { // [model_name, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, // randomization_views] ch_randomization = ch_best_hpams_per_split_rand - .combine(RANDOMIZATION_SPLIT.out.randomization_test_views, by: 0) + .combine(ch_rand_views, by: 0) + RANDOMIZATION_TEST ( ch_randomization, params.path_data, @@ -60,7 +68,9 @@ workflow MODEL_TESTING { if (params.n_trials_robustness > 0) { ch_trials_robustness = Channel.from(1..params.n_trials_robustness) - ch_trials_robustness = ch_models.combine(ch_trials_robustness) + ch_trials_robustness = ch_models + .map{it -> it[1]} + .combine(ch_trials_robustness) ch_best_hpams_per_split_rob = best_hpam_per_split.map { split_id, test_mode, path_to_split, model_name, path_to_hpams -> @@ -79,6 +89,12 @@ workflow MODEL_TESTING { ch_vis = ch_vis.concat(ROBUSTNESS_TEST.out.ch_vis) } + CONSOLIDATE_RESULTS ( + ch_vis.groupTuple(), + randomizations + ) + +/* EVALUATE_FINAL ( ch_vis ) @@ -92,5 +108,5 @@ workflow MODEL_TESTING { evaluation_results = COLLECT_RESULTS.out.evaluation_results evaluation_results_per_drug = COLLECT_RESULTS.out.evaluation_results_per_drug evaluation_results_per_cl = COLLECT_RESULTS.out.evaluation_results_per_cl - true_vs_predicted = COLLECT_RESULTS.out.true_vs_pred + true_vs_predicted = COLLECT_RESULTS.out.true_vs_pred*/ } diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 9da62a1..0e55447 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -1,5 +1,6 @@ include { LOAD_RESPONSE } from '../../../modules/local/load_response' -include { MAKE_MODEL_CHANNEL } from '../../../modules/local/make_model_channel' +include { MAKE_MODEL_CHANNEL as MAKE_MODELS } from '../../../modules/local/make_model_channel' +include { MAKE_MODEL_CHANNEL as MAKE_BASELINES } from '../../../modules/local/make_model_channel' include { CV_SPLIT } from '../../../modules/local/cv_split' include { HPAM_SPLIT } from '../../../modules/local/hpam_split' include { TRAIN_AND_PREDICT_CV } from '../../../modules/local/train_and_predict_cv' @@ -34,18 +35,32 @@ workflow RUN_CV { all_data = LOAD_RESPONSE.out.response_dataset } all_data = all_data.flatten()*/ - ch_input_models = ch_models_baselines + ch_input_models = ch_models + .collect() + .map { models -> [models] } + .combine(LOAD_RESPONSE.out.response_dataset) + ch_input_baselines = ch_baselines .collect() .map { models -> [models] } .combine(LOAD_RESPONSE.out.response_dataset) - MAKE_MODEL_CHANNEL ( - ch_input_models + MAKE_MODELS ( + ch_input_models, + "models" ) - ch_models_baselines = MAKE_MODEL_CHANNEL.out.all_models + MAKE_BASELINES ( + ch_input_baselines, + "baselines" + ) + + ch_models_expanded = MAKE_MODELS.out.all_models + .splitCsv(strip: true) + .map { it -> it[1] } + ch_baselines = MAKE_BASELINES.out.all_models .splitCsv(strip: true) - .flatten() + .map { it -> it[1] } + ch_models_baselines = ch_models_expanded.concat(ch_baselines) HPAM_SPLIT ( ch_models_baselines @@ -86,5 +101,5 @@ workflow RUN_CV { emit: best_hpam_per_split = ch_best_hpams_per_split cross_study_datasets = LOAD_RESPONSE.out.cross_study_datasets - + ch_models = MAKE_MODELS.out.all_models.splitCsv(strip: true) } diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index a5eb5f5..a3d3dc9 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -101,9 +101,10 @@ workflow DRUGRESPONSEEVAL { models, RUN_CV.out.best_hpam_per_split, randomizations, - RUN_CV.out.cross_study_datasets + RUN_CV.out.cross_study_datasets, + RUN_CV.out.ch_models ) - +/* VISUALIZATION ( test_modes, models, @@ -112,7 +113,7 @@ workflow DRUGRESPONSEEVAL { MODEL_TESTING.out.evaluation_results_per_drug, MODEL_TESTING.out.evaluation_results_per_cl, MODEL_TESTING.out.true_vs_predicted - ) + )*/ } From f95a292d06de27907a72fd834515c69111a94ae6 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 4 Oct 2024 16:33:18 +0200 Subject: [PATCH 086/257] consolidating results! Now works for --models SingleDrugRandomForest --baselines NaivePredictor with randomization and robustness test. --- bin/consolidate_results.py | 33 ++++++++++++++++++----- conf/modules.config | 24 +++++++++++++++++ modules/local/consolidate_results/main.nf | 14 +++++----- modules/local/evaluate_final/main.nf | 4 +-- subworkflows/local/model_testing/main.nf | 20 +++++++++++--- workflows/drugresponseeval.nf | 7 +++-- 6 files changed, 80 insertions(+), 22 deletions(-) diff --git a/bin/consolidate_results.py b/bin/consolidate_results.py index 1a0abc3..cd27b78 100755 --- a/bin/consolidate_results.py +++ b/bin/consolidate_results.py @@ -1,20 +1,22 @@ #!/usr/bin/env python +import os import argparse - +from drevalpy.models import MODEL_FACTORY +from drevalpy.experiment import consolidate_single_drug_model_predictions, get_randomization_test_views def get_parser(): parser = argparse.ArgumentParser(description="Consolidate results for SingleDrugModels") + parser.add_argument('--run_id', type=str, required=True, help="Run ID") parser.add_argument("--test_mode", type=str, required=True, help="Test mode (LPO, LCO, LDO)") - parser.add_argument("--model_names", type=str, nargs="+", required=True, help="All Model " + parser.add_argument("--model_name", type=str, required=True, help="All Model " "names") - parser.add_argument("--pred_files", type=str, nargs="+", required=True, help="All prediction " - "files") + parser.add_argument("--outdir_path", type=str, required=True, help="Output directory path") parser.add_argument("--n_cv_splits", type=int, required=True, help="Number of CV splits") parser.add_argument("--cross_study_datasets", type=str, nargs="+", help="All " "cross-study " "datasets") - parser.add_argument("--randomizations", type=str, nargs="+", required=True, help="All " + parser.add_argument("--randomization_modes", type=str, required=True, help="All " "randomizations") parser.add_argument("--n_trials_robustness", type=int, required=True, help="Number of trials") return parser @@ -23,7 +25,26 @@ def get_parser(): def main(): parser = get_parser() args = parser.parse_args() - print(args) + results_path = os.path.join( + args.outdir_path, + args.run_id, + args.test_mode, + ) + randomizations = args.randomization_modes.split('[')[1].split(']')[0].split(', ') + model = MODEL_FACTORY[args.model_name] + if args.cross_study_datasets is None: + cross_study_datasets = [] + else: + cross_study_datasets = args.cross_study_datasets.split('[')[1].split(']')[0].split(', ') + consolidate_single_drug_model_predictions( + models=[model], + n_cv_splits=args.n_cv_splits, + results_path=results_path, + cross_study_datasets=cross_study_datasets, + randomization_mode=randomizations, + n_trials_robustness=args.n_trials_robustness, + out_path="" + ) if __name__ == "__main__": diff --git a/conf/modules.config b/conf/modules.config index 539101b..ba0b8a8 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -34,6 +34,22 @@ process { ] } + withName: 'MAKE_MODELS' { + publishDir = [ + path: params.outdir, + mode: params.publish_dir_mode, + saveAs: { filename -> null } + ] + } + + withName: 'MAKE_BASELINES' { + publishDir = [ + path: params.outdir, + mode: params.publish_dir_mode, + saveAs: { filename -> null } + ] + } + withName: 'HPAM_SPLIT' { publishDir = [ path: { params.save_datasets ? "${params.outdir}/${params.run_id}/hpams" : params.outdir }, @@ -67,6 +83,14 @@ process { ] } + withName: 'EVALUATE_FINAL' { + publishDir = [ + path: params.outdir, + mode: params.publish_dir_mode, + saveAs: { filename -> null } + ] + } + withName: 'WRITE_HTML' { publishDir = [ path: { "${params.outdir}/${params.run_id}" }, diff --git a/modules/local/consolidate_results/main.nf b/modules/local/consolidate_results/main.nf index 5bc0da7..fe8f02b 100644 --- a/modules/local/consolidate_results/main.nf +++ b/modules/local/consolidate_results/main.nf @@ -1,25 +1,27 @@ process CONSOLIDATE_RESULTS { - tag "Consolidate" + tag "$model_name" label 'process_single' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' input: - tuple val(test_mode), val(model_names), val(pred_files) + tuple val(test_mode), val(model_name) val(rand_modes) output: - tuple val(test_mode), val(model_names), val(pred_files) + tuple val(test_mode), val(model_name), path('**split*.csv'), emit: ch_vis, optional: true script: + def outdirPath = new File(params.outdir).getAbsolutePath() """ consolidate_results.py \\ + --run_id ${params.run_id} \\ --test_mode ${test_mode} \\ - --model_names "${model_names}" \\ - --pred_files "${pred_files}" \\ + --model_name "${model_name}" \\ + --outdir_path ${outdirPath} \\ --n_cv_splits ${params.n_cv_splits} \\ ${params.cross_study_datasets != '' ? '--cross_study_datasets ' + params .cross_study_datasets.replace(',', ' ') : ''} \\ - --randomizations ${rand_modes}\\ + --randomization_modes ${rand_modes}\\ --n_trials_robustness ${params.n_trials_robustness} """ diff --git a/modules/local/evaluate_final/main.nf b/modules/local/evaluate_final/main.nf index 1270ee5..b439ea0 100644 --- a/modules/local/evaluate_final/main.nf +++ b/modules/local/evaluate_final/main.nf @@ -9,10 +9,10 @@ process EVALUATE_FINAL { // 'biocontainers/python:3.8.3' }" input: - tuple val(test_mode), val(model_names), path(pred_file) + tuple val(test_mode), val(model_name), path(pred_file) output: - path('*.csv'), emit: ch_individual_results + path('*.csv'), emit: ch_individual_results, optional: true script: """ diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index b5d1ce7..36cf716 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -9,7 +9,7 @@ include { COLLECT_RESULTS } from '../../../modules/local/collect_r workflow MODEL_TESTING { take: - models // from input + ch_models_baselines // from input best_hpam_per_split // from RUN_CV: [split_id, test_mode, split_dataset, model_name, best_hpam_combi_X.yaml] randomizations // from input cross_study_datasets // from LOAD_RESPONSE @@ -89,12 +89,23 @@ workflow MODEL_TESTING { ch_vis = ch_vis.concat(ROBUSTNESS_TEST.out.ch_vis) } + ch_consolidate = ch_vis + .map{ test_mode, model, pred_file -> [test_mode, model.split("\\.")[0]] } + .unique() + CONSOLIDATE_RESULTS ( - ch_vis.groupTuple(), + ch_consolidate, randomizations ) + CONSOLIDATE_RESULTS.out.ch_vis.transpose() + + // filter out SingleDrugModels that have been consolidated + ch_vis = ch_vis + .concat(CONSOLIDATE_RESULTS.out.ch_vis.transpose()) + .map{ test_mode, model, pred_file -> [model, test_mode, pred_file] } + .combine(ch_models_baselines, by: 0) + .map{ model, test_mode, pred_file -> [test_mode, model, pred_file] } -/* EVALUATE_FINAL ( ch_vis ) @@ -104,9 +115,10 @@ workflow MODEL_TESTING { COLLECT_RESULTS ( ch_collapse ) + emit: evaluation_results = COLLECT_RESULTS.out.evaluation_results evaluation_results_per_drug = COLLECT_RESULTS.out.evaluation_results_per_drug evaluation_results_per_cl = COLLECT_RESULTS.out.evaluation_results_per_cl - true_vs_predicted = COLLECT_RESULTS.out.true_vs_pred*/ + true_vs_predicted = COLLECT_RESULTS.out.true_vs_pred } diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index a3d3dc9..a5f8398 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -62,7 +62,6 @@ def test_modes = params.test_mode.split(",") def models = params.models.split(",") def baselines = params.baselines.split(",") def randomizations = params.randomization_mode.split(",") -def outdirPath = new File(params.outdir).getAbsolutePath() workflow DRUGRESPONSEEVAL { @@ -98,13 +97,13 @@ workflow DRUGRESPONSEEVAL { ) MODEL_TESTING ( - models, + ch_models_baselines, RUN_CV.out.best_hpam_per_split, randomizations, RUN_CV.out.cross_study_datasets, RUN_CV.out.ch_models ) -/* + VISUALIZATION ( test_modes, models, @@ -113,7 +112,7 @@ workflow DRUGRESPONSEEVAL { MODEL_TESTING.out.evaluation_results_per_drug, MODEL_TESTING.out.evaluation_results_per_cl, MODEL_TESTING.out.true_vs_predicted - )*/ + ) } From 417bac25b39df6ca11abf00796d40879c1712016 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 8 Oct 2024 14:12:06 +0200 Subject: [PATCH 087/257] pipeline also works for cross validation now --- bin/consolidate_results.py | 7 +++---- modules/local/consolidate_results/main.nf | 1 + modules/local/predict_full/main.nf | 2 +- subworkflows/local/model_testing/main.nf | 3 ++- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/bin/consolidate_results.py b/bin/consolidate_results.py index cd27b78..2590001 100755 --- a/bin/consolidate_results.py +++ b/bin/consolidate_results.py @@ -4,6 +4,7 @@ import argparse from drevalpy.models import MODEL_FACTORY from drevalpy.experiment import consolidate_single_drug_model_predictions, get_randomization_test_views +from drevalpy.datasets import RESPONSE_DATASET_FACTORY def get_parser(): parser = argparse.ArgumentParser(description="Consolidate results for SingleDrugModels") @@ -33,14 +34,12 @@ def main(): randomizations = args.randomization_modes.split('[')[1].split(']')[0].split(', ') model = MODEL_FACTORY[args.model_name] if args.cross_study_datasets is None: - cross_study_datasets = [] - else: - cross_study_datasets = args.cross_study_datasets.split('[')[1].split(']')[0].split(', ') + args.cross_study_datasets = [] consolidate_single_drug_model_predictions( models=[model], n_cv_splits=args.n_cv_splits, results_path=results_path, - cross_study_datasets=cross_study_datasets, + cross_study_datasets=args.cross_study_datasets, randomization_mode=randomizations, n_trials_robustness=args.n_trials_robustness, out_path="" diff --git a/modules/local/consolidate_results/main.nf b/modules/local/consolidate_results/main.nf index fe8f02b..4b13898 100644 --- a/modules/local/consolidate_results/main.nf +++ b/modules/local/consolidate_results/main.nf @@ -6,6 +6,7 @@ process CONSOLIDATE_RESULTS { input: tuple val(test_mode), val(model_name) val(rand_modes) + val(nr_files) output: tuple val(test_mode), val(model_name), path('**split*.csv'), emit: ch_vis, optional: true diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 2d8a563..4c54d53 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -14,7 +14,7 @@ process PREDICT_FULL { output: tuple val(test_mode), val(model_name), path('**predictions*.csv'), emit: ch_vis - path('cross_study/cross_study*.csv'), emit: ch_cross, optional: true + path('**cross_study/cross_study*.csv'), emit: ch_cross, optional: true path('**best_hpams*.json'), emit: ch_hpams script: diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 36cf716..850de42 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -95,7 +95,8 @@ workflow MODEL_TESTING { CONSOLIDATE_RESULTS ( ch_consolidate, - randomizations + randomizations, + ch_vis.count() // wait for ch_vis to finish ) CONSOLIDATE_RESULTS.out.ch_vis.transpose() From 09d7b71a1d3bd03ff88f4d7cef7695f1deef3dd0 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 28 Oct 2024 15:16:27 +0100 Subject: [PATCH 088/257] fixed that hyperparameter split is just executed per model class, not model instance --- bin/load_response.py | 7 +++---- nextflow.config | 2 +- subworkflows/local/run_cv/main.nf | 24 +++++++++--------------- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/bin/load_response.py b/bin/load_response.py index 29a66e6..0e59529 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -1,7 +1,7 @@ #!/usr/bin/env python import argparse import pickle -from drevalpy.utils import load_data +from drevalpy.datasets.loader import load_dataset def get_parser(): @@ -19,9 +19,8 @@ def get_parser(): def main(args): - response_data, cross_study_datasets = load_data( - dataset_name=args.dataset_name, cross_study_datasets=args.cross_study_datasets, path_data=args.path_data - ) + response_data = load_dataset(dataset_name=args.dataset_name, path_data=args.path_data) + cross_study_datasets = [load_dataset(dataset_name=ds, path_data=args.path_data) for ds in args.cross_study_datasets] # Pickle the object to a file with open("response_dataset.pkl", "wb") as f: diff --git a/nextflow.config b/nextflow.config index 27cdeea..4e81aef 100644 --- a/nextflow.config +++ b/nextflow.config @@ -12,7 +12,7 @@ // Docker: Comment in for AMD64 build: // process.container = 'community.wave.seqera.io/library/pip_drevalpy:7d8f30cda5f4887b' // Singularity: Comment in for AMD64 build: -process.container = 'oras://community.wave.seqera.io/library/pip_drevalpy:6ca244fae0c2fa29' +// process.container = 'oras://community.wave.seqera.io/library/pip_drevalpy:6ca244fae0c2fa29' // Global default params, used in configs params { diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 0e55447..ca2d47b 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -28,13 +28,6 @@ workflow RUN_CV { ch_models = channel.from(models) ch_baselines = channel.from(baselines) ch_models_baselines = ch_models.concat(ch_baselines) - /*if (params.cross_study_datasets) { - all_data = LOAD_RESPONSE.out.response_dataset - .combine(LOAD_RESPONSE.out.cross_study_datasets) - } else { - all_data = LOAD_RESPONSE.out.response_dataset - } - all_data = all_data.flatten()*/ ch_input_models = ch_models .collect() .map { models -> [models] } @@ -56,24 +49,25 @@ workflow RUN_CV { ch_models_expanded = MAKE_MODELS.out.all_models .splitCsv(strip: true) - .map { it -> it[1] } - ch_baselines = MAKE_BASELINES.out.all_models + ch_baselines_expanded = MAKE_BASELINES.out.all_models .splitCsv(strip: true) - .map { it -> it[1] } - ch_models_baselines = ch_models_expanded.concat(ch_baselines) + ch_models_baselines_expanded = ch_models_expanded.concat(ch_baselines_expanded) HPAM_SPLIT ( ch_models_baselines ) - // [model_name, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml]] - ch_hpam_combis = HPAM_SPLIT.out.hpam_combi + ch_hpam_combis = ch_models_baselines_expanded + .combine(HPAM_SPLIT.out.hpam_combi, by: 0) + .map { model_class, model_name, hpam_combis -> [model_name, hpam_combis] } + // [model_name, hpam_X.yaml] ch_hpam_combis = ch_hpam_combis.transpose() // [model_name, test_mode, split_X.pkl] - ch_model_cv = ch_models_baselines.combine(ch_cv_splits.transpose()) - + ch_model_cv = ch_models_baselines_expanded + .combine(ch_cv_splits.transpose()) + .map { model_class, model_name, test_mode, split -> [model_name, test_mode, split] } // [model_name, test_mode, split_X.pkl, hpam_X.yaml] ch_test_combis = ch_model_cv.combine(ch_hpam_combis, by: 0) From b4d818537308c288e81303a0cc54918a9aa1ca6a Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 28 Oct 2024 15:30:24 +0100 Subject: [PATCH 089/257] fixed error in consolidate_results.py --- bin/consolidate_results.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/consolidate_results.py b/bin/consolidate_results.py index 2590001..ef67065 100755 --- a/bin/consolidate_results.py +++ b/bin/consolidate_results.py @@ -3,8 +3,8 @@ import os import argparse from drevalpy.models import MODEL_FACTORY -from drevalpy.experiment import consolidate_single_drug_model_predictions, get_randomization_test_views -from drevalpy.datasets import RESPONSE_DATASET_FACTORY +from drevalpy.experiment import consolidate_single_drug_model_predictions + def get_parser(): parser = argparse.ArgumentParser(description="Consolidate results for SingleDrugModels") From 6f3d58a4f0ec1cbb03b735cf9d7be7f3cfdf57cd Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 28 Oct 2024 16:58:34 +0100 Subject: [PATCH 090/257] had limited cpus to 3 --- modules/local/train_and_predict_cv/main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 70d126f..c44b7e3 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -1,7 +1,6 @@ process TRAIN_AND_PREDICT_CV { tag "${model_name}_${test_mode}" label 'process_single' - cpus 3 input: tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters) From 71467ba7541c331db4a7c3524910659e7afb5a5e Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 31 Oct 2024 10:56:22 +0100 Subject: [PATCH 091/257] trying to have gpu support --- conf/base.config | 3 +++ modules/local/predict_full/main.nf | 3 ++- modules/local/randomization_test/main.nf | 3 ++- modules/local/robustness_test/main.nf | 3 ++- modules/local/train_and_predict_cv/main.nf | 3 ++- nextflow.config | 6 ++++++ 6 files changed, 17 insertions(+), 4 deletions(-) diff --git a/conf/base.config b/conf/base.config index 74f1bf9..492c6d2 100644 --- a/conf/base.config +++ b/conf/base.config @@ -59,4 +59,7 @@ process { errorStrategy = 'retry' maxRetries = 2 } + withLabel:process_gpu { + ext.use_gpu = { use_gpu } + } } diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 4c54d53..64c9fa2 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -1,6 +1,7 @@ process PREDICT_FULL { tag "${test_mode}_${model_name}_${split_id}" - label 'process_single' + label 'process_medium' + label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index ffce0f4..f4add82 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -1,6 +1,7 @@ process RANDOMIZATION_TEST { tag "${test_mode}_${model_name}_${randomization_type}" - label 'process_single' + label 'process_medium' + label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index fe54499..a58fec5 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -1,6 +1,7 @@ process ROBUSTNESS_TEST { tag "${model_name}_${robustness_iteration}" - label 'process_single' + label 'process_medium' + label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index c44b7e3..21f75c7 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -1,6 +1,7 @@ process TRAIN_AND_PREDICT_CV { tag "${model_name}_${test_mode}" - label 'process_single' + label 'process_medium' + label 'process_gpu' input: tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters) diff --git a/nextflow.config b/nextflow.config index 4e81aef..536236a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -175,6 +175,12 @@ profiles { executor.cpus = 16 executor.memory = 60.GB } + gpu { + docker.runOptions = '-u $(id -u):$(id -g) --gpus device=0' + apptainer.runOptions = '--no-mount tmp --writable-tmpfs --nv' + singularity.runOptions = '--no-mount tmp --writable-tmpfs --nv' + use_gpu = true + } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } } From 8669fd34ca808382445102129bd9a67ffcbded71 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 31 Oct 2024 12:50:08 +0100 Subject: [PATCH 092/257] trying to have gpu support pt. 2: only for specific models --- conf/modules.config | 38 ++++++++++++++++++++++ modules/local/predict_full/main.nf | 4 +-- modules/local/randomization_test/main.nf | 4 +-- modules/local/robustness_test/main.nf | 4 +-- modules/local/train_and_predict_cv/main.nf | 4 +-- 5 files changed, 46 insertions(+), 8 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index ba0b8a8..5cb6d7b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -65,6 +65,44 @@ process { mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] + + ext.use_gpu = { [ + 'SimpleNeuralNetwork', + 'MultiOmicsNeuralNetwork', + 'MOLIR', + 'SuperFELTR' + ].contains( model_name.split( '\\.' )[0] ) + } + } + + withName: 'PREDICT_FULL' { + ext.use_gpu = { [ + 'SimpleNeuralNetwork', + 'MultiOmicsNeuralNetwork', + 'MOLIR', + 'SuperFELTR' + ].contains( model_name.split( '\\.' )[0] ) + } + } + + withName: 'RANDOMIZATION_TEST' { + ext.use_gpu = { [ + 'SimpleNeuralNetwork', + 'MultiOmicsNeuralNetwork', + 'MOLIR', + 'SuperFELTR' + ].contains( model_name.split( '\\.' )[0] ) + } + } + + withName: 'ROBUSTNESS_TEST' { + ext.use_gpu = { [ + 'SimpleNeuralNetwork', + 'MultiOmicsNeuralNetwork', + 'MOLIR', + 'SuperFELTR' + ].contains( model_name.split( '\\.' )[0] ) + } } withName: 'EVALUATE_FIND_MAX' { diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 64c9fa2..67dc841 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -1,7 +1,7 @@ process PREDICT_FULL { - tag "${test_mode}_${model_name}_${split_id}" + tag "${test_mode}_${model_name}_${split_id}_gpu:${task.ext.use_gpu}" label 'process_medium' - label 'process_gpu' + label { "${ task.ext.use_gpu ? 'process_gpu' : '' }" } publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index f4add82..b922c04 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -1,7 +1,7 @@ process RANDOMIZATION_TEST { - tag "${test_mode}_${model_name}_${randomization_type}" + tag "${test_mode}_${model_name}_${randomization_type}_gpu:${task.ext.use_gpu}" label 'process_medium' - label 'process_gpu' + label { "${ task.ext.use_gpu ? 'process_gpu' : '' }" } publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index a58fec5..82377a4 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -1,7 +1,7 @@ process ROBUSTNESS_TEST { - tag "${model_name}_${robustness_iteration}" + tag "${model_name}_${robustness_iteration}_gpu:${task.ext.use_gpu}" label 'process_medium' - label 'process_gpu' + label { "${ task.ext.use_gpu ? 'process_gpu' : '' }" } publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 21f75c7..149c393 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -1,7 +1,7 @@ process TRAIN_AND_PREDICT_CV { - tag "${model_name}_${test_mode}" + tag { "${model_name}_${test_mode}_gpu:${task.ext.use_gpu}" } label 'process_medium' - label 'process_gpu' + label { "${ task.ext.use_gpu ? 'process_gpu' : '' }" } input: tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters) From bb5480bf928510985ee4448f909eeaeb67181fb3 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 31 Oct 2024 13:08:02 +0100 Subject: [PATCH 093/257] doesn't work yet - setting label to process_gpu everywhere for now --- modules/local/predict_full/main.nf | 2 +- modules/local/randomization_test/main.nf | 2 +- modules/local/robustness_test/main.nf | 2 +- modules/local/train_and_predict_cv/main.nf | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 67dc841..f0b3bdf 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -1,7 +1,7 @@ process PREDICT_FULL { tag "${test_mode}_${model_name}_${split_id}_gpu:${task.ext.use_gpu}" label 'process_medium' - label { "${ task.ext.use_gpu ? 'process_gpu' : '' }" } + label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index b922c04..cc033e2 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -1,7 +1,7 @@ process RANDOMIZATION_TEST { tag "${test_mode}_${model_name}_${randomization_type}_gpu:${task.ext.use_gpu}" label 'process_medium' - label { "${ task.ext.use_gpu ? 'process_gpu' : '' }" } + label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index 82377a4..ecf31cc 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -1,7 +1,7 @@ process ROBUSTNESS_TEST { tag "${model_name}_${robustness_iteration}_gpu:${task.ext.use_gpu}" label 'process_medium' - label { "${ task.ext.use_gpu ? 'process_gpu' : '' }" } + label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 149c393..a102151 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -1,7 +1,7 @@ process TRAIN_AND_PREDICT_CV { tag { "${model_name}_${test_mode}_gpu:${task.ext.use_gpu}" } - label 'process_medium' - label { "${ task.ext.use_gpu ? 'process_gpu' : '' }" } + label 'process_single' + label 'process_gpu' input: tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters) From 7a6f4f0b7fd9e673a65c6c77b366b40fb505e566 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 31 Oct 2024 13:09:05 +0100 Subject: [PATCH 094/257] doesn't work yet - setting label to process_gpu everywhere for now --- modules/local/train_and_predict_cv/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index a102151..c6d8c68 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -1,6 +1,6 @@ process TRAIN_AND_PREDICT_CV { tag { "${model_name}_${test_mode}_gpu:${task.ext.use_gpu}" } - label 'process_single' + label 'process_medium' label 'process_gpu' input: From bad410febca0dc60592b0500a6ca5ca5ac542aa9 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 31 Oct 2024 13:11:14 +0100 Subject: [PATCH 095/257] forgot the brackets --- modules/local/predict_full/main.nf | 2 +- modules/local/randomization_test/main.nf | 2 +- modules/local/robustness_test/main.nf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index f0b3bdf..45910a8 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -1,5 +1,5 @@ process PREDICT_FULL { - tag "${test_mode}_${model_name}_${split_id}_gpu:${task.ext.use_gpu}" + tag { "${test_mode}_${model_name}_${split_id}_gpu:${task.ext.use_gpu}" } label 'process_medium' label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index cc033e2..4235076 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -1,5 +1,5 @@ process RANDOMIZATION_TEST { - tag "${test_mode}_${model_name}_${randomization_type}_gpu:${task.ext.use_gpu}" + tag { "${test_mode}_${model_name}_${randomization_type}_gpu:${task.ext.use_gpu}" } label 'process_medium' label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index ecf31cc..cfa2489 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -1,5 +1,5 @@ process ROBUSTNESS_TEST { - tag "${model_name}_${robustness_iteration}_gpu:${task.ext.use_gpu}" + tag { "${model_name}_${robustness_iteration}_gpu:${task.ext.use_gpu}" } label 'process_medium' label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' From 2fa47e7ab76967c59b3ac3458641a5f755832235 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 4 Nov 2024 16:16:53 +0100 Subject: [PATCH 096/257] copying results --- modules/local/collect_results/main.nf | 2 +- modules/local/draw_corr_comp/main.nf | 2 +- modules/local/draw_critical_difference/main.nf | 2 +- modules/local/draw_heatmap/main.nf | 2 +- modules/local/draw_regression/main.nf | 2 +- modules/local/draw_violin/main.nf | 2 +- modules/local/save_tables/main.nf | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/local/collect_results/main.nf b/modules/local/collect_results/main.nf index d140ec4..86e3d88 100644 --- a/modules/local/collect_results/main.nf +++ b/modules/local/collect_results/main.nf @@ -1,7 +1,7 @@ process COLLECT_RESULTS { //tag "${test_mode}_${model_name}_${pred_file}" label 'process_single' - publishDir "${params.outdir}/${params.run_id}" + publishDir "${params.outdir}/${params.run_id}", mode: 'copy' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/draw_corr_comp/main.nf b/modules/local/draw_corr_comp/main.nf index 17c9058..2361525 100644 --- a/modules/local/draw_corr_comp/main.nf +++ b/modules/local/draw_corr_comp/main.nf @@ -1,7 +1,7 @@ process DRAW_CORR_COMP { tag "${name}" label 'process_single' - publishDir "${params.outdir}/${params.run_id}/corr_comp_scatter" + publishDir "${params.outdir}/${params.run_id}/corr_comp_scatter", mode: 'copy' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/draw_critical_difference/main.nf b/modules/local/draw_critical_difference/main.nf index 14316b7..f8945aa 100644 --- a/modules/local/draw_critical_difference/main.nf +++ b/modules/local/draw_critical_difference/main.nf @@ -1,7 +1,7 @@ process DRAW_CRITICAL_DIFFERENCE { tag "${lpo_lco_ldo}" label 'process_single' - publishDir "${params.outdir}/${params.run_id}/critical_difference_plots" + publishDir "${params.outdir}/${params.run_id}/critical_difference_plots", mode: 'copy' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/draw_heatmap/main.nf b/modules/local/draw_heatmap/main.nf index 6804a6a..a5cde8f 100644 --- a/modules/local/draw_heatmap/main.nf +++ b/modules/local/draw_heatmap/main.nf @@ -1,7 +1,7 @@ process DRAW_HEATMAP { tag "${name}" label 'process_single' - publishDir "${params.outdir}/${params.run_id}/heatmaps" + publishDir "${params.outdir}/${params.run_id}/heatmaps", mode: 'copy' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/draw_regression/main.nf b/modules/local/draw_regression/main.nf index 613c34e..83ccb61 100644 --- a/modules/local/draw_regression/main.nf +++ b/modules/local/draw_regression/main.nf @@ -1,7 +1,7 @@ process DRAW_REGRESSION { tag "${name}_${model}" label 'process_single' - publishDir "${params.outdir}/${params.run_id}/regression_plots" + publishDir "${params.outdir}/${params.run_id}/regression_plots", mode: 'copy' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/draw_violin/main.nf b/modules/local/draw_violin/main.nf index 8e2a3b1..2c5aa00 100644 --- a/modules/local/draw_violin/main.nf +++ b/modules/local/draw_violin/main.nf @@ -1,7 +1,7 @@ process DRAW_VIOLIN { tag "${name}" label 'process_single' - publishDir "${params.outdir}/${params.run_id}/violin_plots" + publishDir "${params.outdir}/${params.run_id}/violin_plots", mode: 'copy' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/save_tables/main.nf b/modules/local/save_tables/main.nf index 69272ed..a42eef5 100644 --- a/modules/local/save_tables/main.nf +++ b/modules/local/save_tables/main.nf @@ -1,7 +1,7 @@ process SAVE_TABLES { tag "${lpo_lco_ldo}_${eval_results}" label 'process_single' - publishDir "${params.outdir}/${params.run_id}/html_tables" + publishDir "${params.outdir}/${params.run_id}/html_tables", mode: 'copy' //conda "conda-forge::python=3.8.3" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? From 0ca4213fd1c484760597c2ba3e6d2ade9d3d3620 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 4 Nov 2024 16:42:58 +0100 Subject: [PATCH 097/257] more cpus for train_and_predict --- conf/base.config | 2 +- modules/local/predict_full/main.nf | 2 +- modules/local/randomization_test/main.nf | 2 +- modules/local/robustness_test/main.nf | 2 +- modules/local/train_and_predict_cv/main.nf | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/conf/base.config b/conf/base.config index 492c6d2..8bd0234 100644 --- a/conf/base.config +++ b/conf/base.config @@ -42,7 +42,7 @@ process { time = { check_max( 8.h * task.attempt, 'time' ) } } withLabel:process_high { - cpus = { check_max( 12 * task.attempt, 'cpus' ) } + cpus = { check_max( 18 * task.attempt, 'cpus' ) } memory = { check_max( 72.GB * task.attempt, 'memory' ) } time = { check_max( 16.h * task.attempt, 'time' ) } } diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 45910a8..53fa12a 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -1,6 +1,6 @@ process PREDICT_FULL { tag { "${test_mode}_${model_name}_${split_id}_gpu:${task.ext.use_gpu}" } - label 'process_medium' + label 'process_high' label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index 4235076..7632fba 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -1,6 +1,6 @@ process RANDOMIZATION_TEST { tag { "${test_mode}_${model_name}_${randomization_type}_gpu:${task.ext.use_gpu}" } - label 'process_medium' + label 'process_high' label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index cfa2489..7d40573 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -1,6 +1,6 @@ process ROBUSTNESS_TEST { tag { "${model_name}_${robustness_iteration}_gpu:${task.ext.use_gpu}" } - label 'process_medium' + label 'process_high' label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index c6d8c68..6ba2682 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -1,6 +1,6 @@ process TRAIN_AND_PREDICT_CV { tag { "${model_name}_${test_mode}_gpu:${task.ext.use_gpu}" } - label 'process_medium' + label 'process_high' label 'process_gpu' input: From a09503b246ad069fa37d121f61359757b966cc1f Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 11:17:36 +0100 Subject: [PATCH 098/257] incorporated updates from the package --- bin/draw_cd.py | 3 +-- bin/draw_corr_comp.py | 2 +- bin/draw_regression.py | 2 +- bin/draw_violin_and_heatmap.py | 3 ++- bin/evaluate_and_find_max.py | 3 +-- bin/save_tables.py | 2 +- bin/train_and_predict_final.py | 8 +++--- nextflow.config | 4 +-- nextflow_schema.json | 49 ++++++++++++++++++---------------- workflows/drugresponseeval.nf | 3 --- 10 files changed, 39 insertions(+), 40 deletions(-) diff --git a/bin/draw_cd.py b/bin/draw_cd.py index 5289ad6..6a43d44 100755 --- a/bin/draw_cd.py +++ b/bin/draw_cd.py @@ -2,8 +2,7 @@ import argparse import pandas as pd -from drevalpy.visualization.utils import CriticalDifferencePlot - +from drevalpy.visualization.critical_difference_plot import CriticalDifferencePlot def get_parser(): parser = argparse.ArgumentParser(description="Draw critical difference plots.") diff --git a/bin/draw_corr_comp.py b/bin/draw_corr_comp.py index 8e8f606..47970f2 100755 --- a/bin/draw_corr_comp.py +++ b/bin/draw_corr_comp.py @@ -2,7 +2,7 @@ import argparse import pandas as pd -from drevalpy.visualization.utils import CorrelationComparisonScatter +from drevalpy.visualization.corr_comp_scatter import CorrelationComparisonScatter from drevalpy.models import MODEL_FACTORY diff --git a/bin/draw_regression.py b/bin/draw_regression.py index 1c5d4b6..b8177ce 100755 --- a/bin/draw_regression.py +++ b/bin/draw_regression.py @@ -2,7 +2,7 @@ import argparse import pandas as pd -from drevalpy.visualization import RegressionSliderPlot +from drevalpy.visualization.regression_slider_plot import RegressionSliderPlot def get_parser(): diff --git a/bin/draw_violin_and_heatmap.py b/bin/draw_violin_and_heatmap.py index f5de956..c64e6af 100755 --- a/bin/draw_violin_and_heatmap.py +++ b/bin/draw_violin_and_heatmap.py @@ -2,7 +2,8 @@ import argparse import pandas as pd -from drevalpy.visualization import Violin, Heatmap +from drevalpy.visualization.violin import Violin +from drevalpy.visualization.heatmap import Heatmap def get_parser(): diff --git a/bin/evaluate_and_find_max.py b/bin/evaluate_and_find_max.py index b438347..4dae5ed 100755 --- a/bin/evaluate_and_find_max.py +++ b/bin/evaluate_and_find_max.py @@ -4,8 +4,7 @@ import pickle import yaml -from drevalpy.evaluation import evaluate -from drevalpy.evaluation import MAXIMIZATION_METRICS, MINIMIZATION_METRICS +from drevalpy.evaluation import evaluate, MAXIMIZATION_METRICS, MINIMIZATION_METRICS def get_parser(): parser = argparse.ArgumentParser( diff --git a/bin/save_tables.py b/bin/save_tables.py index 7cbff5b..4e42562 100755 --- a/bin/save_tables.py +++ b/bin/save_tables.py @@ -2,7 +2,7 @@ import argparse import pandas as pd -from drevalpy.visualization import HTMLTable +from drevalpy.visualization.html_tables import HTMLTable def get_parser(): diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 5ed09a0..c58d16a 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -169,13 +169,13 @@ def compute_cross( if args.mode == "full": predictions_path = generate_data_saving_path( - model_name=selected_model.model_name, + model_name=selected_model.get_model_name(), drug_id=drug_id, result_path='', suffix='predictions', ) hpam_path = generate_data_saving_path( - model_name=selected_model.model_name, + model_name=selected_model.get_model_name(), drug_id=drug_id, result_path='', suffix='best_hpams', @@ -221,7 +221,7 @@ def compute_cross( with open(args.randomization_views_path, "r") as f: rand_test_view = yaml.safe_load(f) rand_path = generate_data_saving_path( - model_name=selected_model.model_name, + model_name=selected_model.get_model_name(), drug_id=drug_id, result_path='', suffix='randomization', @@ -241,7 +241,7 @@ def compute_cross( ) elif args.mode == "robustness": rob_path = generate_data_saving_path( - model_name=selected_model.model_name, + model_name=selected_model.get_model_name(), drug_id=drug_id, result_path='', suffix='robustness', diff --git a/nextflow.config b/nextflow.config index 536236a..7d8426a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -30,9 +30,9 @@ params { curve_curator = false overwrite = false optim_metric = 'RMSE' - n_cv_splits = 5 + n_cv_splits = 10 response_transformation = 'None' - path_data = '~/Projects/munich/NF-CORE-DRUGRESPONSEEVAL/data/' + path_data = 'data/' save_datasets = false // Boilerplate options diff --git a/nextflow_schema.json b/nextflow_schema.json index 0ea4ed7..6477855 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -8,7 +8,7 @@ "model_options": { "title": "Model options", "type": "object", - "fa_icon": "fas fa-cogs", + "fa_icon": "fa-solid fa-laptop-code", "description": "Define the models and baselines to be tested.", "required": ["models", "baselines"], "properties": { @@ -57,15 +57,15 @@ } }, "mode_options": { - "title": "Mode options", + "title": "Mode options (LPO/LCO/LDO)", "type": "object", - "fa_icon": "fas fa-cogs", + "fa_icon": "fa-solid fa-table-cells-column-lock", "description": "Define the mode in which the pipeline will be run.", "required": ["test_mode"], "properties": { "test_mode": { "type": "string", - "description": "Run the pipeline in test mode LPO, LCO, or LDO.", + "description": "Run the pipeline in test mode LPO (Leave-random-Pairs-Out), LCO (Leave-Cell-line-Out), or LDO (Leave-Drug-Out).", "default": "LPO", "help_text": "Which tests to run (LPO=Leave-random-Pairs-Out, LCO=Leave-Cell-line-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO LCO LDO' to run all tests. Default is LPO." } @@ -74,7 +74,7 @@ "randomization_options": { "title": "Randomization options", "type": "object", - "fa_icon": "fas fa-cogs", + "fa_icon": "fa-solid fa-dice", "description": "Options for randomization.", "properties": { "randomization_mode": { @@ -93,7 +93,7 @@ "robustness_options": { "title": "Robustness options", "type": "object", - "fa_icon": "fas fa-cogs", + "fa_icon": "fa-solid fa-repeat", "description": "Options for robustness.", "properties": { "n_trials_robustness": { @@ -104,6 +104,25 @@ } } }, + "data_options": { + "title": "Data options", + "type": "object", + "fa_icon": "fa-solid fa-database", + "description": "Options for data input.", + "properties": { + "path_data": { + "type": "string", + "format": "directory-path", + "description": "Path to the data directory.", + "help_text": "Path to the data directory." + }, + "cross_study_datasets": { + "type": "string", + "description": "Datasets for cross-study prediction.", + "help_text": "List of datasets to use to evaluate predictions across studies. Default is empty string which means no cross-study datasets are used." + } + } + }, "additional_options": { "title": "Additional options", "type": "object", @@ -115,11 +134,6 @@ "description": "Run the curve curator.", "help_text": "Whether to run \" \"CurveCurator \" \"to sort out \" \"non-reactive \" \"curves" }, - "overwrite": { - "type": "boolean", - "description": "Overwrite existing results.", - "help_text": "Whether to overwrite existing results." - }, "optim_metric": { "type": "string", "description": "Optimization metric for the pipeline.", @@ -128,7 +142,7 @@ }, "n_cv_splits": { "type": "integer", - "default": 5, + "default": 10, "description": "Number of cross-validation splits.", "help_text": "Number of cross-validation splits. Default is 5." }, @@ -136,17 +150,6 @@ "type": "string", "description": "Response transformation", "help_text": "Transformation to apply to the response variable possible values: standard, minmax, robust" - }, - "path_data": { - "type": "string", - "format": "directory-path", - "description": "Path to the data directory.", - "help_text": "Path to the data directory." - }, - "cross_study_datasets": { - "type": "string", - "description": "Datasets for cross-study prediction.", - "help_text": "List of datasets to use to evaluate predictions across studies. Default is empty string which means no cross-study datasets are used." } } }, diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index a5f8398..84e1dc3 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -67,9 +67,6 @@ workflow DRUGRESPONSEEVAL { ch_versions = Channel.empty() - // - // SUBWORKFLOW: Read in samplesheet, validate and stage input files - // ch_models = channel.from(models) ch_baselines = channel.from(baselines) ch_models_baselines = ch_models.concat(ch_baselines) From 27d583d4d78d30bcf7c4c796ff82d95ddc3e1ed2 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 12:53:58 +0100 Subject: [PATCH 099/257] fixed pre-commit --- README.md | 1 + nextflow.config | 6 +++--- subworkflows/local/model_testing/main.nf | 10 +++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 27f0b4c..39e2b75 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ ranging from statistical models to complex neural networks. By contributing your DrEval catalog, you can increase your work's exposure, reusability, and transferability. # ![DrEval_pipeline](assets/DrEval_pipeline_simplified.png) + - - - - 1. The response data is loaded 2. All models are trained and evaluated in a cross-validation setting 3. For each CV split, the best hyperparameters are determined using a grid search per model @@ -66,8 +56,6 @@ For baseline models, no randomization or robustness tests are performed. Now, you can run the pipeline using: - - ```bash nextflow run nf-core/drugresponseeval \ -profile \ @@ -95,10 +83,13 @@ Berlin). We thank the following people for their extensive assistance in the development of this pipeline: - - ## Contributions and Support +Contributors to nf-core/drugresponseeval and the drevalpy PyPI package: +- [Judith Bernett](https://github.com/JudithBernett) (TUM) +- [Pascal Iversen](https://github.com/PascalIversen) (FU Berlin) +- [Mario Picciani](https://github.com/picciama) (TUM) + If you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md). For further information or help, don't hesitate to get in touch on the [Slack `#drugresponseeval` channel](https://nfcore.slack.com/channels/drugresponseeval) (you can join with [this invite](https://nf-co.re/join/slack)). diff --git a/assets/nf-core-drugresponseeval_logo_light.png b/assets/nf-core-drugresponseeval_logo_light.png index bc11b3f89481f99066ca302029627b98c03f3a10..d0922b18b33f93121d515ff9de7a2120e17aba2e 100644 GIT binary patch literal 90998 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
  • LrS%uecN-1AcEb#e}@yup;PDexy{o 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 literal 91916 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
      fjKEgm-VhMrJnMJl@kJ46piVa)iBczx$_t0uB6 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 diff --git a/conf/base.config b/conf/base.config index 4bc3f91..933ff63 100644 --- a/conf/base.config +++ b/conf/base.config @@ -10,7 +10,6 @@ process { - // TODO nf-core: Check the defaults for all processes cpus = { 1 * task.attempt } memory = { 6.GB * task.attempt } time = { 4.h * task.attempt } @@ -24,7 +23,6 @@ process { // These labels are used and recognised by default in DSL2 files hosted on nf-core/modules. // If possible, it would be nice to keep the same label naming convention when // adding in your local modules too. - // TODO nf-core: Customise requirements for specific processes. // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors withLabel:process_single { cpus = { 1 } diff --git a/conf/test.config b/conf/test.config index 1599590..2198b34 100644 --- a/conf/test.config +++ b/conf/test.config @@ -22,7 +22,7 @@ params { config_profile_name = 'Test profile' config_profile_description = 'Minimal test dataset to check pipeline function' - //TODO do this for the proper pipeline + // TODO nf-core: do this for the proper pipeline // 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/nf-core-drugresponseeval_logo_dark.png b/docs/images/nf-core-drugresponseeval_logo_dark.png index 7f9be5fc221adfe7cdeac6298aec33f20ac4c804..7bb7436edb79bfa8e14d2ca5c8e422ed35485d5f 100644 GIT binary patch literal 25407 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 literal 25538 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 diff --git a/docs/output.md b/docs/output.md index 42d511c..a961714 100644 --- a/docs/output.md +++ b/docs/output.md @@ -12,38 +12,25 @@ 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 +1. [Load response](#load-response) The response data is loaded +2. All models are trained and evaluated in a cross-validation setting +3. For each CV split, the best hyperparameters are determined using a grid search per model +4. The model is trained on the full training set (train & validation) with the best + hyperparameters to predict the test set +5. If randomization tests are enabled, the model is trained on the full training set with the best + hyperparameters to predict the randomized test set +6. If robustness tests are enabled, the model is trained N times on the full training set with the + best hyperparameters +7. Plots are created summarizing the results +8. [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution -### FastQC +### Load response +The response data is loaded into the pipeline. This step is necessary to provide the pipeline with the response data that will be used to train and evaluate the models. -
      -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. - -
      +### Train and evaluate models -[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. +All models are trained and evaluated in a cross-validation setting. The models are trained on the training set and evaluated on the validation set. The performance of the models is evaluated using various metrics such as accuracy, precision, recall, F1-score, and ROC-AUC. -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 7d69c7b..88cf27d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,65 +8,26 @@ -## Samplesheet input - -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. - -```bash ---input '[path to samplesheet file]' -``` - -### Multiple runs of the same sample - -The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: - -```csv title="samplesheet.csv" -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz -``` - -### Full samplesheet - -The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 3 columns to match those defined in the table below. - -A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. - -```csv title="samplesheet.csv" -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz -CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz -TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, -TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, -``` - -| Column | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | - -An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. - ## Running the pipeline The typical command for running the pipeline is as follows: ```bash -nextflow run nf-core/drugresponseeval --input ./samplesheet.csv --outdir ./results --genome GRCh37 -profile docker +nextflow run nf-core/drugresponseeval \ + -profile \ + --models \ + --baselines \ + --dataset_name \ + --path_data \ ``` -This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. +This will launch the pipeline with the `docker/singularity/.../institute` configuration profile. See below for more information about profiles. Note that the pipeline will create the following files in your working directory: ```bash work # Directory containing the nextflow working files - # Finished results in specified location (defined with --outdir) + # Finished results in specified location (defined with --outdir), defaults to 'results' .nextflow_log # Log file from Nextflow # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` @@ -88,9 +49,11 @@ nextflow run nf-core/drugresponseeval -profile docker -params-file params.yaml with: ```yaml title="params.yaml" -input: './samplesheet.csv' +models: 'ElasticNet' +baselines: 'NaivePredictor,NaiveCellLineMeanPredictor,NaiveDrugMeanPredictor' outdir: './results/' -genome: 'GRCh37' +dataset_name: 'GDSC2' +path_data: '/path/to/data' <...> ``` diff --git a/modules.json b/modules.json index 62cedcb..4566ec2 100644 --- a/modules.json +++ b/modules.json @@ -3,21 +3,24 @@ "homePage": "https://github.com/nf-core/drugresponseeval", "repos": { "https://github.com/nf-core/modules.git": { + "modules": { + "nf-core": {} + }, "subworkflows": { "nf-core": { "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "9d05360da397692321d377b6102d2fb22507c6ef", + "git_sha": "56372688d8979092cafbe0c5c3895b491166ca1c", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "772684d9d66f37b650c8ba5146ac1ee3ecba2acb", + "git_sha": "1b6b9a3338d011367137808b49b923515080e3ba", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "bbd5a41f4535a8defafe6080e00ea74c45f4f96c", + "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", "installed_by": ["subworkflows"] } } diff --git a/nextflow_schema.json b/nextflow_schema.json index 7d57ead..7804e2b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -53,6 +53,18 @@ "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})$" + }, + "input": { + "type": "string", + "format": "file-path", + "exists": true, + "schema": "assets/schema_input.json", + "mimetype": "text/csv", + "pattern": "^\\S+\\.csv$", + "description": "Unnecessary parameter for the pipeline, added to satisfy linting.", + "help_text": "Unnecessary parameter for the pipeline, added to satisfy linting.", + "fa_icon": "fas fa-file-csv", + "hidden": true } } }, diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/main.nf b/subworkflows/nf-core/utils_nextflow_pipeline/main.nf index 2b0dc67..0fcbf7b 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_nextflow_pipeline/tests/main.workflow.nf.test b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test index ca964ce..02dbf09 100644 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test +++ b/subworkflows/nf-core/utils_nextflow_pipeline/tests/main.workflow.nf.test @@ -52,10 +52,12 @@ nextflow_workflow { } then { - assertAll( - { assert workflow.success }, - { assert workflow.stdout.contains("nextflow_workflow v9.9.9") } - ) + expect { + with(workflow) { + assert success + assert "nextflow_workflow v9.9.9" in stdout + } + } } } diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index b78273c..5cb7baf 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 -> diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test index 842dc43..8fb3016 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -42,7 +42,7 @@ nextflow_workflow { params { test_data = '' - outdir = 1 + outdir = null } workflow { @@ -94,7 +94,7 @@ nextflow_workflow { params { test_data = '' - outdir = 1 + outdir = null } workflow { From 7e02d4496a458e8fa56e8c735275f0ed31e7b133 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 16:09:12 +0100 Subject: [PATCH 103/257] fixed pre-commit --- README.md | 1 + docs/output.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f03b199..c230cd7 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,7 @@ We thank the following people for their extensive assistance in the development ## Contributions and Support Contributors to nf-core/drugresponseeval and the drevalpy PyPI package: + - [Judith Bernett](https://github.com/JudithBernett) (TUM) - [Pascal Iversen](https://github.com/PascalIversen) (FU Berlin) - [Mario Picciani](https://github.com/picciama) (TUM) diff --git a/docs/output.md b/docs/output.md index a961714..66baf6a 100644 --- a/docs/output.md +++ b/docs/output.md @@ -25,13 +25,13 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d 8. [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### Load response + The response data is loaded into the pipeline. This step is necessary to provide the pipeline with the response data that will be used to train and evaluate the models. ### Train and evaluate models All models are trained and evaluated in a cross-validation setting. The models are trained on the training set and evaluated on the validation set. The performance of the models is evaluated using various metrics such as accuracy, precision, recall, F1-score, and ROC-AUC. - ### Pipeline information
      From a6acf5336c76d979ce53a0f07eca30bd0fea9434 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 16:28:14 +0100 Subject: [PATCH 104/257] trying to get the new logos --- .gitignore | 1 + assets/nf-core-drugresponseeval_logo_light.png | Bin 90998 -> 0 bytes .../nf-core-drugresponseeval_logo_dark.png | Bin 25407 -> 0 bytes .../nf-core-drugresponseeval_logo_light.png | Bin 21349 -> 0 bytes 4 files changed, 1 insertion(+) delete mode 100644 assets/nf-core-drugresponseeval_logo_light.png delete mode 100644 docs/images/nf-core-drugresponseeval_logo_dark.png delete mode 100644 docs/images/nf-core-drugresponseeval_logo_light.png diff --git a/.gitignore b/.gitignore index a42ce01..14290da 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ testing/ testing* *.pyc null/ +.idea/ diff --git a/assets/nf-core-drugresponseeval_logo_light.png b/assets/nf-core-drugresponseeval_logo_light.png deleted file mode 100644 index d0922b18b33f93121d515ff9de7a2120e17aba2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90998 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
    1. LrS%uecN-1AcEb#e}@yup;PDexy{o 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 diff --git a/docs/images/nf-core-drugresponseeval_logo_dark.png b/docs/images/nf-core-drugresponseeval_logo_dark.png deleted file mode 100644 index 7bb7436edb79bfa8e14d2ca5c8e422ed35485d5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25407 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 diff --git a/docs/images/nf-core-drugresponseeval_logo_light.png b/docs/images/nf-core-drugresponseeval_logo_light.png deleted file mode 100644 index 05adcbdb9b996f4b8bef9673b58717a8dada6993..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21349 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 a-=eE#H$u=uUdv#7CWOP-n3tUKy!$_KJm+u# From 39826d5f8f93346d93c8b1934e90de4217abada4 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 16:31:01 +0100 Subject: [PATCH 105/257] new logos --- assets/nf-core-drugresponseeval_logo_light.png | Bin 0 -> 90998 bytes .../nf-core-drugresponseeval_logo_dark.png | Bin 0 -> 107160 bytes .../nf-core-drugresponseeval_logo_light.png | Bin 0 -> 90998 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/nf-core-drugresponseeval_logo_light.png create mode 100644 docs/images/nf-core-drugresponseeval_logo_dark.png create mode 100644 docs/images/nf-core-drugresponseeval_logo_light.png diff --git a/assets/nf-core-drugresponseeval_logo_light.png b/assets/nf-core-drugresponseeval_logo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d0922b18b33f93121d515ff9de7a2120e17aba2e GIT binary patch literal 90998 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
    2. LrS%uecN-1AcEb#e}@yup;PDexy{o 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 literal 0 HcmV?d00001 diff --git a/docs/images/nf-core-drugresponseeval_logo_dark.png b/docs/images/nf-core-drugresponseeval_logo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..865500befa22a82ec82c02f23078ce737f02d3af GIT binary patch literal 107160 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

      RCwe^T*ZRBhi`*TZTMHvl9 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 n7eS2aE39Joo{4H>cau=cB9vDj;B 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 literal 0 HcmV?d00001 diff --git a/docs/images/nf-core-drugresponseeval_logo_light.png b/docs/images/nf-core-drugresponseeval_logo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d0922b18b33f93121d515ff9de7a2120e17aba2e GIT binary patch literal 90998 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

    3. LrS%uecN-1AcEb#e}@yup;PDexy{o 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 literal 0 HcmV?d00001 From 30d49907b893f62cf66bef9df37bfff7d2a02aeb Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 16:33:02 +0100 Subject: [PATCH 106/257] new logos --- .../nf-core-drugresponseeval_logo_dark.png | Bin 107160 -> 25407 bytes .../nf-core-drugresponseeval_logo_light.png | Bin 90998 -> 21084 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/nf-core-drugresponseeval_logo_dark.png b/docs/images/nf-core-drugresponseeval_logo_dark.png index 865500befa22a82ec82c02f23078ce737f02d3af..7bb7436edb79bfa8e14d2ca5c8e422ed35485d5f 100644 GIT binary patch literal 25407 zcmc$_=U0MZ zXiWw+cKfh;f<@0J@;Tdr@!c`{o|K+^+%xx`1n)P=u>zPu%uJT`{lA3KpU&Y5DmKer zDLCCAF7b^X!V|_XsE2*7Dh|OaRn`HfrPE)Y#%g5dy-oWeHXCJ_!2`;^C)2GQPIEnJ z;x#QdWo?0BM`P;kZ!dp|%9d9Yez=!)iF&%A3cg?TDfPGBbqnIR^NWr0T#lWz@+r#i zdym;kVc**rZ{Pj+S5-DH&#~rKw{u5Ur!V*;cfqyttTkX#apAPA>~rA4BZe04u?#jb zJu@GDQEIQ^`55gL#(K&0P_v1ZUm#x29nT?*w0l*0P2G4-}f|BZ?>|;r z_Fx4_(&cA~h4KEsd#m-=Op(wePvV{+cktMd8f6Ig7l&(5X~uUTWXQeyO(chzy1&Ev zQu`?qj{GbWr!n+q9=wu^AlD%dRb`>%_Uu32 zq;D(=6BOjteTD68zG>r^5ZI#@`7;C8HHpI!TcKJ7Z!?vO^l_r5aT^A0uf-lF=@xl> za$0S45#vZQmoG4I(%f@G_DyQ5;AbDsw2c;WAY?H?YOWvp9%I-BVr|@`gmUo z?O#FJjKb`uBV8L5)F#uac=3@); z&_peh8uBC^GF0{nwtzi%CjVROYtQDSw-LDKy6ddUXjqU_tuxtXRS;03-pw;lG zo;OL|=ZYkG2eVE4&w@vyOICZmQX@-F66*b=;1yiLB0C-F}^BVqWUnZKc%R`S8uX;@<6&k z6KU2(Ior=L;|i27=_{L#NsTX?wa+9J@>kR?n1>?D25_l5GKefJBz`rE@>}+R3&aKn z{AA$g(LIfcF*8hX;`EzuG#W>>(zenRAM#IX-#*=?4Y2(_S1G_Co@W;PlQ0)Cv*5X0 zAKmk!`O+SvbTQ!29X`9OFQ$YpZ>HKCDuK!wx@&6-w_VwzAT;wKQyYhp0e>B z=CT<+c>t!3I=T)lN4m06Af=%Knpn!KmVXof%$|RU%X??qSLV_7uyH{B(x&{iUoX}S zO*WYC;;b(9IzygtDqBkjcARc+(B^op_5C|B`#)CAYXaK#M%#54Lt!Qln_t2j6zkK3 zL@Qn5t=oB_T3l7Ru1oGKcG>6anx~4$@K~Thr=ZN3GPC@4(gmlcVj*YXt#XFI8(p^5 zYd-A*X4`uw+yc@;XQvY)(Z>uXu+(J8i)Wwm#oipH{2M0lR!C3uq2cs{f9E{2a%xC8 zN_YF>egU%fRVz8HX_#%jwAEVtmE`j}77YE{b#KKWRlL>K_joU-N_}H3^6!7cJNzv5 z8Yim(w>W7VI$GLEl#r(5UC^)$I58l^s1{kBlOn`qtLwgz$lBZTeC;oO>@<$n&7VqO z?}XYs*Y`I}14TabZ4+fzD{`uyo`my+1TUnCX`%Viiv)M4H3v?)pX{Z3H@iI^rwA8O z&_0 z0CbbnxvAHboP@%25&kLGuS(B<=`iM`C zltU-2nX6!SV@f`|C4P`wNoEa+{cHp)yS(u7Zn;;()hq1cdbN<+-x`lKbO(ZmTdEh5 zS?TAlkq0nru%(XFqEhc1yOfa%oOm-$Y`L?wDXFasbkSn+*TpV5vGRNH%ZfZi<%t!k z^Z$+a7Z$mijbj=(|8$L3)z8_z4M94?oOmWI^I{#5_Y<{?KReW!8- zUpw#p>v9?2HeK!K=>Z7U!GfOhMVUZ#^Y6KjRTVT_9Xa9q2^+mu1YIXt==>!pc6wBS zG7=(LFd@GgnG)FaD|JR|aprMvSbhb&Hu`HPWt?5Xcbb1`fn&nmyhix1hgL?k;PF*A zx}fv@;rO(2M)Ba!N^f4jd7AXq>4D^%K%pM7V2qJcQBmS4L_iXUk6zp)j!zWQGI?%GW zMPT6J@OHYx3w^`ik9x}&ioc7@b-gnQWNp49XqBqVFY7UzaabopzK1m}IP>Ip zb5YLKp{N6G(g-_ru?9ij6$9c9y_BiHTic)o=CtbkM1L(2_kMwH|BTD7SchE-_FW#Br_Y$4XuccaEvKL{F z55DfO)Snhs=VCNB9;*H-8PBI#O3b z`FbwV`ok3C)(NI7G`g#mdDj}!q5{B7o_B@thF~&pZq3eR^Y^vGMgutQZ)TIMcetS5 z(iyqS?QdV$1Z=*gbak0vZPp^;fAWOzP)%n$Pkd`{Z#Rnj=s1pTY&=mwtls!<(w45& zzOvbN?bktU;vF>8dsu9`L%FXkvPkoX%#ar3w~wQUV@wg_xM@F(#K`>z4gGg*}_V&h2n)(8r5Yowh7YWH+IjcEM27 z`ceJapPe^0Cc+033Ff&i*QlRz*F!^Tf&^m%P-QonL0sw2{^))0^}kyRD{0EReY{F~ z+7NT;0mu>WfEbRo4}tpqxGQS&`z+Lj76?I8or_c1fqr+gB)Ju@iw_(a!`stT+Fqh( zFprHI4+&L*EJ`%Xq?sop2Ikzszmjfz2tqEq5t=_zZ9Nj?0xfG`hq2nS!EcyhakOB>$HEjWy)K^kU%J1=|Ea^X$=Dn?Vg zC)BTkh!y+t;5i3FmGb^nYT1aD$isV7rBn&4e|k6@GuaM=1@7@2n+y2a*>!LzT}n+c zk@wn6zn&XOHJ^MX7jWXjP}7M}!{!+`p}KlCyNyyB2hUs_uFwaN&+5)~C2G{TzG0px z>#b*9QZDn}kJb%i5j?;xG%Ckb%_fB>@yggp7*Pt^8zH4~@Ql>Z;&Coz7}1ctH|{`h zHm2{Fd8L`ozH9Ideyj;SJ3!x)~S-78_Bi#m;b|hmFE6-e$5)o+1HmRFgr3a_oCm`;g z6&x{-ufQiZ-bF0!4Si)5jT~cy5ke$rWiuVleGitlEgZ`K&!UY*ORpx5R}YQ$@;V%& z>?yiw{T3BRs!pnp{Q57g>%>lvO#pPy>DF&=|4!Mg9iwzBO-ObwFE@4|RgJd0hDedd zQ(iV(egOXXbNwdz-w})G2$`7_$egiw5C5>uBLZo&6Gt|=NUH3dup+LJgYRy^Pb*C8 z`OY5o<)Bu_@JdL%SP|6`a1bZMU3WQdGFA}rNC_DHu%4LR_(G1SR?>+)N!Mk!4&NFk67A@b<83xzI7-n6Dx zd}=WCf>LB`mg}^nzslJ3KlK(Y68pQnNd~{0o-J7iz0ODvPkbT%gW5j( z(dh>U08~&kSI2YD3U}r2Xw#MY%pSZ(_XI;dv6{QwSB}>asBz6NlXV%qWNRx?ls*2T z79=g#R+oqfpvw#&vQjf}4+}^NjhEp@r>@XLhZBf;tdFrfvd~c@OyY>Dv8}-n0xspN zNGaD@nj&U_pXit!di4=JehDF}?2?YMIo2!gcmK?_Zu&@Zs&+rH#>cKUH$q21Bg3-w zh0?;$TK!Hzr*IL9&hw<7l5NcabL-J76_i^MVr&trV%THO-jF9^(7|bkgxlNQ&f&th zHRm%w#?}>29eQ=fXIH_psQ-&D*W$c~?D!p8TUYEAO7NyW_%GX^XrQ*)x&9=1(T`$U z!S7LpI2k}7zbdmg({}e>n+oR?i(4(rVBvlnF`?IK9dLU0g8f3f_!d4}*`>2Q)mDCT zEb~K6z{aFUc440In8lL2@@y!$n@42O*Ww@sK0?B^=m1h^$RC)nnPyc*kdIGsYWV^c z>D`l-uc4tr=)otVb}Qa32=@_H-e-`-7qI%W2hO;H)`^TO1;#E(Gtnqn?1VxlzAvOBM>?}S}eh$VIuyGu`m zaXzJ?!ItSi-?|AD-*cUKaAgHAlnQ4HCiQaFdB{I`19uU@=GnqZd3eDhGQ(UoF%l+V zP_28)AvLliGUleIv9;CnBge?h);75neQbl9DbvS|f#)OlRFH(mflLCvcD<~g@;M3L z)*g6(Q}0oTf>6v(KvzBn_FDd@Ca$u1at272g(h|BdpnG5I27CsKUy@h8A#j=7vM=XU;E9yWpTG>6R1yg_!Z0u_i-^&F}k+2NDG znc6g(E^neF<$@2g;wnD^y+T3Gkva92k-M{6q8e(-hsJ;x%EFbQjNWc4@3UYzI}zzM zq8b*UzXW#+A`y9;I5WMKWEf?)8>oDw(JQ~6FZq)gp_-yI9|_@Cy53G+ZArj;4Xfs8 zAdoC9Tj#5Y(!H*S0~xL+Z;nlyAKfmdGT4ojd7$S%w7Dx|qi0(6^LnmIwm!q0m2mHG z)@t>LlAjc0Ye+orGp;FnnZO`9P0j5o*gNyC=2GHy+D)1sPbwd(E-68QR!dQBDDZ6g z!*(dB$t`8TQk`)1#2IY=&^5dGPG8~MkeGC;hI0;SFWDL@ZYsLt2SYl!;0%ip6d?&A zR7rC%NvBMjc|dh>?Q#?KGwx(@qA~z;Fax)}f-G798&cTG(wIw@{VCCina@`kE`*Th zZNq(ev93{%@OS~hh@m^DH*O?4Ra9QZ=Sz1~ceTs%AY_Q|?ym}3=EzLBm35}fk5SLu zu(YDuG4yC4=q`*-GYo3~oPW|*7{@7hyCq5e>`d;)rxVMZl0-NkRRqrO{0?8*H6)wl zfbC{1AqDY`92=8AcSoUrHX$aW;8C3)x`}oJp z7ld{jk>Dbw%a`66=`H;yykV*Dl-cQ(kQFiZOP7NTLgWQ)yLlpgR!uL(#aF{T+;=dm~nrp7?JoM9}dGLnQBszUmYN*9_h)t_TPX zT^KfxIIN{GQv5^4D-ybG((>$aC|xY1t-8j~PKKB}J~Pu^WD$bQ1oO@wr}^YxkB4LX1zA-b#Erc`|&PEtW6T}5=O?V4kgMHDiH=_z@(?65_A zs0apsGZ>D=yZ0g^Kt&`MOl}C>aPT#&VP9V$xfNK0fb<)o=MrjmzB_c#ZUcyXtACAo zuDJ=-GvWGnop<%FxgRIa-xLoTekHZ{fzI1{X{(xbc2&i6S?_>k4L~B1EboR{Qj;~y zcpgwc5%>htf0KPsck;F$ekxd6@2XhC0A<#G$oiwxcx~A0r8)!iK4lX}*VvsqcNmgk z9bo_U%!(PL7u0neS#E$34O+Qr0`IJgkrKd;4ra@Q(pM6;C5(!82Bc}I#a`4CZGdBj zIqBie`@^WW*y>67X6Rs09`7WqnZs~+CM*iKyaNBj8piro9vQA87ZD&odyr`ngd(7e zj;B6==6DMh4O`!{twNwUm3o}X#UYW#-HL0hd2j8+o6Hr6F_h`zXLnaum-XeR(y){?V<^Zg{Ox3Mv2ciNJ~^2q5NbzYhL>)OV$N?KwU!cmrMg|!G*pK2r z{#siEj?!j{rGywWId2b**T)JwtS{;+ajgw0fyE*sxJDEA0DZ5mxB&*2ve8QDU!mxd zi&JQjD>gKTIOwWF+3Pc-&2CDT^O$VfKJTBqSz5IS(S!q*k@ZvpEWAngEw$XJlZ3r_ z7amZ<{q+N%&)R!sx{eJiXm>H`ux2-b@vddlVCcfLP_Bn()d#x=jTFZc@zrug!&Hs| zl-~NSM}hRozEZrAUHeyUc%KCl>*mMsZSU+GD7xqqGhT%lQsE14=mY$ zxYTw=ixXL9Clq>{UrqISiSkBCg@U8p_aY4-REhHqQ%>X#w!CBA{hEguWpBG?l}pKqEJmo9cUH#c=Sr&}iO(|n(vPoCE>%Ag!0 zw+#GiEQBAvl`vs6v}rDXZ#_g4{fdPe{_FWgKTK=Yx*2{|y8wcqP7+OIo3Ch&m!Vy+ zDOGy!Pyhx6cuFKY1-o$jQVO7tEpvGIdr}JftV_3w>bmKmSq&DCvNWiZ`nr5oJu<1Nr zJ_nQ175ARP^x8##xmhKLlp5<@m;{rgw5ti>dR?3tB2l2gz$04mJxZRu^^bCG`EB$$ zD~GP$D$Myc`}QXm&K76g&VuN++NG^bQBxI}b%H+4_>3rGY+s~Af1&zxK<;Z>u^M-C z2w~DMykA$Jc^{GVSs+~$06Xs-8-`^pO&rRj2|3y$OcW6IS7jBJE*!X+ITYuomnhX$6LVm#RG&S z5;6@8v1X0-lo_9tz6_Xo6)+?4>6XbdjO&Y3AbVQ3Oe zA%UD9n+T;FyPDf0$?|e|ZjSpnB-HZq`utF(G_&zb-VM_@!^kzR&!_hlRGF3EC+iiJ zh&D^iMfq*&YVC9-Rb9uVdJ|@_spmFdsI&Pg9LHhw@~S*t_KEMBS;b7r;C(ojp2$YQ zT8Rp2FSFn08F)|myXl4*7V)9IUE_U1)M5M*aF`%?ky?bNY_{{WKdmx2R2)6&xlKVJh$mmL3ez}1e# zDYo2A3)v;SvG#ptUH^Od8__Y0+y%5GTbLm-ldbU{j7m3z8EqHP@|2gp*GVjk!$F2J zj=HNQ6UcQJi&zeORrC`gI93U0)jws@)_uqsfOskR`AaH9*+A5E5@sPl5fh<1^4>#6 zl3{k6nA^M+kngov@`IL!>f7xQ(wPhJreREykIV%zzl|0;)J0|dwv{eSYIFzeF9Rdx zg34<28>_P?b< z2Wn5U>&o9=H=-rw*XNFpq=i3Lcj9^X=R-L1d17)`TS?B-N*pcvlNMiNy`rcU7&0`> zZ*iup797Zd9iGZjSc`UTOJ8Y^LWD4(>JAOEolGmf&6Yfob#c-aU}53Cx+`i5iO z`T+hd;lLRju}?^UD-z75uKRthR$Q!M>5Dk^-v@{?%-iDxUdZpk!flp0hjg?LElyd0 z{n?8vt3L_N{jucCWx2&*7&LB!h^e+wN%zchC?MiocIg8!nm6SlS@qA8P0E65t|&9CBhFiaXh9gHB9Z1^d-(3c1hq*d0y18p!u-x`7lQi<*%WQohH66 z#=F4$nd)e4Y+cM(wKr!#m&3PTdjxIK_PoGNnt)9|XUD3|ko6Bs_1+FN0A8JepfMGC z{?24InlDTt9;Qo8TBj^G)9|->C7K1PmpsE;oY=w3bJ|eit%oFccCJ6;}a#OKUZ5R1?kyI-70%hi;@$l zE^{iS2Ey)$1y@Z47Yk+MQ0RAUb-P8Wy8?9ez5_LpT^Frq2PqvIV1TCpN67F49S4-p zk3y+U#CG2x`LEqRIJLxJhGhrbdzI`H>}xiA|eJ24PXzf|R~M z==m-Q-}LW!=>54*N_;BP%1pB5N!U;*#izBMt5(9iV2XS5Ekm;HOkjNL_RH$S;Re!V zQQVCxjNy=Ay>qzEyXCK{Y>;vQ~LWu}W=s5~mXm(0z^ z;{7bqGGg57#0vUKL<`rlMKEKc1m_o}3h?GXJLGJCT|j!IOx0!s$GLIo@Jjz}C9{A& znU~lX@m0fkJ3{N}X!PCT>f>>j1W}PA?F9-d$hpkJhViQF(o|FuiXLxfX8>nny#vl8iL&X?BX?UB-Q+F;Ie4YvNJ9Rlph zv|!csA~NwC-w=*C^}$ifwA|IZQOZA4KYy(_7q=#5WcOWIg6XNBq)dc=rvKmVl(Px9 zi}308rMcIy0>v$=Zq++Q+aMGhV4q@3s@$2&Bqxh_5M3+5W99(>`bLD$jur!%Y=kH8 zXhV>7+osnz;kq?*;XOBRk;85JCy5>j2ycJJQPI2xU8(KIZu7jqBCg$e!M+_cSdp5X1<^eufdA~CWJ6WKN^9o zVxG+WvKL_4z>9 zD~h2J5_iSla1yH)EDJ0`cN(&Bytll6=RD(j*m9a&sM|P#w>6p{)Wz`{+A~sRvGXfU z&BkZ)&dpPJJ}g#;CRUK5h~4zwH?q6!L#|dxT;b(t+h~}Yt+|lP3+9fw#hYfRR`5F! zkPFPei&x{d9Ke5}^^$@hI%(|X<^D>(gi!GFKRY~(?GoxMIw8uqs3sJ-9Wx=rjknH2 z5q~~*fo22y6|(?M;}mB&GIz5gSgffEMZ4y2?AJG|X56i(-(}rEXgO3e_-1~1#P}EB zUj!T|6^*OVtG;ipEzt$-kXLhkB$)aYl!uy!bNv4VQhsYtdQ&F4rBaKwElfTk$lOkMYD;_aC?eJVBjVRA*p4^MOQO z*ytd>dVjVv3e24ZC*A*6sByPCWYL&{hl=##NAoL;Xx<%n%hvyTSu|OHZk6>6BXcF7 z1rc()L$fD`EL&Qodyn6pg#e1-*T&kmzt_8s+$-E8m$0dZ0UXUC0!7anmsJse=B8Ne zlX<>({TBhYwmZ_=7Z?!Cs|4<|P|Q`&hK!xf zJ}Fn&``pfs;Hv6QHyLwDVuCQzMki5;#X%Nis955!irY!F@_cfrDa{6WfM?vISt}+2 zddZzY&~;8fSNm`VN*!j0l>#zp(yA477)W=Vmbl}RJj!=>fDok`5$5f^wIgp}MD=&y zepX-9rg%eURWi;;b8CTF+HOhvuVL2v3t`Lim}zs0py`QYD}Oi~VjN*)Wc20r9INs5 zE|<&~;frBAW)!wx@S$+*6k@);&Y9|5iSAT{%DT$LSB`m1L!%GhueN)jT8q8|(4H>~ zbG!676zG&B_#8jv`E|pd(@&TMGv9;w*?K-^?C`H!p!4Nw#r*pSTmH0aUbkA=dbXf@ z)t2V+gI`X&&KN}N4nObpx@C|XcWDK|2gkTh>(>+G3Mna|y)1Vl0bhr%yrhRnicz_z1yb9Yw3Rq4IpevihQqS*P?J{1t7mzvH zSFYp91jjD4hrK}bAz3+Gz6==6#S2d}YT1BuG^CBMBvWwpWNAL#a;!ck+)3euk!!2R z|MXn7)QD1(-29?81Mn(G_%jnY^~%go_mVa#gS^?{1W$S`2Fcq?zM_8|cSkU+uXqx9 z4tn!;er(S*yDn14z5p(phHSe|@nz-g`hr=GRcX|MRf_vQ|^lhNoEQ zbg@dOy1LRY?3mMfpV&LdT7;YicJ%jN+(wHF)ElQpS(#v#falca*{9lUi=A{&z;1MZfy>$4LV}5Gn)9;RxBdHk=8m?vLRV~j zdK2I+jZr?l%o|`W`!$fg0QgYmQ~a}@>cCvZiw4dFbr+UP9ptl-uK7>+^>w*#-=&nA z(uhk7+9nCPoR6jkLbRlLTErfn|8=Zx-fE2ZoLfkKfYgf*gDzd757HL+)5#q&F+S;U z%SqM+`Tws(ZGGZwoMad;G3dxP1#xvH(1&jwH0E@UH6N3A@c*~`@aH$=&-am;(YON* zME}Meu(eb?;$@snV6ofr$JlhK|CKZr^)46L>!CKzEY~!$uysV+H2yv@A$ZmQN*;e2 zr8}Pp>h18NJZA2)0avuQ+_KKmF@hTJ+Or;mCW|NlBJq&B1V@8@OtC~>2YHUNAjpsd zaIVC?w$_6OwnBmb(YyVdya<|-L#h@Goo`ptOUBTpm4OQUlm9yGbPjk7K) zlll8pf$~__GYo@*o^;(hiA2&*E;0uji>AS42V@OLMgg*#L=%=qmo9RHiz^$OngzxD zrs2t$z(9y^;8+EK2r(|Kq2EYXxY2b$oNR`T(rQxH;M>el?Oa_yVe+G~wUdc@`5Zg_ ztV0-;amQtrvboQSF!`C#x$;za+aW(zTntMDf>=IwEYKzE0~sE1nfkCPh_O@|sgF`v z&aac$A~=p|7;}(iLEi-0ftEV)5kPuTEvrVAQ*hh~hm{1TKtB`*YBK?Z2$r_SR%D;Q zY;G)zE>(x}2hp-M=P;a&*&l>X^%cg{i0UPOiFN%9>ysOESoQ=)>crRh3M6@lE!Ti| zm+U3b#WAksaW%3F^lWlQeuQ>N*Fd%(t$EgkU!Gcz-&>uYObdqc8*?v)x4#@Rd~2hp++*AX9Mous}tL{|Hh7ZedHMTjTST3n;`&uQha#c3&;BI#$A_Fos=Q2J^*jGL3+rY zScVk-%mIA+N17NOEWQG_hJm~eB3-PvcgpJ}TTMz-lUX$bu+JrQVYZ)<%W|`Jj0wCM z8h?0`I0@wqnYIkI0x!HFJ5*;b84pYnG*oJQm-;)d%OSaRVJ|R{1A&4Y*?#S_p(2M-03Ir}2>P`+23r$7Zb&S-|gL@yGo&u>)v z5F{LyJ1LtS$R>}-Rq;bcyjWWGBit}S>Eqj?{HltH>9yjV$%v{)%UIZxH;3n5ddbsw zU^o6mWd>Iro@4Q+2-F4$Xb>uxl{a`%tTo$MA>TXAhxr?yx z$85hr|&77Y=}{9*BJNtB#D9TI#6 z#*O;O%{t=doVdX)Gn0B^gqSSzHz6~lM&iwTFj|TqBbKd{=0a+!2bWle z=vSuCpqRHAN0agfq?;RZcR9N78oe1z4^iB|9D+zHq&>xBm6hj0Kg9>wTr3(URlf9Q zwA@A_9r4)0L=T;n>8TvQ&JV;}3T@L63bmEh{%hJl5((_PL0H6upVKUHa^(f&N9Z7- zxux^;XmYZO4746PNa)1%Tx_4GPw-GR-%8 zGAOfaSeR7U+n*+Ol5xb2+BmGhy^ed#sSupi&P{6fA>>%rr8 z|DVS)eC(V_ntRl)`hj>ro=~2%#R#2_F|o>~HC|?!+~0|~npAE)_o&haRe9!+?o1nJ zDp+Nxep$Y^jeKaEWtQjO6IB=sb4Xu9FQiZ#6KllEw{m7jWE?0-oE#*NUuJH`7bnxJ z68Oq*GtAnwLg(|p(tvbUT!|ZazB0Go$}zi{?N?rbv-=IR0XS#JuM?U>*KqkE8!kcZ zDl7fO$vhL$wBl7Pxevvvd*DJ2s4mD$LM6^y{vRo@>HI5is z5q>k!Dx~Kd0Cq@1z~$uH4jGp`qY?DvX4%&Z&^{ZKYJo2sOKxm9Pd8Y zi70KmC$cXfvXtBP`#4qAmob=hA*GjWgloknIZuGJW9|aB1iaC>rPss7$16Ewg~ar> zLnceq+{DHU{h!B7i*A$W{;)8lDy@;EyoB8RK+KiGC~Lt>BR`Oj zKp039yf8R>@>)P|r?}vd({c7a?%XW$A?Ad2D6EjBHY%<)DYV%-`~ze$5YZo1i7VU$ zlV3P~b9}9D#T|TsJt;)2R%*w1xYy#!t;fD{`q+R_{icO;!V7G{4Qb?trI2go1wST; zkJ$~ikwHtd!c~ETXg@9|kCN`Z!q)8dPsiDtA(!LV=vFys440^A&y(pNt=Dl`9#sj< zCm!#@k)Ql?Iy|TuWsgPoQ#Vwwki>^sgi!n zxyTx5A-nWQXoSc$>oezNPe;5F*>#QKVK5P#5_4ac^+rcs$mmWIVlyAtQ9$;E3bHS% z_z=RZ;76v=PuU+D$exjaKaGZC5lseUOKQQ)bwvWJam7RTL(LKW#SGAJ=gP1J*PRc< z4o&cOsL0ZSquU)Q#*(`+9nh!3@#c_5m0(|#F+fiRwsAQY(xZIS)-p|5Gq6C*Ld z=O>FwW{u#nkRCf6F~Ti%@cZ}g_mH=2;iYOrxv2fL@riux7*wsen$PHUL!VyLZrNV0 zBHVc_!u{=sfM+={@U{YWbPe_LlWSU;M6~#TVG82>A-vf}=;{OqK_!Tk#NYQN+t15A zE&O=zkJqSWL`c&knb}`r=5r?S9Fvqr%3xyZTgrOk?T2J?I&g@r60^IP{A+{IY|QlE z$3C^m^m0bLcp7330l%Ss(<5I{|CVk?ZENev7i)!N30S(b*A?xjIWftGjjt?Mq_FDb zsC%bs@~ynHz5TlvnRdL`d#c#`3cPPBb>P7ZBCM10ch% zzJ8={2KK2Ss!D8~*?#Y-N&q?i9Af$fH)~AYIrVKmJx#bKP0g-EEtUte<;P|#q@|W; zO9DS-gC2W6M7{1;yRDE*Dm5FQJ*mrVuD-h?3Ea4T>1DF>#7R9-=$b_-lvh_o>9Kiz zk0nFpeo~#w;JL1rg>5-5JaEXA5Bll3UESqYa2k9`T4YIv)%Y;Dz3mgbUqI3xzO5Lt zh|&fRB~VOz=KS()pJv~U<$dIkP4h0~7yZcrqMzxS9;rRzPBOpCz5lEz%KGC{cfJzX5e>bD9$NZ+=f zz9R03e}N;0Ub|7BhWKtde#UtF!x)r)|2d-nz3-UQnu&}2ko4{oz(;yI zH;89=i*;P~UdPSG)JIN3eqvMuRM zXg5MB&CSV*9vasyA>(&VF2WQ(F;WpxnwB>;Sm965_|wi^(%y&+E61_vC9BV|?;i8Y zTA*%MrcM@)HOW`pqRH_yQe8PlMR*-lW&7QSf0OGyHLpAMo5GRUk}@;rdM;GDXIW4i z;jleCa!#*9_lb!eD16hWAfyfx7-0m&l@`&Z2Yx*_0ab)QUs0mrI z6G|F@ViW+H`};n>?t3V)XeN7Y??H_7QfsddJczr0UFY|Sz$uMqeO2I`6W zpuge+WPEp-S-VXK)oxd)t_}WfdAOv=L2@@q@Y|Hej>={EC%{b9)VKVQ=ge|am!TE3 znuz|)-i%^8sO_bB_R9VBECU_pn3C^qcPbU)WE3$qn3$VP(26@_5r}K(8^HQ|oS{`% zT`*ZCl^(|4wZ?%Rs9gtmRU5`&?;3{fmX zmTS@9a^=izf2ahCptkMf4XL-)i;^f7EP!j*vU#CN$^KK?$h{f?MhvzsuS&Q66Iw zgO!Zb+%$6B)i}>4J}3r_Yrx~@#FFQ}hNAjYWO`+Gf8tM-(Z%<1J{!CR9-#FKT<+!i zTk7{itF>bsLDmyh_a0>W7}sDRUc;7y;BOW9x%7Os_N>BQr&6x=3L&%g0GKU(I&D3jr`IdG>Wd>Z#$tE7rhhC_`9 z80Fmx%fbcdAZI^GnUc#I97mI%<9DG-T=k#L&6~lC&I0HN+1({_S?gB$+Vi~=NI5cd z5L%GN_)@KQY}GV;b+6nltD}*yBmituZH?sT=TmFPq+}k+i!7;=!jjya2e1!$$$aJ^ z=;>Wld&Ymt<~D6XJ}qBvhKl279%Vx@-@kQCJk<5*v2X8gYc? zLw>!TLYfAFIehKo+oUrk@-;<|bUVp$F><|LMYhX@XGRURHW&lBxj&ny1MB4G;0SRg zr%IGa;BqthKFyQvXVeT8xN2wtlL!`hb)vv|nQ{o$O%H8*H^FwLCcpY5nRtB1Us4LR z6$spRSkBP~7fbJwJz>KNCs1{~8X8z9-|Ty>?U39k`Gw+>tnMG^oU{y0K&+<3H>m7h zO$^KS(*gc^r0~vFrnrAWuE=$Qx{5i{ z#-^rPr!7zXpr5YCA9Ew06D^lKpIVAO#9P-AJIX9Bk`7%uJx1S*7dCj10}QFXlX)y4 zu#R}_z-y_bO+#&;i#rg2?M3pY{LMbgv>0N4s${63+OgP!hl72dmOnZAaMX%TmC_yA zEBLSfDnP#Bt3kd)%>Wg_(@mK z2QuTK7taI-_v?{^2Cy1p$dwlBvZA|0 z53osEXD|=VSgsvDhZs`WTVCIFuMDlk>5R9YZ+&EX6Z2c3vZ1-Gx-T#H{h!a@E(MOr zxBI!e{x+?AZ13)?Ct^1&Z4BB0ZH$wFiy)b?_?98#$jG>x+Tp#>Q$apE8HYYnyR+4z zKL$4@*Lj&e7TZ_uX}jYj&QfbtaV-T6>U5{4;gT)&>RX zx3cHLmzSBHKeOv9JD7Mw6yyfoP2b@TCSZH@|DCBakL{>+n%aK+y)%1zDf=WFvC4xT z9Y{m0VBL;iC-s}!KIbdI>Lq7ar>ah?1l|#2eR=BiGXQvxgN~;b|D-3^^P#|x@` zot}ABPDx`Y*NgF7K`&X~a%p^QY~LHa@Y0MP3C>?Y8^Gi&)9#pB=6aV8jg0IzrS6dN z_X@>Bv%L-)=cr8c2i^BY$<0(U(ylZU6H)PhJw5nV$tw_ORpR8@?LN+uH?Zmu0x}dm zCgA`#9TY=xkfL+7ukJd`q@>y)`4<~m4#P0%q+mn0Oi?8m6H|eUo?>ApfJr2dCqUczu?3LYsS_(y50=Fdg4?)LOtVX+9qHE zi_L2ylt5(@F4}mHZUMwd} zRIUE`b7WOK@VZ{moGWic+@OkzllR!moiE+av$(%pS_C!1fY0Ek}7}s5HynC|M9>3 z3sjSlN%G`3`quEB-S2+gy`7HzXV08FuoFcQ{}3Z!J5+W-2elr39PO$6ZwPYRz}?(@ z{0_DAG={9Iw+AmABUwq)x89J)QWR5LHjDf6as2^5GxOO~uKt88_8XHpIncV9ecriZ z<^Be%(8MQg*r0B5QK^zMs*(YE+VOu{JNHMX-~a!Q4wTB|nB!}sXIE;#hQE5 zL2m=9f#M@cRI1&s|%zBi{r+6FcOL~4ap3?e)^?_0~*!* z9ut;C+YqYgxGE|a@WJgp4}@4kZXWKcGv|aY`u=g6u1Af9wSMZt{bR=dD=7X-UX78A zI#clG{^~)z5j|vL`1~NP=ao$xze3fU-z~ic; zH$B&VREvJK9nZ&_?%#H&pQ$%quVNHKkdo6G<>I8UcrUgx<0cUp;p`m?xLu7i(%btH`6E|^r=PcHsM|<;nrbnwFVt5Qa z?f?WZv3M`z@|fe0Wc3cdpco!R)|3xzRJ$Sm`1ft*W{Wqn&b{`CN8XY_M;2E?Pdj}; zzG`c7Sm8<@wpn?`4X*Rt@=5qbdF76#BT3`G3nm1pi|@njzSS_9OleHFbxQdAo%2h( zYgsHZMBp0EGr#PT77lNyYA8#1nN9X}YK`2@rTsTeZ)&k;vNZGy`#7bna#t*>o@`;e z&4*vGFaOXYiOB$m;8uCM69kI*{O)Y{6}X+ha2j_-JmVGBeXB1=XJ%YwnW=fyK0q>> zn@>iXTlWBEco7oBu^cozAv`;=03%EhppldPCeK!+2vsjf*TWCp2jy->`#?t-l8wST zTfPe_PIgRTOvDX`c{V!w_0veMWpC)3>|UX1l^s>}bsS|uMxH-fn725VakCS?K%jta zi@?X6WiB3?xL)TmZu>4a7V4JXwhHcDmNyk&wmkjJ8%XdGzh1KF@($F4-qfh; z)Ln~OtJM%){d;7?i%8rh$83*8?N{VJhg+sD*Y1gCHY_t+--PXpV-1uvExk~jY@kH; z3Q*JCXSf{52FK1-II)UV#B8cw3THkmO~u?YeJRkENfUS(qFg>|8dqkJsq|!Ye&!$# zzpz?odwWEr8?LT!BN*xy_jC z&Q_>*gjd@vgO|~7_-c~X529IpR+91%8woRdCQv8zf-}?9+KHt`i;yaalgsF-1jTf| zMc1e0lDHC;&mCGG`ueG9^PFkgjn~G3vJ`^yjJZi#oyY1MdTrC@R3^Hm_>58Nrm@YY zfiBOWH&CIWgJtX|?l+c~;}XzSI{28=#FC7!r%UFJ-AY&qtZuZtQMJt6w(Wi80Eu<~ z5-1EW3u8|tGE~-{2V_60U!%Tfi3rTjX8@_kAtY1WH>(l-AXoDPI4kevYYIOe= zRq4>MI2UwKvm+;0s++4rxUH#+p;+}5IW0iDKQgF*fFHHb@O ze7pI4qNq7Pk`BXtO0M(psIF~OX>vs*iBFi|l+&ix3Ung$+i(BI@GIb5Ln{;rC;cer zyr?r4x>Q8L+q9sS01oqng)95oyhIpe5sZ-c$W!SaqyCg(GG-nvJ$8~Oq6ZU}z}VVK z^(H`L9U+OG!H4n%Z9KyM9vB15hyPOWW_Il7cD)B^6`n7UglOeu}^Q|V~pX(K}( z75^ISyKgrumnEp_Uv9~bb^e(X7M2=>E@D1BDB_8|6C8Z$Q2C+kyFp@CBSphB%ETS) zl8jiXj5<;II>y_u*3nZN^(IlZ360J9njPV>MB6&ol2MYH+1KXQ!i%HFzNmI&&1bP% zvskAw^L!;iNUB?HlGIWbWpmG+9_}O(*{p-$bPZZO)Z(p!t@spGS62xV&n)}8ZATbk zp^kBU0p+6s^2rCOXNq+~a>K`j*1{nB@9CFtRNm{RcoQI`1TpMAC;j@hXKz~1(kG^5 zQzksxreOq!4=|38-cJymD^eP^6;OoGe{ea%Wnq2KMUHt5_^To-WsfzjgntRA%^z{< zx<^MA=pr+&S!3VBKk-Rrtr4mAv)N_XD^SIdW|&XgyP#X+fO8p_b@o&|_ky;|+|G{w zsfcw>p8K1ov?dB4OCoMe`#jn%=G}OC-v)xc6{@2|fWY3#;}#SFck4H1Z!1_5`b5I! z0#&EYwWBMHJ!^R+IsQI5`;}^!`6Cl|dLRfjLkoTgUrm#0VAld3u_p)#Qp3ubmpH2< z@QiCWf;ew#J=~j+?+rSj^z623d`amgT-o6r57@hhI*+r($*XM7ivq@t8)d^6!L}kY| z#jjNbD)?e>o7s3SaIR#=LyJ#=g_AT%+qXoC0ZmPlu*^O?@jNG>L8Vr%X7VKBe45m0 zNVb-H4kT~#x7%Wi$9Y_Hcef4p*4%(h!xgeS6))UbElv-=TRYF{X`7Sp75CL#Dn&gh z4wj`DP)VWHjL@ghw_HY?PdAwR$It8HOS6d@mKM1IDO$4(&3TtqlZk4&9#8eGE$^Uv zUw!qe#vO}HkJw%RBtfudpD@|#>6(VWc8jGMgojzL9F?M4nGeO4T+fiFUbV1)XQ$PN=vM8;xR+Rhg$=R%s{|FyGE+aVy z`{SA)GccOys#X0>m|B(cM~tB{a<|Xm%T7$h1<7D`2X^3N4FAb8v9yogaLH zK$h1rKH;c_r6iq$ZO?!{#INoqfS^mb9MQyjd3jxe#HrQJb~RXKLO$Q1Tt~1gL31k<>=DiGK9NVRbN+y^UpkMX=!;ou9wXl;;KdMf%Be9n8LdB&Yiv)21#d&Mb+46-y{{ukIEF}9S^{ER3^^MRV* zMi>O&r(TkLT9h0*u66+mPlejhz2K08rnI|Ws34FQgQtn@(ykz0=PT zqD)Cm?G7?3DrzYDLpuy^j%>Ir<1*jeT7Nxy(QLv;^v;J13Pw=25d&kH^&{@|EZZJ( zNZ2jtcX~vBFaQh`p3JQ4&s?ecltBx#~GH6+ULxihtSmHFh{1W zlXxY5ALJ?J4u^cjj;Ia<_vZ>DUV@T~bNnx-sUTAT;Z@7aT>sVJ-A;JtU@SD3^RFXO zzLzOQ2@mFxPKFU&Mz(c%s8R*lT;WFJfXu0^-+BOP(+*C9exvsND8pAn2W=E$pWf$$ zU0s-;f8FA!*x-?T0SP1c8Ku?_ciD;aIL+nY=7wY%I&-fgAA8y}Z0iUk<#qr)jKVR)w-)dK5B}0zDT6_|vYf9A=uuw$SUtt+qkf!@`76@2*;>yK zSJl$eN+G|_(q33vdJ4kb&zSAw@GSv|{TDUcArDvByK_yzZmn9iN1x-_rDL{tYzNxt z+ecuS4y_!N(i%6Fwo5&8u(7=%n(Ie>cWO7C8UMMYeeePEV%ENqi0*+gV z{kO^NP)-yQhEUe@#yMq|D*6CzI}lg@rYg@V{8`8-gtDra;24p+>D?J&)I)kwOikXTz4{fH!eA z#jBs*j8t>L<@zn2s)s1x+s+8XU#SuNLTjzm+a5q#&fS<1l%?1@;Oq`81GQlYa4IC3 z+N=-|Xq^0;64No^_cFI1n0wCOo1a%v`EhL`^ySz_wLA!xK@E8~bAisLf2pzyKs8`NE2BB1z$0!xDD1gx8N1WvuL;!gzO=`5F96b?$G(h`uX?hPe^*Jg^%lcdPA?XU3V znI|3%)M9Q|Uc*hvQznW>UXorH+&vS04uf+7VR<@ZY=rIzgCDvcx|i!~A?l+tZP4(L zILwDzFo%SjqQJRgpl3LQa6LiOe~8f!S|9vUW8? z9EtS3x!$a-%6;q@@=!THD?cy~`mK;Ee3&~S>NG|E2yEt)u&05MEZ=qsqa-T?ojjxo zPAEWZM41fzX#}-a*FKEcBZ&5GQQ;$eR1Wy77eHb2uDyf20n92Q?wcbfKvnJKVwr zKZ))!Dk8;Q!;NBIv$yfuXHqYW3`I&rJAnwfUdQceLy`yxKf@l{4$qxOkx??6hpJ4X zCkg@|aiI6?C}>s?7*3r*Z_PfN-|aUWm^8HbiR*<{_b+bq{O|4E{s}MZu>#vi1cK;S`NVUt_8~9E~asLDr=n_h{B&9(iA8Y;Hc_4)!wvD%~(t zIg|d|5IQ(nsGv*m^WglNh@HaRLVT2@?A)hqG}~uRrpk2?%J57Ova>_NP%?q4vHDBd zjE&7r^HQ;rY8Az!0uZor_PB*X%=~UbBwss6Wl*=s$mU12+=p`47(#2xvlBD~r_=d# ziHw@Gr^5EUh`*+(e?Y2=O>ERNNwX8Qk@uhW)rtN^YfZ8Gz&H{^v=wo`y2jkc$c$L2 z{hUXhCAD*i!{IX1L0}TF;M8Cxdfv}{ozvsjTI}-2N<)_pM059NDHl@q%fJ(rBlk9T zeBP@oqvbiIDS@c5IZ}T7nC}$?(XxTE(;Tw2``96)l(v^o3yPwyGkKLy@I9K%W{erp z7zq!1hB_9z@A^I4-0MRYVPpvEt0R+P;!`h9M;sWz1gJ|i~M}vV0ts6 zoe-JRS!5$liL)7~*qqBJEvpzUL)yW1gTZQ!EZnC9f2@IvA=140TqVGx3CyK5@DB~r zM01flea`OT*XI2Pj4f_nsasZ{@e=Cpk|Cf?Yrg1%jin0W`;je(ryoyZ@>XJaPW)n=%^R<4ZS~X|DKvz>!*I8S~UZ3 zv~%Pzwfc@0X8yLNxb#B+uK7?S0QCD_E3idDE>1`EteuRF!)Vjrl}?HMs9btj-DMdZ zn^$Y5RJZhaV?$--65zmZ_cvzij53KO#f}QWpxs6WD$rc*7B=yULk+{3BxTZmeLzwM zj8u-|JeTu2FlUQcZ(t3_0Coh(!p~`*b0tb6$%T@+96X0)JX|k5V`VZoiC%QM3#_6w zea8=}D_$0;kz=cdWU20_os>r=HzqE%|LZFAL>=e+J7-%>wQ>;SE+1n@m89#ocT#Cf zt@9PHlcftX7H(MemNR|tKDnAM)!o?NXcx95A#}wlu_W$2eP<3t+Iqrd@NU}E2LW*% zZR0hPZ*1Wp?qNm1qB)FkNjLwpW`to#L{jfI7`>g&Y##6qQ7COJr8<)XqO@jl&q3U1 z(d;!ZUXoA+g1kMsikIJh{4+%)*%B@}oI?=DZe0I>+5W0#Hf2;ujQ>12xm$vs^8kY0 zh^^?Q@fmPxb3iJB`o-*JGsbA&iv;leUaif^jVbVgP6TI54F1;<+(H=e>grzyqL2w3 zhY$aoEc;gl?(|HDC}S}r=HGqR$$dBMULIp>CsbN%%oP~Q=4@K;G28A- zyW2*b=Y}!9esC?v;?$bEOOIorEr8Dp&GgXprUr`^;?YB!=?!r!;fCChyA)s}z(WO9 zC730O4|>&VsO-@JxA;}3j(!pBZ_L~y)iD6^3e0H$DW3S^-R_xkas0vN9t^%!N?K*7 zSPvcGUU=loy*sWQ45%Gfk&=-Ep z{PF6UxpnEb!|r3p_ouY&K*|jcm_G2Jm=p$_oiob7dXM2N-4_c<=%?&{ft;?EoL{FQ z8#fyirdu+_r3#)3xhwu&T#T&ioBiDO!oHTl{ude+KG`*<7;)>>}$}*2Tb!G(sUv~-l*qf?b-)xG+)ylsX zYKv0GakGT{N3St0^-+|M)ASv|*$LhFpT|+9NpF9u=_q|Ds92ONxKb;>9SLf_bmMLb zQCkya0zUen)%3B82mJCk_o|?8??HkNDT$otw#z+u6c9BkkORoN9P<8=FSghg8I!cv zrOBPM8a-3T&p%aOmv%KtgS0_;6vXkT@Lg#3W%;GuR2U&9-s=nkj&I2{;KsxUk^BO?uN~+QxeXaaMV4C@Vy=l`(2mQFCrvS2CzO}Vw zt5jRZU{Yw2#**z_6V8iV-cK|pD!%zRcCeC|<_h*{QVF`%e9VUcfId@D2r>!A+z^^AhO<3ex_oGx%`obxOf8R@p9 z{sx@>L$U<8HUk}n9FYqhKXEZhd1?^zbmH6YB#@id)9n}`pFxl)P-W7p{!}WMw3Dm%Rhm`t1TkIa@3~41K z&ClJ2hdv@M{$WmmS3+~)sdjRR2t>EOBo1=@HdESM*2+yLiOe6};@>zSO}K2i0F8K3 z>;XAY5+vpDKs}HvOIu7xD65#Zc)CE!%nDLfqGREt$#e9g82Kbb6=K?3V_M{`L-c`+ ztP<}GB`I%uQ)kt6)YE)VM`Cch@wWxTMZc7}_x*xw)yQ8di*mD*&3IsudyzZY&Y@3t z%Nt|{kBN7j>lHFk^OkrK_r(b=*=w2h^%dKT2LSB17JRrCZ+{q7#;pd;& zmRi3moohH-mjRcMkTq8{RovX$69fT^e+-J@@SY>bpu&prqd) zxNm(z0l5K-iNNx`GOs&lRcf6qh{zf4ai~--{?;r(>jT|9w@k(98S$|7y1so`6n| zZFKUc0YAbt9W8$3OPAh_4j(wiC(*u#ZVve=h`15*WkMTS7e@<{psxQZaCIj@4ar{a zpxqAm{WJeQuc4%OSjfi6ZJ7P)(x=~faOGxy>ANX5vKbP0P|W|ktXLM*lnr~-u|1!+ z4AAJLdtS}fP{`BxH-at!b2a~zL^)ENpHfG-zS&TMv_szizWY8H^lUa34|?kpNW?OQ;q2-!FE9*aZu|69AFj?aR#CfMhD|Ca|?@88rd7{!)P`@DZ~; z0#<(hhM~*4Hw_t6Tq@y8xK`O@z3Pr-(bf9zoP*ZsUnw!aRVg#BlOtX{Vz>bYSa6ef&&V rA>!=;OVEDr|33Hs>CgAK`yAuMbq*)$IVbRsF(4)vuOcfD*YE#7vo$ir literal 107160 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

      RCwe^T*ZRBhi`*TZTMHvl9 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 n7eS2aE39Joo{4H>cau=cB9vDj;B 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 diff --git a/docs/images/nf-core-drugresponseeval_logo_light.png b/docs/images/nf-core-drugresponseeval_logo_light.png index d0922b18b33f93121d515ff9de7a2120e17aba2e..46ba87800ad7b18c49466107d8ae4b300bc2826f 100644 GIT binary patch literal 21084 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 F{{XgS7^46H literal 90998 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

    4. LrS%uecN-1AcEb#e}@yup;PDexy{o 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 From 1ed774a95e282fc3bdb51e6f4fe2b5090e92ed56 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 17:13:50 +0100 Subject: [PATCH 107/257] going to document more --- docs/output.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/output.md b/docs/output.md index 66baf6a..f086882 100644 --- a/docs/output.md +++ b/docs/output.md @@ -32,6 +32,16 @@ The response data is loaded into the pipeline. This step is necessary to provide All models are trained and evaluated in a cross-validation setting. The models are trained on the training set and evaluated on the validation set. The performance of the models is evaluated using various metrics such as accuracy, precision, recall, F1-score, and ROC-AUC. +### Determine best hyperparameters + +### Train model on full training set + +### Randomization tests + +### Robustness tests + +### Create plots + ### Pipeline information
      From 29cd07dbe62e50378c61f9442159a907de0ad84e Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 17:16:51 +0100 Subject: [PATCH 108/257] trying to fix the images --- .../nf-core-drugresponseeval_logo_dark.png | Bin 25407 -> 107160 bytes .../nf-core-drugresponseeval_logo_light.png | Bin 21084 -> 90998 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/nf-core-drugresponseeval_logo_dark.png b/docs/images/nf-core-drugresponseeval_logo_dark.png index 7bb7436edb79bfa8e14d2ca5c8e422ed35485d5f..865500befa22a82ec82c02f23078ce737f02d3af 100644 GIT binary patch literal 107160 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

      RCwe^T*ZRBhi`*TZTMHvl9 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 n7eS2aE39Joo{4H>cau=cB9vDj;B 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 literal 25407 zcmc$_=U0MZ zXiWw+cKfh;f<@0J@;Tdr@!c`{o|K+^+%xx`1n)P=u>zPu%uJT`{lA3KpU&Y5DmKer zDLCCAF7b^X!V|_XsE2*7Dh|OaRn`HfrPE)Y#%g5dy-oWeHXCJ_!2`;^C)2GQPIEnJ z;x#QdWo?0BM`P;kZ!dp|%9d9Yez=!)iF&%A3cg?TDfPGBbqnIR^NWr0T#lWz@+r#i zdym;kVc**rZ{Pj+S5-DH&#~rKw{u5Ur!V*;cfqyttTkX#apAPA>~rA4BZe04u?#jb zJu@GDQEIQ^`55gL#(K&0P_v1ZUm#x29nT?*w0l*0P2G4-}f|BZ?>|;r z_Fx4_(&cA~h4KEsd#m-=Op(wePvV{+cktMd8f6Ig7l&(5X~uUTWXQeyO(chzy1&Ev zQu`?qj{GbWr!n+q9=wu^AlD%dRb`>%_Uu32 zq;D(=6BOjteTD68zG>r^5ZI#@`7;C8HHpI!TcKJ7Z!?vO^l_r5aT^A0uf-lF=@xl> za$0S45#vZQmoG4I(%f@G_DyQ5;AbDsw2c;WAY?H?YOWvp9%I-BVr|@`gmUo z?O#FJjKb`uBV8L5)F#uac=3@); z&_peh8uBC^GF0{nwtzi%CjVROYtQDSw-LDKy6ddUXjqU_tuxtXRS;03-pw;lG zo;OL|=ZYkG2eVE4&w@vyOICZmQX@-F66*b=;1yiLB0C-F}^BVqWUnZKc%R`S8uX;@<6&k z6KU2(Ior=L;|i27=_{L#NsTX?wa+9J@>kR?n1>?D25_l5GKefJBz`rE@>}+R3&aKn z{AA$g(LIfcF*8hX;`EzuG#W>>(zenRAM#IX-#*=?4Y2(_S1G_Co@W;PlQ0)Cv*5X0 zAKmk!`O+SvbTQ!29X`9OFQ$YpZ>HKCDuK!wx@&6-w_VwzAT;wKQyYhp0e>B z=CT<+c>t!3I=T)lN4m06Af=%Knpn!KmVXof%$|RU%X??qSLV_7uyH{B(x&{iUoX}S zO*WYC;;b(9IzygtDqBkjcARc+(B^op_5C|B`#)CAYXaK#M%#54Lt!Qln_t2j6zkK3 zL@Qn5t=oB_T3l7Ru1oGKcG>6anx~4$@K~Thr=ZN3GPC@4(gmlcVj*YXt#XFI8(p^5 zYd-A*X4`uw+yc@;XQvY)(Z>uXu+(J8i)Wwm#oipH{2M0lR!C3uq2cs{f9E{2a%xC8 zN_YF>egU%fRVz8HX_#%jwAEVtmE`j}77YE{b#KKWRlL>K_joU-N_}H3^6!7cJNzv5 z8Yim(w>W7VI$GLEl#r(5UC^)$I58l^s1{kBlOn`qtLwgz$lBZTeC;oO>@<$n&7VqO z?}XYs*Y`I}14TabZ4+fzD{`uyo`my+1TUnCX`%Viiv)M4H3v?)pX{Z3H@iI^rwA8O z&_0 z0CbbnxvAHboP@%25&kLGuS(B<=`iM`C zltU-2nX6!SV@f`|C4P`wNoEa+{cHp)yS(u7Zn;;()hq1cdbN<+-x`lKbO(ZmTdEh5 zS?TAlkq0nru%(XFqEhc1yOfa%oOm-$Y`L?wDXFasbkSn+*TpV5vGRNH%ZfZi<%t!k z^Z$+a7Z$mijbj=(|8$L3)z8_z4M94?oOmWI^I{#5_Y<{?KReW!8- zUpw#p>v9?2HeK!K=>Z7U!GfOhMVUZ#^Y6KjRTVT_9Xa9q2^+mu1YIXt==>!pc6wBS zG7=(LFd@GgnG)FaD|JR|aprMvSbhb&Hu`HPWt?5Xcbb1`fn&nmyhix1hgL?k;PF*A zx}fv@;rO(2M)Ba!N^f4jd7AXq>4D^%K%pM7V2qJcQBmS4L_iXUk6zp)j!zWQGI?%GW zMPT6J@OHYx3w^`ik9x}&ioc7@b-gnQWNp49XqBqVFY7UzaabopzK1m}IP>Ip zb5YLKp{N6G(g-_ru?9ij6$9c9y_BiHTic)o=CtbkM1L(2_kMwH|BTD7SchE-_FW#Br_Y$4XuccaEvKL{F z55DfO)Snhs=VCNB9;*H-8PBI#O3b z`FbwV`ok3C)(NI7G`g#mdDj}!q5{B7o_B@thF~&pZq3eR^Y^vGMgutQZ)TIMcetS5 z(iyqS?QdV$1Z=*gbak0vZPp^;fAWOzP)%n$Pkd`{Z#Rnj=s1pTY&=mwtls!<(w45& zzOvbN?bktU;vF>8dsu9`L%FXkvPkoX%#ar3w~wQUV@wg_xM@F(#K`>z4gGg*}_V&h2n)(8r5Yowh7YWH+IjcEM27 z`ceJapPe^0Cc+033Ff&i*QlRz*F!^Tf&^m%P-QonL0sw2{^))0^}kyRD{0EReY{F~ z+7NT;0mu>WfEbRo4}tpqxGQS&`z+Lj76?I8or_c1fqr+gB)Ju@iw_(a!`stT+Fqh( zFprHI4+&L*EJ`%Xq?sop2Ikzszmjfz2tqEq5t=_zZ9Nj?0xfG`hq2nS!EcyhakOB>$HEjWy)K^kU%J1=|Ea^X$=Dn?Vg zC)BTkh!y+t;5i3FmGb^nYT1aD$isV7rBn&4e|k6@GuaM=1@7@2n+y2a*>!LzT}n+c zk@wn6zn&XOHJ^MX7jWXjP}7M}!{!+`p}KlCyNyyB2hUs_uFwaN&+5)~C2G{TzG0px z>#b*9QZDn}kJb%i5j?;xG%Ckb%_fB>@yggp7*Pt^8zH4~@Ql>Z;&Coz7}1ctH|{`h zHm2{Fd8L`ozH9Ideyj;SJ3!x)~S-78_Bi#m;b|hmFE6-e$5)o+1HmRFgr3a_oCm`;g z6&x{-ufQiZ-bF0!4Si)5jT~cy5ke$rWiuVleGitlEgZ`K&!UY*ORpx5R}YQ$@;V%& z>?yiw{T3BRs!pnp{Q57g>%>lvO#pPy>DF&=|4!Mg9iwzBO-ObwFE@4|RgJd0hDedd zQ(iV(egOXXbNwdz-w})G2$`7_$egiw5C5>uBLZo&6Gt|=NUH3dup+LJgYRy^Pb*C8 z`OY5o<)Bu_@JdL%SP|6`a1bZMU3WQdGFA}rNC_DHu%4LR_(G1SR?>+)N!Mk!4&NFk67A@b<83xzI7-n6Dx zd}=WCf>LB`mg}^nzslJ3KlK(Y68pQnNd~{0o-J7iz0ODvPkbT%gW5j( z(dh>U08~&kSI2YD3U}r2Xw#MY%pSZ(_XI;dv6{QwSB}>asBz6NlXV%qWNRx?ls*2T z79=g#R+oqfpvw#&vQjf}4+}^NjhEp@r>@XLhZBf;tdFrfvd~c@OyY>Dv8}-n0xspN zNGaD@nj&U_pXit!di4=JehDF}?2?YMIo2!gcmK?_Zu&@Zs&+rH#>cKUH$q21Bg3-w zh0?;$TK!Hzr*IL9&hw<7l5NcabL-J76_i^MVr&trV%THO-jF9^(7|bkgxlNQ&f&th zHRm%w#?}>29eQ=fXIH_psQ-&D*W$c~?D!p8TUYEAO7NyW_%GX^XrQ*)x&9=1(T`$U z!S7LpI2k}7zbdmg({}e>n+oR?i(4(rVBvlnF`?IK9dLU0g8f3f_!d4}*`>2Q)mDCT zEb~K6z{aFUc440In8lL2@@y!$n@42O*Ww@sK0?B^=m1h^$RC)nnPyc*kdIGsYWV^c z>D`l-uc4tr=)otVb}Qa32=@_H-e-`-7qI%W2hO;H)`^TO1;#E(Gtnqn?1VxlzAvOBM>?}S}eh$VIuyGu`m zaXzJ?!ItSi-?|AD-*cUKaAgHAlnQ4HCiQaFdB{I`19uU@=GnqZd3eDhGQ(UoF%l+V zP_28)AvLliGUleIv9;CnBge?h);75neQbl9DbvS|f#)OlRFH(mflLCvcD<~g@;M3L z)*g6(Q}0oTf>6v(KvzBn_FDd@Ca$u1at272g(h|BdpnG5I27CsKUy@h8A#j=7vM=XU;E9yWpTG>6R1yg_!Z0u_i-^&F}k+2NDG znc6g(E^neF<$@2g;wnD^y+T3Gkva92k-M{6q8e(-hsJ;x%EFbQjNWc4@3UYzI}zzM zq8b*UzXW#+A`y9;I5WMKWEf?)8>oDw(JQ~6FZq)gp_-yI9|_@Cy53G+ZArj;4Xfs8 zAdoC9Tj#5Y(!H*S0~xL+Z;nlyAKfmdGT4ojd7$S%w7Dx|qi0(6^LnmIwm!q0m2mHG z)@t>LlAjc0Ye+orGp;FnnZO`9P0j5o*gNyC=2GHy+D)1sPbwd(E-68QR!dQBDDZ6g z!*(dB$t`8TQk`)1#2IY=&^5dGPG8~MkeGC;hI0;SFWDL@ZYsLt2SYl!;0%ip6d?&A zR7rC%NvBMjc|dh>?Q#?KGwx(@qA~z;Fax)}f-G798&cTG(wIw@{VCCina@`kE`*Th zZNq(ev93{%@OS~hh@m^DH*O?4Ra9QZ=Sz1~ceTs%AY_Q|?ym}3=EzLBm35}fk5SLu zu(YDuG4yC4=q`*-GYo3~oPW|*7{@7hyCq5e>`d;)rxVMZl0-NkRRqrO{0?8*H6)wl zfbC{1AqDY`92=8AcSoUrHX$aW;8C3)x`}oJp z7ld{jk>Dbw%a`66=`H;yykV*Dl-cQ(kQFiZOP7NTLgWQ)yLlpgR!uL(#aF{T+;=dm~nrp7?JoM9}dGLnQBszUmYN*9_h)t_TPX zT^KfxIIN{GQv5^4D-ybG((>$aC|xY1t-8j~PKKB}J~Pu^WD$bQ1oO@wr}^YxkB4LX1zA-b#Erc`|&PEtW6T}5=O?V4kgMHDiH=_z@(?65_A zs0apsGZ>D=yZ0g^Kt&`MOl}C>aPT#&VP9V$xfNK0fb<)o=MrjmzB_c#ZUcyXtACAo zuDJ=-GvWGnop<%FxgRIa-xLoTekHZ{fzI1{X{(xbc2&i6S?_>k4L~B1EboR{Qj;~y zcpgwc5%>htf0KPsck;F$ekxd6@2XhC0A<#G$oiwxcx~A0r8)!iK4lX}*VvsqcNmgk z9bo_U%!(PL7u0neS#E$34O+Qr0`IJgkrKd;4ra@Q(pM6;C5(!82Bc}I#a`4CZGdBj zIqBie`@^WW*y>67X6Rs09`7WqnZs~+CM*iKyaNBj8piro9vQA87ZD&odyr`ngd(7e zj;B6==6DMh4O`!{twNwUm3o}X#UYW#-HL0hd2j8+o6Hr6F_h`zXLnaum-XeR(y){?V<^Zg{Ox3Mv2ciNJ~^2q5NbzYhL>)OV$N?KwU!cmrMg|!G*pK2r z{#siEj?!j{rGywWId2b**T)JwtS{;+ajgw0fyE*sxJDEA0DZ5mxB&*2ve8QDU!mxd zi&JQjD>gKTIOwWF+3Pc-&2CDT^O$VfKJTBqSz5IS(S!q*k@ZvpEWAngEw$XJlZ3r_ z7amZ<{q+N%&)R!sx{eJiXm>H`ux2-b@vddlVCcfLP_Bn()d#x=jTFZc@zrug!&Hs| zl-~NSM}hRozEZrAUHeyUc%KCl>*mMsZSU+GD7xqqGhT%lQsE14=mY$ zxYTw=ixXL9Clq>{UrqISiSkBCg@U8p_aY4-REhHqQ%>X#w!CBA{hEguWpBG?l}pKqEJmo9cUH#c=Sr&}iO(|n(vPoCE>%Ag!0 zw+#GiEQBAvl`vs6v}rDXZ#_g4{fdPe{_FWgKTK=Yx*2{|y8wcqP7+OIo3Ch&m!Vy+ zDOGy!Pyhx6cuFKY1-o$jQVO7tEpvGIdr}JftV_3w>bmKmSq&DCvNWiZ`nr5oJu<1Nr zJ_nQ175ARP^x8##xmhKLlp5<@m;{rgw5ti>dR?3tB2l2gz$04mJxZRu^^bCG`EB$$ zD~GP$D$Myc`}QXm&K76g&VuN++NG^bQBxI}b%H+4_>3rGY+s~Af1&zxK<;Z>u^M-C z2w~DMykA$Jc^{GVSs+~$06Xs-8-`^pO&rRj2|3y$OcW6IS7jBJE*!X+ITYuomnhX$6LVm#RG&S z5;6@8v1X0-lo_9tz6_Xo6)+?4>6XbdjO&Y3AbVQ3Oe zA%UD9n+T;FyPDf0$?|e|ZjSpnB-HZq`utF(G_&zb-VM_@!^kzR&!_hlRGF3EC+iiJ zh&D^iMfq*&YVC9-Rb9uVdJ|@_spmFdsI&Pg9LHhw@~S*t_KEMBS;b7r;C(ojp2$YQ zT8Rp2FSFn08F)|myXl4*7V)9IUE_U1)M5M*aF`%?ky?bNY_{{WKdmx2R2)6&xlKVJh$mmL3ez}1e# zDYo2A3)v;SvG#ptUH^Od8__Y0+y%5GTbLm-ldbU{j7m3z8EqHP@|2gp*GVjk!$F2J zj=HNQ6UcQJi&zeORrC`gI93U0)jws@)_uqsfOskR`AaH9*+A5E5@sPl5fh<1^4>#6 zl3{k6nA^M+kngov@`IL!>f7xQ(wPhJreREykIV%zzl|0;)J0|dwv{eSYIFzeF9Rdx zg34<28>_P?b< z2Wn5U>&o9=H=-rw*XNFpq=i3Lcj9^X=R-L1d17)`TS?B-N*pcvlNMiNy`rcU7&0`> zZ*iup797Zd9iGZjSc`UTOJ8Y^LWD4(>JAOEolGmf&6Yfob#c-aU}53Cx+`i5iO z`T+hd;lLRju}?^UD-z75uKRthR$Q!M>5Dk^-v@{?%-iDxUdZpk!flp0hjg?LElyd0 z{n?8vt3L_N{jucCWx2&*7&LB!h^e+wN%zchC?MiocIg8!nm6SlS@qA8P0E65t|&9CBhFiaXh9gHB9Z1^d-(3c1hq*d0y18p!u-x`7lQi<*%WQohH66 z#=F4$nd)e4Y+cM(wKr!#m&3PTdjxIK_PoGNnt)9|XUD3|ko6Bs_1+FN0A8JepfMGC z{?24InlDTt9;Qo8TBj^G)9|->C7K1PmpsE;oY=w3bJ|eit%oFccCJ6;}a#OKUZ5R1?kyI-70%hi;@$l zE^{iS2Ey)$1y@Z47Yk+MQ0RAUb-P8Wy8?9ez5_LpT^Frq2PqvIV1TCpN67F49S4-p zk3y+U#CG2x`LEqRIJLxJhGhrbdzI`H>}xiA|eJ24PXzf|R~M z==m-Q-}LW!=>54*N_;BP%1pB5N!U;*#izBMt5(9iV2XS5Ekm;HOkjNL_RH$S;Re!V zQQVCxjNy=Ay>qzEyXCK{Y>;vQ~LWu}W=s5~mXm(0z^ z;{7bqGGg57#0vUKL<`rlMKEKc1m_o}3h?GXJLGJCT|j!IOx0!s$GLIo@Jjz}C9{A& znU~lX@m0fkJ3{N}X!PCT>f>>j1W}PA?F9-d$hpkJhViQF(o|FuiXLxfX8>nny#vl8iL&X?BX?UB-Q+F;Ie4YvNJ9Rlph zv|!csA~NwC-w=*C^}$ifwA|IZQOZA4KYy(_7q=#5WcOWIg6XNBq)dc=rvKmVl(Px9 zi}308rMcIy0>v$=Zq++Q+aMGhV4q@3s@$2&Bqxh_5M3+5W99(>`bLD$jur!%Y=kH8 zXhV>7+osnz;kq?*;XOBRk;85JCy5>j2ycJJQPI2xU8(KIZu7jqBCg$e!M+_cSdp5X1<^eufdA~CWJ6WKN^9o zVxG+WvKL_4z>9 zD~h2J5_iSla1yH)EDJ0`cN(&Bytll6=RD(j*m9a&sM|P#w>6p{)Wz`{+A~sRvGXfU z&BkZ)&dpPJJ}g#;CRUK5h~4zwH?q6!L#|dxT;b(t+h~}Yt+|lP3+9fw#hYfRR`5F! zkPFPei&x{d9Ke5}^^$@hI%(|X<^D>(gi!GFKRY~(?GoxMIw8uqs3sJ-9Wx=rjknH2 z5q~~*fo22y6|(?M;}mB&GIz5gSgffEMZ4y2?AJG|X56i(-(}rEXgO3e_-1~1#P}EB zUj!T|6^*OVtG;ipEzt$-kXLhkB$)aYl!uy!bNv4VQhsYtdQ&F4rBaKwElfTk$lOkMYD;_aC?eJVBjVRA*p4^MOQO z*ytd>dVjVv3e24ZC*A*6sByPCWYL&{hl=##NAoL;Xx<%n%hvyTSu|OHZk6>6BXcF7 z1rc()L$fD`EL&Qodyn6pg#e1-*T&kmzt_8s+$-E8m$0dZ0UXUC0!7anmsJse=B8Ne zlX<>({TBhYwmZ_=7Z?!Cs|4<|P|Q`&hK!xf zJ}Fn&``pfs;Hv6QHyLwDVuCQzMki5;#X%Nis955!irY!F@_cfrDa{6WfM?vISt}+2 zddZzY&~;8fSNm`VN*!j0l>#zp(yA477)W=Vmbl}RJj!=>fDok`5$5f^wIgp}MD=&y zepX-9rg%eURWi;;b8CTF+HOhvuVL2v3t`Lim}zs0py`QYD}Oi~VjN*)Wc20r9INs5 zE|<&~;frBAW)!wx@S$+*6k@);&Y9|5iSAT{%DT$LSB`m1L!%GhueN)jT8q8|(4H>~ zbG!676zG&B_#8jv`E|pd(@&TMGv9;w*?K-^?C`H!p!4Nw#r*pSTmH0aUbkA=dbXf@ z)t2V+gI`X&&KN}N4nObpx@C|XcWDK|2gkTh>(>+G3Mna|y)1Vl0bhr%yrhRnicz_z1yb9Yw3Rq4IpevihQqS*P?J{1t7mzvH zSFYp91jjD4hrK}bAz3+Gz6==6#S2d}YT1BuG^CBMBvWwpWNAL#a;!ck+)3euk!!2R z|MXn7)QD1(-29?81Mn(G_%jnY^~%go_mVa#gS^?{1W$S`2Fcq?zM_8|cSkU+uXqx9 z4tn!;er(S*yDn14z5p(phHSe|@nz-g`hr=GRcX|MRf_vQ|^lhNoEQ zbg@dOy1LRY?3mMfpV&LdT7;YicJ%jN+(wHF)ElQpS(#v#falca*{9lUi=A{&z;1MZfy>$4LV}5Gn)9;RxBdHk=8m?vLRV~j zdK2I+jZr?l%o|`W`!$fg0QgYmQ~a}@>cCvZiw4dFbr+UP9ptl-uK7>+^>w*#-=&nA z(uhk7+9nCPoR6jkLbRlLTErfn|8=Zx-fE2ZoLfkKfYgf*gDzd757HL+)5#q&F+S;U z%SqM+`Tws(ZGGZwoMad;G3dxP1#xvH(1&jwH0E@UH6N3A@c*~`@aH$=&-am;(YON* zME}Meu(eb?;$@snV6ofr$JlhK|CKZr^)46L>!CKzEY~!$uysV+H2yv@A$ZmQN*;e2 zr8}Pp>h18NJZA2)0avuQ+_KKmF@hTJ+Or;mCW|NlBJq&B1V@8@OtC~>2YHUNAjpsd zaIVC?w$_6OwnBmb(YyVdya<|-L#h@Goo`ptOUBTpm4OQUlm9yGbPjk7K) zlll8pf$~__GYo@*o^;(hiA2&*E;0uji>AS42V@OLMgg*#L=%=qmo9RHiz^$OngzxD zrs2t$z(9y^;8+EK2r(|Kq2EYXxY2b$oNR`T(rQxH;M>el?Oa_yVe+G~wUdc@`5Zg_ ztV0-;amQtrvboQSF!`C#x$;za+aW(zTntMDf>=IwEYKzE0~sE1nfkCPh_O@|sgF`v z&aac$A~=p|7;}(iLEi-0ftEV)5kPuTEvrVAQ*hh~hm{1TKtB`*YBK?Z2$r_SR%D;Q zY;G)zE>(x}2hp-M=P;a&*&l>X^%cg{i0UPOiFN%9>ysOESoQ=)>crRh3M6@lE!Ti| zm+U3b#WAksaW%3F^lWlQeuQ>N*Fd%(t$EgkU!Gcz-&>uYObdqc8*?v)x4#@Rd~2hp++*AX9Mous}tL{|Hh7ZedHMTjTST3n;`&uQha#c3&;BI#$A_Fos=Q2J^*jGL3+rY zScVk-%mIA+N17NOEWQG_hJm~eB3-PvcgpJ}TTMz-lUX$bu+JrQVYZ)<%W|`Jj0wCM z8h?0`I0@wqnYIkI0x!HFJ5*;b84pYnG*oJQm-;)d%OSaRVJ|R{1A&4Y*?#S_p(2M-03Ir}2>P`+23r$7Zb&S-|gL@yGo&u>)v z5F{LyJ1LtS$R>}-Rq;bcyjWWGBit}S>Eqj?{HltH>9yjV$%v{)%UIZxH;3n5ddbsw zU^o6mWd>Iro@4Q+2-F4$Xb>uxl{a`%tTo$MA>TXAhxr?yx z$85hr|&77Y=}{9*BJNtB#D9TI#6 z#*O;O%{t=doVdX)Gn0B^gqSSzHz6~lM&iwTFj|TqBbKd{=0a+!2bWle z=vSuCpqRHAN0agfq?;RZcR9N78oe1z4^iB|9D+zHq&>xBm6hj0Kg9>wTr3(URlf9Q zwA@A_9r4)0L=T;n>8TvQ&JV;}3T@L63bmEh{%hJl5((_PL0H6upVKUHa^(f&N9Z7- zxux^;XmYZO4746PNa)1%Tx_4GPw-GR-%8 zGAOfaSeR7U+n*+Ol5xb2+BmGhy^ed#sSupi&P{6fA>>%rr8 z|DVS)eC(V_ntRl)`hj>ro=~2%#R#2_F|o>~HC|?!+~0|~npAE)_o&haRe9!+?o1nJ zDp+Nxep$Y^jeKaEWtQjO6IB=sb4Xu9FQiZ#6KllEw{m7jWE?0-oE#*NUuJH`7bnxJ z68Oq*GtAnwLg(|p(tvbUT!|ZazB0Go$}zi{?N?rbv-=IR0XS#JuM?U>*KqkE8!kcZ zDl7fO$vhL$wBl7Pxevvvd*DJ2s4mD$LM6^y{vRo@>HI5is z5q>k!Dx~Kd0Cq@1z~$uH4jGp`qY?DvX4%&Z&^{ZKYJo2sOKxm9Pd8Y zi70KmC$cXfvXtBP`#4qAmob=hA*GjWgloknIZuGJW9|aB1iaC>rPss7$16Ewg~ar> zLnceq+{DHU{h!B7i*A$W{;)8lDy@;EyoB8RK+KiGC~Lt>BR`Oj zKp039yf8R>@>)P|r?}vd({c7a?%XW$A?Ad2D6EjBHY%<)DYV%-`~ze$5YZo1i7VU$ zlV3P~b9}9D#T|TsJt;)2R%*w1xYy#!t;fD{`q+R_{icO;!V7G{4Qb?trI2go1wST; zkJ$~ikwHtd!c~ETXg@9|kCN`Z!q)8dPsiDtA(!LV=vFys440^A&y(pNt=Dl`9#sj< zCm!#@k)Ql?Iy|TuWsgPoQ#Vwwki>^sgi!n zxyTx5A-nWQXoSc$>oezNPe;5F*>#QKVK5P#5_4ac^+rcs$mmWIVlyAtQ9$;E3bHS% z_z=RZ;76v=PuU+D$exjaKaGZC5lseUOKQQ)bwvWJam7RTL(LKW#SGAJ=gP1J*PRc< z4o&cOsL0ZSquU)Q#*(`+9nh!3@#c_5m0(|#F+fiRwsAQY(xZIS)-p|5Gq6C*Ld z=O>FwW{u#nkRCf6F~Ti%@cZ}g_mH=2;iYOrxv2fL@riux7*wsen$PHUL!VyLZrNV0 zBHVc_!u{=sfM+={@U{YWbPe_LlWSU;M6~#TVG82>A-vf}=;{OqK_!Tk#NYQN+t15A zE&O=zkJqSWL`c&knb}`r=5r?S9Fvqr%3xyZTgrOk?T2J?I&g@r60^IP{A+{IY|QlE z$3C^m^m0bLcp7330l%Ss(<5I{|CVk?ZENev7i)!N30S(b*A?xjIWftGjjt?Mq_FDb zsC%bs@~ynHz5TlvnRdL`d#c#`3cPPBb>P7ZBCM10ch% zzJ8={2KK2Ss!D8~*?#Y-N&q?i9Af$fH)~AYIrVKmJx#bKP0g-EEtUte<;P|#q@|W; zO9DS-gC2W6M7{1;yRDE*Dm5FQJ*mrVuD-h?3Ea4T>1DF>#7R9-=$b_-lvh_o>9Kiz zk0nFpeo~#w;JL1rg>5-5JaEXA5Bll3UESqYa2k9`T4YIv)%Y;Dz3mgbUqI3xzO5Lt zh|&fRB~VOz=KS()pJv~U<$dIkP4h0~7yZcrqMzxS9;rRzPBOpCz5lEz%KGC{cfJzX5e>bD9$NZ+=f zz9R03e}N;0Ub|7BhWKtde#UtF!x)r)|2d-nz3-UQnu&}2ko4{oz(;yI zH;89=i*;P~UdPSG)JIN3eqvMuRM zXg5MB&CSV*9vasyA>(&VF2WQ(F;WpxnwB>;Sm965_|wi^(%y&+E61_vC9BV|?;i8Y zTA*%MrcM@)HOW`pqRH_yQe8PlMR*-lW&7QSf0OGyHLpAMo5GRUk}@;rdM;GDXIW4i z;jleCa!#*9_lb!eD16hWAfyfx7-0m&l@`&Z2Yx*_0ab)QUs0mrI z6G|F@ViW+H`};n>?t3V)XeN7Y??H_7QfsddJczr0UFY|Sz$uMqeO2I`6W zpuge+WPEp-S-VXK)oxd)t_}WfdAOv=L2@@q@Y|Hej>={EC%{b9)VKVQ=ge|am!TE3 znuz|)-i%^8sO_bB_R9VBECU_pn3C^qcPbU)WE3$qn3$VP(26@_5r}K(8^HQ|oS{`% zT`*ZCl^(|4wZ?%Rs9gtmRU5`&?;3{fmX zmTS@9a^=izf2ahCptkMf4XL-)i;^f7EP!j*vU#CN$^KK?$h{f?MhvzsuS&Q66Iw zgO!Zb+%$6B)i}>4J}3r_Yrx~@#FFQ}hNAjYWO`+Gf8tM-(Z%<1J{!CR9-#FKT<+!i zTk7{itF>bsLDmyh_a0>W7}sDRUc;7y;BOW9x%7Os_N>BQr&6x=3L&%g0GKU(I&D3jr`IdG>Wd>Z#$tE7rhhC_`9 z80Fmx%fbcdAZI^GnUc#I97mI%<9DG-T=k#L&6~lC&I0HN+1({_S?gB$+Vi~=NI5cd z5L%GN_)@KQY}GV;b+6nltD}*yBmituZH?sT=TmFPq+}k+i!7;=!jjya2e1!$$$aJ^ z=;>Wld&Ymt<~D6XJ}qBvhKl279%Vx@-@kQCJk<5*v2X8gYc? zLw>!TLYfAFIehKo+oUrk@-;<|bUVp$F><|LMYhX@XGRURHW&lBxj&ny1MB4G;0SRg zr%IGa;BqthKFyQvXVeT8xN2wtlL!`hb)vv|nQ{o$O%H8*H^FwLCcpY5nRtB1Us4LR z6$spRSkBP~7fbJwJz>KNCs1{~8X8z9-|Ty>?U39k`Gw+>tnMG^oU{y0K&+<3H>m7h zO$^KS(*gc^r0~vFrnrAWuE=$Qx{5i{ z#-^rPr!7zXpr5YCA9Ew06D^lKpIVAO#9P-AJIX9Bk`7%uJx1S*7dCj10}QFXlX)y4 zu#R}_z-y_bO+#&;i#rg2?M3pY{LMbgv>0N4s${63+OgP!hl72dmOnZAaMX%TmC_yA zEBLSfDnP#Bt3kd)%>Wg_(@mK z2QuTK7taI-_v?{^2Cy1p$dwlBvZA|0 z53osEXD|=VSgsvDhZs`WTVCIFuMDlk>5R9YZ+&EX6Z2c3vZ1-Gx-T#H{h!a@E(MOr zxBI!e{x+?AZ13)?Ct^1&Z4BB0ZH$wFiy)b?_?98#$jG>x+Tp#>Q$apE8HYYnyR+4z zKL$4@*Lj&e7TZ_uX}jYj&QfbtaV-T6>U5{4;gT)&>RX zx3cHLmzSBHKeOv9JD7Mw6yyfoP2b@TCSZH@|DCBakL{>+n%aK+y)%1zDf=WFvC4xT z9Y{m0VBL;iC-s}!KIbdI>Lq7ar>ah?1l|#2eR=BiGXQvxgN~;b|D-3^^P#|x@` zot}ABPDx`Y*NgF7K`&X~a%p^QY~LHa@Y0MP3C>?Y8^Gi&)9#pB=6aV8jg0IzrS6dN z_X@>Bv%L-)=cr8c2i^BY$<0(U(ylZU6H)PhJw5nV$tw_ORpR8@?LN+uH?Zmu0x}dm zCgA`#9TY=xkfL+7ukJd`q@>y)`4<~m4#P0%q+mn0Oi?8m6H|eUo?>ApfJr2dCqUczu?3LYsS_(y50=Fdg4?)LOtVX+9qHE zi_L2ylt5(@F4}mHZUMwd} zRIUE`b7WOK@VZ{moGWic+@OkzllR!moiE+av$(%pS_C!1fY0Ek}7}s5HynC|M9>3 z3sjSlN%G`3`quEB-S2+gy`7HzXV08FuoFcQ{}3Z!J5+W-2elr39PO$6ZwPYRz}?(@ z{0_DAG={9Iw+AmABUwq)x89J)QWR5LHjDf6as2^5GxOO~uKt88_8XHpIncV9ecriZ z<^Be%(8MQg*r0B5QK^zMs*(YE+VOu{JNHMX-~a!Q4wTB|nB!}sXIE;#hQE5 zL2m=9f#M@cRI1&s|%zBi{r+6FcOL~4ap3?e)^?_0~*!* z9ut;C+YqYgxGE|a@WJgp4}@4kZXWKcGv|aY`u=g6u1Af9wSMZt{bR=dD=7X-UX78A zI#clG{^~)z5j|vL`1~NP=ao$xze3fU-z~ic; zH$B&VREvJK9nZ&_?%#H&pQ$%quVNHKkdo6G<>I8UcrUgx<0cUp;p`m?xLu7i(%btH`6E|^r=PcHsM|<;nrbnwFVt5Qa z?f?WZv3M`z@|fe0Wc3cdpco!R)|3xzRJ$Sm`1ft*W{Wqn&b{`CN8XY_M;2E?Pdj}; zzG`c7Sm8<@wpn?`4X*Rt@=5qbdF76#BT3`G3nm1pi|@njzSS_9OleHFbxQdAo%2h( zYgsHZMBp0EGr#PT77lNyYA8#1nN9X}YK`2@rTsTeZ)&k;vNZGy`#7bna#t*>o@`;e z&4*vGFaOXYiOB$m;8uCM69kI*{O)Y{6}X+ha2j_-JmVGBeXB1=XJ%YwnW=fyK0q>> zn@>iXTlWBEco7oBu^cozAv`;=03%EhppldPCeK!+2vsjf*TWCp2jy->`#?t-l8wST zTfPe_PIgRTOvDX`c{V!w_0veMWpC)3>|UX1l^s>}bsS|uMxH-fn725VakCS?K%jta zi@?X6WiB3?xL)TmZu>4a7V4JXwhHcDmNyk&wmkjJ8%XdGzh1KF@($F4-qfh; z)Ln~OtJM%){d;7?i%8rh$83*8?N{VJhg+sD*Y1gCHY_t+--PXpV-1uvExk~jY@kH; z3Q*JCXSf{52FK1-II)UV#B8cw3THkmO~u?YeJRkENfUS(qFg>|8dqkJsq|!Ye&!$# zzpz?odwWEr8?LT!BN*xy_jC z&Q_>*gjd@vgO|~7_-c~X529IpR+91%8woRdCQv8zf-}?9+KHt`i;yaalgsF-1jTf| zMc1e0lDHC;&mCGG`ueG9^PFkgjn~G3vJ`^yjJZi#oyY1MdTrC@R3^Hm_>58Nrm@YY zfiBOWH&CIWgJtX|?l+c~;}XzSI{28=#FC7!r%UFJ-AY&qtZuZtQMJt6w(Wi80Eu<~ z5-1EW3u8|tGE~-{2V_60U!%Tfi3rTjX8@_kAtY1WH>(l-AXoDPI4kevYYIOe= zRq4>MI2UwKvm+;0s++4rxUH#+p;+}5IW0iDKQgF*fFHHb@O ze7pI4qNq7Pk`BXtO0M(psIF~OX>vs*iBFi|l+&ix3Ung$+i(BI@GIb5Ln{;rC;cer zyr?r4x>Q8L+q9sS01oqng)95oyhIpe5sZ-c$W!SaqyCg(GG-nvJ$8~Oq6ZU}z}VVK z^(H`L9U+OG!H4n%Z9KyM9vB15hyPOWW_Il7cD)B^6`n7UglOeu}^Q|V~pX(K}( z75^ISyKgrumnEp_Uv9~bb^e(X7M2=>E@D1BDB_8|6C8Z$Q2C+kyFp@CBSphB%ETS) zl8jiXj5<;II>y_u*3nZN^(IlZ360J9njPV>MB6&ol2MYH+1KXQ!i%HFzNmI&&1bP% zvskAw^L!;iNUB?HlGIWbWpmG+9_}O(*{p-$bPZZO)Z(p!t@spGS62xV&n)}8ZATbk zp^kBU0p+6s^2rCOXNq+~a>K`j*1{nB@9CFtRNm{RcoQI`1TpMAC;j@hXKz~1(kG^5 zQzksxreOq!4=|38-cJymD^eP^6;OoGe{ea%Wnq2KMUHt5_^To-WsfzjgntRA%^z{< zx<^MA=pr+&S!3VBKk-Rrtr4mAv)N_XD^SIdW|&XgyP#X+fO8p_b@o&|_ky;|+|G{w zsfcw>p8K1ov?dB4OCoMe`#jn%=G}OC-v)xc6{@2|fWY3#;}#SFck4H1Z!1_5`b5I! z0#&EYwWBMHJ!^R+IsQI5`;}^!`6Cl|dLRfjLkoTgUrm#0VAld3u_p)#Qp3ubmpH2< z@QiCWf;ew#J=~j+?+rSj^z623d`amgT-o6r57@hhI*+r($*XM7ivq@t8)d^6!L}kY| z#jjNbD)?e>o7s3SaIR#=LyJ#=g_AT%+qXoC0ZmPlu*^O?@jNG>L8Vr%X7VKBe45m0 zNVb-H4kT~#x7%Wi$9Y_Hcef4p*4%(h!xgeS6))UbElv-=TRYF{X`7Sp75CL#Dn&gh z4wj`DP)VWHjL@ghw_HY?PdAwR$It8HOS6d@mKM1IDO$4(&3TtqlZk4&9#8eGE$^Uv zUw!qe#vO}HkJw%RBtfudpD@|#>6(VWc8jGMgojzL9F?M4nGeO4T+fiFUbV1)XQ$PN=vM8;xR+Rhg$=R%s{|FyGE+aVy z`{SA)GccOys#X0>m|B(cM~tB{a<|Xm%T7$h1<7D`2X^3N4FAb8v9yogaLH zK$h1rKH;c_r6iq$ZO?!{#INoqfS^mb9MQyjd3jxe#HrQJb~RXKLO$Q1Tt~1gL31k<>=DiGK9NVRbN+y^UpkMX=!;ou9wXl;;KdMf%Be9n8LdB&Yiv)21#d&Mb+46-y{{ukIEF}9S^{ER3^^MRV* zMi>O&r(TkLT9h0*u66+mPlejhz2K08rnI|Ws34FQgQtn@(ykz0=PT zqD)Cm?G7?3DrzYDLpuy^j%>Ir<1*jeT7Nxy(QLv;^v;J13Pw=25d&kH^&{@|EZZJ( zNZ2jtcX~vBFaQh`p3JQ4&s?ecltBx#~GH6+ULxihtSmHFh{1W zlXxY5ALJ?J4u^cjj;Ia<_vZ>DUV@T~bNnx-sUTAT;Z@7aT>sVJ-A;JtU@SD3^RFXO zzLzOQ2@mFxPKFU&Mz(c%s8R*lT;WFJfXu0^-+BOP(+*C9exvsND8pAn2W=E$pWf$$ zU0s-;f8FA!*x-?T0SP1c8Ku?_ciD;aIL+nY=7wY%I&-fgAA8y}Z0iUk<#qr)jKVR)w-)dK5B}0zDT6_|vYf9A=uuw$SUtt+qkf!@`76@2*;>yK zSJl$eN+G|_(q33vdJ4kb&zSAw@GSv|{TDUcArDvByK_yzZmn9iN1x-_rDL{tYzNxt z+ecuS4y_!N(i%6Fwo5&8u(7=%n(Ie>cWO7C8UMMYeeePEV%ENqi0*+gV z{kO^NP)-yQhEUe@#yMq|D*6CzI}lg@rYg@V{8`8-gtDra;24p+>D?J&)I)kwOikXTz4{fH!eA z#jBs*j8t>L<@zn2s)s1x+s+8XU#SuNLTjzm+a5q#&fS<1l%?1@;Oq`81GQlYa4IC3 z+N=-|Xq^0;64No^_cFI1n0wCOo1a%v`EhL`^ySz_wLA!xK@E8~bAisLf2pzyKs8`NE2BB1z$0!xDD1gx8N1WvuL;!gzO=`5F96b?$G(h`uX?hPe^*Jg^%lcdPA?XU3V znI|3%)M9Q|Uc*hvQznW>UXorH+&vS04uf+7VR<@ZY=rIzgCDvcx|i!~A?l+tZP4(L zILwDzFo%SjqQJRgpl3LQa6LiOe~8f!S|9vUW8? z9EtS3x!$a-%6;q@@=!THD?cy~`mK;Ee3&~S>NG|E2yEt)u&05MEZ=qsqa-T?ojjxo zPAEWZM41fzX#}-a*FKEcBZ&5GQQ;$eR1Wy77eHb2uDyf20n92Q?wcbfKvnJKVwr zKZ))!Dk8;Q!;NBIv$yfuXHqYW3`I&rJAnwfUdQceLy`yxKf@l{4$qxOkx??6hpJ4X zCkg@|aiI6?C}>s?7*3r*Z_PfN-|aUWm^8HbiR*<{_b+bq{O|4E{s}MZu>#vi1cK;S`NVUt_8~9E~asLDr=n_h{B&9(iA8Y;Hc_4)!wvD%~(t zIg|d|5IQ(nsGv*m^WglNh@HaRLVT2@?A)hqG}~uRrpk2?%J57Ova>_NP%?q4vHDBd zjE&7r^HQ;rY8Az!0uZor_PB*X%=~UbBwss6Wl*=s$mU12+=p`47(#2xvlBD~r_=d# ziHw@Gr^5EUh`*+(e?Y2=O>ERNNwX8Qk@uhW)rtN^YfZ8Gz&H{^v=wo`y2jkc$c$L2 z{hUXhCAD*i!{IX1L0}TF;M8Cxdfv}{ozvsjTI}-2N<)_pM059NDHl@q%fJ(rBlk9T zeBP@oqvbiIDS@c5IZ}T7nC}$?(XxTE(;Tw2``96)l(v^o3yPwyGkKLy@I9K%W{erp z7zq!1hB_9z@A^I4-0MRYVPpvEt0R+P;!`h9M;sWz1gJ|i~M}vV0ts6 zoe-JRS!5$liL)7~*qqBJEvpzUL)yW1gTZQ!EZnC9f2@IvA=140TqVGx3CyK5@DB~r zM01flea`OT*XI2Pj4f_nsasZ{@e=Cpk|Cf?Yrg1%jin0W`;je(ryoyZ@>XJaPW)n=%^R<4ZS~X|DKvz>!*I8S~UZ3 zv~%Pzwfc@0X8yLNxb#B+uK7?S0QCD_E3idDE>1`EteuRF!)Vjrl}?HMs9btj-DMdZ zn^$Y5RJZhaV?$--65zmZ_cvzij53KO#f}QWpxs6WD$rc*7B=yULk+{3BxTZmeLzwM zj8u-|JeTu2FlUQcZ(t3_0Coh(!p~`*b0tb6$%T@+96X0)JX|k5V`VZoiC%QM3#_6w zea8=}D_$0;kz=cdWU20_os>r=HzqE%|LZFAL>=e+J7-%>wQ>;SE+1n@m89#ocT#Cf zt@9PHlcftX7H(MemNR|tKDnAM)!o?NXcx95A#}wlu_W$2eP<3t+Iqrd@NU}E2LW*% zZR0hPZ*1Wp?qNm1qB)FkNjLwpW`to#L{jfI7`>g&Y##6qQ7COJr8<)XqO@jl&q3U1 z(d;!ZUXoA+g1kMsikIJh{4+%)*%B@}oI?=DZe0I>+5W0#Hf2;ujQ>12xm$vs^8kY0 zh^^?Q@fmPxb3iJB`o-*JGsbA&iv;leUaif^jVbVgP6TI54F1;<+(H=e>grzyqL2w3 zhY$aoEc;gl?(|HDC}S}r=HGqR$$dBMULIp>CsbN%%oP~Q=4@K;G28A- zyW2*b=Y}!9esC?v;?$bEOOIorEr8Dp&GgXprUr`^;?YB!=?!r!;fCChyA)s}z(WO9 zC730O4|>&VsO-@JxA;}3j(!pBZ_L~y)iD6^3e0H$DW3S^-R_xkas0vN9t^%!N?K*7 zSPvcGUU=loy*sWQ45%Gfk&=-Ep z{PF6UxpnEb!|r3p_ouY&K*|jcm_G2Jm=p$_oiob7dXM2N-4_c<=%?&{ft;?EoL{FQ z8#fyirdu+_r3#)3xhwu&T#T&ioBiDO!oHTl{ude+KG`*<7;)>>}$}*2Tb!G(sUv~-l*qf?b-)xG+)ylsX zYKv0GakGT{N3St0^-+|M)ASv|*$LhFpT|+9NpF9u=_q|Ds92ONxKb;>9SLf_bmMLb zQCkya0zUen)%3B82mJCk_o|?8??HkNDT$otw#z+u6c9BkkORoN9P<8=FSghg8I!cv zrOBPM8a-3T&p%aOmv%KtgS0_;6vXkT@Lg#3W%;GuR2U&9-s=nkj&I2{;KsxUk^BO?uN~+QxeXaaMV4C@Vy=l`(2mQFCrvS2CzO}Vw zt5jRZU{Yw2#**z_6V8iV-cK|pD!%zRcCeC|<_h*{QVF`%e9VUcfId@D2r>!A+z^^AhO<3ex_oGx%`obxOf8R@p9 z{sx@>L$U<8HUk}n9FYqhKXEZhd1?^zbmH6YB#@id)9n}`pFxl)P-W7p{!}WMw3Dm%Rhm`t1TkIa@3~41K z&ClJ2hdv@M{$WmmS3+~)sdjRR2t>EOBo1=@HdESM*2+yLiOe6};@>zSO}K2i0F8K3 z>;XAY5+vpDKs}HvOIu7xD65#Zc)CE!%nDLfqGREt$#e9g82Kbb6=K?3V_M{`L-c`+ ztP<}GB`I%uQ)kt6)YE)VM`Cch@wWxTMZc7}_x*xw)yQ8di*mD*&3IsudyzZY&Y@3t z%Nt|{kBN7j>lHFk^OkrK_r(b=*=w2h^%dKT2LSB17JRrCZ+{q7#;pd;& zmRi3moohH-mjRcMkTq8{RovX$69fT^e+-J@@SY>bpu&prqd) zxNm(z0l5K-iNNx`GOs&lRcf6qh{zf4ai~--{?;r(>jT|9w@k(98S$|7y1so`6n| zZFKUc0YAbt9W8$3OPAh_4j(wiC(*u#ZVve=h`15*WkMTS7e@<{psxQZaCIj@4ar{a zpxqAm{WJeQuc4%OSjfi6ZJ7P)(x=~faOGxy>ANX5vKbP0P|W|ktXLM*lnr~-u|1!+ z4AAJLdtS}fP{`BxH-at!b2a~zL^)ENpHfG-zS&TMv_szizWY8H^lUa34|?kpNW?OQ;q2-!FE9*aZu|69AFj?aR#CfMhD|Ca|?@88rd7{!)P`@DZ~; z0#<(hhM~*4Hw_t6Tq@y8xK`O@z3Pr-(bf9zoP*ZsUnw!aRVg#BlOtX{Vz>bYSa6ef&&V rA>!=;OVEDr|33Hs>CgAK`yAuMbq*)$IVbRsF(4)vuOcfD*YE#7vo$ir diff --git a/docs/images/nf-core-drugresponseeval_logo_light.png b/docs/images/nf-core-drugresponseeval_logo_light.png index 46ba87800ad7b18c49466107d8ae4b300bc2826f..d0922b18b33f93121d515ff9de7a2120e17aba2e 100644 GIT binary patch literal 90998 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

    5. LrS%uecN-1AcEb#e}@yup;PDexy{o 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 literal 21084 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 F{{XgS7^46H From a8622e7ce7bba0907a8f8a9a89a9e5cb9b15e030 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 17:17:56 +0100 Subject: [PATCH 109/257] trying to fix images #2 --- .../nf-core-drugresponseeval_logo_dark.png | Bin 107160 -> 25407 bytes .../nf-core-drugresponseeval_logo_light.png | Bin 90998 -> 21084 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/nf-core-drugresponseeval_logo_dark.png b/docs/images/nf-core-drugresponseeval_logo_dark.png index 865500befa22a82ec82c02f23078ce737f02d3af..7bb7436edb79bfa8e14d2ca5c8e422ed35485d5f 100644 GIT binary patch literal 25407 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 literal 107160 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

      RCwe^T*ZRBhi`*TZTMHvl9 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 n7eS2aE39Joo{4H>cau=cB9vDj;B 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 diff --git a/docs/images/nf-core-drugresponseeval_logo_light.png b/docs/images/nf-core-drugresponseeval_logo_light.png index d0922b18b33f93121d515ff9de7a2120e17aba2e..46ba87800ad7b18c49466107d8ae4b300bc2826f 100644 GIT binary patch literal 21084 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 F{{XgS7^46H literal 90998 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

    6. LrS%uecN-1AcEb#e}@yup;PDexy{o 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 From e10534d558ed4838d9a111247ebdb034afebe3a0 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 17:24:44 +0100 Subject: [PATCH 110/257] trying to fix logo part 3 --- .../nf-core-drugresponseeval_logo_dark.png | Bin 25407 -> 25538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/nf-core-drugresponseeval_logo_dark.png b/docs/images/nf-core-drugresponseeval_logo_dark.png index 7bb7436edb79bfa8e14d2ca5c8e422ed35485d5f..7f9be5fc221adfe7cdeac6298aec33f20ac4c804 100644 GIT binary patch literal 25538 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 literal 25407 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 From a3fa5c4d66f2a41a9803516d73728652f108739d Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 17:28:43 +0100 Subject: [PATCH 111/257] Found the problem. The hack is to switch to the TEMPLATE branch and copy the logo files from there and move them over. --- .../nf-core-drugresponseeval_logo_light.png | Bin 90998 -> 91916 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/nf-core-drugresponseeval_logo_light.png b/assets/nf-core-drugresponseeval_logo_light.png index d0922b18b33f93121d515ff9de7a2120e17aba2e..bc11b3f89481f99066ca302029627b98c03f3a10 100644 GIT binary patch literal 91916 zcmeFZ`#%%x|2XcxyGtdxi;%Yfqm3MMKFn$6 z5Mp5nA?M_Ln)CVe9lBqiKj8c8+fRFJ*Y&)f*YkY3gzD+2GhXDlNJmG<2!8ayfR66` zJ{{ekF6YnDzWLO)zeq>-2hu@RRS&GHdPC2{4d&nsrK9ux;QfA7Bv_xFtRnl*;6D}> z&x)k;W!t|0dWe;F1WQ3H`bQ272CJ%LBHn z*>}v!cT5L#_~G0AE}Q-X;mefszljllI%e}(p2zZ;Y^@FXB_lnzgqjH%2D|^gv;)aO z@tv1&>QUJ$=)VfKeDQ{LOkb_%VtsV|$I_RMtC7zz=uo~_9j}HHEcCY9zmG#vGV+#F zZqcQWe7S&&_3d7aWGB<+r}9tyv6t;CxtC1VV-V4c5FX8yAd&F%TUSF6VECF zHg?w(KI@kG^WXc^j3r`mNaOzLi9i0~Ts7(|EN43KsBxKPTW*3Emf#psbbrv%fgjv^ z?E7J181cap?ngbCNA>0#et+0l3~i1R$%w!F$4iNxcQ(#%8QHbm89q+Fdnb26DAMz? zKy!1m{2%oI zcxj7;_Zv4aZ9d(K->L3&CQtx{-{nB_O`JjCE9XyOErixHonGMCdA$2VkqFvgmYrc` z2e#>q;U3GscJs$C8-9$_s*3i(QC%+beS2kX7&Qzq=;0E*AchT6m)J+1AA<*%=53+I z-XH~51NKg!-Cg>)eC8A`<(;O_T&RF@cW{zjG5qU#{B2?dJiBYWrre|B#VqUdg?nsE zw(E1;f7MalwGo%~LWLRZc&B{=>gLR3I{q5BafiAponyXUhJJ+l)AU z7t1R(&l(0g1ZDUiY{(6-2g~zZI@#iX`8Ch!-k(oC6uVk#tDb?k9x&Z6jMg4TcMSCf zY>HjD2cgsuf2EN@^K&@`?H9vN$$HU1SmAUh-M3c!&R1p~nSMpBLkorsQ=3k>h8M;n zYG@~wCze;~oiGC887-<*echQ%WONhj}RLhzwU^iY-jzX#N+eV zDJ0;d%nx4m^TGWjsO-evo%&Xa{haIK%8bghwF2yX%KriZ3QO98=$(j<`?5Qpd z0m#+1xRzfcl!bcL{&l-v9JdmxMD|_vj^-%In|yPK>jZH8v>+|QIR3M#Q`|^n7WbLu zp*$Wnk;p{G#6?x^Cx)RQ#@SX!ZAk~tgAK!*QUK&aSQ;)s;8h{YS}o;Z)^%fL5q*fv z!_{nQmX8c1tVEnZdtP(@KSDDMNb$JuGpL?7N$meQa#5aNn|pYphkXIio!2GOgw^fEOZ>M!E1M$w5CrO_xzA0?D7d@Iy#og71YTtg?%ey(i3uO#?RV zsh&UjP)0x;O}EL7x(iC3NbcRBl;3Li{Oq(d4(F^qo4Iu1=00_#MH$AAs8z@Lw)eT! z?3fc|wqn$A%jY~v(ys~)x~D365w*?QJWTk2UzOJTzsmX(E}USw%k-b<0q@Wlzwc02 zKW!nrv;&fAPAyA>7gSPB$^+cX;3@}KqI~W7zO1Es6%RSWDjP*n+Ae{!yNPZno3iN> z+@2q*{*MzaLIMTmwzypr)j|O(ahS|Y%)K_r7BtQ#hf0fobxPhnw*L`&qPc4z(ODeI z%|5SC>iw*u~H>*Hv@5xH{U4w2cRxdCQ2U&O=c>mFP3h6RC=WjhIw27}z zyl<vODZ(Dd|{e=)s|HY93P@NXl z$Hl^DTz9qo?8(8;ZvO`@dCB`K(&4;9K*yqT2GxfLQ+>2MAIlnjDswil|E(*)`79I} zNmUD)7AhsdVd&X6Zu@g4qriVSPauA-Oa4z1YI=qDiqI&j@Rg4p(%@BHje$W2>(l!x z{m=UECWK6szwG~p*OilMWM3lKSd09__8ZdwWU9uy3oKwXwD`7Ksem-3u2MmT%MGKQ z1W(pISAFmwe*>M=-bTq0)TxVAVi?|T1n=Tx?x`txKBD&DqJ!4`>)`X@Lp)|X?g-*~ z-k%1i#+U2rethPQ}#Vl5N{$3{h|CV8YbqB{REc!__ z`NSODnSOM79wFti*XgHkdvD&nG4_qCFlU$%9?HH{;ZyGMfg?i|5WP z+(IRgv}20BJll&-H^R=U`=8+XJVXk(wYJJJm0zH(Rg&M~1lToX9ruvR8!;aySE@86 zxsOK-{wGqmIe&}F^8=3TzNA~-&GHeRV4m3TUmXCuM&Mig=3_M-%rk(B$6f z6;J&wGn?e0@p-=3HTJ2lHs-deQa{T5p!u(nC4X=FeW)f;o25=2(`V=ZL}N3{N?7S0 ztfSQ>d0qpo=#dyw0|i9&)s*iE#*gCcPHp^i$bZaVFcge!$2{(U#_v^Q_cA@OuMejc zTx&Zn{|9eM^fyOr3bK3V{F`+6N+{aDyO!^n@5*wpc?^!B`R9X0K1tlW z?utlaps9gkChbPBa17SZFGzg+1%3S~vvGroPf$_X@5Qo*e7`|pctd<9+)gC(}I{4AQO7X`pQlAyF?jd6MYFZ*e znwT#8xO%6Ttvb_aBJtRWtrvw!;sgwpIrS`RxtwHc;#+~h^PSFF$lQd*J?P6l6#kU9 z-v()tbVo2p1+j9MudTQ73m}h@dpG32eYjsEvR>8isd6m2~iOpJDkVX4M?Y2 zIuJdy{$c1`g0)y^9zI?M+XaPvtg2m7Y&-MYf`6`}iO}a4Bx+38z#5d8=RBcKnL^c ziKHaiP8tmJ5>u*_INR{opJ5~&{22vfG)vizJo=pTXs9k z$W2KxGQ1|TVucohigJx7Sx>`nn>bnsS*SaoPyBhMbAgeSAeCpJU?AqlI*H4jdCD{; zh9#%i9V2p(%+k;gGsAXQtmwQonUH2+`1h<4wD$nzo+O?ov%`1lZ{jU!{s#0#KM8fv z?C=OBpfUYM!=cE(XyP~)w-E!rpD*=e^xT`(Gf?c>QBrm@2@f@M>3`^xDnWY1E8lc8b&sR{U9>xq|Gp}7&&Rnh zW`Tb7DxPEUpb@8wa`dxP@z8Q<+raLD4Tt$R0;uHZanf;#jE;_C$bx!)*0s%u4QSYZ zsQyl@Oykj=%4790jc;lyJ9=Z^@zn{hZYh?9?E?XCQ<;!$tuNmYOpL8JzS!X@{8{azUF;Y$4kf>jPu)qdmlwBeKNIY+6}sGK5`J@o%FQp z@%85JPwYyDR|huIO8vUek)VsEY(xKa7l8Oxv^00esxyOZY-LAfPEbr%p(Ty1h2DKu z+oqV2bdOc7bp4n>+E35VwgTt=Spv98Pg_*>YorGm<;0Tjtf$WF2yqYkYDwbD&^}tx z0)dOuy}mZcbYcqnQE=EOyCr&I+S~$xIh%uQ8-cibJ&ZeAF2mW)8^hY(kEvOSolSQy z9_<#L%)qEkWjGRbwb0E`>6ejQi+!8FIiN^WKo9IB~yMUgtDO^=E(0WAld@ zvh8evap6{CKOOWqDYdDSYJ8Rt)}(pZe0mM&ktu-iO|jQ>ZzIENkD;QsuZBcGgJLpD%{l(4n|Qs^>LUxOri>I;YxK4`^AWBo6w#qUWGe!>?(%%6hlQ@itF%zBB;GQrDc5i@m2mf88t!ZJL8_xvIc6x^m5~ z7vAa1OA7o~EQ(YMFaKf;5&Do0{4fa#Aiqx{ZkwqE`i^%c)-?2DnJ!|vU)CQ zs@}xEdBm;wNyo*?r}C}2F@hN@jGP_&Kle@(U5eb9GiO3*NwzpaMn0m-wyLx0MkYkC z-Uu!*Z_K5f%RMeoIWISS;0}8d!NRolN#>(*ehZJqkN%#~mEl2G>4Po$`pP3uDIp2Q z1!p&1>h-nBa#uIL+8<~~q+P6xA%cLWZw&zZ!S~!tzlfA=-%JcBj?W0EFN?re$jV|a z?Fyzsp|9w?73__TWTNGDMElqB?cHb8K zZo*({_*M?g;FtVg_;{9=Kz|rcD_l;lJkD)kAbY5`+Hz5v-%JF3tIA$;%iE7Kl>T>_ zvmd1s*VMun0vQPA^ayT7CsWV(?_ z+05do(}??yX=|EVp4mo@B+^6djHUH;H(6_77OoXU$&xX#ECfE*jM9t43GJ*w6`Haq z|4>_E)yr^O5lR39wD5oN;Y##5+`iNy%iXeE2b3)wOL8O`x2?pYvAnwVXUus>$}VEp zm9^Bkm%Qn6W4_vPZLzC7f$S$Tij!71Q%=*)=R{g+XG+(L8be^r1`c1gOlJBiiYm0{ zo(5%HAN;FP{_lb`4CFB{@=YS;5|b!U)+x%BB>!RekB=2P(%8V8e~FxJ7AW8PV&$;C z5TXs(gBo;!$=QkO0&l1zXydXai|kL?=)W^+uko7zG3B7;FXQ)-$z|XDE7nuLDb2NZ zdj(4#kv@8n=}~^|JuC|+tesK)I73G_6;JXbtzk6KHNcbN)E(ccl|LsRZ@SO2mDbe- zwb`*wHC;)nUe0n-L3Zw;d3Or*E(W=ReP0eu;H=5JrdZi&dL zP~+dzwX!7Opy94Wl2DWjgh>S@R#}B>0p^x^tm2DSe?{dT ztT*O_N1o<;Fzc*i#Cj{8#6jI{BQt?MZ;z9$=c<79FJ??5mGgb&>+2X2n`9E`A&^16jC;0m5QKjZ!y|<*pn<6+{@$%M|`5<|=i+>%1#UtBOThiWPVOy!FiEPj+Z>fq zF|nv+tb-TqhDTLR)niz=Piqboz(tk2Je-b3R!=4;E{wE?MIMJ9$svz(dQ!D~9$Kwg z__z@Ihu-ypxDsScs`F|#6BxuDbJlr`bx^vnjT+J21#MQSgc-cB%(?Yeq#1F;oh&`ixto<|qg3-U`N!H~?wfWszo!FWT z_;CESZ{e2(sH7q&3PM%ZzdY6gf{lI4tC_1RHSXWhH>#(&^q7t0^dm1&Ka zv&K3)%k1I5FZ}lH+e@1M+E!~?yQ?!_zI3c5gansw8nS_^EwWI`G0}vWhkh+v(H_mk zpG<{B2Yk8)Vh452NTrgpR~%FA+IEbCSAiPEj*r&!W%}?z4?F!%`26`JtysDKvDEqw zB8yb5ftDW4zk5vJc*C}pl~LL5Q2B`YFEc#o@9hqN%T0WkS2BH8&px({5#nBveHF)% z%}Qz*qJW)xzG?MF=e%O<%G5!|4q*(AVTZz0>*}FSDuH8!@W@kYUIx&p$y4g6%aFdz zu1iRXK1N|iln-2xxbH_L9;J1<9+`^~o_*`Z1#DTLBW#KMIBy=f*bT+z6mErh_^sLJ|s%|xI}q7)3J2G5ULn@cfSf3;)1-2Q%WiOBocK^EoZhozhF zG^PNC_s{E;@QLo5%wndr2!b|8!A?1)-C|(0q>vTT>^Z5nM zDzCrqDNWae`d4;jE-J%{4c-}Dg{1R}2#|sv^9RK+3z>F;X#x3jKc}pcAKC?NPWa{m zZl`j$b|=8)p-NrLfE0mEWs%o6Ta@4NdZ*k^_wp$132^Gv|9ybSHEz1k3qsI-x3A9F zDzf-MLYhsn!9Q*p0K2Mg3f05mahEK3aIy&2B@8iL$bTZmZP(NF4^$sd^gnbt=A!?j z95bcCv{X-yK0U#}$Bu2O>i+;Q&F2TWh-wxi_$Ir|mh9EY_n21Lp{(L}b`uy>{K=Z) zsktX1*Jltdc$~S#kBp3s{?^LoDtf^KArxNjw;uJd8*#rdQLbvDSaEYh;Z~A-kgp&^ z)VlFBR!p&BLbu4^DroZXSa5%i<(j3};S{~_9)qj%qdYu3waQ75`1fO7iD-k>0A1u3 z@*xXvxIt-^f(v2<7^`_WYZ;AmI`j(*gbSSL@YViR z{X4!iP5Im#IJHkE@>$FFUyK6z{>cQrDG2M|wDFn4!L2sOQ`Sx}d4AA3+ZjkVW!6Qx zjPWWV13+^vT9Te_WGAS9-5V(}%JOsU(=~IMHOta~g}O?YDF@VU?1b{`Wp@qYYDVaBx)I zK9R^My*KgW$B(I@sj=rnH5+&~A+XiYMZnOxaQrVw47PgVlWtON*$nXHG@Bz@mKs>E z1c0ZfO>2l7YfRu4TJv7?4lV^8gd`FI_c%MYf0Aq!@k_2-ZJRE~EM2oosOd_B`n~m- zeF0pHnv!6kr%Leb1m9yg42gRcRz)vYpHlt+V}wqZD8jIDpK9*{&#^P8cuig(Xf)S+ z32LKiTwXW zNW>qnqKHV;SY+JtNRY(~1pqT4ckVjX9F$e6)qcAwqHuBQif-!TivpS8-M1-(6WTlv zJl5|QcD37a*;@10kWU+;u(l$DSu-XqC$}_>8vJpy_ zH$jbxMKgl&xRUby$o=W+>G`|L~kC&BfphgH{1a7vGVTe3m~&5|kWg~eWj z8P9&KiDJ>>-^&-PjtM~@3!l8y>u}y!500(WxzC?#r==O_pANH$`MzQa8Z@loYq<9> zT1)-AhGvqn7t6_oPodfLLiiwg@QW&SEQ1c_HxG+v1Zls1zHeC2mo$-Y=*cl{u)iE9 zYVI>7%|!pzd^1~5Oq80Hnj{faA@W$`+UxDAl+;uDRiDt09evHCC#=0l^WDS%SKFQT z<0$+q2D|6S&p0jBzU1L#9oqrq`gBZYwTu2%9U#HK)(m4<4zAA^RQkIAX9`tm<(=K< z#Jmy>+trbZ1Sd)GK)>1J>VgwF{(RpcrzcW+r*$=9y32@}xl*pc@6PQu*xmyyV99}Y zJ&GM(4N|BMOHZ4^#X_#W15Q^R)?;n z`cdjB@#*4a9<**I{ggZcLX_s6z49MdnP`Qy875VwitOqvP4Nh|kmJjx zCa_sp=+Oga*;aM$arFmJ!rH=sdfp;M}z~suxUCvYtNF!h`ja}b;T6U?S`mhTH{O| z)!BZ#Y0z<&j#n%zl6jwH>~+#?X#{JrJ<6Us_V*Nxqz*e)*wibs3zu|vH%%A_O_p&# z^t{Z?f6L&q%}(y_x!Z6b<-$B#@o&=O2@jp#`R?WA;xS_ z2vMMsjrG$u=&|IJDoyz=U7mrJNwsa&a#3@l4`&9rq3`wki0z<{WWE9C3TT39#@%KQD5nI_EHCZc5~}>yz$4SSAMR|DH=~JvOTD7XIP)F z{%YiKET2D<4&>B|wuk(~Jxg`6M7?T$GhD@A{zvqj2hY1KVF+YZ&`{M?aX5f7}-EmxU z^k(@U@2Fs32k2E2aqplF=9!aL1RA{_&)id2SJwzm5OYlA1`I_phH?Y!Kw1}b+5%#S z-Y6^@8yN^m@JYrF)2`ndl!F@`hZa7kM?N*gU(GRU~$?kumnOg0UsH(w|DDUXa zU3UPBBx3Z6R%&qRz$eW_?G+!B3d@^^z}AH(zP#RpEzNPYYUbO>Di*6J`LXg5gK@+l z-b_gR$8Q&O316I8F7&5R)RqNeI2 zSOe{1h7HiD0Cffb#CBqWB8Ew?i~vLtX)omQE8eU6I2Fs9ut?~JXI zg~>_!HfOyqjYP*wT6;vKb>yg`UctzMYk9m^_{*a-Gw$v7GMB-J@H+r`P5=N9T6ACv zJv24B)0E~7Afy)C%wKiTgLz;m89Ljg)d92RNd;#!4{Q-*X~;y$W{|$^z?_4(U3EqT zKdH4X$gE|56j3%S!wB{ zBf$oHIYB`QmqAFuf$!%HyJ*)(L$##To=TT<I5Ll9Vd84Z&7fIyuu$Q#LGlKU^8s}$T{$DYKu z9No84ogyA948(9R|s0KDc92TD!UO`3XlZs;+^7>8D-McOP&X7O9}NIUA+5qBi$;?pNB#ck`!hwT?lq|o${M0Y*K$H z?wIk*iHf#Pp%*?qs zjZK*<(0Vts#Vb24USp8nsmGj`qygSs8Xw0cvEr`K!;%L;-S%W!1M^9K)V~EA$ZlG( zw75{Yui*Oh-N%S(d#^rW2F1uvvE5@H4$D70x=fuvdLt6V24egioCf+==3$w#!aTrc zmYAbjZ-zIT9_A9V2{AoNUChVoO1Dmz|C(Z#qr5s-Hp zdS#>$%?Hqq^XCr-8BXG@r2P0_V8I{v8q6K0GLk}ORP+ji7^g;S#@AcrHX1I@%Jfwo zvb^qc3`c!qYZY}zINa4=D*QWgDYkSm?k_)9x35}3%qjH^wM`#aZ0b@1gT^&gKHrLv z7>$|R*v|2IXoEk<*Esv3f4elzV6F=Aak*-*SH-sh62MA4=`%A55cQ$%*@PN z*Kik*#K4|vyUKajPYUtvowkEMq?R8F2F*; zVt(t?ow@4HgFDi+#JybnmqUzt?da9LVmK-yGu4_n{~>33@!<%6G%>ac*z{bq{ z3JxLD>(`q!LTv?Vo{VF80)mv8U#LpmzFlb66@G2p0j<(XiDSh%#6hW*{aT}uowaV@ z)!@+3P|mQ+v8k(fOLv|5d@@p!9AF~hmt&&8rx%Fq8UgBSWjP{{VVA$doo#G>(lj$u za7M0e1Bm7RsJ!DpGF&eFLp@r$27w3c7}2;WF1fYVw*IF!;N2kG(2{3=ttmR-SwO%( zn;N+;nDMf4Qr^>}{3>O(3M=IiXRFv&Amzt#mGb3Kfyvc#$jQ1J^!0q+6C5!zRu#Ta z$!a1PnEK;Z5s^@AA|ICY>pSe11KLKz{^F`LJYjKrKaRUir0i|)l5?hJ3z941UsZd4 z1ke2A`S~SeCsLM;`?Njd<$jQ=j`L_1N;d}}yXLYL)S+G7L+e_exEotN#-fam_!|W~ zEQaHBJ3~FMR-V1#2It10055|;ux9wwI1D4xN3k7)zaSW-#2aki>kwg#X^k=#sv58t zH%fBx@8>~`3KNpP?lVI&g4{~YYQ+?~Ek5iuBXUaxL0=;@8R?q?T;;=RyrNkT(BIqdWVm?Tsu{D#c;N{PD7Wd>hJsu zM~0;rw%1SG>K>Zxlt~gBX{*dCAI;^uiu{0HzSFqQ)MtULBdfBGDi(-=ux;a-QFOEl z(|}%Jclhvu1;)z8pnB$kpA-R#)`=a=;#(tWZVZ^%u@*R#3|dD^>wDFx%78#1w6_9V z!oDrU)Y=O_Vlz)!C+Vj%(9caeS?t!*>T4vm%mjg!QnN*edkUHo%GPx{?|A*T*1Hek z^C|PI{?#>kolh;yy%GW;WzPL6Q(wL`#z6}rU{Pl0nNn{PjL@iBE-zQ2)zP!5!x|XD z58g>+EvChC>V6bFrVoS(^!QM$t1H!4xw9J8_}w_E2Q0Zu9}@Al*4MuCDue8|NU;tW ziVMPOiH*t4jZ;6I`qa?GQ|sroc2t9y@4~GP1XL_v%QHuXbwa85c<8-h+bHiNEp4A*a-b2~K6r*j2n>uY+;fz}(3 z^BHl>U=C~VPHo{2B7$p`OmhM)z?)IWuIw6jHXCCcO&PM*Er_-EGt`~_h&z)h6|Nc9 zUMRldf6&+#x}qXS5D@*kS=RpqeWY*ezjHUwr}+V4M*=KWivWa(Wr)l57t?B+d$985 zB3cdVC$ZmbaBV0Dz@i=2NtnLG=)Bi`D~>F)G55q}>)CC!B&AZqCmUJc_AtJlhSo{Z zr3xoQxZ&G|Nyt~FM1D=hFtj9*Rb89QGAB~BfLB%BL}TTB>D*L<@MH-qFh=$Kqz#x= ziL=ADk`V1+D3Evfso$cgC|ahxgwX!R2MKP-ML)V2tul4P>zxRuL;l2A|NN}C-P}Lc z_d(7;e^DQ>ucm0JE7ze@tl^inGm-kk;@7{K*Tcl3ut2b}dH-RH!b%UV=RFhTJmY-y ziWcA^_@7tx>*Z}~VU9jdWHtkZ6!fBm6KCIhSUOT`RUQ{uNcTRqw)FaRhUJ`7DZ!3> zBp9!hKXZHSOR^RllC_=vQ;#wg7Bu=)nl(Tk@$~7_*O{}P*Va9v4mtU)iGRyBa?xRO zr!VrV#i> zzoygrYN#Dc@@uM`;gRQTp0Lwq2{a^j&S0#BAf+>)wbxiy(n4X1C)dBUe&ws7BZCZv z>BFC|4((tfeAU_j>)W^Wc2Yw_H`&74AHVu&wuseNXeF$BVI$`NeT}1;0Aub?Mk5?h zH@W_nl!o>A2gQBox((+yb`?1ynq<`I%>+U7RriZ;d2*CDi0(bmAv}B9n-wCr?`vxY zY#l-U=(5I_+BUa;-TSC?1uGi@MOF-QVDSbyaZVBs(;Xgz{w;5|bo9RzWi4I! ztF{1AG`l4`Wa88;>{+}sMVE$_M2Jc{DI{Qb+CXs|@(|UP}^DV0&I;%#+(Ez6m_c!Wy%1!;~enrsaxz<~P_9$+fZsbygg- zMv4$U;nQ=sdbj3X%#pvd^TLZ1smWvo(>!Iv3^}!Kf;NYk!ruU^JY#dViK9V^m9bZx z6|Cz5|Irtl>RtTG!+CLDnXvZn9dR1r=J}qU^A{>>MxJKKO-M7+&;CGErwsTt+5Kndnc?-snv%ckPKx zIkS;toW6QV3h80B271Nx6u{!iR*7>O%*mmi3Gra*wJ7pPiEp%~-^Pnp^eo(~bdlm!x#uyDeqZ5^9F~-YreyYucU!HXQ*m z=p}KbUGCbE)*OqP&F%tZz}sC*tQEH~xJ^+?{P2~HLdJ);L!RH7PfFXLol}>kG$Xeu zjk;hK>m{reK;ud1)o4UYRhxI`KYj_|x^tpMTY1E({cDJWiLbSt>6osnKW~fBjIoLO z8X}>D){ltiq)oWwB#w{sNE1ed6*NaBmGnE6<)rlv4vIp1p=xBTnkuc<;?}y)h*nWG zFz~v;RhVW~Psa)FN*u5!t2kj~z62zA~!5@A~k=xO0g zfA8S{l@=-8L_Y3oNEF^J8O-8n+w_JV9$pKNJIu-RU;EKeO?^X9URMRP^A6wGZay>#z{f^6YS?X6 zdHX9@->PJx+!rExE!t7dD#y@q0TF zmJ7MfqGf{0dcP;Tc|w1J-s)UGrwF|tM{T~eRpA&EGm0uKC(P+%Mg(Rf%w3P>=RtFp z=?29L+VIWv`y7^&29n!wCllEqzqMgI&Ms%)GVy<*{E+o^dDV?P8XG22^>@8_qg!w@ ztE$fWu^RUzgv%6XP3*p_WGE^exqo36$GJ1RHT3iBm*tZt7D@-H%5B{XQNUO53glL0 z^B+H-`JWKjpW$^6O2_K9ZBE=vgR-6Vk{L9l&~bLFPkA$5o73xHl$HC! z=l#cd#!>ArEn!`R@b;I)pp z1vHJld+_?nT5i>7P|(X}jeGcqesRMy5~xwo;diOQnb7i=_c?}5AUU2d!2+Z~!hOCh zuPC9Udp!-jIWZFvn=-MLwPU?f`9lFSZXczK4|VfLyaq?LOy4FwLKg}qjx~Ld4mYzB z7Dw(qX{GKQL?k)_a-9i-73&BuwoO&v>9S76yYn7xFTVFLf~Xm7Sv?} zV@{q+*lN?dKh=`_>IK9N%qqOvWY}CQ=F>3;o}KUMDB?65pnE$Cqp3ioSp>!4;GSv0 zwWyYoN*Zb36H#u-R+jpCr6UzCi4ViuJ?|RlvS&vvZmW78DP32;+oqXAYaE&(%hT4v zBfE69{JpMvO@90Kt>4bhj^Gh;bl;fPC3?GRGGQWciHC=i6M3WD{SI$ufPSG3(z2PE zHbTQPID6SG^9WlJSZJhC*5@-~(M=Dl-e~A;5+WEtE@3gJh$e>0aUjP&(rS&@FU81-iU|#DnPAyp>7uC2r z|NQx!@o`QjgrY3cq8#XwY@rO%#~5x3#WlCP$mA?piZZg`CdX)Qj?73M+7Z9E$@Z`x zZe@0pk&*hT#)S4+EPjCniradWeH>LVgcV2=jQl7bTcQ_V&_ANwx~Dv(l;SkNoM*nS z&sv@pUEMciRk1>84chAyuU;T*;SXQXmn7}BTTbtfHofr_BaO9VtPYKrwmt0xP<7}V ze0!re(q{76kM_c}H+vJ?D{OTlgB2IHRSryJ4uP+*7;jsz*Sz14Y&MFY*`pUgF(Gd0 z=&L64TgE`*))AMtX`oSharQO4tMDh9I>eZ-sk&ap+hvm~AgYmwu0J_9E--_%MrlQX zzF${T^xqGR8gSs#DLI~uptGq-UJgD>CJ2gP;z++#a%<;osqtr)3y*zL>pB?At?$K3 z!I|axr13R}@Y1?8tdIDSJ(2z!1{>RbITA&Et?MZ%o)F!S97rLoOJS-5 zlFbgBHnz#0;^xAlvi-D%yjLKt1h)?-wl&-gr-u8)x@!%mM1jI_>q)75QcD5N^rKZ{ z6eiT3jVp4zA9G+^;kgZwSUckHgNZCns>)w5*t*j`N?Lo{did+j=+50~o6)#4MYhTN zhth5N1;+52ic02G-i1~{nw|1fIXcycv{$FXneJI&46P?k_+qb$wy#V3n?RPNElUVfZqvu_%`3*{24dJ0Eh)lmX#@4Dh4bWg=2^luUSfpl&>oDNml3z!*2s) z16w8^;B@?TGnuWGJ%$tyos3=AZw#S!>1BbVELMC`LHt`y-yddD(yhG)9Q27NQt_GA zjIVn+33>d9S2G21s9}O@OI`Z|^z~Ww;bW|_bH;m`EV%aM^e{mEEj#54b&W8!nN|fV zSu;0gcxX>kqC0f=hp*ZLSK(R1C-#F5cJ?(7 z@F^Z9+0W1y7m{Q|o5`rQdsetVGjk|`<+h>;MBc}iZ=rST7}{;cuXxzOTA6o7^W)Bi zwZGhP1Lu{AX)MVQCe`4O_ysw#Q>lueLLD~5i)h; zX$RjEp$7KTyHf0?lxWs<%3vAeJAfK%A{1=j14wO6<#ThoKHFM~MPpUokcVTzv3&)m z9LBE=JgsxyDe#LD3db$yFApA?w_8-ja$=^z=1d_)K8n7c8%3%zt%fs(RUYJcWXf6O}~|gVO~s3`ihiFZO%bHqK{Aa89{$F4A-5NWsm_%e0-oG~L#tQ{&~J9NaU)eToqM(hvrG?ku6qO!F?`q;<)eKj>Z3la< ziM6#?m{r-+&J?I5F0l_39SBp;@kUy$J?}5J9Zni%vro!DgBV!SV$Z-`85US zzM7j~mNqUt*~tW`_TT^VaUj9x?UUX?Wwh|*1Bu;C49^jK6nkKvWLXQEp4%LTTl$!E zo|g7LyVBlLfi+S=0}M>HQ`)y^gEM+>KYnZhPaUf8au2BnOC*_+*O8KnDKj_X<)iUE z`BAj_G_H6=E{j*Fy*exRUnJs!s49nfRyPh^!M&%fn1=$?TO;wsfy+slenZkJ`w510Ib6E~iIwz7% z_q>Mo?*raVbVBQlG2a7xIw5o{Db%b(tKw3c5g+2rzJ$90aph#by=O7DMSHI5A^+># z!AGltq-Jv9lEiFCy|&!4TL`R=*Yd1Mn+xdLH>Vay=7dK-4`|rf`T9*N-5n9BHc)c zba!|6&OAau^xzXo;-uHLT{b@dkGkdSK*IN5p*ShY1 zCuQ|?QpRQV3qbXTin~m6HL-V?ENFr#P%cZgD|UxZlk+{OD1RgkJWjh#y76+)u$yhG zck<5{(8Q<9!jDLf|ncz;f+WuK-6o5_B+!0j_$cDnhwIe)Y zTi+XtjVrez{ma<51#yD{rq!04E4JPfQ;J0&ws)kxLru}*6MLF(27rX0Xmtc0RJqV- z|BpC`0T2hzhl`EOy$*l)V(EHt7)LmOD442HNcf|nHS(U4nQ2moIdRI-K-3q{zpMT8)OcUv1BP)u8eU5WQ&I?Pm z>>kAfoaT_B9c?*9>x7><{SUrC1CDKmk7!qqO|2uVOPEr+Vhs>CVx;`M*iBr-$NIVB zCQ(9P3f{jzUbC2TAcC7vr|{%C|0>XSO*Wj`J>xz0Sr)m;bPF5oaB?J2S%r*+M}$Q6Y$#cqJY8Qrl?pd=)N^OE zlEmnNeTM$PZKA_3^`h1bdh$GGo$2l_&5~a#ckHxJ6n|JZ_K6x;Q;SGeGq!*}_7fX0 zmklZ|{~(^B(0;`np~5Eg)}#;VY=Q9gmgU7t>H9&Mswd`My3w~`!2pQ8=xnwyd#q3l zHTwVAKQQwTcawdU(I+_r;tcHuQ}qZGs*`ZV4(2=3xfu`*%MN*FDmV-|mKDm6yDa8K zaPmP2WlB;}Q+8!3uG{pAclE1g$RQx;er;_n1|3*wVwQ+qzn;yZA$zrWC2k&jbDT>e z9;BIn@l5WJRp=d_hn$kPOZrrzp42gNqeZrwE3HAvzC}+VlHJ=u-agHDQi;7^pJ+Oc zK*UGz9euMrM-m-pb69*~H_U;k>uWO}^pYk42O1D(7&YYh?tn1G{`It?c9Lec7Xd7j zB>8QA7wML3_ns?kmHKw0TN=rlzO=|4^>S@(SjE0UjQ^Fsf11o4XNFE-Z`Yy;wg*(!G;k5Q`ft!oikKpDl>sj6m0M$#|sI9Uo9#X8*UUI+2a`{(<$?5~oXhY9p=;s-TSN{-&DtOYgqQlf{FPR7Ih4x?t5=%G9m1F5v)9=E@! zqhn)^WualjY1ew%>}ju4Y{Ed3m%GMzBG&8NK?1ECpF1)pg-PRW?|K*KOX$eer3Qv| zQg^dnV?zk`$LQY-)Kv^!4<49}99I2NPX4HV(PKFJCg??_wo2SyX1>SJqm-VZn=Pz! zjpiGXZ-F8+j<=c<@E;xL^=qc*Zu}<``c6)==K{^*4C&$vma$2oB{u0%ji2i_!zuK9 z95A|*jx5`HG3GL^6o}W}T&>oG4n5ejRNKE;!6jw;r-z^ikzQh(;)K=0Y^^M|hEz4H zQH#bKgj`?;Tk~iU62Lnt#_}9v1qB%Fj{f}lBYz0e9&k)5)T#zp)T|pq@~}~6*$SxV z5S{q?+NOEcvA$d{#m@c^Gh)>D-7+u$oVnQbvn@SU^@R4!Z(FB$VuL}{PkDlkU z1>dbM?^%wF4YPW(=g8x_27t?UkQ^Y{2IVA3t*vXQ-t8XHWu9}zI|pkrGuk%_&2k#d zUKs!1Hlm~l?z`Ty-p%)k^Xcr+U>!6CJjRC(<6$l zti6VKQO?9Jq0v_V^;wbCar#+&Ehpi(6R}(FGg&~9Uo`(Mt0AY|r@`P{#~Q26y=*z8 zU-*1jc(mm@65#hDRox*?3nI7PV@3vwEuFAC`h<3|S7QrxPK)me0<4`4AkA+k9?9h- zB|gE$jVXnR4N3Xrhh#I(Cn)KQ6GLnUze`+>N1lK59Ye^`gPB@x%ja#KhWsypsYM*Q z71DAYldWp;l=)x2HmS@B*|k2o*YNR(5xl683DzaB4cHYP+vK>Nro_x)haAZgZc=FR zMZENvAaK~Nh;2Tf9aN~dkXR;aH^+EYpyms;8 z=`vqhxHwVrB}}kcGa$p~i+odD{(?jjl<7_0AahDZHM`b9$ljWBi}l(IoolMmBSgoh z#aetj^LBnbuIo+pTf;=f4CjwYrSlRLpDF94anG_ zoLk)!RgQh^#|3dCkzjYDGP=vDi|+2~5UGkJgAm7nfPjQTrTa!jBmkjU(ul%_gAD4n zGN$}{t$(hETI;KWKHs>_e$=~8IC_hOJ(RVJ;nlz6d8K+A^YagCnrPXo2wus=k!v*_ zmiT17epPy*G4r)Z=H|tPj|Oa%m0#{^DR0>{xgqBzo5;?Wgy9!=84=dI&*Yke-Y+@w z9g>ld2$)cGn5(O_#SUH918qp@zjX(jjIAciC=aA$oo7T8{s9n%y81jXIKOFdw-uBm z|7%J)mYm<1gWkRoV!%>#we>%dsVk{NGSrV!)*Do@w@1pfzFnWVYkXvvt#U-2F7^?y z_FqGTcNtJ)BH{UH?JUNdI(c&jpj3Di+-#AZWiv@eHgDP)DMOGw1 z)x4uKnG2t|;J9s@J`u&*xXIyh#YUjY_&mcj-QoV);*zXVOD@KM7*tUa6iCLN$vj)> zSeT(vP5cDM&Uc(^OjyyY+V9k#oWH~Vy1z<6OJd$;pu4-ft@F&%b+YKn;=Go&d}PeYpZxWSbbz~_N*VJ&ft~kq!c)Od~?HLI*-mR`_c92y|16pDw>GO|ehQ(3Xz1y5x z=dUft-<(eY&GJU;Z4qxH9Z>QO7erQ9+gE>FaEuhtEm3nn+a%&gP(s7R$Ie);nNn)4 zPyFQWq;{%|;wbh(cE6k=4K-`T#|xDE9gGvjT6|A7DOdwgA+(zDiy2iTy78wo^fhcJ zrM8ZUf0!wxxT!kOl<(BCU^AOryuP;1<2TKrrOD2vlK4TLEpX>R`@R%jHIo)ULzJ}^ z{B4DH_VRgj4{NV*mI(p5O|e(Kev>j!24$KpUk+&@aWfLSk$uO-PA#IKPLF8D=u-+3 z9k(~q1I2(}OwOUH`DH=xTH$QSIBC2RLh=V~c?4bC){S*=GXGkbr3)aK;!Q|yIRJEF zDEixtKrt9xqHV@Ch~GIYnLy+oK7#iHjqe#P!Qlt)TUDpZX$N@JC82s4xrWM9au8DC zTA{=C;(sKpHbCmc-DB66as}T!;6oGSP_LQMU(V=2eeC5WeLw)pO$o)YNuKY~VNTGZ zln5Bu`P9N?;RMr9J?X z-ah#`*H>0LOKG6rGTA-Q#M6-6{7g?_zy>%e z&P+lBjt;<<^1rM?MDy#9s+|(|pS?-(nj=d}2Syt0`zeKqo4}<@4YYAL+ndAb#Iof) z8N)7p(~u21?kZ9e5+BgGplT(+Rh3OW{haS1@(~HMn*!Rwwfq3R9}*v^30O!W+XNIM zk~TZS`wtFR${M<(kJXb<8yd2@NYY!y z1MQcL-pSGzb!-n85pu}=$dVEEgT#I8s=8hJiB_b20@r0`B!U>;K1F;=u9?;B0?;MB# zZ-K8=6HL@fPtV|DWu3Ip>i5qvu zq(&`@fdV&1-kt!2uha;4$kl;zm1j#@wkjyOjl^9ghk83q2II|p^D9R^c=PDVxTjvl z^pz*TG&Wnx?^yY8BYxJ0CTV!?*RDGae%Htxm)EvSb{NfraXEw9$WNX^oZ8WD}tT-G6m?tUmvYd9PhbNo=KR@}^lIYy6Be-k87lurlnqrBK!C z6Xe#F`-G#Bz=ER_r;vR1!u~n?eppcLhv%o2%`MwfzYa3knTs(d&O-GsLSnCE4@=SRfuu7%=vjC(C(tKe)IjjZC>TWHPS|8? zfr8t(AfvIdv3HelG7O9S`RkNU{j+F5USV91Vjx@ORW2bgtyKf3>oaLH7MDDJ9yM~L z8mI-CU(f|b-n^isT;b8J3RLLy%l|`LMpm?vIE4tM^zP6tUjJp{u6->F5$xa_M8z1C z_j1{byK;#~|4CBADfBNE!o@{v>&US+cy~0GN1Syg{JqH`+}vW9(Ie9b`K1QDf$pCPuMp&a|*o^2Uxle>-q+um^Q52hwTDWSpt|QGZf85z$y}fLV>hD!3ms9QHjhXY!Ha?>7 z49vQ57CiGp?zeQAF$j~*)Ou&BPA>XzWt<&_yf1X8zu=pt*|9)P|B8z9X_`=^gHC~s z4#WnbW&)#yc2(#6SfBi{UgJ%E)KFo_W$p0QmQ6cd<0*KTYL@DXbnQ=IYgj@JO@SETY(3VlZfkmAg!FAAb?-(BvxMjMYf2Yas=f?}Ah1H1bA`doqj(3j?IUTeP8-dEl*9JTVrUR*V<)(r$nn9>INraV-VrP9)$DUTThQS z1_lOYz;6u800<3sQzRI3{k1Sla0CsDx4LlK8IPdt7o%KA$b8mdjIO^*-kZOcmN3cx z^TE9Nb`mltkh@Rs`&zD?AnO5kT-pM^i~5>>M{*q+D{@aL#-Yx1&1`4ZOy`A-y?^ZD z>F?2l;~1s(y#sb}4RHs=Nr}_h{F#47rp+5S_hJM1t;i)PlnVRjt;b~bY;4M2xTMsc zQDWB$f5vb$fU?OR1S*bZ3DR4+gN@V=8;orFLQFJ3pW3iv*@RG!b!ujHYs!|^;av{pHh)nx5WL|TVHj>`GXUI+352)0^tPm<&ud(6yyQI-?zc^t%bh(Ha z-*_X=FU-iwb3d{Os2V5`1ge%=Bv)USts`_hiGKxWKULf};43?76JF0kTiUaL4hmWS zdb8-|sDsb6$AZ4kf+7mvD89jjtwFsAgNu_s0j6|x=N>y)jM3=GZolcRgwFRy-jy)a zUg*k+dI#qEUwf9RU%nd`ywWtMCNlwrhql`W(gQ zTTq!$e@sw($t2VZ8o%iQO3y98evdsm-l#+1WC@DnS9Ra{0q!)-_R=-O!q!`Zs>PEG z41!S#PdkHSrM&M-1=i~6*6LF@p`m}*hXSs;@HeZ?HM*-*FgQ4O7)NwU@-;h^cn&h~ zw)@L^Lq^{xuQHenSsmxXNCSX&aj|i=|I*A9UoLDh@N`vjR5ML>GVmje^nG#T^~JiI zar!y3Y^_zqb~ZT=R+Q64sfYX~iMID44Qvhqfs85lr+(~g)*`UPC-4CNBupkO6~`fc zSScP1g_Gg^YH#J{as!QXeSysR78a_Ha}{$>I>iI*3a;nVPo3QnNBJI#T-*5ZJHVQq z^h!<)tc9pc+@e#9@3qt5%xdj0toFGtR^yW-E-ZhABLD*$00yjdmNj)4w?fHPoq_F5 zX0jm3R(pSBFZy{AgIgYE8ZG)1w=Gpii&|sBctxR&s7g+k^KCdxOnbFBr3Sypt9`Lx z9uX}vIhM2d#u^Z>q(J%5TMv!o(6z`XU-=K(W$ap8;AA)D#xQ0o#eD%}=PZQ~_YQ`{plTQr8EwiIR}qthkZyCE{IU8JrAyNel2vC-OCh>LSx} zI5#FGT@f`r6N&pYx?hGW_4bM$CG_iC?Jj9p{?jEJ>tMRh^|3aX11JOibfLNDRg-+k zq1-)M?q&vTu>={i70=JJQ|a0L!@?RWISX)ZEll}(hqcjzwHC+OaYO5b*oZ6^U|@rK zhMh3GFa0mRbm410%bzN`xlqxnTbo6Omq1L4(*ZB3e0XG5Djf8BA+|GZMB|WL4F5uY>@oZM16xveTw@>}1=a4{hur zqX_2|q51V6;*{A+tjibGzm>fgmAwmMyqpk6PrZ`7iuwM0w3BrQ_=2p8?UfHR0@7ej z8_>opMWXN!=7p(iyT#yQzB|RXz-NVp{{DLEhHH%I;@WCwT@Ut*45*P!`BJA4X}2VV z?n-Zwzr|inyhD+CGp`eGuVv$XEvQ@M{41)82s=2f>J?&nVSV$qLcT$8*>8=t{G3vG!tG1B^}T43NCo7a#w7HPGRnEauS&uG*q@l+z#u~gBTc5DpkVQl!?Zs= z(Ed)wa5JDUV{5c!f4cpWc`8zwD@(yaczd+gv=GfDT5FQOYidnC(<|4C- z3db)tNnu?j$7v5wnRNDuz>(W17~IXh&{4sy%xt0CeQQ!{vG&}c)pHowm0%B>!qSs{j5&z9VAtM1$ zxhMjyf~VdFlfq|-9NY%X+s!gt0!*Sa$)MfXuF=)iRr#NLNkA3{V6g5RAdmaSJY)?s zjeJPHYt>2Dv>*E9Utx;?csuw3@52MvZ)BOgLZ@`jP3{Q47cPueINvC?Z%S4yUT(5JKCGX-?jq zv#0=8p~+QjBd4D-`E6f*t+%`OlkVzJ+Y+o!V=O?@O@0;)D{HtF(YPpu#K;%wAZ4R3vhH7S3ij30^up++QH$ zX*gs2R5mP{u#s?b;T--vo`}_8O-71EL%(_5Zh7&f8s%{JK+&Z zneZuNcoV1$zdUbR7E;HB4Ay`1nl-A3jByM96tc@Zu#I#{xLfooIf(+=?rm%=$x+7o zL`xIq|E4s90|C(uK)&TwgYz!MTG7Z5fT!`DfJT=W8ft->*Vt?}wk%p$LxzHTH`&cg zG|1jUWv=bgW{0o%&hNO^W;9l~- zpmhJffK*m%dss^|bl#@8*GF!$@e+N$eqRU+W&vT_cHW;i8cOpj)JYY(Qh=pov0YrO zpJ)BajTV`V!OCbA%~-mk<^EYVFNZh-UolYbI-_IBrM3>gT5Iy)@Wrecs=QBwOO9+) zyLbe^=KmxajF*?$nv;4$tw=y_&XKCOXjBDM;GL5B@AIXoh&=&mX(9AYO*t+$cA@T0 zU_vX_`x4?#N^rJ;=sy74f5-yj{7m3S7 zTsgU&+PZ}$evnrpcFx5Qz*bnz2+i8(kkKI`!mMAWX~0_m9OabPoU?2js{8GT#wJCK z)!k0wbX9-J#@CTp^?drLFZs&bZ@*d(CG{@;z&dBfn}Hum*3D&{&a!D+u1I@X9V!kp zLC^48s6K%fJME2ESBW+5o_kSl(Pv!USjySB&rFS*OdQn37H9MN*3VT>jIW>P9yqBu zqwa8V^~mfrC~+1y7V3gN2NJ;)+z+e7z59j1Ex$@EX5#f~2m{wUnXlPUO%x99o$Azt?eid;(^ZhKfz?SG@iJ z-V?7k*I?9J>~x%Fyq6|q@1PT9vvA_%muGWjo%5>U#s-0JB45mRvlrN6kjjPt4N8c4 zCeEH({3wn&Oc&92>?tbF)KwjI0=qV~FC9-PwC2bARl+yaD|s@&zTNVedHXxfv~BCl z{*-sAU}J49(etC2d7I6XlXo?`{?qG?oy}W;Ch0vD9%&DU&Xi8$FOzK{Pq<5V@QS^i)6_Z0r|DDQfuleK;1A z%y!;=1!Di)je}@mAMMYwuF?8qHN>SEVl&sWPL-$Gu9UI)Z0QqT0@L*nmp7;HAtB0w zR+$kfy!i{AoI#s+VM@r{AIQ`0R86S=pRv*WEiby6N?|thg~99FQ*kbMYCg1 zw#QiNh&gs_to{SQHj6v$F)GO)5=FlKfmFOpR7{Fx2r^1&m=JL8RkG909s11LooaBv-Rjh)U7&p1D3vtFB>H~TmE6ER$+Ww0kD z+ERciJVT?BOyss#NTYl3JklQyVK<~FGgwm(MjL9reuqwIU=|cFTl+pqPp= zJtR#6f%gifHaF+N!eQzBOM*-uI-Z*fkA^}l7aBrsX4MS)r;4-tt3-$jy9pThk3K$S z;NLGr`e|5EaEDT*InFw7uUDV8DyB#36|(% zk9|zN4>R;$HQ{gv_724?Lw~FUxQ*jq8TE@sh-zP?i40VwwAet(X!S4SAu8IE?e(ezO7T(g4W(KR1?gilwiNBMRX%r6O4{2< zrGM+Y(o=!Gc!YA&`6-3WYc0LPJ2P#%hh2{gespDk@gq*kvn)`xscE-?qBvc>W)_ewthm2gvPb-fbo@X-dwg!=b}|{_$2E>*DNs3Cm@3`78w(G5Ta z2Ea>(Km+xXuIC3E^Lb7fiIKZWU_T(#sKD8lSflXQ@4i=Na1tw_=6cT+9aUo>tj?FS z1SJ-6xp2=bw)g^k_$N<^h^+POlha!*+UkGxJF4CoT$ITh?>6v{F5zx_aBpHDRFlpu ze?5WpEmhFQJ24COp#qdC+2-B7B{AA`qcW*$eFC^_XBWPV%@+mhmx4&gBtXE6{eM!T zZf;~KW21idgHd$-m9GJm;Xd42Cwr}D1C6OSOBgz*+p|VLe*7Rjp2Uts0%2*%(6m^u5)9jn&cyCC7BvOlfmelHfU+3HY7j%U1f0lbc(kK zDhidHwb;0Uuq<6dd6sfm*C^R*4VE&1z>UFG(S!s+%+rgt_;;JTRCpW+vrs)a^)tUr z89Wpp5=x<8c5vuEHwPNp&4x9ALN^rb><`R$1C+wc-x%WGzU@^PL{@+7fx9C%_J{3? z=IH)@ZLZ1vdw)*Z`AK)1r|}Mw)IX!i^uldsYNz}vQB2k0Po7KxI0UizXTsgiwUZ$M zJ{M}t@t$c5%EMH&Vs~R<58P0HzjQgqjn@k4s(l=QwA8B=vbKx9A45FP+U5??myBMs z*K{-dPx3zV{!Jcm6SXxN*|`LTX!Cc;nYgpLPn67wb(NfVOM_N5{cT$VibPdv zphrV(Lylc-TVl&x$Y+S`l|LHlr`RW?TX#ZSR}c=x{2ucLr-v z|GK=y5y0O=xk}DB1S)T-R4pmRZ*cLj1?#dwKc_X>cL|oI@TVS~ZH8_Tilsl#1t%O( z-_;-r_IyOj&q;O5;gQt6~$973YR%wt07}goFJO7uVyA8-S9C`fbdq z{?m!40uv5qU)eOufQCdI-J6<}#KBt8gWG}#FQkL-(1T4{l{KynV8rf;TzuLP;pM`= zYGUXykmiEh35WfTVobRa0IEAa%97Ocv03FF#im9-9K;ci@K+Mmy^u4XQwL!Vwb98j zD3WbYA67ztmGB?5twaH|&m;FXfu{FwblxSteBb8gja~d4q8qTaVk9rAI@A>>WAiU+ z+?1tI(mzJ|PW_nrK(k&`y$H@WnFf+XFaqqKt8sX#7w%L8P+1?FM!W{@n&Hi>6LC9j z&wOX%4w!*b&)C!4Jm0A1OutrRXL)q7@nFl3>}A4~dkv#{0dOPVNXxRZj`B#`XaOpF zu~@zD0iZ$l!)i9{^KWds(VP$kdX41mi+qoNXXEx>9D1zD{D}p_DDc)9ZGLez*fVv2 zkPBwvZ5pS5X296sAM>S#9-qjb>6diEytON;#u<>DSIc~M0bdb(&2s7nM5CZ2rfhN{ zZb&7USUbRk_Xi|HTvJ7|6J|xc?<_6Mf42jr^vQ6fqq*nH0Px;>9PxMp$uF#;01@`z zQ4#-pRH~j%xQ$A(>{h)F>8B9PeP8taH!igK86kftg@KU81i-{jeeN8)SKA&-2Xz4@ zT4WQ2PZep8-Vi31%M&szJQrsc!rV;uKYx}`HEOre7>|?%ZrejDRqp5CR?WWqTXe>n zgZdq(Z^Sz+ZKn%3$XWkWa)ooYd8zFOnt* zHGECcP|)%`K11H+Eq=nSB~vNLG%~S$5dOP%>_zh6>gpK2ZP&E48&;%)hu4{Dg=f$k z3w+Na%yDPAXD`_0e#RoO-dATl(VW4_3Jw4F_~Bs(hKHBh;Nanjvwqje^I!{$$cJm? zNu9pt+Ccgf_f?k3y`}}l9PxPC*Wm|m1OGrlI_JR{R@MhB8b1{{<{&K%)EQG#YAZKF zqhk8}d0bm0iNbro&3*4klBiOHvTO_Vx#iSjMbC|8DXQHKb|X#@5zW76M|30YAvF!n z%b@a*jxgL>5o1q&6gfCq+hAh#4`6O%vJauzsj~20n`VMisMlQtCzs3sY1dV@dH}3e zme4@#(9nfqLl(vK*9kWk*dNYfQOw+?E(9G3eM>t?XNQ~$yZoN#KSN_h&vgq*kHTBxxUA7EEFrH6uTl1~6a64oa5CwC z&y>IJA1P^RQKg?L$ECz58ovrYNQJ?*XpU3MaYILH+0!jvzoKzI~TL>CDJu+f}8Cn+H^`U zs-(84{_So4@{bTo8k!wD8ZX@7pMce3C1O!mCAZ)*U|QM_51Pe6F;*`+-{f(BPHAs% z_e3Ql5$dhe^lW##dIu-d%%qds#9lud69l%oCU(uIVocCBVA{SRE#F7O42^}uk3v^- z&PUp4K)NMpJ`#)~p@oWi??-aUBTBk+XDl{o@-t@;J-FSK5-DSf&K^%b1=m zneQD@_z;^V+ccxcG$r9{A~j--wy*i+{>ingz5WjgGDJL){#TMVfH&Pg`O97ZR!>Vy zd-9|(^P#u|&2k5h1R1~sJ$^ed`%6~3*ntk?;|Ldp$a?C%H=)O(lHdY9y@9hnK1QuQ z)X}V8<@{9WVRS~>15s2NLbn&qE%T1Ysgn6xK3BITULmH%v&Vp)gGsifR;H9B|Ifbv z`)1EHmI0_L13+ml+anix%c&lVfs*JnEvxB9)pE_$(;)KjQ>y z5{}4l$hOPC+5YF$2LGH|CHjUum9a@fx=G#PSVB@nU5i3X$B`7d=^*sXpR#U z!<+X<7Ue78h_bAa$NrLGxxb@77a}Cj4#otvrO`PD^`q~Am@=dIQ~O-oRt+}XO5BDi zQIQLrs+pw}Q2`tl|Aq+>P~wLALvtImZpWAZzYPG?@&ey!9X`pjp#MygsR8ia=eddu zfI%HmjGy591ArNW@f0{~LI9$m9NbC`?7rHx@V=`MBM28OpFYwA2&nGIhiGmAK5&Bi zE1Ib1GM2etIyGG?W(_)+EZOooY@RtXyyY7`IVRs~kX{zEcWk^pTdEeDN&3(62SOi; zOH1>-n38b?!=JJ;l9H}squA#qoIaDWyIVGa&8D=nfWoJ#cUB&o$^%=&7-Wpj_9QE$ zOI4abZwaRQj52Lhr(#+!@59)fl2W|V7{?6TN6Zn~h}be(mgie%TD8%Ug7z-FzBNz# z_I~b;a&C(f{O1LpwD(>xUTB&dgz^PgCRa^38S9tFt{U*C1TnhJO7CSQw{%0Mk8nc3(>p} ziiPcT^EDmmhA$sihyBLH-$#3Oz{(3;EJh`VR(g=0y%En{Ze0cv&4u1pmf7MK?h%E1CbZ8hzk+ONgK3q2& zVTzROdGJZ*I#lMf%oMhLaf_6t)f(GLUO{C%*Q2;p_Wvt-cizXZbe<>IcxoeSS;>TN zhDw0l?6rQ-FlN>hx2q6;bH$RxYPN2JC5Rimd%YlCHBpKZ)Pqj&JQ}-m#5cVa@40K{ zywA&0ZN#&mf=r&u+n++j(oF^b$Ue-*%d!Biw}F!ebWl&jlwXfuU0u!WR%k9S=~P`y z^0W|rxeGC`7;ApZtUk^iMXFr$l0x~A-B~36Ai499w0EXF`9%AWUb+dF{QZB9?}u?8 z{B0*l>@B?|&NzY1jeoc<6;+Wmh`hSO+GcqbcXbtyW}h^GXSObcxr~`xQ(8+uT7&V* zaLUJm@lLHmQyIv(G5`~6kL=0`Ur!j6oTOW+cfL4A&D8p~;E0Z3Hf)5;K7`voX}t?b zSJ@)Jt#b8Y5N#zf?3@+!PI?qvqPPa3j?B;@K7FuUU5>;#i|w~Z=)@MkBTXax23!I? zVnTNuAoZj>my24H<#P-m+<%FJW`~^Zf|@43-%^!2rJxdKoP21yKHqRNy>7zgxl<49 zHH}>Su!EeteU<(tZ>u4D2ra6#%od4#!@-B&2$@*nM~`z&_5f>0Vd!a_n5?usx@gQz zEpXJ%_>G{o^V5NoXksyczQhgIhEo;L)AUk}25A8T3Xe>sw)8aQ;vKbtrB`dQcASry zJYE+?X*t8p!2I6N1c&p6E(yJ!Xw3_+4fpFDAtbaZPuhqndD~7Gc>&Lh9fs*L~TR5Iw;z_%z!r3Y&E|E$= zf#**0;>9IlEqH+FumHG=H4m=8p0*)LzjlbldHhtdaYEHT3IJ$o8JX&@x)v`TU3LT}BCQHyW zUh#+PbP{~HSq>2--|)wJfxlsnJEQ(qU!(5p0cUE^cS^y$qD7UT^@JClM)Wm1NS5TP z%jLN{!=F}kO01LkoMg1qUA~K_%lL#_{~EB5I$)o2`u?APF3Fz;=uq{d&e4GykMey% zb?>-j6v{8cq@zuUxQNs^RYiM!j%q$zumT*B56Wf}Q!S%>SXovPX*xMt8Q`BUa-tkh z^};DWc?`^h|2s9|$u+wMJ0-2RUpv(2v1bAuZEfMrA+(z1)9VBm*A`FppsTeyQC)_7z#JA82$zMp_FR8>LYQj8 z3Fb~k8MY{|e0;`JnUwH8lTTq`IXGlh>2&>%v@KmEVna;%Q6SV-H|r+cz-|_o zi#L`YDr*G^y#72E)GKXdv25WiiUu)A-pDKXoQ}ZaN=>g=dHUT%a%&!5KFJq+#Tmsd zTk+t5V?(DhUdgV5YLL*`&SLcQR9@i2IQ*TcZh`dpF@%J=q@aWRc>WSpHsAX>D+Eea1Vufk-1&!9aa6&2(p#}bkbt@&YOcchxrQ1r z?U)S&#CGi5U93Q3D$k^!*XyndX@p)paTqqs{$2?E6C972`#${0SY2MMNJdvm_k09a3`8|tj=@edBRqlXR z#}|w;_TEXif#`ys%WSz8nA z2ARs!${C}6c#bNFCE+Pz5|r
        fjKEgm-VhMrJnMJl@kJ46piVa)iBczx$_t0uB6 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 literal 90998 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
      1. LrS%uecN-1AcEb#e}@yup;PDexy{o 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 From 217318121b2b86cf7c5c463bccd1c32bbeea2716 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 17:40:21 +0100 Subject: [PATCH 112/257] trying to fix .nf-core.yml check --- .nf-core.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 2a18a04..bc4c4fd 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -18,11 +18,11 @@ org_path: null repository_type: pipeline template: author: Judith Bernett - description: "This pipeline takes a drug response prediction model architecture + description: This pipeline takes a drug response prediction model architecture as input and evaluates its performance by using custom training, validation, and test sets. It compares it against existing deep learning models and baseline models. Additionally, it tests the model for overfitting, consistency, robustness, and - generalization. " + generalization. force: false is_nfcore: true name: drugresponseeval From a981ca7c4daf035bcac4fb0018877bb351d7635a Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 15 Nov 2024 17:43:58 +0100 Subject: [PATCH 113/257] it didn't update? --- .nf-core.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index bc4c4fd..a06ac73 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -18,11 +18,7 @@ org_path: null repository_type: pipeline template: author: Judith Bernett - description: This pipeline takes a drug response prediction model architecture - as input and evaluates its performance by using custom training, validation, and - test sets. It compares it against existing deep learning models and baseline models. - Additionally, it tests the model for overfitting, consistency, robustness, and - generalization. + description: This pipeline evaluates drug response models in various settings on a variety of datasets. force: false is_nfcore: true name: drugresponseeval From d18dfc58cceb005bb27ef2caab0ff23c6b69fe78 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 18 Nov 2024 10:21:23 +0100 Subject: [PATCH 114/257] fixed -profile test but still need to put the requirements on docker and the dataset on nf-core/test-datasets --- conf/base.config | 6 +++--- conf/modules.config | 12 ++++++------ conf/test.config | 9 +++++---- conf/test_full.config | 3 +++ modules/local/load_response/main.nf | 2 +- modules/local/params_check/main.nf | 3 ++- modules/local/predict_full/main.nf | 2 +- modules/local/train_and_predict_cv/main.nf | 2 +- nextflow.config | 6 +++--- subworkflows/local/model_testing/main.nf | 7 ++++--- subworkflows/local/run_cv/main.nf | 5 +++-- workflows/drugresponseeval.nf | 9 ++++++--- 12 files changed, 38 insertions(+), 28 deletions(-) diff --git a/conf/base.config b/conf/base.config index 933ff63..87dc864 100644 --- a/conf/base.config +++ b/conf/base.config @@ -40,9 +40,9 @@ process { time = { 8.h * task.attempt } } withLabel:process_high { - cpus = { check_max( 18 * 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 = { 20.h * task.attempt } diff --git a/conf/modules.config b/conf/modules.config index c2b986f..13057f3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -20,7 +20,7 @@ process { withName: 'LOAD_RESPONSE' { publishDir = [ - path: { params.save_datasets ? "${params.outdir}/${params.run_id}/datasets" : params.outdir }, + path: { params.save_datasets ? "${params.path_data}/${params.run_id}/datasets" : params.path_data }, mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] @@ -28,7 +28,7 @@ process { withName: 'CV_SPLIT' { publishDir = [ - path: { params.save_datasets ? "${params.outdir}/${params.run_id}/datasets" : params.outdir }, + path: { params.save_datasets ? "${params.path_data}/${params.run_id}/datasets" : params.path_data }, mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] @@ -52,7 +52,7 @@ process { withName: 'HPAM_SPLIT' { publishDir = [ - path: { params.save_datasets ? "${params.outdir}/${params.run_id}/hpams" : params.outdir }, + path: { params.save_datasets ? "${params.path_data}/${params.run_id}/hpams" : params.path_data }, mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] @@ -61,7 +61,7 @@ process { withName: 'TRAIN_AND_PREDICT_CV' { publishDir = [ - path: { params.save_datasets ? "${params.outdir}/${params.run_id}/datasets" : params.outdir }, + path: { params.save_datasets ? "${params.path_data}/${params.run_id}/datasets" : params.path_data }, mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] @@ -107,7 +107,7 @@ process { withName: 'EVALUATE_FIND_MAX' { publishDir = [ - path: { params.save_datasets ? "${params.outdir}/${params.run_id}/datasets" : params.outdir }, + path: { params.save_datasets ? "${params.path_data}/${params.run_id}/datasets" : params.path_data }, mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] @@ -115,7 +115,7 @@ process { withName: 'RANDOMIZATION_SPLIT' { publishDir = [ - path: { params.save_datasets ? "${params.outdir}/${params.run_id}/datasets" : params.outdir }, + path: { params.save_datasets ? "${params.path_data}/${params.run_id}/datasets" : params.path_data }, mode: params.publish_dir_mode, saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } ] diff --git a/conf/test.config b/conf/test.config index 2198b34..7fa6d8e 100644 --- a/conf/test.config +++ b/conf/test.config @@ -13,7 +13,7 @@ process { resourceLimits = [ cpus: 4, - memory: '15.GB', + memory: '3.GB', time: '1.h' ] } @@ -22,12 +22,13 @@ params { config_profile_name = 'Test profile' config_profile_description = 'Minimal test dataset to check pipeline function' - // TODO nf-core: do this for the proper pipeline // 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 = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' - // Genome references - //genome = 'R64-1-1' + run_id = 'test_run' + dataset_name = 'Toy_Data' + n_cv_splits = 2 + } diff --git a/conf/test_full.config b/conf/test_full.config index 278c654..e19d5f8 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -22,4 +22,7 @@ params { // Genome references //genome = 'R64-1-1' + run_id = 'test_run' + dataset_name = 'Toy_Data' + n_cv_splits = 5 } diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index 3221d63..69790b9 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -9,7 +9,7 @@ process LOAD_RESPONSE { // 'biocontainers/python:3.8.3' }" input: val dataset_name - val path_data + path path_data val cross_study_datasets output: diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index 4eb69c1..ecc6e63 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -21,9 +21,10 @@ process PARAMS_CHECK { val optim_metric val n_cv_splits val response_transformation + val path_data output: - + path path_data, emit: path_data when: task.ext.when == null || task.ext.when diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 53fa12a..9d9b513 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -11,7 +11,7 @@ process PREDICT_FULL { input: tuple path(cross_study_datasets), val(model_name), val(test_mode), val(split_id), path(split_dataset), path(hpam_combi) val(response_transformation) - val(path_data) + path(path_data) output: tuple val(test_mode), val(model_name), path('**predictions*.csv'), emit: ch_vis diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 6ba2682..28d3cae 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -5,7 +5,7 @@ process TRAIN_AND_PREDICT_CV { input: tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters) - val path_data + path path_data val response_transformation output: diff --git a/nextflow.config b/nextflow.config index ffe8664..54fc92a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -18,19 +18,19 @@ params { // For this pipeline run_id = 'my_run' - models = 'SimpleNeuralNetwork' + models = 'NaiveDrugMeanPredictor' baselines = 'NaivePredictor' test_mode = 'LPO' randomization_mode = 'None' randomization_type = 'permutation' n_trials_robustness = 0 - dataset_name = 'GDSC1' + dataset_name = 'GDSC2' cross_study_datasets = '' curve_curator = false optim_metric = 'RMSE' n_cv_splits = 10 response_transformation = 'None' - path_data = 'data/' + path_data = './data' save_datasets = false // Boilerplate options diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 5617454..6f88958 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -14,6 +14,7 @@ workflow MODEL_TESTING { randomizations // from input cross_study_datasets // from LOAD_RESPONSE ch_models // from RUN_CV + path_data // from input main: if (params.cross_study_datasets == '') { @@ -30,7 +31,7 @@ workflow MODEL_TESTING { PREDICT_FULL ( ch_predict_final, params.response_transformation, - params.path_data + path_data ) ch_vis = PREDICT_FULL.out.ch_vis @@ -59,7 +60,7 @@ workflow MODEL_TESTING { RANDOMIZATION_TEST ( ch_randomization, - params.path_data, + path_data, params.randomization_type, params.response_transformation ) @@ -82,7 +83,7 @@ workflow MODEL_TESTING { ch_robustness = ch_best_hpams_per_split_rob.combine(ch_trials_robustness, by: 0) ROBUSTNESS_TEST ( ch_robustness, - params.path_data, + path_data, params.randomization_type, params.response_transformation ) diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index ca2d47b..ec84980 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -11,9 +11,10 @@ workflow RUN_CV { test_modes // LPO,LDO,LCO models // model names for full testing baselines // model names for comparison + path_data // path to data main: - LOAD_RESPONSE(params.dataset_name, params.path_data, params.cross_study_datasets) + LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets) ch_test_modes = channel.from(test_modes) ch_data = ch_test_modes.combine(LOAD_RESPONSE.out.response_dataset) @@ -73,7 +74,7 @@ workflow RUN_CV { TRAIN_AND_PREDICT_CV ( ch_test_combis, - params.path_data, + path_data, params.response_transformation ) // [model_name, test_mode, split_id, diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 84c0149..3c89a36 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -60,13 +60,15 @@ workflow DRUGRESPONSEEVAL { params.curve_curator, params.optim_metric, params.n_cv_splits, - params.response_transformation + params.response_transformation, + params.path_data ) RUN_CV ( test_modes, models, - baselines + baselines, + PARAMS_CHECK.out.path_data ) MODEL_TESTING ( @@ -74,7 +76,8 @@ workflow DRUGRESPONSEEVAL { RUN_CV.out.best_hpam_per_split, randomizations, RUN_CV.out.cross_study_datasets, - RUN_CV.out.ch_models + RUN_CV.out.ch_models, + PARAMS_CHECK.out.path_data ) VISUALIZATION ( From 6ea8f84c2127474c768b44af8373bae3e36ffdc3 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 21 Nov 2024 14:23:14 +0100 Subject: [PATCH 115/257] added container with latest drevalpy version --- nextflow.config | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/nextflow.config b/nextflow.config index 54fc92a..4117454 100644 --- a/nextflow.config +++ b/nextflow.config @@ -6,13 +6,7 @@ ---------------------------------------------------------------------------------------- */ -// Wave containers -// Docker: Comment in for ARM64 build: -// process.container = 'community.wave.seqera.io/library/pip_drevalpy:23d68e736486ab16' -// Docker: Comment in for AMD64 build: -// process.container = 'community.wave.seqera.io/library/pip_drevalpy:7d8f30cda5f4887b' -// Singularity: Comment in for AMD64 build: -// process.container = 'oras://community.wave.seqera.io/library/pip_drevalpy:6ca244fae0c2fa29' +process.container = 'ghcr.io/daisybio/drevalpy:main' // Global default params, used in configs params { From f43dbbc71ac94e07b395fd9aa020e945004f784a Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 22 Nov 2024 10:11:05 +0100 Subject: [PATCH 116/257] added conda support --- env.yml | 9 +++++++++ nextflow.config | 1 + 2 files changed, 10 insertions(+) create mode 100644 env.yml diff --git a/env.yml b/env.yml new file mode 100644 index 0000000..33d431f --- /dev/null +++ b/env.yml @@ -0,0 +1,9 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge + - defaults +dependencies: + - ray-tune + - pip + - pip: + - drevalpy==1.0.10 diff --git a/nextflow.config b/nextflow.config index 4117454..1b47b13 100644 --- a/nextflow.config +++ b/nextflow.config @@ -7,6 +7,7 @@ */ process.container = 'ghcr.io/daisybio/drevalpy:main' +process.conda = 'env.yml' // Global default params, used in configs params { From a3ea0d63134d0ec5a38678d27bd7ffd1c136c0ff Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 22 Nov 2024 12:09:43 +0100 Subject: [PATCH 117/257] Proper usage documentation --- docs/usage.md | 120 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 116 insertions(+), 4 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 88cf27d..53dc9a8 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -6,7 +6,38 @@ ## Introduction - +DrugResponseEval is a workflow designed to ensure that drug response prediction models are evaluated in a consistent and +reproducible manner. We offer three settings: + +- **Leave-Pair-Out (LPO)**: Random pairs of cell lines and drugs are left out for testing but both the drug and the + cell line might already be present in the training set. This is the **easiest setting** for your model but also the + most uninformative one. The only application scenario for this setting is when you want to test whether your model + can **complete the missing values in the training set**. +- **Leave-Cell-Line-Out (LCO)**: Random cell lines are left out for testing but the drugs might already be present in + the training set. This setting is **more challenging** than LPO but still relatively easy. The application scenario + for this setting is when you want to test whether your model can **predict the response of a new cell line**. This + is very relevant for **personalized medicine or drug repurposing**. +- **Leave-Drug-Out (LDO)**: Random drugs are left out for testing but the cell lines might already be present in the + training set. This setting is the **most challenging** one. The application scenario for this setting is when you + want to test whether your model can **predict the response of a new drug**. This is very relevant for **drug + development**. + +An underlying issue is that drugs have a rather unique IC50 range. That means that by just predicting the mean IC50 +that a drug has in the training set (aggregated over all cell lines), you can already achieve a rather good +prediction. This is why we also offer the possibility to compare your model to a **NaivePredictor** that predicts +the mean IC50 of all drugs in the training set. We also offer two more advanced naive predictors: +**NaiveCellLineMeanPredictor** and **NaiveDrugMeanPredictor**. The former predicts the mean IC50 of a cell line in +the training set and the latter predicts the mean IC50 of a drug in the training set. + +Furthermore, we offer a variety of more advanced **baseline models** and some **state-of-the-art models** to compare +your model against. Similarly, we provide commonly used datasets to evaluate your model on (GDSC1, GDSC2, CCLE, +CTRPv2). You can also provide your **own dataset or your own model by contributing to our PyPI package +[drevalpy](https://github.com/daisybio/drevalpy.git)** Before contributing, you can pull our respective repositories. +More information will be supplied soon. + +We first identify the best hyperparameters for all models and baselines in a cross-validation setting. Then, we +train the models on the whole training set and evaluate them on the test set. Furthermore, we offer randomization +and robustness tests. ## Running the pipeline @@ -15,14 +46,28 @@ The typical command for running the pipeline is as follows: ```bash nextflow run nf-core/drugresponseeval \ -profile \ + --run_id myRun \ + --test_mode \ --models \ --baselines \ --dataset_name \ - --path_data \ + --path_data ``` This will launch the pipeline with the `docker/singularity/.../institute` configuration profile. See below for more information about profiles. +In your `outdir`, a folder named `myRun` will be created containing the results of the pipeline run. + +The `test_mode` parameter specifies the evaluation setting, e.g., `--test_mode LCO`. + +The `models` and `baselines` parameters are lists of models and baselines to be evaluated, e.g., +`--models ElasticNet,RandomForest --baselines NaivePredictor,NaiveCellLineMeanPredictor,NaiveDrugMeanPredictor`. + +The `dataset_name` parameter specifies the dataset to be used for evaluation, e.g., `--dataset_name GDSC2`. + +If you do not want to re-download the data every time you run the pipeline, you can specify the path to the data with +the `path_data` parameter, e.g., `--path_data /path/to/data`. + Note that the pipeline will create the following files in your working directory: ```bash @@ -32,7 +77,8 @@ work # Directory containing the nextflow working files # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` -If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, you can specify these in a params file. +If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, +you can specify these in a params file. Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. @@ -51,7 +97,6 @@ with: ```yaml title="params.yaml" models: 'ElasticNet' baselines: 'NaivePredictor,NaiveCellLineMeanPredictor,NaiveDrugMeanPredictor' -outdir: './results/' dataset_name: 'GDSC2' path_data: '/path/to/data' <...> @@ -59,6 +104,73 @@ path_data: '/path/to/data' You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). +### Available Models + +**Single-Drug Models** fit one model for each drug in the training set. They also cannot generalize to new drugs, +hence those models cannot be used in the LDO setting. **Multi-Drug Models** fit one model for all drugs in the training +set. They can be used in all three settings. + +The following models are available: + +| Model Name | Baseline / Published Model | Multi-Drug Model / Single-Drug Model | Description | +| -------------------------- | -------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| NaivePredictor | Baseline Method | Multi-Drug Model | Most simple method. Predicts the mean response of all drugs in the training set. | +| NaiveCellLineMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a cell line in the training set. | +| NaiveDrugMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a drug in the training set. | +| ElasticNet | Baseline Method | Multi-Drug Model | Fits an [Sklearn Elastic Net](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html), [Lasso](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html), or [Ridge](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html) model on gene expression data and drug fingerprints (concatenated input matrix). | +| GradientBoosting | Baseline Method | Multi-Drug Model | Fits an [Sklearn Gradient Boosting Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html) gene expression data and drug fingerprints. | +| RandomForest | Baseline Method | Multi-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression data and drug fingerprints. | +| MultiOmicsRandomForest | Baseline Method | Multi-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression, methylation, mutation, copy number variation data, and drug fingerprints (concatenated matrix). The dimensionality of the methylation data is reduced with a PCA to the first 100 components before it is fed to the model. | +| SingleDrugRandomForest | Baseline Method | Single-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression data for each drug separately. | +| SVR | Baseline Method | Multi-Drug Model | Fits an [Sklearn Support Vector Regressor](https://scikit-learn.org/1.5/modules/generated/sklearn.svm.SVR.html) gene expression data and drug fingerprints. | +| SimpleNeuralNetwork | Baseline Method | Multi-Drug Model | Fits a simple feedforward neural network (implemented with [Pytorch Lightning](https://lightning.ai/docs/pytorch/stable/)) on gene expression and drug fingerprints (concatenated input) with 3 layers of varying dimensions and Dropout layers. | +| MultiOmicsNeuralNetwork | Baseline Method | Multi-Drug Model | Fits a simple feedforward neural network (implemented with [Pytorch Lightning](https://lightning.ai/docs/pytorch/stable/)) on gene expression, methylation, mutation, copy number variation data, and drug fingerprints (concatenated input) with 3 layers of varying dimensions and Dropout layers. The dimensionality of the methylation data is reduced with a PCA to the first 100 components before it is fed to the model. | +| SRMF | Published Model | Multi-Drug Model | [Similarity Regularization Matrix Factorization](https://doi.org/10.1186/s12885-017-3500-5) model by Wang et al. on gene expression data and drug fingerprints. Re-implemented Matlab code into Python. The basic idea is represent each drug and each cell line by their respective similarities to all other drugs/cell lines. Those similarities are mapped into a shared latent low-dimensional space from which responses are predicted. | +| MOLIR | Published Model | Single-Drug Model | Regression extension of [MOLI: multi-omics late integration deep neural network.](https://doi.org/10.1093/bioinformatics/btz318) by Sharifi-Noghabi et al. Takes somatic mutation, copy number variation and gene expression data as input. MOLI reduces the dimensionality of each omics type with a hidden layer, concatenates them into one representation and optimizes this representation via a combined cost function consisting of a triplet loss and a binary cross-entropy loss. We implemented a regression adaption with MSE loss and an adapted triplet loss for regression. | +| SuperFELTR | Published Model | Single-Drug Model | Regression extension of [SuperFELT: supervised feature extraction learning using triplet loss for drug response](https:://doi.org/10.1186/s12859-021-04146-z) by Park et al. Very similar to MOLI(R). In MOLI(R), encoders and the classifier were trained jointly. Super.FELT(R) trains them independently. MOLI(R) was trained without feature selection (except for the Variance Threshold on the gene expression). Super.FELT(R) uses feature selection for all omics data. | +| DIPK | Published Model | Multi-Drug Model | [Deep neural network Integrating Prior Knowledge](https://doi.org/10.1093/bib/bbae153) from Li et al. Uses gene interaction relationships (encoded by a graph auto-encoder), gene expression profiles (encoded by a denoising auto-encoder), and molecular topologies (encoded by MolGNet). Those features are integrated using multi-head attention layers. | + +### Available Datasets + +The following datasets are available and can be supplied via `--dataset_name`: + +| Dataset Name | Number of drugs | Number of Cell Lines | Description | +| ------------ | --------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------- | +| GDSC1 | 345 | 987 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 1. | +| GDSC2 | 192 | 809 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 2. | +| CCLE | 18 | 471 | The Cancer Cell Line Encyclopedia (CCLE) dataset. The response data will soon be replaced with the data from CTRPv2. | + +Our pipeline also supports cross-study prediction, i.e., training on one dataset and testing on another (or multiple +others) to assess the generalization of the model. This dataset name can be supplied via `--cross_study_datasets`. + +### Available Randomization Tests + +We have several randomization modes and types available. + +The modes are supplied via `--randomization_mode` and the types via `--randomization_type`.: + +- **SVCC: Single View Constant for Cell Lines:** A single cell line view (e.g., gene expression) is held unperturbed + while the others are randomized. +- **SVCD: Single View Constant for Drugs:** A single drug view (e.g., drug fingerprints) is held unperturbed while the + others are randomized. +- **SVRC: Single View Random for Cell Lines:** A single cell line view (e.g., gene expression) is randomized while the + others are held unperturbed. +- **SVRD: Single View Random for Drugs:** A single drug view (e.g., drug fingerprints) is randomized while the others + are held unperturbed. + +Currently, we support two ways of randomizing the data. The default is permututation. + +- **Permutation**: Permutes the features over the instances, keeping the distribution of the features the same but + dissolving the relationship to the target. +- **Invariant**: The randomization is done in a way that a key characteristic of the feature is preserved. In case + of matrices, this is the mean and standard deviation of the feature view for this instance, for networks it is the + degree distribution. + +### Robustness Tests + +The robustness test is a test where the model is trained with varying seeds. This is done multiple times to see how +stable the model is. Via `--n_trials_robustness`, you can specify the number of trials for the robustness tests. + ### Updating the pipeline When you run the above command, Nextflow automatically pulls the pipeline code from GitHub and stores it as a cached version. When running the pipeline after this, it will always use the cached version if available - even if the pipeline has been updated since. To make sure that you're running the latest version of the pipeline, make sure that you regularly update the cached version of the pipeline: From f0f9417be3d6da54828aa5ba907cc76b90bd99d8 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 22 Nov 2024 17:54:52 +0100 Subject: [PATCH 118/257] Proper output documentation, removed unnecessary statements in the module files --- conf/modules.config | 49 +-- docs/output.md | 313 ++++++++++++++++-- docs/usage.md | 2 +- modules/local/collect_results/main.nf | 6 - modules/local/cv_split/main.nf | 4 - modules/local/draw_corr_comp/main.nf | 5 - .../local/draw_critical_difference/main.nf | 5 - modules/local/draw_heatmap/main.nf | 5 - modules/local/draw_regression/main.nf | 5 - modules/local/draw_violin/main.nf | 5 - modules/local/evaluate_final/main.nf | 6 - modules/local/evaluate_find_max/main.nf | 4 - modules/local/hpam_split/main.nf | 4 - modules/local/load_response/main.nf | 6 +- modules/local/make_model_channel/main.nf | 6 +- modules/local/params_check/main.nf | 6 - modules/local/predict_full/main.nf | 4 - modules/local/randomization_split/main.nf | 4 - modules/local/randomization_test/main.nf | 4 - modules/local/robustness_test/main.nf | 4 - modules/local/save_tables/main.nf | 5 - modules/local/write_html/main.nf | 5 - modules/local/write_index/main.nf | 6 - 23 files changed, 319 insertions(+), 144 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 13057f3..5dba3ba 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -52,29 +52,38 @@ process { withName: 'HPAM_SPLIT' { publishDir = [ - path: { params.save_datasets ? "${params.path_data}/${params.run_id}/hpams" : params.path_data }, + path: params.outdir, mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } + saveAs: { filename -> null } ] } withName: 'TRAIN_AND_PREDICT_CV' { publishDir = [ - path: { params.save_datasets ? "${params.path_data}/${params.run_id}/datasets" : params.path_data }, + path: params.outdir, mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } + saveAs: { filename -> null } ] ext.use_gpu = { [ 'SimpleNeuralNetwork', 'MultiOmicsNeuralNetwork', 'MOLIR', - 'SuperFELTR' + 'SuperFELTR', + 'DIPK' ].contains( model_name.split( '\\.' )[0] ) } } + withName: 'EVALUATE_FIND_MAX' { + publishDir = [ + path: params.outdir, + mode: params.publish_dir_mode, + saveAs: { filename -> null } + ] + } + withName: 'PREDICT_FULL' { ext.use_gpu = { [ 'SimpleNeuralNetwork', @@ -85,12 +94,21 @@ process { } } + withName: 'RANDOMIZATION_SPLIT' { + publishDir = [ + path: params.outdir, + mode: params.publish_dir_mode, + saveAs: { filename -> null } + ] + } + withName: 'RANDOMIZATION_TEST' { ext.use_gpu = { [ 'SimpleNeuralNetwork', 'MultiOmicsNeuralNetwork', 'MOLIR', - 'SuperFELTR' + 'SuperFELTR', + 'DIPK' ].contains( model_name.split( '\\.' )[0] ) } } @@ -100,27 +118,12 @@ process { 'SimpleNeuralNetwork', 'MultiOmicsNeuralNetwork', 'MOLIR', - 'SuperFELTR' + 'SuperFELTR', + 'DIPK' ].contains( model_name.split( '\\.' )[0] ) } } - withName: 'EVALUATE_FIND_MAX' { - publishDir = [ - path: { params.save_datasets ? "${params.path_data}/${params.run_id}/datasets" : params.path_data }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } - ] - } - - withName: 'RANDOMIZATION_SPLIT' { - publishDir = [ - path: { params.save_datasets ? "${params.path_data}/${params.run_id}/datasets" : params.path_data }, - mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } - ] - } - withName: 'EVALUATE_FINAL' { publishDir = [ path: params.outdir, diff --git a/docs/output.md b/docs/output.md index f086882..b0c6b9e 100644 --- a/docs/output.md +++ b/docs/output.md @@ -2,45 +2,312 @@ ## 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. - - +The directories listed below will be created in the results directory after the pipeline has finished. +All paths are relative to the top-level results directory. ## Pipeline overview The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -1. [Load response](#load-response) The response data is loaded -2. All models are trained and evaluated in a cross-validation setting -3. For each CV split, the best hyperparameters are determined using a grid search per model -4. The model is trained on the full training set (train & validation) with the best - hyperparameters to predict the test set -5. If randomization tests are enabled, the model is trained on the full training set with the best - hyperparameters to predict the randomized test set -6. If robustness tests are enabled, the model is trained N times on the full training set with the - best hyperparameters -7. Plots are created summarizing the results -8. [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +1. [Parameter check](#parameter-check): Several parameters are validated to ensure that the pipeline can run + successfully. +2. `RUN_CV` subworkflow: Finds the optimal hyperparameters for each model in a cross-validation setting. + - [Load response](#load-response): The response data is loaded. + - [CV split](#cv-split): The response data is split into cross-validation folds. + - [Make model channel](#make-model-channel): From the input baseline and model names, channels are created. This + step is necessary because for the Single-Drug Models, one model has to be created per drug. + - [HPAM split](#hyperparameter-split): One YAML file is created per model and hyperparameter combination to be + tested. + - [Train and predict CV](#train-and-predict-cv): All models are trained and evaluated in a cross-validation setting. + - [Evaluate and find max](#evaluate-and-find-max): For each CV split, the best hyperparameters are determined + using a grid search per model +3. `MODEL_TESTING` subworkflow: The best hyperparameters are used to train the models on the full training set + and predict the test set. Optionally, randomization and robustness testes are performed. + - [Predict full](#predict-full): The model is trained on the full training set (train & validation) with the best + hyperparameters to predict the test set. + - [Randomization split](#randomization-split): Makes a channel per randomization to be tested. + - [Randomization test](#randomization-test): If randomization tests are enabled, the model is trained on the full + training set with the best hyperparameters to predict the randomized test set. + - [Robustness test](#robustness-test): If robustness tests are enabled, the model is trained N times on the full + training set with the best hyperparameters + - [Consolidate results](#consolidate-results): The results of the model testing are consolidated into a single + table for each model. + - [Evaluate final](#evaluate-final): The performance of the models is calculated on the test set results. + - [Collect results](#collect-results): The results of the evaluation metrics per model are collected into four + overview tables. +4. `VISUALIZATION` subworkflow: Plots are created summarizing the results. + - [Critical difference plot](#critical-difference): A critical difference plot is created to compare the performance + of the models. + - [Violin plot](#violin-plot): A violin plot is created to compare the performance of the models over the CV folds. + - [Heatmap](#heatmap): A heatmap is created to compare the average performance of the models over the CV folds. + - [Correlation comparison](#correlation-comparison): Renders a plot in which the per-drug/per-cell line + correlations between y_true and y_predicted are compared between different models. + - [Regression plots](#regression-plots): Plots in which the y_true and y_predicted values are compared between + different models. + - [Save tables](#save-tables): Saves the performance metrics of the models in a table. + - [Write html](#write-html): Writes the plots to an HTML file per setting (LPO/LCO/LDO). + - [Write index](#write-index): Writes an index.html file that links to all the HTML files. +5. [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution + +### Parameter check + +The process `PARAMS_CHECK` performs the following checks: + +- `--models` / `--baselines`: Check if the model and baseline names are valid (for valid names, see the [usage](usage.md) page). +- `--test_mode`: Check whether the test mode is LPO, LCO, LDO or a combination of these. +- `--dataset_name`: Check if the dataset name is valid, i.e., GDSC1, GDSC2, or CCLE. +- `--cross_study_datasets`: If supplied, check if the datasets are valid, i.e., GDSC1, GDSC2, or CCLE or a + combination of these. +- `--n_cv_splits`: Check if the number of cross-validation splits is a positive integer > 1. +- `--randomization_mode`: If supplied, checks if the randomization is SVCC, SVCD, SVRC, SVRD, or a combination of these. +- `--randomization_type`: If supplied, checks if the randomization type is valid, i.e., permutation or invariant. +- `--n_trials_robustness`: Checks if the number of trials for robustness tests is >= 0. +- `--optim_metric`: Checks if the optimization metric is either MSE, RMSE, MAE, R^2, Pearson, Spearman, Kendall, or + Partial_Correlation. +- `--response_transformation`: If supplied, checks whether the response transformation is either standard, + minmax, or robust. + +It emits the path to the data but mostly so that the other processes wait for `PARAMS_CHECK` to finish before starting. -### Load response +### Subworkflow `RUN_CV` + +#### Load response The response data is loaded into the pipeline. This step is necessary to provide the pipeline with the response data that will be used to train and evaluate the models. -### Train and evaluate models +
        +Optional output files if --save_datasets is set + +- `response_dataset.pkl`: The response data is saved as a pickle file. +- `cross_study_*.pkl`: The response data for the cross-study datasets is saved as a pickle file. + +
        + +#### CV split + +The response data is split into as many cross-validation folds as specified over the `--n_cv_splits` parameter. +The data is split into training, validation, and test sets for each fold. For models using early stopping, the early +stopping dataset is split from the validation set. This ensures that all models are trained and evaluated on the +same dataset. + +
        +Optional output file if --save_datasets is set + +- `split*.pkl`: The response data belonging to each fold is saved as a pickle file. + +
        + +#### Make model channel + +From the input baseline and model names, channels are created. This step is necessary because for the +Single-Drug Models, one model has to be created per drug. The model name then becomes the name of the model and the +drug, separated by a dot, e.g., `MOLIR.Drug1`. All of these models should be able to be trained in parallel +which is why they should be individual elements in the channel. + +#### Hyperparameter split + +One YAML file is created per model and hyperparameter combination to be tested. This ensures that all hyperparameter +can be tested in parallel. + +#### Train and predict CV + +A model is trained in the specified test mode, on the specific cross-validation split with the specified +hyperparameter combination. + +As soon as the GPU support is available, the training and prediction will be done on the GPU for the models +SimpleNeuralNetwork, MultiOmicsNeuralNetwork, MOLIR, SuperFELTR, and DIPK. + +#### Evaluate and find max + +Over all hyperparameter combinations, the best hyperparameters for a specific cross-validation split are determined. +The best hyperparameters are determined based on the optimization metric specified via `--optim_metric`. + +### Subworkflow `MODEL_TESTING` + +### Predict full + +The model is trained on the full training set (train & validation) per split with the best hyperparameters to predict +the test set of the CV split. If specified via `--cross_study_datasets`, the cross-study datasets are also +predicted. + +
        +Output files + +- `**predictions*.csv`: CSV file with the predicted response values for the test set. +- `**cross_study/cross_study*.csv`: CSV file with the predicted response values for the cross-study datasets. +- `**best_hpams*.json`: JSON file with the best hyperparameters for the model. + +
        + +#### Randomization split + +Takes the `--randomization_mode` as input and creates a channel for each randomization to be tested. This ensures that +all randomizations can be tested in parallel. + +#### Randomization test + +Trains the model on the randomized training + validation set with the best hyperparameters to predict the +unperturbed test set of the specified CV split. How the data is randomized is determined by the +`--randomization_type`. + +As soon as GPU support is available, the training and prediction will be done on the GPU for +the models SimpleNeuralNetwork, MultiOmicsNeuralNetwork, MOLIR, SuperFELTR, and DIPK. + +
        +Output files + +- `**randomization*.csv`: CSV file with the predicted response values for the randomization test. + +
        + +#### Robustness test + +Trains the model `--n_trials_robustness` times on the full training set with the best hyperparameters to predict the test set of the +specific CV split. + +As soon as GPU support is available, the training and prediction will be done on the GPU for the models +SimpleNeuralNetwork, MultiOmicsNeuralNetwork, MOLIR, SuperFELTR, and DIPK. + +
        +Output files + +- `**robustness*.csv`: CSV file with the predicted response values for the robustness test. + +
        + +#### Consolidate results + +For Single-Drug Models, the results of the model testing are consolidated such that their results look like the +results of the Multi-Drug Models. + +
        +Output files + +- `**predictions*.csv`: CSV file with the consolidated predicted response values for the test set. +- `**cross_study/cross_study*.csv`: CSV file with the consolidated predicted response values for the cross-study + datasets. +- `**randomization*.csv`: CSV file with the consolidated predicted response values for the randomization test. +- `**robustness*.csv`: CSV file with the consolidated predicted response values for the robustness test. + +
        + +#### Evaluate final + +Calculates various performance metrics on the given test set results, including RMSE, MSE, MAE, R^2, Pearson +Correlation, Spearman Correlation, Kendall Correlation, and Partial Correlation. + +#### Collect results -All models are trained and evaluated in a cross-validation setting. The models are trained on the training set and evaluated on the validation set. The performance of the models is evaluated using various metrics such as accuracy, precision, recall, F1-score, and ROC-AUC. +Collapses the results from above into four overview tables: `evaluation_results.csv`, `evaluation_results_per_drug. +csv`, `evaluation_results_per_cell_line.csv`, and `true_vs_pred.csv`. -### Determine best hyperparameters +
        +Output files + +- `evaluation_results.csv`: Overall performance metrics. One value per model per CV fold and setting (LPO/LCO/LDO, + full predictions, randomizations, robustness, cross-study predictions). +- `evaluation_results_per_drug.csv`: Performance metrics calculated per drug. +- `evaluation_results_per_cell_line.csv`: Performance metrics calculated per cell line. +- `true_vs_pred.csv`: true vs predicted values for each model. + +
        + +### Subworkflow `VISUALIZATION` + +#### Critical difference + +The critical difference plot measures whether a model is significantly better than another model measured over its +average rank over all CV folds. + +
        +Output files + +- `critical_difference*.svg`: SVG file with the critical difference plot. + +
        + +#### Violin plot + +The violin shows the distribution of the performance metrics over the CV folds. This plot is rendered overall for +all real predictions and once per algorithm to compare the real predictions against, e.g., the randomization results. + +
        +Output files + +- `violin*.html`: HTML file with the violin plot. + +
        + +#### Heatmap + +The heatmap shows the average performance of the models over the CV folds. This plot is rendered overall for all +real predictions and once per algorithm to compare the real predictions against, e.g., the randomization results. + +
        +Output files + +- `heatmap*.html`: HTML file with the violin plot. + +
        + +#### Correlation comparison + +Renders a plot in which the per-drug/per-cell line correlations between y_true and y_predicted are compared between +different models. + +
        +Output files -### Train model on full training set +- `corr_comp_scatter*.html`: HTML file with the violin plot. -### Randomization tests +
        -### Robustness tests +#### Regression plots -### Create plots +Plots in which the y_true and y_predicted values are compared between different models. + +
        +Output files + +- `regression_lines*.html`: HTML file with the violin plot. + +
        + +#### Save tables + +Saves the performance metrics of the models in an html table. + +
        +Output files + +- `table*.html`: HTML file with the violin plot. + +
        + +#### Write html + +Creates a summary HTML file per setting (LPO/LCO/LDO) that contains all the plots and tables. + +
        +Output files + +- `{LPO,LCO,LPO}.html`: HTML file with the violin plot. + +
        + +#### Write index + +Writes an index.html file that links to all the HTML files. + +
        +Output files + +- `index.html`: HTML file with the violin plot. +- `*.png`: Some png files for the logo, etc. + +
        ### Pipeline information diff --git a/docs/usage.md b/docs/usage.md index 53dc9a8..6d84a78 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -33,7 +33,7 @@ Furthermore, we offer a variety of more advanced **baseline models** and some ** your model against. Similarly, we provide commonly used datasets to evaluate your model on (GDSC1, GDSC2, CCLE, CTRPv2). You can also provide your **own dataset or your own model by contributing to our PyPI package [drevalpy](https://github.com/daisybio/drevalpy.git)** Before contributing, you can pull our respective repositories. -More information will be supplied soon. +More information can be found in the [drevalpy readthedocs](https://drevalpy.readthedocs.io/en/latest/). We first identify the best hyperparameters for all models and baselines in a cross-validation setting. Then, we train the models on the whole training set and evaluate them on the test set. Furthermore, we offer randomization diff --git a/modules/local/collect_results/main.nf b/modules/local/collect_results/main.nf index 86e3d88..e426caf 100644 --- a/modules/local/collect_results/main.nf +++ b/modules/local/collect_results/main.nf @@ -1,13 +1,7 @@ process COLLECT_RESULTS { - //tag "${test_mode}_${model_name}_${pred_file}" label 'process_single' publishDir "${params.outdir}/${params.run_id}", mode: 'copy' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" - input: path(outfiles) diff --git a/modules/local/cv_split/main.nf b/modules/local/cv_split/main.nf index cc58dec..74b36d9 100644 --- a/modules/local/cv_split/main.nf +++ b/modules/local/cv_split/main.nf @@ -2,10 +2,6 @@ process CV_SPLIT { tag "$test_mode" label 'process_single' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" input: tuple val(test_mode), path(response) val n_cv_splits diff --git a/modules/local/draw_corr_comp/main.nf b/modules/local/draw_corr_comp/main.nf index 2361525..c0487f8 100644 --- a/modules/local/draw_corr_comp/main.nf +++ b/modules/local/draw_corr_comp/main.nf @@ -3,11 +3,6 @@ process DRAW_CORR_COMP { label 'process_single' publishDir "${params.outdir}/${params.run_id}/corr_comp_scatter", mode: 'copy' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" - input: tuple val(name), path(eval_results_per_group) diff --git a/modules/local/draw_critical_difference/main.nf b/modules/local/draw_critical_difference/main.nf index f8945aa..e06c486 100644 --- a/modules/local/draw_critical_difference/main.nf +++ b/modules/local/draw_critical_difference/main.nf @@ -3,11 +3,6 @@ process DRAW_CRITICAL_DIFFERENCE { label 'process_single' publishDir "${params.outdir}/${params.run_id}/critical_difference_plots", mode: 'copy' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" - input: tuple val(lpo_lco_ldo), path(eval_results) diff --git a/modules/local/draw_heatmap/main.nf b/modules/local/draw_heatmap/main.nf index a5cde8f..673562c 100644 --- a/modules/local/draw_heatmap/main.nf +++ b/modules/local/draw_heatmap/main.nf @@ -3,11 +3,6 @@ process DRAW_HEATMAP { label 'process_single' publishDir "${params.outdir}/${params.run_id}/heatmaps", mode: 'copy' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" - input: val(name) path(eval_results) diff --git a/modules/local/draw_regression/main.nf b/modules/local/draw_regression/main.nf index 83ccb61..d75e683 100644 --- a/modules/local/draw_regression/main.nf +++ b/modules/local/draw_regression/main.nf @@ -3,11 +3,6 @@ process DRAW_REGRESSION { label 'process_single' publishDir "${params.outdir}/${params.run_id}/regression_plots", mode: 'copy' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" - input: tuple val(name), val(model), path(true_vs_pred) diff --git a/modules/local/draw_violin/main.nf b/modules/local/draw_violin/main.nf index 2c5aa00..e9c71a3 100644 --- a/modules/local/draw_violin/main.nf +++ b/modules/local/draw_violin/main.nf @@ -3,11 +3,6 @@ process DRAW_VIOLIN { label 'process_single' publishDir "${params.outdir}/${params.run_id}/violin_plots", mode: 'copy' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" - input: val(name) path(eval_results) diff --git a/modules/local/evaluate_final/main.nf b/modules/local/evaluate_final/main.nf index b439ea0..aa252f8 100644 --- a/modules/local/evaluate_final/main.nf +++ b/modules/local/evaluate_final/main.nf @@ -1,12 +1,6 @@ process EVALUATE_FINAL { tag "${test_mode}_${model_name}_${pred_file}" label 'process_single' - //publishDir "${params.outdir}/${params.run_id}" - - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" input: tuple val(test_mode), val(model_name), path(pred_file) diff --git a/modules/local/evaluate_find_max/main.nf b/modules/local/evaluate_find_max/main.nf index 34acca5..c2637a3 100644 --- a/modules/local/evaluate_find_max/main.nf +++ b/modules/local/evaluate_find_max/main.nf @@ -2,10 +2,6 @@ process EVALUATE_FIND_MAX { tag "${test_mode}_${model_name}_${split_id}" label 'process_single' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" input: tuple val(model_name), val(test_mode), val(split_id), path(hpam_yamls), path(pred_datas) val metric diff --git a/modules/local/hpam_split/main.nf b/modules/local/hpam_split/main.nf index 70dc028..78d0002 100644 --- a/modules/local/hpam_split/main.nf +++ b/modules/local/hpam_split/main.nf @@ -2,10 +2,6 @@ process HPAM_SPLIT { tag "$model_name" label 'process_single' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" input: val model_name diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index 69790b9..6063252 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -1,12 +1,8 @@ process LOAD_RESPONSE { tag "${dataset_name} (cross: ${cross_study_datasets})" - //label 'process_single' + label 'process_single' publishDir "${path_data}", mode: 'copy' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" input: val dataset_name path path_data diff --git a/modules/local/make_model_channel/main.nf b/modules/local/make_model_channel/main.nf index aa8cf87..a9373aa 100644 --- a/modules/local/make_model_channel/main.nf +++ b/modules/local/make_model_channel/main.nf @@ -1,11 +1,7 @@ process MAKE_MODEL_CHANNEL { tag "Make model channel" - //label 'process_single' + label 'process_single' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" input: tuple val(models), path(response_data) val(name) diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index ecc6e63..7970b4d 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -1,12 +1,6 @@ process PARAMS_CHECK { - //tag "$samplesheet" label 'process_single' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" - input: val run_id val models diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 9d9b513..965fd11 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -4,10 +4,6 @@ process PREDICT_FULL { label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" input: tuple path(cross_study_datasets), val(model_name), val(test_mode), val(split_id), path(split_dataset), path(hpam_combi) val(response_transformation) diff --git a/modules/local/randomization_split/main.nf b/modules/local/randomization_split/main.nf index a71c426..2a8ec1d 100644 --- a/modules/local/randomization_split/main.nf +++ b/modules/local/randomization_split/main.nf @@ -2,10 +2,6 @@ process RANDOMIZATION_SPLIT { tag "${model_name}_${randomization_mode}" label 'process_single' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" input: tuple val(model_name), val(randomization_mode) diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index 7632fba..c9041ff 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -4,10 +4,6 @@ process RANDOMIZATION_TEST { label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" input: tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), path(randomization_views) path(path_data) diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index 7d40573..4f54593 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -4,10 +4,6 @@ process ROBUSTNESS_TEST { label 'process_gpu' publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" input: tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), val(robustness_iteration) path(path_data) diff --git a/modules/local/save_tables/main.nf b/modules/local/save_tables/main.nf index a42eef5..eec8ef4 100644 --- a/modules/local/save_tables/main.nf +++ b/modules/local/save_tables/main.nf @@ -3,11 +3,6 @@ process SAVE_TABLES { label 'process_single' publishDir "${params.outdir}/${params.run_id}/html_tables", mode: 'copy' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" - input: tuple val(lpo_lco_ldo), path(eval_results) diff --git a/modules/local/write_html/main.nf b/modules/local/write_html/main.nf index 06076f2..c9e703d 100644 --- a/modules/local/write_html/main.nf +++ b/modules/local/write_html/main.nf @@ -2,11 +2,6 @@ process WRITE_HTML { tag "${test_mode}" label 'process_single' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" - input: val(run_id) tuple val(test_mode), path(files) diff --git a/modules/local/write_index/main.nf b/modules/local/write_index/main.nf index 88b2d76..a5551e8 100644 --- a/modules/local/write_index/main.nf +++ b/modules/local/write_index/main.nf @@ -1,12 +1,6 @@ process WRITE_INDEX { - //tag "index" label 'process_single' - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" - input: val(run_id) val(test_modes) From 9839312de41c84de66dfc8a8d2121ed0d291d3b0 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 22 Nov 2024 18:01:30 +0100 Subject: [PATCH 119/257] change log for the pull request --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16ceb7c..0e50810 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,16 @@ Initial release of nf-core/drugresponseeval, created with the [nf-core](https:// ### `Added` +- Updated to the new template +- Added tests that run with docker, singularity, apptainer, and conda +- Added the docker container and the conda env.yml in the nextflow.config. We just need one container for all + processes as this pipeline automates the PyPI package drevalpy. +- Added usage and output documentation. + ### `Fixed` +- Fixed linting issues + ### `Dependencies` ### `Deprecated` From e01cbdcfe1555bd7c0dd4ebdee7f69518a141c28 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 22 Nov 2024 18:17:52 +0100 Subject: [PATCH 120/257] added citations for implemented and adapted drug response prediction models --- CITATIONS.md | 24 ++++++++++++++++++++---- docs/usage.md | 2 +- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 8dd7848..95debcc 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -1,5 +1,9 @@ # nf-core/drugresponseeval: Citations +## [DrugResponseEval](https://github.com/nf-core/drugresponseeval/) + +> Bernett, J, Iversen, P, Picciani, M, Wilhelm, M, Baum, K, List, M. Will be published soon. + ## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) > Ewels PA, Peltzer A, Fillinger S, Patel H, Alneberg J, Wilm A, Garcia MU, Di Tommaso P, Nahnsen S. The nf-core framework for community-curated bioinformatics pipelines. Nat Biotechnol. 2020 Mar;38(3):276-278. doi: 10.1038/s41587-020-0439-x. PubMed PMID: 32055031. @@ -10,13 +14,25 @@ ## Pipeline tools -- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) +- [DrEvalPy](https://github.com/daisybio/drevalpy) + + > Bernett, J, Iversen, P, Picciani, M, Wilhelm, M, Baum, K, List, M. Will be published soon. + +- [SRMF](https://doi.org/10.1186/s12885-017-3500-5) + + > Wang L, Li X, Zhang L, Gao Q. Improved anticancer drug response prediction in cell lines using matrix factorization with similarity regularization. BMC cancer. 2017 Dec;17:1-2. + +- [MOLI](https://doi.org/10.1093/bioinformatics/btz318) + + > Sharifi-Noghabi H, Zolotareva O, Collins CC, Ester M. MOLI: multi-omics late integration with deep neural networks for drug response prediction. Bioinformatics. 2019 Jul;35(14):i501-9. + +- [SuperFELT](https://doi.org/10.1186/s12859-021-04146-z) -> Andrews, S. (2010). FastQC: A Quality Control Tool for High Throughput Sequence Data [Online]. + > Park S, Soh J, Lee H. Super. FELT: supervised feature extraction learning using triplet loss for drug response prediction with multi-omics data. BMC bioinformatics. 2021 May 25;22(1):269. -- [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) +- [DIPK](https://doi.org/10.1093/bib/bbae153) -> 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. + > Li P, Jiang Z, Liu T, Liu X, Qiao H, Yao X. Improving drug response prediction via integrating gene relationships with deep learning. Briefings in Bioinformatics. 2024 May;25(3):bbae153. ## Software packaging/containerisation tools diff --git a/docs/usage.md b/docs/usage.md index 6d84a78..556df55 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -127,7 +127,7 @@ The following models are available: | MultiOmicsNeuralNetwork | Baseline Method | Multi-Drug Model | Fits a simple feedforward neural network (implemented with [Pytorch Lightning](https://lightning.ai/docs/pytorch/stable/)) on gene expression, methylation, mutation, copy number variation data, and drug fingerprints (concatenated input) with 3 layers of varying dimensions and Dropout layers. The dimensionality of the methylation data is reduced with a PCA to the first 100 components before it is fed to the model. | | SRMF | Published Model | Multi-Drug Model | [Similarity Regularization Matrix Factorization](https://doi.org/10.1186/s12885-017-3500-5) model by Wang et al. on gene expression data and drug fingerprints. Re-implemented Matlab code into Python. The basic idea is represent each drug and each cell line by their respective similarities to all other drugs/cell lines. Those similarities are mapped into a shared latent low-dimensional space from which responses are predicted. | | MOLIR | Published Model | Single-Drug Model | Regression extension of [MOLI: multi-omics late integration deep neural network.](https://doi.org/10.1093/bioinformatics/btz318) by Sharifi-Noghabi et al. Takes somatic mutation, copy number variation and gene expression data as input. MOLI reduces the dimensionality of each omics type with a hidden layer, concatenates them into one representation and optimizes this representation via a combined cost function consisting of a triplet loss and a binary cross-entropy loss. We implemented a regression adaption with MSE loss and an adapted triplet loss for regression. | -| SuperFELTR | Published Model | Single-Drug Model | Regression extension of [SuperFELT: supervised feature extraction learning using triplet loss for drug response](https:://doi.org/10.1186/s12859-021-04146-z) by Park et al. Very similar to MOLI(R). In MOLI(R), encoders and the classifier were trained jointly. Super.FELT(R) trains them independently. MOLI(R) was trained without feature selection (except for the Variance Threshold on the gene expression). Super.FELT(R) uses feature selection for all omics data. | +| SuperFELTR | Published Model | Single-Drug Model | Regression extension of [SuperFELT: supervised feature extraction learning using triplet loss for drug response](https://doi.org/10.1186/s12859-021-04146-z) by Park et al. Very similar to MOLI(R). In MOLI(R), encoders and the classifier were trained jointly. Super.FELT(R) trains them independently. MOLI(R) was trained without feature selection (except for the Variance Threshold on the gene expression). Super.FELT(R) uses feature selection for all omics data. | | DIPK | Published Model | Multi-Drug Model | [Deep neural network Integrating Prior Knowledge](https://doi.org/10.1093/bib/bbae153) from Li et al. Uses gene interaction relationships (encoded by a graph auto-encoder), gene expression profiles (encoded by a denoising auto-encoder), and molecular topologies (encoded by MolGNet). Those features are integrated using multi-head attention layers. | ### Available Datasets From 268ba9597728d4afb55f40b1705a95e9ac97b241 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 25 Nov 2024 09:32:34 +0100 Subject: [PATCH 121/257] trying to fix version comment --- .../workflows/template_version_comment.yml | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/template_version_comment.yml b/.github/workflows/template_version_comment.yml index 9dea41f..e8aafe4 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). # From aafd92a31573e39e9eef16102ea57010f62bc7ed Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 25 Nov 2024 09:42:13 +0100 Subject: [PATCH 122/257] trying to fix ci.yml --- .github/workflows/ci.yml | 94 ++++++++++++++++++++++++++++++++-------- 1 file changed, 77 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6f061ea..3759130 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,12 @@ on: env: NXF_ANSI_LOG: false + NFT_VER: "0.9.1" + NFT_WORKDIR: "~" + NFT_DIFF: "pdiff" + NFT_DIFF_ARGS: "--line-numbers --width 120 --expand-tabs=2" + NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity + NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" @@ -18,42 +24,96 @@ 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/drugresponseeval') }}" runs-on: ubuntu-latest strategy: + fail-fast: false matrix: NXF_VER: - "24.04.2" - "latest-everything" + shard: [1, 2, 3, 4, 5] + filter: [pipeline, workflow] + profile: + - "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 + with: + fetch-depth: 0 - - 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: Install pdiff to see diff between nf-test snapshots + run: | + python -m pip install --upgrade pip + pip install pdiff + + - uses: nf-core/setup-nf-test@v1 + with: + version: ${{ env.NFT_VER }} + + - name: Set up Apptainer + if: matrix.profile == 'singularity' + uses: eWaterCycle/setup-apptainer@main + + - name: Set up Singularity + if: matrix.profile == 'singularity' + run: | + 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 (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 Conda + if: matrix.profile == 'conda' run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results + echo $(realpath $CONDA)/condabin >> $GITHUB_PATH + echo $(realpath python) >> $GITHUB_PATH - - name: Run pipeline with test data (singularity) - # TODO nf-core: You can customise CI pipeline run tests as required + - name: Clean up Disk space + uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 + + - name: Run Tests (Shard ${{ matrix.shard }}/${{ strategy.job-total }}) run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,singularity --outdir ./results - if: "${{ github.base_ref == 'master' }}" + nf-test test \ + --ci \ + --shard ${{ matrix.shard }}/${{ strategy.job-total }} \ + --changed-since HEAD^ \ + --profile "+${{ matrix.profile }}" \ + --filter ${{ matrix.filter }} - - name: Run pipeline with test data (conda) - # TODO nf-core: You can customise CI pipeline run tests as required + - name: Output log on failure + if: failure() run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,conda --outdir ./results - if: "${{ github.base_ref == 'master' }}" + sudo apt install bat > /dev/null + batcat --decorations=always --color=always ${{ github.workspace }}/.nf-test/tests/*/meta/nextflow.log + + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3 + if: always() # always run even if the previous step fails + with: + report_paths: test.xml From 95cde66ad4ae49554a3721d7c67c0f9663bd229e Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 25 Nov 2024 09:47:32 +0100 Subject: [PATCH 123/257] trying to fix ci.yml --- .github/workflows/ci.yml | 112 +++++++++++++++++++++++---------------- 1 file changed, 67 insertions(+), 45 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3759130..14e96ef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,32 +1,50 @@ name: nf-core CI # This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors on: - push: - branches: - - dev pull_request: release: types: [published] workflow_dispatch: env: - NXF_ANSI_LOG: false - NFT_VER: "0.9.1" - NFT_WORKDIR: "~" NFT_DIFF: "pdiff" NFT_DIFF_ARGS: "--line-numbers --width 120 --expand-tabs=2" + NFT_VER: "0.9.0" + NFT_WORKDIR: "~" + 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 }}" cancel-in-progress: true - jobs: + nf-test-changes: + name: Check for changes + runs-on: ubuntu-latest + outputs: + nf_test_files: ${{ steps.list.outputs.components }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: List nf-test files + id: list + uses: adamrtalbot/detect-nf-test-changes@v0.0.2 + with: + head: ${{ github.sha }} + base: origin/${{ github.base_ref }} + include: .github/include.yaml + + - name: print list of nf-test files + run: | + echo ${{ steps.list.outputs.components }} + test: - 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/drugresponseeval') }}" + name: "Run tests (${{ matrix.nf_test_files }} ${{ matrix.profile }} NF-${{ matrix.NXF_VER }})" + needs: [nf-test-changes] + if: needs.nf-test-changes.outputs.nf_test_files != '[]' runs-on: ubuntu-latest strategy: fail-fast: false @@ -34,41 +52,27 @@ jobs: NXF_VER: - "24.04.2" - "latest-everything" - shard: [1, 2, 3, 4, 5] - filter: [pipeline, workflow] + nf_test_files: ["${{ fromJson(needs.nf-test-changes.outputs.nf_test_files) }}"] profile: - "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" + - NXF_VER: "latest-everything" + profile: "singularity" steps: - name: Check out pipeline code uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - with: - fetch-depth: 0 - name: Set up Nextflow uses: nf-core/setup-nextflow@v2 with: version: "${{ matrix.NXF_VER }}" - - name: Install pdiff to see diff between nf-test snapshots - run: | - python -m pip install --upgrade pip - pip install pdiff - - - uses: nf-core/setup-nf-test@v1 - with: - version: ${{ env.NFT_VER }} - - name: Set up Apptainer if: matrix.profile == 'singularity' uses: eWaterCycle/setup-apptainer@main @@ -79,32 +83,32 @@ jobs: 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 + - name: Install nf-test + uses: nf-core/setup-nf-test@v1 with: - miniconda-version: "latest" - auto-update-conda: true - conda-solver: libmamba - channels: conda-forge,bioconda + version: ${{ env.NFT_VER }} - - name: Set up Conda - if: matrix.profile == 'conda' + - uses: actions/setup-python@v4 + with: + python-version: "3.10" + architecture: "x64" + + - name: Install pdiff to see diff between nf-test snapshots run: | - echo $(realpath $CONDA)/condabin >> $GITHUB_PATH - echo $(realpath python) >> $GITHUB_PATH + python -m pip install --upgrade pip + pip install pdiff - name: Clean up Disk space uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - name: Run Tests (Shard ${{ matrix.shard }}/${{ strategy.job-total }}) + - name: Run nf-test run: | - nf-test test \ - --ci \ - --shard ${{ matrix.shard }}/${{ strategy.job-total }} \ - --changed-since HEAD^ \ - --profile "+${{ matrix.profile }}" \ - --filter ${{ matrix.filter }} + nf-test test --verbose ${{ matrix.nf_test_files }} --profile "+${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap + + - uses: pcolby/tap-summary@v1 + with: + path: >- + test.tap - name: Output log on failure if: failure() @@ -117,3 +121,21 @@ jobs: if: always() # always run even if the previous step fails with: report_paths: test.xml + + confirm-pass: + runs-on: ubuntu-latest + needs: [test] + if: always() + steps: + - name: All tests ok + if: ${{ !contains(needs.*.result, 'failure') }} + run: exit 0 + - name: One or more tests failed + if: ${{ contains(needs.*.result, 'failure') }} + run: exit 1 + + - name: debug-print + if: always() + run: | + echo "toJSON(needs) = ${{ toJSON(needs) }}" + echo "toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" From 4af82b0ecbc2dfd4db331d8f89da302836e4c4fd Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 25 Nov 2024 09:51:54 +0100 Subject: [PATCH 124/257] rolling back ci.yml --- .github/workflows/ci.yml | 126 +++++++-------------------------------- 1 file changed, 22 insertions(+), 104 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 14e96ef..6f061ea 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,141 +1,59 @@ name: nf-core CI # This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors on: + push: + branches: + - dev pull_request: release: types: [published] workflow_dispatch: env: - NFT_DIFF: "pdiff" - NFT_DIFF_ARGS: "--line-numbers --width 120 --expand-tabs=2" - NFT_VER: "0.9.0" - NFT_WORKDIR: "~" 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 }}" cancel-in-progress: true -jobs: - nf-test-changes: - name: Check for changes - runs-on: ubuntu-latest - outputs: - nf_test_files: ${{ steps.list.outputs.components }} - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: List nf-test files - id: list - uses: adamrtalbot/detect-nf-test-changes@v0.0.2 - with: - head: ${{ github.sha }} - base: origin/${{ github.base_ref }} - include: .github/include.yaml - - - name: print list of nf-test files - run: | - echo ${{ steps.list.outputs.components }} +jobs: test: - name: "Run tests (${{ matrix.nf_test_files }} ${{ matrix.profile }} NF-${{ matrix.NXF_VER }})" - needs: [nf-test-changes] - if: needs.nf-test-changes.outputs.nf_test_files != '[]' + name: Run pipeline with test data + # Only run on push if this is the nf-core dev branch (merged PRs) + if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/drugresponseeval') }}" runs-on: ubuntu-latest strategy: - fail-fast: false matrix: NXF_VER: - "24.04.2" - "latest-everything" - nf_test_files: ["${{ fromJson(needs.nf-test-changes.outputs.nf_test_files) }}"] - profile: - - "docker" - - "singularity" - isMaster: - - ${{ github.base_ref == 'master' }} - # Exclude conda and singularity on dev - exclude: - - isMaster: false - profile: "singularity" - - NXF_VER: "latest-everything" - profile: "singularity" steps: - name: Check out pipeline code uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 - - name: Set up Nextflow + - name: Install Nextflow uses: nf-core/setup-nextflow@v2 with: version: "${{ matrix.NXF_VER }}" - - name: Set up Apptainer - if: matrix.profile == 'singularity' - uses: eWaterCycle/setup-apptainer@main - - - name: Set up Singularity - if: matrix.profile == 'singularity' - run: | - mkdir -p $NXF_SINGULARITY_CACHEDIR - mkdir -p $NXF_SINGULARITY_LIBRARYDIR - - - name: Install nf-test - uses: nf-core/setup-nf-test@v1 - with: - version: ${{ env.NFT_VER }} - - - uses: actions/setup-python@v4 - with: - python-version: "3.10" - architecture: "x64" - - - name: Install pdiff to see diff between nf-test snapshots - run: | - python -m pip install --upgrade pip - pip install pdiff - - - name: Clean up Disk space + - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - name: Run nf-test + - 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: | - nf-test test --verbose ${{ matrix.nf_test_files }} --profile "+${{ matrix.profile }}" --junitxml=test.xml --tap=test.tap - - - uses: pcolby/tap-summary@v1 - with: - path: >- - test.tap + nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results - - name: Output log on failure - if: failure() + - name: Run pipeline with test data (singularity) + # TODO nf-core: You can customise CI pipeline run tests as required run: | - sudo apt install bat > /dev/null - batcat --decorations=always --color=always ${{ github.workspace }}/.nf-test/tests/*/meta/nextflow.log - - - name: Publish Test Report - uses: mikepenz/action-junit-report@v3 - if: always() # always run even if the previous step fails - with: - report_paths: test.xml - - confirm-pass: - runs-on: ubuntu-latest - needs: [test] - if: always() - steps: - - name: All tests ok - if: ${{ !contains(needs.*.result, 'failure') }} - run: exit 0 - - name: One or more tests failed - if: ${{ contains(needs.*.result, 'failure') }} - run: exit 1 + nextflow run ${GITHUB_WORKSPACE} -profile test,singularity --outdir ./results + if: "${{ github.base_ref == 'master' }}" - - name: debug-print - if: always() + - name: Run pipeline with test data (conda) + # TODO nf-core: You can customise CI pipeline run tests as required run: | - echo "toJSON(needs) = ${{ toJSON(needs) }}" - echo "toJSON(needs.*.result) = ${{ toJSON(needs.*.result) }}" + nextflow run ${GITHUB_WORKSPACE} -profile test,conda --outdir ./results + if: "${{ github.base_ref == 'master' }}" From 29c8d0d407c24c48a22173677da2dc3d1ccd0cef Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 25 Nov 2024 09:59:15 +0100 Subject: [PATCH 125/257] does this template_version_comment.yml update now? --- .github/workflows/template_version_comment.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/template_version_comment.yml b/.github/workflows/template_version_comment.yml index e8aafe4..ad95636 100644 --- a/.github/workflows/template_version_comment.yml +++ b/.github/workflows/template_version_comment.yml @@ -2,7 +2,8 @@ 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 +on: + pull_request: jobs: template_version: From 238ea4665979e119e49289809507708e928de2ee Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Mon, 25 Nov 2024 10:39:39 +0100 Subject: [PATCH 126/257] Remove unnecessary statements in .nf-core.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matthias Hörtenhuber --- .nf-core.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index a06ac73..bad883f 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -10,8 +10,6 @@ lint: files_unchanged: - .github/CONTRIBUTING.md - assets/sendmail_template.txt - - .github/CONTRIBUTING.md - - assets/sendmail_template.txt multiqc_config: false nf_core_version: 3.0.2 org_path: null From 87db9b1312e651a1b90941761a81edd2149cd2ee Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Mon, 25 Nov 2024 10:40:30 +0100 Subject: [PATCH 127/257] remove unnecessary statements in .nf-core.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matthias Hörtenhuber --- .nf-core.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index bad883f..741acee 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -4,9 +4,6 @@ lint: - conf/igenomes.config - conf/igenomes_ignored.config - assets/multiqc_config.yml - - conf/igenomes.config - - conf/igenomes_ignored.config - - assets/multiqc_config.yml files_unchanged: - .github/CONTRIBUTING.md - assets/sendmail_template.txt From 1857efa8c12558d1fc8ebf2595f8121d65816690 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 25 Nov 2024 10:47:38 +0100 Subject: [PATCH 128/257] sorted the cited implemented tools alphabetically, renamed the pipeline picture and added more alt-text --- CITATIONS.md | 16 ++++++++-------- README.md | 2 +- ...=> drugresponseeval_pipeline_simplified.png} | Bin 3 files changed, 9 insertions(+), 9 deletions(-) rename assets/{DrEval_pipeline_simplified.png => drugresponseeval_pipeline_simplified.png} (100%) diff --git a/CITATIONS.md b/CITATIONS.md index 95debcc..53b3aca 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -14,25 +14,25 @@ ## Pipeline tools -- [DrEvalPy](https://github.com/daisybio/drevalpy) +- [DrEvalPy](https://github.com/daisybio/drevalpy): The pipeline mostly automates the individual steps of the DrEvalPy PyPI package. > Bernett, J, Iversen, P, Picciani, M, Wilhelm, M, Baum, K, List, M. Will be published soon. -- [SRMF](https://doi.org/10.1186/s12885-017-3500-5) +- [DIPK](https://doi.org/10.1093/bib/bbae153): Implemented model in the pipeline. - > Wang L, Li X, Zhang L, Gao Q. Improved anticancer drug response prediction in cell lines using matrix factorization with similarity regularization. BMC cancer. 2017 Dec;17:1-2. + > Li P, Jiang Z, Liu T, Liu X, Qiao H, Yao X. Improving drug response prediction via integrating gene relationships with deep learning. Briefings in Bioinformatics. 2024 May;25(3):bbae153. -- [MOLI](https://doi.org/10.1093/bioinformatics/btz318) +- [MOLI](https://doi.org/10.1093/bioinformatics/btz318): Implemented model in the pipeline. > Sharifi-Noghabi H, Zolotareva O, Collins CC, Ester M. MOLI: multi-omics late integration with deep neural networks for drug response prediction. Bioinformatics. 2019 Jul;35(14):i501-9. -- [SuperFELT](https://doi.org/10.1186/s12859-021-04146-z) +- [SRMF](https://doi.org/10.1186/s12885-017-3500-5): Implemented model in the pipeline. - > Park S, Soh J, Lee H. Super. FELT: supervised feature extraction learning using triplet loss for drug response prediction with multi-omics data. BMC bioinformatics. 2021 May 25;22(1):269. + > Wang L, Li X, Zhang L, Gao Q. Improved anticancer drug response prediction in cell lines using matrix factorization with similarity regularization. BMC cancer. 2017 Dec;17:1-2. -- [DIPK](https://doi.org/10.1093/bib/bbae153) +- [SuperFELT](https://doi.org/10.1186/s12859-021-04146-z): Implemented model in the pipeline. - > Li P, Jiang Z, Liu T, Liu X, Qiao H, Yao X. Improving drug response prediction via integrating gene relationships with deep learning. Briefings in Bioinformatics. 2024 May;25(3):bbae153. + > Park S, Soh J, Lee H. Super. FELT: supervised feature extraction learning using triplet loss for drug response prediction with multi-omics data. BMC bioinformatics. 2021 May 25;22(1):269. ## Software packaging/containerisation tools diff --git a/README.md b/README.md index c230cd7..e5b9e0f 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ tuning is fair and consistent. With its flexible model interface, DrEval support ranging from statistical models to complex neural networks. By contributing your model to the DrEval catalog, you can increase your work's exposure, reusability, and transferability. -# ![DrEval_pipeline](assets/DrEval_pipeline_simplified.png) +# ![Pipeline diagram showing the major steps of nf-core/drugresponseeval](assets/drugresponseeval_pipeline_simplified.png) 1. The response data is loaded 2. All models are trained and evaluated in a cross-validation setting diff --git a/assets/DrEval_pipeline_simplified.png b/assets/drugresponseeval_pipeline_simplified.png similarity index 100% rename from assets/DrEval_pipeline_simplified.png rename to assets/drugresponseeval_pipeline_simplified.png From 304a6956b30fbfc0aed29a605c40696ac37c0d60 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 25 Nov 2024 11:07:27 +0100 Subject: [PATCH 129/257] ignoring input parameter --- .nf-core.yml | 2 ++ nextflow_schema.json | 12 ------------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 741acee..7bc803a 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -8,6 +8,8 @@ lint: - .github/CONTRIBUTING.md - assets/sendmail_template.txt multiqc_config: false + nextflow_config: + - params.input nf_core_version: 3.0.2 org_path: null repository_type: pipeline diff --git a/nextflow_schema.json b/nextflow_schema.json index 7804e2b..7d57ead 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -53,18 +53,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})$" - }, - "input": { - "type": "string", - "format": "file-path", - "exists": true, - "schema": "assets/schema_input.json", - "mimetype": "text/csv", - "pattern": "^\\S+\\.csv$", - "description": "Unnecessary parameter for the pipeline, added to satisfy linting.", - "help_text": "Unnecessary parameter for the pipeline, added to satisfy linting.", - "fa_icon": "fas fa-file-csv", - "hidden": true } } }, From 004555c404b25557a588cb03a600bb769704c8aa Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 25 Nov 2024 11:18:34 +0100 Subject: [PATCH 130/257] forgot to remove input from nextflow.config --- nextflow.config | 1 - 1 file changed, 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 1b47b13..36e18bc 100644 --- a/nextflow.config +++ b/nextflow.config @@ -29,7 +29,6 @@ params { save_datasets = false // Boilerplate options - input = null outdir = 'results' publish_dir_mode = 'copy' email = null From 5c8301ac64f34c6754ad6bca01f41e20e17a9760 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Mon, 25 Nov 2024 15:36:09 +0100 Subject: [PATCH 131/257] intermediate commit, added CurveCurator logic --- bin/prepost_curve_fitting.py | 22 ++++++++++++++++++++++ modules/local/fit_curves/main.nf | 26 ++++++++++++++++++++++++++ modules/local/params_check/main.nf | 4 ++-- nextflow.config | 2 +- nextflow_schema.json | 10 +++++----- subworkflows/local/run_cv/main.nf | 7 +++++++ workflows/drugresponseeval.nf | 3 ++- 7 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 bin/prepost_curve_fitting.py create mode 100644 modules/local/fit_curves/main.nf diff --git a/bin/prepost_curve_fitting.py b/bin/prepost_curve_fitting.py new file mode 100644 index 0000000..05fb7cd --- /dev/null +++ b/bin/prepost_curve_fitting.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +from drevalpy.datasets.curvecurator import preprocess, postprocess +from pathlib import Path +def get_parser(): + parser = argparse.ArgumentParser(description="Load data for drug response prediction.") + parser.add_argument("--input_file", type=str, default="", help="Path to viability data csv file.") + parser.add_argument("--output_dir", type=str, required=True, help="Output directory for all outputs.") + parser.add_argument("--cores", type=int, default=0, help="The number of cores used by CurveCurator.") + return parser + + +def main(input_file: str | Path, output_dir: str | Path, cores: int = 0): + + if cores == 0 or input_file == "": + postprocess(output_dir) + else: + preprocess(input_file, output_dir, cores) + +if __name__ == "__main__": + arg_parser = get_parser() + args = arg_parser.parse_args() + main(args) diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf new file mode 100644 index 0000000..2c410b3 --- /dev/null +++ b/modules/local/fit_curves/main.nf @@ -0,0 +1,26 @@ +process FIT_CURVES { + //tag "$samplesheet" + label 'process_medium' + publishDir "${path_data}", mode: 'copy' + + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + val dataset_name + val path_data + val curve_curator_input + + script: + """ + prepost_curvefitting.py \\ + --input=$curve_curator_input \\ + --output_dir=$path_data/$dataset_name + --cores=50 + CurveCurator $path_data/$dataset_name/config.toml --mad + prepost_curvefitting.py --output_dir=$path_data/$dataset_name + """ +} diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index 4eb69c1..0b225bd 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -17,7 +17,7 @@ process PARAMS_CHECK { val n_trials_robustness val dataset_name val cross_study_datasets - val curve_curator + val curve_curator_input val optim_metric val n_cv_splits val response_transformation @@ -40,7 +40,7 @@ process PARAMS_CHECK { --n_trials_robustness $n_trials_robustness \\ --dataset_name $dataset_name \\ ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} \\ - ${curve_curator ? '--curve_curator' : ''} \\ + ${curve_curator_input ? '--curve_curator_input' : ''} \\ --optim_metric $optim_metric \\ --n_cv_splits $n_cv_splits \\ --response_transformation $response_transformation diff --git a/nextflow.config b/nextflow.config index 27cdeea..61a74eb 100644 --- a/nextflow.config +++ b/nextflow.config @@ -27,7 +27,7 @@ params { n_trials_robustness = 0 dataset_name = 'GDSC1' cross_study_datasets = '' - curve_curator = false + curve_curator_input = '' overwrite = false optim_metric = 'RMSE' n_cv_splits = 5 diff --git a/nextflow_schema.json b/nextflow_schema.json index 0ea4ed7..4a8056e 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -39,7 +39,7 @@ "dataset_name": { "type": "string", "description": "Name of the dataset.", - "help_text": "Name of the dataset used for the pipeline. Allowed values are GDSC1, GDSC2, and Custom." + "help_text": "Name of the dataset used for the pipeline. This can be either one of the provided datasets ('GDSC1', 'GDSC2', 'CCLE', 'CTRPv2', 'Toy_Data') in which case the datasets with the fitted curves is downloaded, or a custom name, in which case raw viability measurements are expected (the option 'curve_curator_input' is required in this case)." }, "outdir": { "type": "string", @@ -110,10 +110,10 @@ "fa_icon": "fas fa-cogs", "description": "Additional options for the pipeline.", "properties": { - "curve_curator": { - "type": "boolean", - "description": "Run the curve curator.", - "help_text": "Whether to run \" \"CurveCurator \" \"to sort out \" \"non-reactive \" \"curves" + "curve_curator_input": { + "type": "string", + "description": "Path to configuration file for CurveCurator.", + "help_text": "This allows specifying the configuration for preprocessing of custom viability data using CurveCurator. If provided, custom viability data specified in the config file will be fitted with custom settings. Please note: The output path in the configuration file must point to '//'. A default configuration file reflecting the exact settings that were used to preprocess the available datasets (see option dataset_name) is provided in documentation, to allow reproduction or fair comparison." }, "overwrite": { "type": "boolean", diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 0e55447..1d45abc 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -13,6 +13,13 @@ workflow RUN_CV { baselines // model names for comparison main: + if (params.curve_curator_input) + FIT_CURVES ( + params.dataset_name + params.path_data, + params.curve_curator_input, + ) + LOAD_RESPONSE(params.dataset_name, params.path_data, params.cross_study_datasets) ch_test_modes = channel.from(test_modes) diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index a3d3dc9..b993ed9 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -26,6 +26,7 @@ WorkflowDrugresponseeval.initialise(params, log) IMPORT LOCAL MODULES/SUBWORKFLOWS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +include { FIT_CURVES } from '../modules/local/fit_curves' include { PARAMS_CHECK } from '../modules/local/params_check' include { DRAW_VIOLIN } from '../modules/local/draw_violin' include { DRAW_HEATMAP } from '../modules/local/draw_heatmap' @@ -85,7 +86,7 @@ workflow DRUGRESPONSEEVAL { params.n_trials_robustness, params.dataset_name, params.cross_study_datasets, - params.curve_curator, + params.curve_curator_input, params.optim_metric, params.n_cv_splits, params.response_transformation From e2efb013fc1db2ac7a13bb6514621fea8c8dae80 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 29 Nov 2024 14:03:17 +0100 Subject: [PATCH 132/257] does not work with path_data as path, need it as val for -resume to work --- modules/local/load_response/main.nf | 2 +- modules/local/params_check/main.nf | 2 +- modules/local/predict_full/main.nf | 2 +- modules/local/randomization_test/main.nf | 2 +- modules/local/robustness_test/main.nf | 2 +- modules/local/train_and_predict_cv/main.nf | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index 6063252..a388048 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -5,7 +5,7 @@ process LOAD_RESPONSE { input: val dataset_name - path path_data + val path_data val cross_study_datasets output: diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index 7970b4d..a04511f 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -18,7 +18,7 @@ process PARAMS_CHECK { val path_data output: - path path_data, emit: path_data + val path_data, emit: path_data when: task.ext.when == null || task.ext.when diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 965fd11..7f9370c 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -7,7 +7,7 @@ process PREDICT_FULL { input: tuple path(cross_study_datasets), val(model_name), val(test_mode), val(split_id), path(split_dataset), path(hpam_combi) val(response_transformation) - path(path_data) + val(path_data) output: tuple val(test_mode), val(model_name), path('**predictions*.csv'), emit: ch_vis diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index c9041ff..496d511 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -6,7 +6,7 @@ process RANDOMIZATION_TEST { input: tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), path(randomization_views) - path(path_data) + val(path_data) val(randomization_type) val(response_transformation) diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index 4f54593..8a18093 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -6,7 +6,7 @@ process ROBUSTNESS_TEST { input: tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), val(robustness_iteration) - path(path_data) + val(path_data) val(randomization_type) val(response_transformation) diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 28d3cae..6ba2682 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -5,7 +5,7 @@ process TRAIN_AND_PREDICT_CV { input: tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters) - path path_data + val path_data val response_transformation output: From 106e497c76cee27e3f6f3533c14da2c1008a2af4 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Mon, 2 Dec 2024 15:04:53 +0100 Subject: [PATCH 133/257] adjusted params for new drevalpy handling --- bin/prepost_curve_fitting.py | 20 +++++++++++++------- modules/local/fit_curves/main.nf | 8 ++------ modules/local/params_check/main.nf | 4 ++-- nextflow.config | 2 +- nextflow_schema.json | 16 +++++++++++----- subworkflows/local/run_cv/main.nf | 12 +++++++----- workflows/drugresponseeval.nf | 3 ++- 7 files changed, 38 insertions(+), 27 deletions(-) diff --git a/bin/prepost_curve_fitting.py b/bin/prepost_curve_fitting.py index 05fb7cd..63e4373 100644 --- a/bin/prepost_curve_fitting.py +++ b/bin/prepost_curve_fitting.py @@ -3,18 +3,24 @@ from pathlib import Path def get_parser(): parser = argparse.ArgumentParser(description="Load data for drug response prediction.") - parser.add_argument("--input_file", type=str, default="", help="Path to viability data csv file.") - parser.add_argument("--output_dir", type=str, required=True, help="Output directory for all outputs.") - parser.add_argument("--cores", type=int, default=0, help="The number of cores used by CurveCurator.") + parser.add_argument("--path", type=str, default="", help="Path to base folder containing datasets.") + parser.add_argument("--dataset", type=str, required=True, help="Dataset name.") + parser.add_argument("--task", type=str, required=True, help="What to do, can be 'preprocess' / 'postprocess'") + parser.add_argument("--cores", type=int, default=0, help="The number of cores used for CurveCurator fitting.") return parser -def main(input_file: str | Path, output_dir: str | Path, cores: int = 0): +def main(path_data: str | Path, dataset_name: str | Path, task: str, cores: int = 1): - if cores == 0 or input_file == "": - postprocess(output_dir) + base_path = Path(path_data) / dataset_name + if task == 'postprocess': + postprocess(output_folder=base_path, dataset_name=dataset_name) else: - preprocess(input_file, output_dir, cores) + preprocess( + input_file=base_path / f"{dataset_name}_raw.csv", + output_dir=base_path, + cores=cores + ) if __name__ == "__main__": arg_parser = get_parser() diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index 2c410b3..96eb014 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -12,15 +12,11 @@ process FIT_CURVES { input: val dataset_name val path_data - val curve_curator_input script: """ - prepost_curvefitting.py \\ - --input=$curve_curator_input \\ - --output_dir=$path_data/$dataset_name - --cores=50 + prepost_curvefitting.py --path=$path_data --dataset=$dataset_name --task=preprocess --cores=50 CurveCurator $path_data/$dataset_name/config.toml --mad - prepost_curvefitting.py --output_dir=$path_data/$dataset_name + prepost_curvefitting.py --path_=$path_data --dataset=$dataset_name --task=postprocess """ } diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index 9b2ecd2..fad7f5e 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -11,7 +11,7 @@ process PARAMS_CHECK { val n_trials_robustness val dataset_name val cross_study_datasets - val curve_curator_input + val curve_curator val optim_metric val n_cv_splits val response_transformation @@ -35,7 +35,7 @@ process PARAMS_CHECK { --n_trials_robustness $n_trials_robustness \\ --dataset_name $dataset_name \\ ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} \\ - ${curve_curator_input ? '--curve_curator_input' : ''} \\ + ${curve_curator ? '--curve_curator --curve_curator_cores 1' : ''} \\ --optim_metric $optim_metric \\ --n_cv_splits $n_cv_splits \\ --response_transformation $response_transformation diff --git a/nextflow.config b/nextflow.config index 773a87e..36e18bc 100644 --- a/nextflow.config +++ b/nextflow.config @@ -21,7 +21,7 @@ params { n_trials_robustness = 0 dataset_name = 'GDSC2' cross_study_datasets = '' - curve_curator_input = '' + curve_curator = false optim_metric = 'RMSE' n_cv_splits = 10 response_transformation = 'None' diff --git a/nextflow_schema.json b/nextflow_schema.json index b6a360a..1e63f18 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -39,7 +39,7 @@ "dataset_name": { "type": "string", "description": "Name of the dataset.", - "help_text": "Name of the dataset used for the pipeline. This can be either one of the provided datasets ('GDSC1', 'GDSC2', 'CCLE', 'CTRPv2', 'Toy_Data') in which case the datasets with the fitted curves is downloaded, or a custom name, in which case raw viability measurements are expected (the option 'curve_curator_input' is required in this case)." + "help_text": "Name of the dataset used for the pipeline. This can be either one of the provided datasets ('GDSC1', 'GDSC2', 'CCLE', 'CTRPv2', 'Toy_Data') in which case the datasets with the fitted curves is downloaded, or a custom dataset name, pointing either to raw viability measurements for automatic curve fitting (see 'curve_curator' option, which is required in this case), or prefit data (not recommended for dataset comparability reasons due to potential differences in fitting procedures)." }, "outdir": { "type": "string", @@ -116,6 +116,12 @@ "description": "Path to the data directory.", "help_text": "Path to the data directory." }, + "measure": { + "type": "string", + "default": "LN_IC50", + "description": "The name of the measure to use. Can be one of ['LN_IC50'], which is the default.", + "help": "The name of the measure to use. This can be one of ['LN_IC50']. This corresponds to the names of the columns that contain theses measures in the provided input dataset. If providing a custom dataset (see 'dataset_name' option), this may differ. If the option 'curve_curator' is set, the prefix '_curvecurator' is automatically appended, e.g. 'LN_IC50_curvecurator', to allow using the refit measures instead of the ones originally published for the available datasets (see 'dataset_name' option for details), allowing for better dataset comparability (refit measures are already provided in the available datasets or computed as part of the fitting procedure when providing custom raw viability datasets, see 'curve_curator' option for details)." + }, "cross_study_datasets": { "type": "string", "description": "Datasets for cross-study prediction.", @@ -129,10 +135,10 @@ "fa_icon": "fas fa-cogs", "description": "Additional options for the pipeline.", "properties": { - "curve_curator_input": { - "type": "string", - "description": "Path to configuration file for CurveCurator.", - "help_text": "This allows specifying the configuration for preprocessing of custom viability data using CurveCurator. If provided, custom viability data specified in the config file will be fitted with custom settings. Please note: The output path in the configuration file must point to '//'. A default configuration file reflecting the exact settings that were used to preprocess the available datasets (see option dataset_name) is provided in documentation, to allow reproduction or fair comparison." + "curve_curator": { + "type": "bool", + "description": "If True, use refit measures instead of original measures reported by the authors for the available datasets, or invoke automatic fitting of custom raw viability data.", + "help_text": "This allows using refit measures (see 'measure' option for details) for available datasets, which allows better comparability between datasets. When providing a custom dataset (see 'dataset_name' option), setting this to True expects a csv-formatted file at //_raw.csv (also see 'path_data' option), which is fitted automatically with the same procedure as the available datasets, to provide fair comparison. The fitted data will then be stored at //.csv." }, "save_datasets": { "type": "boolean", diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index f3e78f8..ec18326 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -10,18 +10,20 @@ workflow RUN_CV { take: test_modes // LPO,LDO,LCO models // model names for full testing - baselines // model names for comparison - path_data // path to data + baselines // model names for comparison + path_data // path to data + measure // measure name to use main: - if (params.curve_curator_input) + if (params.curve_curator) FIT_CURVES ( params.dataset_name path_data, - params.curve_curator_input, ) + // manually change this here to call LOAD_RESPONSE without curvecurator option + measure = measure + "_curvecurator" - LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets) + LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, measure) ch_test_modes = channel.from(test_modes) ch_data = ch_test_modes.combine(LOAD_RESPONSE.out.response_dataset) diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 32b3e40..d132dad 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -58,7 +58,7 @@ workflow DRUGRESPONSEEVAL { params.n_trials_robustness, params.dataset_name, params.cross_study_datasets, - params.curve_curator_input, + params.curve_curator, params.optim_metric, params.n_cv_splits, params.response_transformation, @@ -70,6 +70,7 @@ workflow DRUGRESPONSEEVAL { models, baselines, PARAMS_CHECK.out.path_data + params.measure ) MODEL_TESTING ( From 4793866b67be77bd73c0c2b6baac590bd3d923d7 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Mon, 2 Dec 2024 18:06:27 +0100 Subject: [PATCH 134/257] ensured output and task requirements are correct --- conf/base.config | 5 +++++ modules/local/fit_curves/main.nf | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/conf/base.config b/conf/base.config index 87dc864..3f1347d 100644 --- a/conf/base.config +++ b/conf/base.config @@ -60,4 +60,9 @@ process { withLabel:process_gpu { ext.use_gpu = { use_gpu } } + withLabel:high_cpu_low_mem { + cpus = { 32 * task.attempt } + memory = { 16B * task.attempt } + time = { 6.h * task.attempt } + } } diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index 96eb014..ee532ba 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -1,6 +1,6 @@ process FIT_CURVES { //tag "$samplesheet" - label 'process_medium' + label 'high_cpu_low_mem' publishDir "${path_data}", mode: 'copy' @@ -13,9 +13,14 @@ process FIT_CURVES { val dataset_name val path_data + output: + path '${dataset_name}/config.toml' + path '${dataset_name}/curves.txt' + path '${dataset_name}/${dataset_name}.csv' + script: """ - prepost_curvefitting.py --path=$path_data --dataset=$dataset_name --task=preprocess --cores=50 + prepost_curvefitting.py --path=$path_data --dataset=$dataset_name --task=preprocess --cores=$task.cpus CurveCurator $path_data/$dataset_name/config.toml --mad prepost_curvefitting.py --path_=$path_data --dataset=$dataset_name --task=postprocess """ From d3537033c8e3f89e27cfd7e53f699a50ff160206 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Tue, 3 Dec 2024 12:08:08 +0100 Subject: [PATCH 135/257] fixed missing measure arg and fit_curves includes --- bin/load_response.py | 9 +++++++-- modules/local/load_response/main.nf | 4 +++- modules/local/params_check/main.nf | 2 ++ nextflow_schema.json | 4 ++-- subworkflows/local/run_cv/main.nf | 4 +++- workflows/drugresponseeval.nf | 4 ++-- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/bin/load_response.py b/bin/load_response.py index 0e59529..adfbc2e 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -15,12 +15,17 @@ def get_parser(): help="List of datasets to use to evaluate predictions across studies. " "Default is empty list which means no cross-study datasets are used.", ) + parser.add_argument( + "--measure", + type=str, + default="LN_IC50", + help="Name of the column in the dataset containing the drug response measures.") return parser def main(args): - response_data = load_dataset(dataset_name=args.dataset_name, path_data=args.path_data) - cross_study_datasets = [load_dataset(dataset_name=ds, path_data=args.path_data) for ds in args.cross_study_datasets] + response_data = load_dataset(dataset_name=args.dataset_name, path_data=args.path_data, measure=args.measure) + cross_study_datasets = [load_dataset(dataset_name=ds, path_data=args.path_data, measure=args.measure) for ds in args.cross_study_datasets] # Pickle the object to a file with open("response_dataset.pkl", "wb") as f: diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index 6063252..619ddd7 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -7,6 +7,7 @@ process LOAD_RESPONSE { val dataset_name path path_data val cross_study_datasets + val measure output: path 'response_dataset.pkl', emit: response_dataset @@ -16,7 +17,8 @@ process LOAD_RESPONSE { load_response.py \\ --dataset_name ${dataset_name} \\ --path_data ${path_data} \\ - ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} + ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} \\ + --measure ${measure} """ } diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index fad7f5e..376a3b9 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -16,6 +16,7 @@ process PARAMS_CHECK { val n_cv_splits val response_transformation val path_data + val measure output: path path_data, emit: path_data @@ -39,5 +40,6 @@ process PARAMS_CHECK { --optim_metric $optim_metric \\ --n_cv_splits $n_cv_splits \\ --response_transformation $response_transformation + --measure $measure """ } diff --git a/nextflow_schema.json b/nextflow_schema.json index 1e63f18..a2275ca 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -119,8 +119,8 @@ "measure": { "type": "string", "default": "LN_IC50", - "description": "The name of the measure to use. Can be one of ['LN_IC50'], which is the default.", - "help": "The name of the measure to use. This can be one of ['LN_IC50']. This corresponds to the names of the columns that contain theses measures in the provided input dataset. If providing a custom dataset (see 'dataset_name' option), this may differ. If the option 'curve_curator' is set, the prefix '_curvecurator' is automatically appended, e.g. 'LN_IC50_curvecurator', to allow using the refit measures instead of the ones originally published for the available datasets (see 'dataset_name' option for details), allowing for better dataset comparability (refit measures are already provided in the available datasets or computed as part of the fitting procedure when providing custom raw viability datasets, see 'curve_curator' option for details)." + "description": "The name of the measure to use", + "help": "The name of the measure to use, default 'LN_IC50'. If using one of the available datasets (see 'dataset_name' option), this is restricted to one of ['LN_IC50', 'EC50', 'IC50', 'pEC50', 'AUC', 'response']. This corresponds to the names of the columns that contain theses measures in the provided input dataset. If providing a custom dataset (see 'dataset_name' option), this may differ. If the option 'curve_curator' is set, the prefix '_curvecurator' is automatically appended, e.g. 'LN_IC50_curvecurator', to allow using the refit measures instead of the ones originally published for the available datasets (see 'dataset_name' option for details), allowing for better dataset comparability (refit measures are already provided in the available datasets or computed as part of the fitting procedure when providing custom raw viability datasets, see 'curve_curator' option for details)." }, "cross_study_datasets": { "type": "string", diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index ec18326..c232331 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -5,6 +5,7 @@ include { CV_SPLIT } from '../../../modules/local/cv_sp include { HPAM_SPLIT } from '../../../modules/local/hpam_split' include { TRAIN_AND_PREDICT_CV } from '../../../modules/local/train_and_predict_cv' include { EVALUATE_FIND_MAX } from '../../../modules/local/evaluate_find_max' +include { FIT_CURVES } from '../../../modulues/local/fit_curves' workflow RUN_CV { take: @@ -15,13 +16,14 @@ workflow RUN_CV { measure // measure name to use main: - if (params.curve_curator) + if (params.curve_curator) { FIT_CURVES ( params.dataset_name path_data, ) // manually change this here to call LOAD_RESPONSE without curvecurator option measure = measure + "_curvecurator" + } LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, measure) diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index d132dad..6d7c1f4 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -10,7 +10,6 @@ include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pi include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_drugresponseeval_pipeline' -include { FIT_CURVES } from '../modules/local/fit_curves' include { PARAMS_CHECK } from '../modules/local/params_check' include { DRAW_VIOLIN } from '../modules/local/draw_violin' include { DRAW_HEATMAP } from '../modules/local/draw_heatmap' @@ -62,7 +61,8 @@ workflow DRUGRESPONSEEVAL { params.optim_metric, params.n_cv_splits, params.response_transformation, - params.path_data + params.path_data, + params.measure ) RUN_CV ( From 08cdcc886c220688d159afc1d98246c989c1dc25 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Tue, 3 Dec 2024 13:05:22 +0100 Subject: [PATCH 136/257] syntax error fix in call to FIT_CURVES --- subworkflows/local/run_cv/main.nf | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index c232331..bfc671d 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -5,7 +5,7 @@ include { CV_SPLIT } from '../../../modules/local/cv_sp include { HPAM_SPLIT } from '../../../modules/local/hpam_split' include { TRAIN_AND_PREDICT_CV } from '../../../modules/local/train_and_predict_cv' include { EVALUATE_FIND_MAX } from '../../../modules/local/evaluate_find_max' -include { FIT_CURVES } from '../../../modulues/local/fit_curves' +include { FIT_CURVES } from '../../../modules/local/fit_curves' workflow RUN_CV { take: @@ -17,10 +17,7 @@ workflow RUN_CV { main: if (params.curve_curator) { - FIT_CURVES ( - params.dataset_name - path_data, - ) + FIT_CURVES(params.dataset_name, path_data) // manually change this here to call LOAD_RESPONSE without curvecurator option measure = measure + "_curvecurator" } From 82d9193fd5132201efaf0690d01f3489bb879f98 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Tue, 3 Dec 2024 13:12:28 +0100 Subject: [PATCH 137/257] fix missing comma in call to RUN_CV --- bin/load_response.py | 3 ++- workflows/drugresponseeval.nf | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/load_response.py b/bin/load_response.py index adfbc2e..a411d11 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -19,7 +19,8 @@ def get_parser(): "--measure", type=str, default="LN_IC50", - help="Name of the column in the dataset containing the drug response measures.") + help="Name of the column in the dataset containing the drug response measures." + ) return parser diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 6d7c1f4..b3046ac 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -69,7 +69,7 @@ workflow DRUGRESPONSEEVAL { test_modes, models, baselines, - PARAMS_CHECK.out.path_data + PARAMS_CHECK.out.path_data, params.measure ) From 127d72d8ccddc8b95c194745e689ea84fe94ab4e Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Tue, 3 Dec 2024 15:39:02 +0100 Subject: [PATCH 138/257] added default measure and fixed arg type --- nextflow.config | 1 + nextflow_schema.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 36e18bc..e20e51f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -27,6 +27,7 @@ params { response_transformation = 'None' path_data = './data' save_datasets = false + measure = 'LN_IC50' // Boilerplate options outdir = 'results' diff --git a/nextflow_schema.json b/nextflow_schema.json index a2275ca..5d59589 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -136,7 +136,7 @@ "description": "Additional options for the pipeline.", "properties": { "curve_curator": { - "type": "bool", + "type": "boolean", "description": "If True, use refit measures instead of original measures reported by the authors for the available datasets, or invoke automatic fitting of custom raw viability data.", "help_text": "This allows using refit measures (see 'measure' option for details) for available datasets, which allows better comparability between datasets. When providing a custom dataset (see 'dataset_name' option), setting this to True expects a csv-formatted file at //_raw.csv (also see 'path_data' option), which is fitted automatically with the same procedure as the available datasets, to provide fair comparison. The fitted data will then be stored at //.csv." }, From df8e42f6aad7dbc817fc3b08f55cfae9083f2114 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Tue, 3 Dec 2024 16:18:52 +0100 Subject: [PATCH 139/257] add missing path_data arg to params_check --- modules/local/params_check/main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index 376a3b9..b126c0f 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -41,5 +41,6 @@ process PARAMS_CHECK { --n_cv_splits $n_cv_splits \\ --response_transformation $response_transformation --measure $measure + --path_data $path_data """ } From 37139c51975b8f4548039cc0a8e6aa36394ec422 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Tue, 3 Dec 2024 17:50:07 +0100 Subject: [PATCH 140/257] fix syntax errors and wrong args / file modes --- bin/prepost_curve_fitting.py | 7 ++++--- conf/base.config | 2 +- modules/local/fit_curves/main.nf | 4 ++-- modules/local/params_check/main.nf | 6 +++--- 4 files changed, 10 insertions(+), 9 deletions(-) mode change 100644 => 100755 bin/prepost_curve_fitting.py diff --git a/bin/prepost_curve_fitting.py b/bin/prepost_curve_fitting.py old mode 100644 new mode 100755 index 63e4373..3cd0464 --- a/bin/prepost_curve_fitting.py +++ b/bin/prepost_curve_fitting.py @@ -1,10 +1,11 @@ #!/usr/bin/env python from drevalpy.datasets.curvecurator import preprocess, postprocess from pathlib import Path +import argparse def get_parser(): - parser = argparse.ArgumentParser(description="Load data for drug response prediction.") - parser.add_argument("--path", type=str, default="", help="Path to base folder containing datasets.") - parser.add_argument("--dataset", type=str, required=True, help="Dataset name.") + parser = argparse.ArgumentParser(description="Pre/postprocess CurveCurator viability data.") + parser.add_argument("--path_data", type=str, default="", help="Path to base folder containing datasets.") + parser.add_argument("--dataset_name", type=str, required=True, help="Dataset name.") parser.add_argument("--task", type=str, required=True, help="What to do, can be 'preprocess' / 'postprocess'") parser.add_argument("--cores", type=int, default=0, help="The number of cores used for CurveCurator fitting.") return parser diff --git a/conf/base.config b/conf/base.config index 3f1347d..2c73d37 100644 --- a/conf/base.config +++ b/conf/base.config @@ -62,7 +62,7 @@ process { } withLabel:high_cpu_low_mem { cpus = { 32 * task.attempt } - memory = { 16B * task.attempt } + memory = { 16.GB * task.attempt } time = { 6.h * task.attempt } } } diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index ee532ba..e77fa29 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -20,8 +20,8 @@ process FIT_CURVES { script: """ - prepost_curvefitting.py --path=$path_data --dataset=$dataset_name --task=preprocess --cores=$task.cpus + prepost_curve_fitting.py --path_data=$path_data --dataset_name=$dataset_name --task=preprocess --cores=$task.cpus CurveCurator $path_data/$dataset_name/config.toml --mad - prepost_curvefitting.py --path_=$path_data --dataset=$dataset_name --task=postprocess + prepost_curve_fitting.py --path_data=$path_data --dataset_name=$dataset_name --task=postprocess """ } diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index b126c0f..71ea502 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -19,7 +19,7 @@ process PARAMS_CHECK { val measure output: - path path_data, emit: path_data + val path_data, emit: path_data when: task.ext.when == null || task.ext.when @@ -39,8 +39,8 @@ process PARAMS_CHECK { ${curve_curator ? '--curve_curator --curve_curator_cores 1' : ''} \\ --optim_metric $optim_metric \\ --n_cv_splits $n_cv_splits \\ - --response_transformation $response_transformation - --measure $measure + --response_transformation $response_transformation \\ + --measure $measure \\ --path_data $path_data """ } From e00b5cbb93c92997dbf578048fa00e52bcc63636 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Tue, 3 Dec 2024 18:09:37 +0100 Subject: [PATCH 141/257] fixed argument parsing bug --- bin/prepost_curve_fitting.py | 12 ++++++------ modules/local/fit_curves/main.nf | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bin/prepost_curve_fitting.py b/bin/prepost_curve_fitting.py index 3cd0464..e1330d5 100755 --- a/bin/prepost_curve_fitting.py +++ b/bin/prepost_curve_fitting.py @@ -11,16 +11,16 @@ def get_parser(): return parser -def main(path_data: str | Path, dataset_name: str | Path, task: str, cores: int = 1): +def main(args): - base_path = Path(path_data) / dataset_name - if task == 'postprocess': - postprocess(output_folder=base_path, dataset_name=dataset_name) + base_path = Path(args.path_data) / args.dataset_name + if args.task == 'postprocess': + postprocess(output_folder=base_path, dataset_name=args.dataset_name) else: preprocess( - input_file=base_path / f"{dataset_name}_raw.csv", + input_file=base_path / f"{args.dataset_name}_raw.csv", output_dir=base_path, - cores=cores + cores=args.cores ) if __name__ == "__main__": diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index e77fa29..95ed02d 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -20,8 +20,8 @@ process FIT_CURVES { script: """ - prepost_curve_fitting.py --path_data=$path_data --dataset_name=$dataset_name --task=preprocess --cores=$task.cpus - CurveCurator $path_data/$dataset_name/config.toml --mad - prepost_curve_fitting.py --path_data=$path_data --dataset_name=$dataset_name --task=postprocess + prepost_curve_fitting.py --path_data ${path_data} --dataset_name ${dataset_name} --task preprocess --cores ${task.cpus} + CurveCurator ${path_data}/${dataset_name}/config.toml --mad + prepost_curve_fitting.py --path_data ${path_data} --dataset_name ${dataset_name} --task postprocess """ } From 67b073c903ec70801755b5de165f8f8dbb41199f Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Tue, 3 Dec 2024 18:12:46 +0100 Subject: [PATCH 142/257] add missing dataset_name arg --- bin/prepost_curve_fitting.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/prepost_curve_fitting.py b/bin/prepost_curve_fitting.py index e1330d5..11a85b4 100755 --- a/bin/prepost_curve_fitting.py +++ b/bin/prepost_curve_fitting.py @@ -20,6 +20,7 @@ def main(args): preprocess( input_file=base_path / f"{args.dataset_name}_raw.csv", output_dir=base_path, + dataset_name=args.dataset_name, cores=args.cores ) From 069e7148fcef6fee6e4951735f6c2920a76195a3 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Wed, 4 Dec 2024 18:11:12 +0100 Subject: [PATCH 143/257] separated fitting into three modules --- bin/postprocess_curvecurator_output.py | 19 +++++++++++++++ ...fitting.py => preprocess_raw_viability.py} | 18 ++++++--------- modules/local/fit_curves/main.nf | 8 ++----- .../postprocess_curvecurator_output/main.nf | 23 +++++++++++++++++++ .../local/preprocess_raw_viability/main.nf | 23 +++++++++++++++++++ subworkflows/local/run_cv/main.nf | 11 ++++++--- 6 files changed, 82 insertions(+), 20 deletions(-) create mode 100755 bin/postprocess_curvecurator_output.py rename bin/{prepost_curve_fitting.py => preprocess_raw_viability.py} (57%) create mode 100644 modules/local/postprocess_curvecurator_output/main.nf create mode 100644 modules/local/preprocess_raw_viability/main.nf diff --git a/bin/postprocess_curvecurator_output.py b/bin/postprocess_curvecurator_output.py new file mode 100755 index 0000000..6a31100 --- /dev/null +++ b/bin/postprocess_curvecurator_output.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python +from drevalpy.datasets.curvecurator import postprocess +import argparse + + +def get_parser(): + parser = argparse.ArgumentParser(description="Pre/postprocess CurveCurator viability data.") + parser.add_argument("--dataset_name", type=str, required=True, help="Dataset name.") + return parser + + +def main(args): + postprocess(output_folder='./', dataset_name=args.dataset_name) + + +if __name__ == "__main__": + arg_parser = get_parser() + args = arg_parser.parse_args() + main(args) diff --git a/bin/prepost_curve_fitting.py b/bin/preprocess_raw_viability.py similarity index 57% rename from bin/prepost_curve_fitting.py rename to bin/preprocess_raw_viability.py index 11a85b4..68f16e9 100755 --- a/bin/prepost_curve_fitting.py +++ b/bin/preprocess_raw_viability.py @@ -1,12 +1,11 @@ #!/usr/bin/env python -from drevalpy.datasets.curvecurator import preprocess, postprocess +from drevalpy.datasets.curvecurator import preprocess from pathlib import Path import argparse def get_parser(): parser = argparse.ArgumentParser(description="Pre/postprocess CurveCurator viability data.") parser.add_argument("--path_data", type=str, default="", help="Path to base folder containing datasets.") parser.add_argument("--dataset_name", type=str, required=True, help="Dataset name.") - parser.add_argument("--task", type=str, required=True, help="What to do, can be 'preprocess' / 'postprocess'") parser.add_argument("--cores", type=int, default=0, help="The number of cores used for CurveCurator fitting.") return parser @@ -14,15 +13,12 @@ def get_parser(): def main(args): base_path = Path(args.path_data) / args.dataset_name - if args.task == 'postprocess': - postprocess(output_folder=base_path, dataset_name=args.dataset_name) - else: - preprocess( - input_file=base_path / f"{args.dataset_name}_raw.csv", - output_dir=base_path, - dataset_name=args.dataset_name, - cores=args.cores - ) + preprocess( + input_file=base_path / f"{args.dataset_name}_raw.csv", + output_dir='./', + dataset_name=args.dataset_name, + cores=args.cores + ) if __name__ == "__main__": arg_parser = get_parser() diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index 95ed02d..63cba77 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -11,17 +11,13 @@ process FIT_CURVES { input: val dataset_name - val path_data + path path_data output: - path '${dataset_name}/config.toml' - path '${dataset_name}/curves.txt' - path '${dataset_name}/${dataset_name}.csv' + path './', emit: path_to_curvecurator_out script: """ - prepost_curve_fitting.py --path_data ${path_data} --dataset_name ${dataset_name} --task preprocess --cores ${task.cpus} CurveCurator ${path_data}/${dataset_name}/config.toml --mad - prepost_curve_fitting.py --path_data ${path_data} --dataset_name ${dataset_name} --task postprocess """ } diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf new file mode 100644 index 0000000..cd45369 --- /dev/null +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -0,0 +1,23 @@ +process POSTPROCESS_CURVECURATOR_DATA { + //tag "$samplesheet" + label 'process_low' + publishDir "${path_data}", mode: 'copy' + + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + val dataset_name + path path_data + + output: + path './', emit: path_to_dataset + + script: + """ + postprocess_curvecurator_output.py --path_data ${path_data} --dataset_name ${dataset_name} + """ +} diff --git a/modules/local/preprocess_raw_viability/main.nf b/modules/local/preprocess_raw_viability/main.nf new file mode 100644 index 0000000..786a7e8 --- /dev/null +++ b/modules/local/preprocess_raw_viability/main.nf @@ -0,0 +1,23 @@ +process PREPROCESS_RAW_VIABILITY { + //tag "$samplesheet" + label 'process_low' + publishDir "${path_data}", mode: 'copy' + + + //conda "conda-forge::python=3.8.3" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + // 'biocontainers/python:3.8.3' }" + + input: + val dataset_name + val path_data + + output: + path './', emit: path_to_processed_raw + + script: + """ + preprocess_raw_viability.py --path_data ${path_data} --dataset_name ${dataset_name} --cores ${task.cpus} + """ +} diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index bfc671d..8f8f387 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -6,6 +6,8 @@ include { HPAM_SPLIT } from '../../../modules/local/hpam_ include { TRAIN_AND_PREDICT_CV } from '../../../modules/local/train_and_predict_cv' include { EVALUATE_FIND_MAX } from '../../../modules/local/evaluate_find_max' include { FIT_CURVES } from '../../../modules/local/fit_curves' +include { PREPROCESS_RAW_VIABILITY } from '../../../modules/local/preprocess_raw_viability' +include { POSTPROCESS_CURVECURATOR_DATA } from '../../../modules/local/postprocess_curvecurator_output' workflow RUN_CV { take: @@ -17,9 +19,12 @@ workflow RUN_CV { main: if (params.curve_curator) { - FIT_CURVES(params.dataset_name, path_data) - // manually change this here to call LOAD_RESPONSE without curvecurator option - measure = measure + "_curvecurator" + PREPROCESS_RAW_VIABILITY(params.dataset_name, path_data) + FIT_CURVES(params.dataset_name, PREPROCESS_RAW_VIABILITY.out.path_to_processed_raw) + POSTPROCESS_CURVECURATOR_DATA(params.dataset_name, FIT_CURVES.out.path_to_curvecurator_out) + // manually change this here to call LOAD_RESPONSE without curvecurator option and correct path + measure = measure + "_curvecurator" + path_data = POSTPROCESS_CURVECURATOR_DATA.out.path_to_dataset } LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, measure) From 01b89363bc88536717ea89abe2c49156cb4853c5 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Wed, 4 Dec 2024 19:23:34 +0100 Subject: [PATCH 144/257] fixed paths and emits --- bin/preprocess_raw_viability.py | 2 +- modules/local/fit_curves/main.nf | 10 +++++++--- modules/local/postprocess_curvecurator_output/main.nf | 8 ++++---- modules/local/preprocess_raw_viability/main.nf | 3 ++- subworkflows/local/run_cv/main.nf | 2 +- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/bin/preprocess_raw_viability.py b/bin/preprocess_raw_viability.py index 68f16e9..c92f7c7 100755 --- a/bin/preprocess_raw_viability.py +++ b/bin/preprocess_raw_viability.py @@ -15,7 +15,7 @@ def main(args): base_path = Path(args.path_data) / args.dataset_name preprocess( input_file=base_path / f"{args.dataset_name}_raw.csv", - output_dir='./', + output_dir=args.dataset_name, dataset_name=args.dataset_name, cores=args.cores ) diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index 63cba77..1909b9f 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -11,13 +11,17 @@ process FIT_CURVES { input: val dataset_name - path path_data + path toml + path curvecurator_input output: - path './', emit: path_to_curvecurator_out + path "${dataset_name}/curves.txt", emit: path_to_curvecurator_out + path "${dataset_name}/norm.txt" + path "${dataset_name}/mad.txt" + path "${dataset_name}/dashboard.html" script: """ - CurveCurator ${path_data}/${dataset_name}/config.toml --mad + CurveCurator ${toml} --mad """ } diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf index cd45369..2552a7a 100644 --- a/modules/local/postprocess_curvecurator_output/main.nf +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -1,7 +1,7 @@ process POSTPROCESS_CURVECURATOR_DATA { //tag "$samplesheet" label 'process_low' - publishDir "${path_data}", mode: 'copy' + publishDir "${path_data}/", mode: 'copy' //conda "conda-forge::python=3.8.3" @@ -11,13 +11,13 @@ process POSTPROCESS_CURVECURATOR_DATA { input: val dataset_name - path path_data + path curve_data output: - path './', emit: path_to_dataset + path "${dataset_name}/${dataset_name}.csv", emit: path_to_dataset script: """ - postprocess_curvecurator_output.py --path_data ${path_data} --dataset_name ${dataset_name} + postprocess_curvecurator_output.py --dataset_name ${dataset_name} """ } diff --git a/modules/local/preprocess_raw_viability/main.nf b/modules/local/preprocess_raw_viability/main.nf index 786a7e8..7dd8574 100644 --- a/modules/local/preprocess_raw_viability/main.nf +++ b/modules/local/preprocess_raw_viability/main.nf @@ -14,7 +14,8 @@ process PREPROCESS_RAW_VIABILITY { val path_data output: - path './', emit: path_to_processed_raw + path "${dataset_name}/config.toml", emit: path_to_toml + path "${dataset_name}/curvecurator_input.tsv", emit: curvecurator_input script: """ diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 8f8f387..cf952f8 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -20,7 +20,7 @@ workflow RUN_CV { main: if (params.curve_curator) { PREPROCESS_RAW_VIABILITY(params.dataset_name, path_data) - FIT_CURVES(params.dataset_name, PREPROCESS_RAW_VIABILITY.out.path_to_processed_raw) + FIT_CURVES(params.dataset_name, PREPROCESS_RAW_VIABILITY.out.path_to_toml, PREPROCESS_RAW_VIABILITY.out.curvecurator_input) POSTPROCESS_CURVECURATOR_DATA(params.dataset_name, FIT_CURVES.out.path_to_curvecurator_out) // manually change this here to call LOAD_RESPONSE without curvecurator option and correct path measure = measure + "_curvecurator" From e4bd7242def42bc031cb791d8b8693552d48479b Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Wed, 4 Dec 2024 19:37:19 +0100 Subject: [PATCH 145/257] fixed publishDirs --- modules/local/fit_curves/main.nf | 10 +++++----- modules/local/postprocess_curvecurator_output/main.nf | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index 1909b9f..02e4336 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -1,7 +1,7 @@ process FIT_CURVES { //tag "$samplesheet" label 'high_cpu_low_mem' - publishDir "${path_data}", mode: 'copy' + publishDir "${path_data}/${dataset_name}/", mode: 'copy' //conda "conda-forge::python=3.8.3" @@ -15,10 +15,10 @@ process FIT_CURVES { path curvecurator_input output: - path "${dataset_name}/curves.txt", emit: path_to_curvecurator_out - path "${dataset_name}/norm.txt" - path "${dataset_name}/mad.txt" - path "${dataset_name}/dashboard.html" + path "curves.txt", emit: path_to_curvecurator_out + path "mad.txt" + path "dashboard.html" + path "curveCurator.log" script: """ diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf index 2552a7a..afa0a0e 100644 --- a/modules/local/postprocess_curvecurator_output/main.nf +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -1,7 +1,7 @@ process POSTPROCESS_CURVECURATOR_DATA { //tag "$samplesheet" label 'process_low' - publishDir "${path_data}/", mode: 'copy' + publishDir "${path_data}/${dataset_name}/", mode: 'copy' //conda "conda-forge::python=3.8.3" @@ -14,7 +14,7 @@ process POSTPROCESS_CURVECURATOR_DATA { path curve_data output: - path "${dataset_name}/${dataset_name}.csv", emit: path_to_dataset + path "${dataset_name}.csv", emit: path_to_dataset script: """ From b9f3cf2d6cc924bb4d23ad4f046da1166dc63d21 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Wed, 4 Dec 2024 19:44:48 +0100 Subject: [PATCH 146/257] fixed missing params ref in publishDir --- modules/local/fit_curves/main.nf | 2 +- modules/local/postprocess_curvecurator_output/main.nf | 2 +- subworkflows/local/run_cv/main.nf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index 02e4336..e6e7256 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -1,7 +1,7 @@ process FIT_CURVES { //tag "$samplesheet" label 'high_cpu_low_mem' - publishDir "${path_data}/${dataset_name}/", mode: 'copy' + publishDir "${path_data}/${params.dataset_name}/", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf index afa0a0e..94a6884 100644 --- a/modules/local/postprocess_curvecurator_output/main.nf +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -1,7 +1,7 @@ process POSTPROCESS_CURVECURATOR_DATA { //tag "$samplesheet" label 'process_low' - publishDir "${path_data}/${dataset_name}/", mode: 'copy' + publishDir "${path_data}/${params.dataset_name}/", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index cf952f8..0ee0734 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -24,7 +24,7 @@ workflow RUN_CV { POSTPROCESS_CURVECURATOR_DATA(params.dataset_name, FIT_CURVES.out.path_to_curvecurator_out) // manually change this here to call LOAD_RESPONSE without curvecurator option and correct path measure = measure + "_curvecurator" - path_data = POSTPROCESS_CURVECURATOR_DATA.out.path_to_dataset + //path_data = POSTPROCESS_CURVECURATOR_DATA.out.path_to_dataset } LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, measure) From befa36821f303c5dea0fc6b053bcddec0cbd18ac Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Wed, 4 Dec 2024 19:47:50 +0100 Subject: [PATCH 147/257] ensure LOAD_RESPONSE is waiting --- subworkflows/local/run_cv/main.nf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 0ee0734..8071e2c 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -25,9 +25,13 @@ workflow RUN_CV { // manually change this here to call LOAD_RESPONSE without curvecurator option and correct path measure = measure + "_curvecurator" //path_data = POSTPROCESS_CURVECURATOR_DATA.out.path_to_dataset + LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, measure) + + } else { + LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, measure) + } - LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, measure) ch_test_modes = channel.from(test_modes) ch_data = ch_test_modes.combine(LOAD_RESPONSE.out.response_dataset) From 719e2ffd70730c13ac4a44c925ec3d697a02af2c Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Dec 2024 11:50:17 +0100 Subject: [PATCH 148/257] fixed path data problems, problem was missing params. in front of path_data in publishDir. --- modules/local/fit_curves/main.nf | 2 +- modules/local/postprocess_curvecurator_output/main.nf | 4 +++- subworkflows/local/run_cv/main.nf | 8 +++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index e6e7256..21557ac 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -1,7 +1,7 @@ process FIT_CURVES { //tag "$samplesheet" label 'high_cpu_low_mem' - publishDir "${path_data}/${params.dataset_name}/", mode: 'copy' + publishDir "${params.path_data}/${params.dataset_name}", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf index 94a6884..453e211 100644 --- a/modules/local/postprocess_curvecurator_output/main.nf +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -1,7 +1,7 @@ process POSTPROCESS_CURVECURATOR_DATA { //tag "$samplesheet" label 'process_low' - publishDir "${path_data}/${params.dataset_name}/", mode: 'copy' + publishDir "${params.path_data}/${params.dataset_name}", mode: 'copy' //conda "conda-forge::python=3.8.3" @@ -12,9 +12,11 @@ process POSTPROCESS_CURVECURATOR_DATA { input: val dataset_name path curve_data + val measure output: path "${dataset_name}.csv", emit: path_to_dataset + val "${measure}" + "_curvecurator", emit: measure script: """ diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 8071e2c..958840a 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -15,17 +15,15 @@ workflow RUN_CV { models // model names for full testing baselines // model names for comparison path_data // path to data - measure // measure name to use + measure // measure name to use main: if (params.curve_curator) { PREPROCESS_RAW_VIABILITY(params.dataset_name, path_data) FIT_CURVES(params.dataset_name, PREPROCESS_RAW_VIABILITY.out.path_to_toml, PREPROCESS_RAW_VIABILITY.out.curvecurator_input) - POSTPROCESS_CURVECURATOR_DATA(params.dataset_name, FIT_CURVES.out.path_to_curvecurator_out) - // manually change this here to call LOAD_RESPONSE without curvecurator option and correct path - measure = measure + "_curvecurator" + POSTPROCESS_CURVECURATOR_DATA(params.dataset_name, FIT_CURVES.out.path_to_curvecurator_out, measure) //path_data = POSTPROCESS_CURVECURATOR_DATA.out.path_to_dataset - LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, measure) + LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, POSTPROCESS_CURVECURATOR_DATA.out.measure) } else { LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, measure) From b3af48f515bf7225295b531a52c85b35c1fb892f Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Thu, 5 Dec 2024 15:15:29 +0100 Subject: [PATCH 149/257] created separate preprocessing workflow --- modules/local/fit_curves/main.nf | 2 +- .../postprocess_curvecurator_output/main.nf | 2 +- subworkflows/local/preprocess_custom/main.nf | 21 +++++++++++++++++++ subworkflows/local/run_cv/main.nf | 18 ++-------------- workflows/drugresponseeval.nf | 9 +++++++- 5 files changed, 33 insertions(+), 19 deletions(-) create mode 100644 subworkflows/local/preprocess_custom/main.nf diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index 21557ac..5a62777 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -1,7 +1,7 @@ process FIT_CURVES { //tag "$samplesheet" label 'high_cpu_low_mem' - publishDir "${params.path_data}/${params.dataset_name}", mode: 'copy' + publishDir "${params.path_data}/${dataset_name}", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf index 453e211..70eb6fe 100644 --- a/modules/local/postprocess_curvecurator_output/main.nf +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -1,7 +1,7 @@ process POSTPROCESS_CURVECURATOR_DATA { //tag "$samplesheet" label 'process_low' - publishDir "${params.path_data}/${params.dataset_name}", mode: 'copy' + publishDir "${params.path_data}/${dataset_name}", mode: 'copy' //conda "conda-forge::python=3.8.3" diff --git a/subworkflows/local/preprocess_custom/main.nf b/subworkflows/local/preprocess_custom/main.nf new file mode 100644 index 0000000..7d6dc31 --- /dev/null +++ b/subworkflows/local/preprocess_custom/main.nf @@ -0,0 +1,21 @@ +include { FIT_CURVES } from '../../../modules/local/fit_curves' +include { PREPROCESS_RAW_VIABILITY } from '../../../modules/local/preprocess_raw_viability' +include { POSTPROCESS_CURVECURATOR_DATA } from '../../../modules/local/postprocess_curvecurator_output' + +workflow PREPROCESS_CUSTOM { + take: + path_data + dataset_name + measure + + main: + File raw_file = new File("${path_data}/${dataset_name}/${dataset_name}_raw.csv") + + if (raw_file.exists()){ + PREPROCESS_RAW_VIABILITY(dataset_name, path_data) + FIT_CURVES(dataset_name, PREPROCESS_RAW_VIABILITY.out.path_to_toml, PREPROCESS_RAW_VIABILITY.out.curvecurator_input) + POSTPROCESS_CURVECURATOR_DATA(dataset_name, FIT_CURVES.out.path_to_curvecurator_out) + } + emit: + measure = params.curve_curator ? measure + "_curvecurator" : measure +} \ No newline at end of file diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 958840a..e349faa 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -5,9 +5,6 @@ include { CV_SPLIT } from '../../../modules/local/cv_sp include { HPAM_SPLIT } from '../../../modules/local/hpam_split' include { TRAIN_AND_PREDICT_CV } from '../../../modules/local/train_and_predict_cv' include { EVALUATE_FIND_MAX } from '../../../modules/local/evaluate_find_max' -include { FIT_CURVES } from '../../../modules/local/fit_curves' -include { PREPROCESS_RAW_VIABILITY } from '../../../modules/local/preprocess_raw_viability' -include { POSTPROCESS_CURVECURATOR_DATA } from '../../../modules/local/postprocess_curvecurator_output' workflow RUN_CV { take: @@ -17,19 +14,8 @@ workflow RUN_CV { path_data // path to data measure // measure name to use - main: - if (params.curve_curator) { - PREPROCESS_RAW_VIABILITY(params.dataset_name, path_data) - FIT_CURVES(params.dataset_name, PREPROCESS_RAW_VIABILITY.out.path_to_toml, PREPROCESS_RAW_VIABILITY.out.curvecurator_input) - POSTPROCESS_CURVECURATOR_DATA(params.dataset_name, FIT_CURVES.out.path_to_curvecurator_out, measure) - //path_data = POSTPROCESS_CURVECURATOR_DATA.out.path_to_dataset - LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, POSTPROCESS_CURVECURATOR_DATA.out.measure) - - } else { - LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, measure) - - } - + main: + LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, measure) ch_test_modes = channel.from(test_modes) ch_data = ch_test_modes.combine(LOAD_RESPONSE.out.response_dataset) diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index b3046ac..3ea4eab 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -22,6 +22,7 @@ include { WRITE_INDEX } from '../modules/local/write_index' // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // +include { PREPROCESS_CUSTOM } from '../subworkflows/local/preprocess_custom' include { RUN_CV } from '../subworkflows/local/run_cv' include { MODEL_TESTING } from '../subworkflows/local/model_testing' include { VISUALIZATION } from '../subworkflows/local/visualization' @@ -65,12 +66,18 @@ workflow DRUGRESPONSEEVAL { params.measure ) + PREPROCESS_CUSTOM ( + PARAMS_CHECK.out.path_data + params.dataset_name + params.measure + ) + RUN_CV ( test_modes, models, baselines, PARAMS_CHECK.out.path_data, - params.measure + PREPROCESS_CUSTOM.out.measure ) MODEL_TESTING ( From 66bb18b0b463db08cc127794702b3e97631f0475 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Thu, 5 Dec 2024 15:25:02 +0100 Subject: [PATCH 150/257] added missing commas --- workflows/drugresponseeval.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 3ea4eab..81a55e2 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -67,8 +67,8 @@ workflow DRUGRESPONSEEVAL { ) PREPROCESS_CUSTOM ( - PARAMS_CHECK.out.path_data - params.dataset_name + PARAMS_CHECK.out.path_data, + params.dataset_name, params.measure ) From 98c780097e2fc987eb61355f90192e9cced8b826 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Dec 2024 15:59:53 +0100 Subject: [PATCH 151/257] giving path_data as value, not as channel, does not work otherwise --- modules/local/postprocess_curvecurator_output/main.nf | 7 ------- subworkflows/local/preprocess_custom/main.nf | 10 +++++----- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf index 70eb6fe..125ccae 100644 --- a/modules/local/postprocess_curvecurator_output/main.nf +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -1,14 +1,7 @@ process POSTPROCESS_CURVECURATOR_DATA { - //tag "$samplesheet" label 'process_low' publishDir "${params.path_data}/${dataset_name}", mode: 'copy' - - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" - input: val dataset_name path curve_data diff --git a/subworkflows/local/preprocess_custom/main.nf b/subworkflows/local/preprocess_custom/main.nf index 7d6dc31..7d0f25f 100644 --- a/subworkflows/local/preprocess_custom/main.nf +++ b/subworkflows/local/preprocess_custom/main.nf @@ -9,13 +9,13 @@ workflow PREPROCESS_CUSTOM { measure main: - File raw_file = new File("${path_data}/${dataset_name}/${dataset_name}_raw.csv") - + File raw_file = new File("${params.path_data}/${dataset_name}/${dataset_name}_raw.csv") + if (raw_file.exists()){ PREPROCESS_RAW_VIABILITY(dataset_name, path_data) FIT_CURVES(dataset_name, PREPROCESS_RAW_VIABILITY.out.path_to_toml, PREPROCESS_RAW_VIABILITY.out.curvecurator_input) - POSTPROCESS_CURVECURATOR_DATA(dataset_name, FIT_CURVES.out.path_to_curvecurator_out) + POSTPROCESS_CURVECURATOR_DATA(dataset_name, FIT_CURVES.out.path_to_curvecurator_out, measure) } emit: - measure = params.curve_curator ? measure + "_curvecurator" : measure -} \ No newline at end of file + measure = POSTPROCESS_CURVECURATOR_DATA.out.measure +} From 674bf15845dc35cc96c211db51f2bc527b982c6c Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Dec 2024 16:16:38 +0100 Subject: [PATCH 152/257] giving back valid measure variables: if curvecurator&raw -> run processes, if it's curvecurator but already processed, just append _curvecurator to metric, else return normal metric --- subworkflows/local/preprocess_custom/main.nf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/preprocess_custom/main.nf b/subworkflows/local/preprocess_custom/main.nf index 7d0f25f..528d95c 100644 --- a/subworkflows/local/preprocess_custom/main.nf +++ b/subworkflows/local/preprocess_custom/main.nf @@ -15,7 +15,12 @@ workflow PREPROCESS_CUSTOM { PREPROCESS_RAW_VIABILITY(dataset_name, path_data) FIT_CURVES(dataset_name, PREPROCESS_RAW_VIABILITY.out.path_to_toml, PREPROCESS_RAW_VIABILITY.out.curvecurator_input) POSTPROCESS_CURVECURATOR_DATA(dataset_name, FIT_CURVES.out.path_to_curvecurator_out, measure) + ch_measure = POSTPROCESS_CURVECURATOR_DATA.out.measure + }else if(params.curve_curator){ + ch_measure = Channel.of("${measure}" + "_curvecurator") + }else{ + ch_measure = measure } emit: - measure = POSTPROCESS_CURVECURATOR_DATA.out.measure + measure = ch_measure } From cd57894939d14c902b537dbfcba4725b1d8a9ac2 Mon Sep 17 00:00:00 2001 From: Mario Picciani Date: Tue, 10 Dec 2024 22:31:48 +0100 Subject: [PATCH 153/257] remove trailing whitespaces --- bin/preprocess_raw_viability.py | 2 +- subworkflows/local/run_cv/main.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/preprocess_raw_viability.py b/bin/preprocess_raw_viability.py index c92f7c7..9e5498d 100755 --- a/bin/preprocess_raw_viability.py +++ b/bin/preprocess_raw_viability.py @@ -11,7 +11,7 @@ def get_parser(): def main(args): - + base_path = Path(args.path_data) / args.dataset_name preprocess( input_file=base_path / f"{args.dataset_name}_raw.csv", diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index e349faa..5d97799 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -14,7 +14,7 @@ workflow RUN_CV { path_data // path to data measure // measure name to use - main: + main: LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets, measure) ch_test_modes = channel.from(test_modes) From 9bcf37662495c2030925b0fdd744055d901dd37f Mon Sep 17 00:00:00 2001 From: Pascal Iversen Date: Mon, 16 Dec 2024 15:00:43 +0000 Subject: [PATCH 154/257] c --- bin/train_and_predict_cv.py | 2 ++ bin/train_and_predict_final.py | 18 ++++++++++++++---- modules/local/randomization_test/main.nf | 4 +++- modules/local/robustness_test/main.nf | 4 +++- modules/local/train_and_predict_cv/main.nf | 5 ++++- nextflow.config | 1 + subworkflows/local/run_cv/main.nf | 9 +++------ 7 files changed, 30 insertions(+), 13 deletions(-) diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index 9380281..d2fbd1f 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -19,6 +19,7 @@ def get_parser(): parser.add_argument("--hyperparameters", type=str, help="hyperparameters for the model") parser.add_argument("--cv_data", type=str, help="path to the cv data split") parser.add_argument("--response_transformation", type=str, help="response transformation to apply to the dataset") + parser.add_argument("--model_checkpoint_dir", type=str, default="TEMPORARY", help="model checkpoint directory, if not provided: temporary directory is used") return parser @@ -45,6 +46,7 @@ def main(): prediction_dataset=validation_dataset, early_stopping_dataset=es_dataset, response_transformation=response_transform, + model_checkpoint_dir=args.model_checkpoint_dir ) with open(f"prediction_dataset_{model_name}_{str(args.cv_data).split('.pkl')[0]}_" f"{str(args.hyperparameters).split('.yaml')[0]}.pkl", diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index c58d16a..a590391 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -42,6 +42,8 @@ def get_parser(): ) parser.add_argument("--robustness_trial", type=int, help="Robustness trial index.") parser.add_argument("--cross_study_datasets", nargs="+", help="Path to cross study datasets.") + parser.add_argument("--model_checkpoint_dir", type=str, default="TEMPORARY", help="model checkpoint directory, if not provided: temporary directory is used") + return parser @@ -82,7 +84,8 @@ def compute_randomization( split_id: str, randomization_type: str = "permutation", response_transformation=Optional[TransformerMixin], - randomization_test_path: str = "" + randomization_test_path: str = "", + model_checkpoint_dir: str = "TEMPORARY", ): randomization_test_file = os.path.join( randomization_test_path, @@ -99,7 +102,8 @@ def compute_randomization( train_dataset=train_dataset, test_dataset=test_dataset, early_stopping_dataset=early_stopping_dataset, - response_transformation=response_transformation + response_transformation=response_transformation, + model_checkpoint_dir=model_checkpoint_dir ) @@ -113,7 +117,8 @@ def compute_robustness( split_id: str, trial: int, response_transformation=Optional[TransformerMixin], - rob_path: str = "" + rob_path: str = "", + model_checkpoint_dir: str = "TEMPORARY", ): robustness_test_file = os.path.join( rob_path, @@ -129,6 +134,7 @@ def compute_robustness( hpam_set=hpam_set, path_data=path_data, response_transformation=response_transformation, + model_checkpoint_dir=model_checkpoint_dir ) @@ -197,6 +203,7 @@ def compute_cross( prediction_dataset=test_set, early_stopping_dataset=es_set, response_transformation=transformation, + model_checkpoint_dir=args.model_checkpoint_dir ) prediction_dataset = os.path.join( predictions_path, @@ -238,6 +245,8 @@ def compute_cross( randomization_type=args.randomization_type, response_transformation=transformation, randomization_test_path=rand_path, + model_checkpoint_dir=args.model_checkpoint_dir + ) elif args.mode == "robustness": rob_path = generate_data_saving_path( @@ -256,7 +265,8 @@ def compute_cross( split_id=args.split_id, trial=args.robustness_trial, response_transformation=transformation, - rob_path=rob_path + rob_path=rob_path, + model_checkpoint_dir=args.model_checkpoint_dir ) else: raise ValueError(f"Invalid mode: {args.mode}. Choose full, randomization, or robustness.") diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index c9041ff..4368e99 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -9,6 +9,7 @@ process RANDOMIZATION_TEST { path(path_data) val(randomization_type) val(response_transformation) + val model_checkpoint_dir output: tuple val(test_mode), val(model_name), path('**randomization*.csv'), emit: ch_vis @@ -25,7 +26,8 @@ process RANDOMIZATION_TEST { --test_mode $test_mode \\ --path_data $path_data \\ --randomization_views_path $randomization_views \\ - --randomization_type $randomization_type + --randomization_type $randomization_type \\ + --model_checkpoint_dir $model_checkpoint_dir \\ """ } diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index 4f54593..ff71197 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -9,6 +9,7 @@ process ROBUSTNESS_TEST { path(path_data) val(randomization_type) val(response_transformation) + val model_checkpoint_dir output: tuple val(test_mode), val(model_name), path('**robustness*.csv'), emit: ch_vis @@ -24,7 +25,8 @@ process ROBUSTNESS_TEST { --response_transformation $response_transformation \\ --test_mode $test_mode \\ --path_data $path_data \\ - --robustness_trial $robustness_iteration + --robustness_trial $robustness_iteration \\ + --model_checkpoint_dir $model_checkpoint_dir \\ """ } diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 28d3cae..b8ec7c7 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -7,6 +7,8 @@ process TRAIN_AND_PREDICT_CV { tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters) path path_data val response_transformation + val model_checkpoint_dir + output: tuple val(model_name), val(test_mode), val(cv_data.baseName), path(hyperparameters), path("prediction_dataset_*.pkl"), emit: pred_data @@ -19,6 +21,7 @@ process TRAIN_AND_PREDICT_CV { --test_mode $test_mode \\ --hyperparameters $hyperparameters \\ --cv_data $cv_data \\ - --response_transformation $response_transformation + --response_transformation $response_transformation \\ + --model_checkpoint_dir $model_checkpoint_dir """ } diff --git a/nextflow.config b/nextflow.config index 36e18bc..7687d6b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -27,6 +27,7 @@ params { response_transformation = 'None' path_data = './data' save_datasets = false + model_checkpoint_dir = 'TEMPORARY' // Boilerplate options outdir = 'results' diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index ec84980..1766864 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -12,7 +12,7 @@ workflow RUN_CV { models // model names for full testing baselines // model names for comparison path_data // path to data - + main: LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets) @@ -72,11 +72,8 @@ workflow RUN_CV { // [model_name, test_mode, split_X.pkl, hpam_X.yaml] ch_test_combis = ch_model_cv.combine(ch_hpam_combis, by: 0) - TRAIN_AND_PREDICT_CV ( - ch_test_combis, - path_data, - params.response_transformation - ) + TRAIN_AND_PREDICT_CV(ch_test_combis, path_data, params.response_transformation, params.model_checkpoint_dir) + // [model_name, test_mode, split_id, // [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], // [prediction_dataset_0.pkl, ..., prediction_dataset_n.pkl] ] From 92786267886f9fb5c029746db1f5859198e6a1ef Mon Sep 17 00:00:00 2001 From: Pascal Iversen Date: Mon, 16 Dec 2024 21:09:04 +0000 Subject: [PATCH 155/257] checkpointing --- bin/train_and_predict_final.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index a590391..f5f037d 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -209,7 +209,7 @@ def compute_cross( predictions_path, f"predictions_{args.split_id}.csv", ) - test_set.save(prediction_dataset) + test_set.to_csv(prediction_dataset) for ds in args.cross_study_datasets: if ds == "NONE.csv": continue From 28ed89768b0e56bb761386fa890076074e5f12ee Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 13 Jan 2025 14:23:51 +0100 Subject: [PATCH 156/257] deleted notes --- modules/local/params_check/main.nf | 2 ++ modules/local/predict_full/main.nf | 2 ++ modules/local/randomization_test/main.nf | 2 ++ modules/local/robustness_test/main.nf | 2 ++ modules/local/train_and_predict_cv/main.nf | 2 ++ 5 files changed, 10 insertions(+) diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index a04511f..cdef2f3 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -18,6 +18,8 @@ process PARAMS_CHECK { val path_data output: + // note: this needs to be a value even though it is a path because otherwise, nextflow will interpret it only + // relatively to the work directory and as this path is outside the work directory, it will fail. val path_data, emit: path_data when: diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 7f9370c..6dd62fa 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -7,6 +7,8 @@ process PREDICT_FULL { input: tuple path(cross_study_datasets), val(model_name), val(test_mode), val(split_id), path(split_dataset), path(hpam_combi) val(response_transformation) + // note: this needs to be a value even though it is a path because otherwise, nextflow will interpret it only + // relatively to the work directory and as this path is outside the work directory, it will fail. val(path_data) output: diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index 496d511..3cf975f 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -6,6 +6,8 @@ process RANDOMIZATION_TEST { input: tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), path(randomization_views) + // note: this needs to be a value even though it is a path because otherwise, nextflow will interpret it only + // relatively to the work directory and as this path is outside the work directory, it will fail. val(path_data) val(randomization_type) val(response_transformation) diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index 8a18093..d4228f4 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -6,6 +6,8 @@ process ROBUSTNESS_TEST { input: tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), val(robustness_iteration) + // note: this needs to be a value even though it is a path because otherwise, nextflow will interpret it only + // relatively to the work directory and as this path is outside the work directory, it will fail. val(path_data) val(randomization_type) val(response_transformation) diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 6ba2682..440723d 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -5,6 +5,8 @@ process TRAIN_AND_PREDICT_CV { input: tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters) + // note: this needs to be a value even though it is a path because otherwise, nextflow will interpret it only + // relatively to the work directory and as this path is outside the work directory, it will fail. val path_data val response_transformation From 7680d2271c0c6f3ded869aadb34497347a183463 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 13 Jan 2025 14:27:51 +0100 Subject: [PATCH 157/257] changing something small to retrigger github action --- workflows/drugresponseeval.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 81a55e2..487b321 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -3,8 +3,6 @@ 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' From a5b42d0133bc0dc3c9804cf5f27a19bf32a4f413 Mon Sep 17 00:00:00 2001 From: Pascal Iversen Date: Mon, 13 Jan 2025 13:38:40 +0000 Subject: [PATCH 158/257] schema --- nextflow_schema.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index 7d57ead..b8a50b8 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -155,6 +155,12 @@ "type": "string", "description": "Response transformation", "help_text": "Transformation to apply to the response variable possible values: standard, minmax, robust" + }, + "model_checkpoint_dir": { + "type": "string", + "description": "Model checkpoint directory", + "default": "TEMPORARY", + "help_text": "Directory to save model checkpoints." } } }, From 794fb176bda257f6c86422ed1cea6b08ded57166 Mon Sep 17 00:00:00 2001 From: Pascal Iversen Date: Mon, 13 Jan 2025 13:45:03 +0000 Subject: [PATCH 159/257] pre-commit --- subworkflows/local/run_cv/main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 1766864..e893004 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -12,7 +12,6 @@ workflow RUN_CV { models // model names for full testing baselines // model names for comparison path_data // path to data - main: LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets) From d2ae9e723a5e6ce1cf18ef581af9e363ae8b54ca Mon Sep 17 00:00:00 2001 From: Pascal Iversen Date: Mon, 13 Jan 2025 13:52:38 +0000 Subject: [PATCH 160/257] auto fix lint nfcore --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/workflows/branch.yml | 18 ++++++++++-------- .github/workflows/linting.yml | 10 +++++----- .github/workflows/linting_comment.yml | 2 +- .prettierignore | 1 + LICENSE | 2 +- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 2a9b304..a7debef 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -9,7 +9,6 @@ body: - [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) - [nf-core/drugresponseeval pipeline documentation](https://nf-co.re/drugresponseeval/usage) - - type: textarea id: description attributes: diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 54154ae..5002772 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -1,15 +1,17 @@ name: nf-core branch protection -# This workflow is triggered on PRs to master branch on the repository -# It fails when someone tries to make a PR against the nf-core `master` branch instead of `dev` +# This workflow is triggered on PRs to `main`/`master` branch on the repository +# It fails when someone tries to make a PR against the nf-core `main`/`master` branch instead of `dev` on: pull_request_target: - branches: [master] + branches: + - main + - master jobs: test: runs-on: ubuntu-latest steps: - # PRs to the nf-core repo master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches + # PRs to the nf-core repo main/master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches - name: Check PRs if: github.repository == 'nf-core/drugresponseeval' run: | @@ -22,7 +24,7 @@ jobs: uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2 with: message: | - ## This PR is against the `master` branch :x: + ## This PR is against the `${{github.event.pull_request.base.ref}}` branch :x: * Do not close this PR * Click _Edit_ and change the `base` to `dev` @@ -32,9 +34,9 @@ jobs: Hi @${{ github.event.pull_request.user.login }}, - It looks like this pull-request is has been made against the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `master` branch. - The `master` branch on nf-core repositories should always contain code from the latest release. - Because of this, PRs to `master` are only allowed if they come from the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `dev` branch. + It looks like this pull-request is has been made against the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) ${{github.event.pull_request.base.ref}} branch. + The ${{github.event.pull_request.base.ref}} branch on nf-core repositories should always contain code from the latest release. + Because of this, PRs to ${{github.event.pull_request.base.ref}} are only allowed if they come from the [${{github.event.pull_request.head.repo.full_name }}](https://github.com/${{github.event.pull_request.head.repo.full_name }}) `dev` branch. You do not need to close this PR, you can change the target branch to `dev` by clicking the _"Edit"_ button at the top of this page. Note that even after this, the test will continue to show as failing until you push a new commit. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index a502573..dbd52d5 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -14,10 +14,10 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Set up Python 3.12 - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 + uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 with: python-version: "3.12" @@ -31,12 +31,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 + - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5 with: python-version: "3.12" architecture: "x64" @@ -74,7 +74,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 42e519b..0bed96d 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@bf251b5aa9c2f7eeb574a96ee720e24f801b7c11 # v6 + uses: dawidd6/action-download-artifact@80620a5d27ce0ae443b965134db88467fc607b43 # v7 with: workflow: linting.yml workflow_conclusion: completed diff --git a/.prettierignore b/.prettierignore index 437d763..edd29f0 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,3 +10,4 @@ testing/ testing* *.pyc bin/ +ro-crate-metadata.json diff --git a/LICENSE b/LICENSE index e7cad53..3359a46 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) Judith Bernett +Copyright (c) The nf-core/drugresponseeval team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 6e592263932b1fa02652286502e24e45a4262e34 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 13 Jan 2025 15:21:04 +0100 Subject: [PATCH 161/257] fixed pre-commit --- conf/test.config | 3 --- modules.json | 3 +-- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/conf/test.config b/conf/test.config index ec0b2a1..469f88b 100644 --- a/conf/test.config +++ b/conf/test.config @@ -30,7 +30,4 @@ params { run_id = 'test_run' dataset_name = 'Toy_Data' n_cv_splits = 2 - - - } diff --git a/modules.json b/modules.json index 39eb1ae..4430ebe 100644 --- a/modules.json +++ b/modules.json @@ -4,8 +4,7 @@ "repos": { "https://github.com/nf-core/modules.git": { "modules": { - "nf-core": { - } + "nf-core": {} }, "subworkflows": { "nf-core": { From e627d9f17e7cac8b4bc1b55761813338bd439500 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 13 Jan 2025 15:23:41 +0100 Subject: [PATCH 162/257] fixed container and env to latest --- env.yml | 2 +- nextflow.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/env.yml b/env.yml index 33d431f..d855f2b 100644 --- a/env.yml +++ b/env.yml @@ -6,4 +6,4 @@ dependencies: - ray-tune - pip - pip: - - drevalpy==1.0.10 + - drevalpy==1.1.1 diff --git a/nextflow.config b/nextflow.config index 5f3bdf0..ddf454b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -6,7 +6,7 @@ ---------------------------------------------------------------------------------------- */ -process.container = 'ghcr.io/daisybio/drevalpy:main' +process.container = 'ghcr.io/daisybio/drevalpy:latest' process.conda = 'env.yml' // Global default params, used in configs From a8cd55fcc1c7213cdfc43f87e476cea7f0454bc0 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 13 Jan 2025 17:01:55 +0100 Subject: [PATCH 163/257] ./data -> data --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 2437186..64f9af0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -25,7 +25,7 @@ params { optim_metric = 'RMSE' n_cv_splits = 10 response_transformation = 'None' - path_data = './data' + path_data = 'data' save_datasets = false model_checkpoint_dir = 'TEMPORARY' From 65bfa0bcb2c1d65d6f1d6c7eb504b2f12e56844d Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 29 Jan 2025 12:05:47 +0100 Subject: [PATCH 164/257] Lots of fixes: - added params.measure - made sure that downloaded data is exported to path_data but that internally, the work dir path is used (more nextflow-y) - added the model_checkpoint_dirs everywhere --- conf/modules.config | 8 ++++---- conf/test_full.config | 14 ++++---------- modules/local/load_response/main.nf | 8 +++++--- modules/local/params_check/main.nf | 10 ++++------ modules/local/predict_full/main.nf | 9 ++++----- modules/local/randomization_test/main.nf | 5 +---- modules/local/robustness_test/main.nf | 5 +---- modules/local/train_and_predict_cv/main.nf | 5 +---- nextflow.config | 4 ++-- nextflow_schema.json | 9 +++++---- subworkflows/local/model_testing/main.nf | 19 +++++++++++-------- subworkflows/local/run_cv/main.nf | 11 +++++++---- workflows/drugresponseeval.nf | 12 +++++++++--- 13 files changed, 58 insertions(+), 61 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 5dba3ba..60d4a2f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -20,17 +20,17 @@ process { withName: 'LOAD_RESPONSE' { publishDir = [ - path: { params.save_datasets ? "${params.path_data}/${params.run_id}/datasets" : params.path_data }, + path: params.path_data, mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } + saveAs: { filename -> (filename != 'versions.yml' && !filename.endsWith('pkl')) ? filename : null } ] } withName: 'CV_SPLIT' { publishDir = [ - path: { params.save_datasets ? "${params.path_data}/${params.run_id}/datasets" : params.path_data }, + path: { params.path_data }, mode: params.publish_dir_mode, - saveAs: { filename -> (filename != 'versions.yml' && params.save_datasets) ? filename : null } + saveAs: { filename -> null } ] } diff --git a/conf/test_full.config b/conf/test_full.config index dc74347..54f3257 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -14,16 +14,10 @@ params { config_profile_name = 'Full test profile' config_profile_description = 'Full test dataset to check pipeline function' - // TODO: do this for the proper pipeline - // 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 = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_full_illumina_amplicon.csv' - - // Fasta references - //fasta = params.pipelines_testdata_base_path + 'viralrecon/genome/NC_045512.2/GCF_009858895.2_ASM985889v3_genomic.200409.fna.gz' - - run_id = 'test_run' + run_id = 'full_test_run' dataset_name = 'Toy_Data' n_cv_splits = 5 + models = 'ElasticNet' + randomization_mode = 'SVRC' + n_trials_robustness = 2 } diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index a388048..4b155b1 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -1,21 +1,23 @@ process LOAD_RESPONSE { tag "${dataset_name} (cross: ${cross_study_datasets})" label 'process_single' - publishDir "${path_data}", mode: 'copy' input: val dataset_name - val path_data + path work_path val cross_study_datasets + val measure + val useless_count output: path 'response_dataset.pkl', emit: response_dataset path 'cross_study_*.pkl', emit: cross_study_datasets, optional: true + script: """ load_response.py \\ --dataset_name ${dataset_name} \\ - --path_data ${path_data} \\ + --path_data ${work_path} \\ ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} """ diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index cdef2f3..189939b 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -16,14 +16,10 @@ process PARAMS_CHECK { val n_cv_splits val response_transformation val path_data + val measure output: - // note: this needs to be a value even though it is a path because otherwise, nextflow will interpret it only - // relatively to the work directory and as this path is outside the work directory, it will fail. - val path_data, emit: path_data - - when: - task.ext.when == null || task.ext.when + val path_data script: """ @@ -38,6 +34,8 @@ process PARAMS_CHECK { --dataset_name $dataset_name \\ ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} \\ ${curve_curator ? '--curve_curator' : ''} \\ + --path_data $path_data \\ + --measure $measure \\ --optim_metric $optim_metric \\ --n_cv_splits $n_cv_splits \\ --response_transformation $response_transformation diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 6dd62fa..0a31a1e 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -5,11 +5,9 @@ process PREDICT_FULL { publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' input: - tuple path(cross_study_datasets), val(model_name), val(test_mode), val(split_id), path(split_dataset), path(hpam_combi) + tuple path(cross_study_datasets), val(model_name), val(test_mode), val(split_id), path(split_dataset), path(hpam_combi), path(path_data) val(response_transformation) - // note: this needs to be a value even though it is a path because otherwise, nextflow will interpret it only - // relatively to the work directory and as this path is outside the work directory, it will fail. - val(path_data) + val(model_checkpoint_dir) output: tuple val(test_mode), val(model_name), path('**predictions*.csv'), emit: ch_vis @@ -27,7 +25,8 @@ process PREDICT_FULL { --response_transformation $response_transformation \\ --test_mode $test_mode \\ --path_data $path_data \\ - --cross_study_datasets $cross_study_datasets + --cross_study_datasets $cross_study_datasets \\ + --model_checkpoint_dir $model_checkpoint_dir \\ """ } diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index 90eadd8..c21b00f 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -5,10 +5,7 @@ process RANDOMIZATION_TEST { publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' input: - tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), path(randomization_views) - // note: this needs to be a value even though it is a path because otherwise, nextflow will interpret it only - // relatively to the work directory and as this path is outside the work directory, it will fail. - val(path_data) + tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), path(randomization_views), path(path_data) val(randomization_type) val(response_transformation) val model_checkpoint_dir diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index 0548f0c..4e4cd84 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -5,10 +5,7 @@ process ROBUSTNESS_TEST { publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' input: - tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), val(robustness_iteration) - // note: this needs to be a value even though it is a path because otherwise, nextflow will interpret it only - // relatively to the work directory and as this path is outside the work directory, it will fail. - val(path_data) + tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), val(robustness_iteration), path(path_data) val(randomization_type) val(response_transformation) val model_checkpoint_dir diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 2cc89de..10867e9 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -4,10 +4,7 @@ process TRAIN_AND_PREDICT_CV { label 'process_gpu' input: - tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters) - // note: this needs to be a value even though it is a path because otherwise, nextflow will interpret it only - // relatively to the work directory and as this path is outside the work directory, it will fail. - val path_data + tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters), path(path_data) val response_transformation val model_checkpoint_dir diff --git a/nextflow.config b/nextflow.config index 64f9af0..5f088d7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -25,9 +25,9 @@ params { optim_metric = 'RMSE' n_cv_splits = 10 response_transformation = 'None' - path_data = 'data' - save_datasets = false + path_data = './data' model_checkpoint_dir = 'TEMPORARY' + measure = 'LN_IC50' // Boilerplate options outdir = 'results' diff --git a/nextflow_schema.json b/nextflow_schema.json index 49baf6f..b76f5bf 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -134,10 +134,11 @@ "description": "Run the curve curator.", "help_text": "Whether to run \" \"CurveCurator \" \"to sort out \" \"non-reactive \" \"curves" }, - "save_datasets": { - "type": "boolean", - "description": "If this is true, intermediate datasets are saved.", - "help_text": "This includes the pickled response/cross validation datasets, the pickled CV splits, the hyperparameter split yamls, the pickled predictions of each trained model, the best hyperparameters, and the randomization test view yamls. Consider this more of a debug flag." + "measure": { + "type": "string", + "description": "Which measure of drug response should be used. Only 'LN_IC50', 'EC50', 'IC50', 'pEC50', 'AUC', 'response' or their equivalents including the '_curvecurator' suffix are allowed.", + "default": "LN_IC50", + "help_text": "Measure to use for the pipeline. Default is LN_IC50." }, "optim_metric": { "type": "string", diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 6f88958..6ca8b94 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -14,7 +14,7 @@ workflow MODEL_TESTING { randomizations // from input cross_study_datasets // from LOAD_RESPONSE ch_models // from RUN_CV - path_data // from input + work_path // from input main: if (params.cross_study_datasets == '') { @@ -27,11 +27,13 @@ workflow MODEL_TESTING { ch_tmp2 = cross_study_datasets .collect() .map{it -> [it]} - ch_predict_final = ch_tmp2.combine(ch_tmp) + // [[cross_study_datasets], model, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, path/to/data] + ch_predict_final = ch_tmp2.combine(ch_tmp).combine(work_path) + PREDICT_FULL ( ch_predict_final, params.response_transformation, - path_data + params.model_checkpoint_dir ) ch_vis = PREDICT_FULL.out.ch_vis @@ -57,12 +59,13 @@ workflow MODEL_TESTING { // randomization_views] ch_randomization = ch_best_hpams_per_split_rand .combine(ch_rand_views, by: 0) + .combine(work_path) RANDOMIZATION_TEST ( ch_randomization, - path_data, params.randomization_type, - params.response_transformation + params.response_transformation, + params.model_checkpoint_dir ) ch_vis = ch_vis.concat(RANDOMIZATION_TEST.out.ch_vis) } @@ -80,12 +83,12 @@ workflow MODEL_TESTING { // [model_name, test_mode, split_id, split_dataset, best_hpam_combi_X.yaml, // robustness_iteration] - ch_robustness = ch_best_hpams_per_split_rob.combine(ch_trials_robustness, by: 0) + ch_robustness = ch_best_hpams_per_split_rob.combine(ch_trials_robustness, by: 0).combine(work_path) ROBUSTNESS_TEST ( ch_robustness, - path_data, params.randomization_type, - params.response_transformation + params.response_transformation, + params.model_checkpoint_dir ) ch_vis = ch_vis.concat(ROBUSTNESS_TEST.out.ch_vis) } diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index e893004..52fe83b 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -11,9 +11,11 @@ workflow RUN_CV { test_modes // LPO,LDO,LCO models // model names for full testing baselines // model names for comparison - path_data // path to data + work_path // path to data + useless_count // how do I make it wait for check params to finish? main: - LOAD_RESPONSE(params.dataset_name, path_data, params.cross_study_datasets) + + LOAD_RESPONSE(params.dataset_name, work_path, params.cross_study_datasets, params.measure, useless_count) ch_test_modes = channel.from(test_modes) ch_data = ch_test_modes.combine(LOAD_RESPONSE.out.response_dataset) @@ -68,10 +70,11 @@ workflow RUN_CV { ch_model_cv = ch_models_baselines_expanded .combine(ch_cv_splits.transpose()) .map { model_class, model_name, test_mode, split -> [model_name, test_mode, split] } - // [model_name, test_mode, split_X.pkl, hpam_X.yaml] + // [model_name, test_mode, split_X.pkl, hpam_X.yaml, path/to/data] ch_test_combis = ch_model_cv.combine(ch_hpam_combis, by: 0) + ch_test_combis = ch_test_combis.combine(work_path) - TRAIN_AND_PREDICT_CV(ch_test_combis, path_data, params.response_transformation, params.model_checkpoint_dir) + TRAIN_AND_PREDICT_CV(ch_test_combis, params.response_transformation, params.model_checkpoint_dir) // [model_name, test_mode, split_id, // [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index b6dbdea..906dc59 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -69,14 +69,20 @@ workflow DRUGRESPONSEEVAL { params.optim_metric, params.n_cv_splits, params.response_transformation, - params.path_data + params.path_data, + params.measure ) + work_path = channel.fromPath(params.path_data) + work_path + RUN_CV ( test_modes, models, baselines, - PARAMS_CHECK.out.path_data + work_path, + // wait for params_check to finish + PARAMS_CHECK.out.count() ) MODEL_TESTING ( @@ -85,7 +91,7 @@ workflow DRUGRESPONSEEVAL { randomizations, RUN_CV.out.cross_study_datasets, RUN_CV.out.ch_models, - PARAMS_CHECK.out.path_data + work_path ) VISUALIZATION ( From 3797462cc2e810744daf9dab946179cad2d0d2e9 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 29 Jan 2025 12:32:06 +0100 Subject: [PATCH 165/257] did not work with relative default path yet, maybe now --- modules/local/params_check/main.nf | 3 ++- nextflow.config | 2 +- subworkflows/local/model_testing/main.nf | 2 +- workflows/drugresponseeval.nf | 1 - 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index 189939b..3a7a93d 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -22,6 +22,7 @@ process PARAMS_CHECK { val path_data script: + def work_path = new File("${path_data}").absolutePath """ check_params.py \\ --run_id $run_id \\ @@ -34,7 +35,7 @@ process PARAMS_CHECK { --dataset_name $dataset_name \\ ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} \\ ${curve_curator ? '--curve_curator' : ''} \\ - --path_data $path_data \\ + --path_data $work_path \\ --measure $measure \\ --optim_metric $optim_metric \\ --n_cv_splits $n_cv_splits \\ diff --git a/nextflow.config b/nextflow.config index 5f088d7..1fe0791 100644 --- a/nextflow.config +++ b/nextflow.config @@ -25,7 +25,7 @@ params { optim_metric = 'RMSE' n_cv_splits = 10 response_transformation = 'None' - path_data = './data' + path_data = 'data' model_checkpoint_dir = 'TEMPORARY' measure = 'LN_IC50' diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 6ca8b94..65a6dfc 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -18,7 +18,7 @@ workflow MODEL_TESTING { main: if (params.cross_study_datasets == '') { - cross_study_datasets = Channel.fromPath(['./NONE.csv']) + cross_study_datasets = channel.fromPath(['./NONE.csv']) } ch_tmp = best_hpam_per_split.map{ split_id, test_mode, path_to_split, model_name, path_to_hpams -> diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 906dc59..d088473 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -74,7 +74,6 @@ workflow DRUGRESPONSEEVAL { ) work_path = channel.fromPath(params.path_data) - work_path RUN_CV ( test_modes, From db805e9f1c7d837875599b8525106278ad066528 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 29 Jan 2025 15:12:29 +0100 Subject: [PATCH 166/257] updated documentation --- CHANGELOG.md | 1 + docs/output.md | 15 ++++----------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e50810..0640c8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ Initial release of nf-core/drugresponseeval, created with the [nf-core](https:// ### `Fixed` - Fixed linting issues +- Fixed bugs with path_data: can now be handled as absolute and relative paths ### `Dependencies` diff --git a/docs/output.md b/docs/output.md index b0c6b9e..8eef1b2 100644 --- a/docs/output.md +++ b/docs/output.md @@ -75,13 +75,13 @@ It emits the path to the data but mostly so that the other processes wait for `P #### Load response -The response data is loaded into the pipeline. This step is necessary to provide the pipeline with the response data that will be used to train and evaluate the models. +The response data is loaded into the pipeline. The downloaded data is exported to `--path_data` +This step is necessary to provide the pipeline with the response data that will be used to train and evaluate the models.
        -Optional output files if --save_datasets is set +Output files -- `response_dataset.pkl`: The response data is saved as a pickle file. -- `cross_study_*.pkl`: The response data for the cross-study datasets is saved as a pickle file. +- Folder `path_data/dataset_name`: Everything required for the models to run is saved into this folder.
        @@ -92,13 +92,6 @@ The data is split into training, validation, and test sets for each fold. For mo stopping dataset is split from the validation set. This ensures that all models are trained and evaluated on the same dataset. -
        -Optional output file if --save_datasets is set - -- `split*.pkl`: The response data belonging to each fold is saved as a pickle file. - -
        - #### Make model channel From the input baseline and model names, channels are created. This step is necessary because for the From 83b4f54383720d85173905d5a99d95bad78afe95 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 29 Jan 2025 16:38:58 +0100 Subject: [PATCH 167/257] fixed schema --- env.yml | 1 - nextflow_schema.json | 6 ------ 2 files changed, 7 deletions(-) diff --git a/env.yml b/env.yml index d855f2b..330a6d4 100644 --- a/env.yml +++ b/env.yml @@ -3,7 +3,6 @@ channels: - conda-forge - defaults dependencies: - - ray-tune - pip - pip: - drevalpy==1.1.1 diff --git a/nextflow_schema.json b/nextflow_schema.json index dedd8ef..6a9687b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -140,12 +140,6 @@ "description": "If True, use refit measures instead of original measures reported by the authors for the available datasets, or invoke automatic fitting of custom raw viability data.", "help_text": "This allows using refit measures (see 'measure' option for details) for available datasets, which allows better comparability between datasets. When providing a custom dataset (see 'dataset_name' option), setting this to True expects a csv-formatted file at //_raw.csv (also see 'path_data' option), which is fitted automatically with the same procedure as the available datasets, to provide fair comparison. The fitted data will then be stored at //.csv." }, - "measure": { - "type": "string", - "description": "Which measure of drug response should be used. Only 'LN_IC50', 'EC50', 'IC50', 'pEC50', 'AUC', 'response' or their equivalents including the '_curvecurator' suffix are allowed.", - "default": "LN_IC50", - "help_text": "Measure to use for the pipeline. Default is LN_IC50." - }, "optim_metric": { "type": "string", "description": "Optimization metric for the pipeline.", From a25e8d87748eeeb5f45d1394523ff0abec79159f Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 30 Jan 2025 10:43:02 +0100 Subject: [PATCH 168/257] fixed curvecurator-related tasks to work within the Nextflow logic, i.e., with the local paths in the work directories. Updated output and usage documentation. --- bin/preprocess_raw_viability.py | 6 +- conf/modules.config | 16 ++++++ docs/output.md | 56 +++++++++++++++++-- docs/usage.md | 29 ++++++++++ modules/local/fit_curves/main.nf | 18 ++---- modules/local/load_response/main.nf | 2 +- .../postprocess_curvecurator_output/main.nf | 2 +- .../local/preprocess_raw_viability/main.nf | 19 ++----- subworkflows/local/preprocess_custom/main.nf | 18 ++++-- workflows/drugresponseeval.nf | 12 ++-- 10 files changed, 131 insertions(+), 47 deletions(-) diff --git a/bin/preprocess_raw_viability.py b/bin/preprocess_raw_viability.py index 9e5498d..3119279 100755 --- a/bin/preprocess_raw_viability.py +++ b/bin/preprocess_raw_viability.py @@ -2,6 +2,7 @@ from drevalpy.datasets.curvecurator import preprocess from pathlib import Path import argparse + def get_parser(): parser = argparse.ArgumentParser(description="Pre/postprocess CurveCurator viability data.") parser.add_argument("--path_data", type=str, default="", help="Path to base folder containing datasets.") @@ -11,10 +12,9 @@ def get_parser(): def main(args): - - base_path = Path(args.path_data) / args.dataset_name + input_file = Path(args.path_data) / args.dataset_name / f"{args.dataset_name}_raw.csv" preprocess( - input_file=base_path / f"{args.dataset_name}_raw.csv", + input_file=input_file, output_dir=args.dataset_name, dataset_name=args.dataset_name, cores=args.cores diff --git a/conf/modules.config b/conf/modules.config index 60d4a2f..81b7393 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -26,6 +26,22 @@ process { ] } + withName: 'PREPROCESS_RAW_VIABILITY' { + publishDir = [ + path: { params.path_data }, + mode: params.publish_dir_mode, + saveAs: { filename -> null } + ] + } + + withName: 'FIT_CURVES' { + publishDir = [ + path: { params.path_data }, + mode: params.publish_dir_mode, + saveAs: { filename -> null } + ] + } + withName: 'CV_SPLIT' { publishDir = [ path: { params.path_data }, diff --git a/docs/output.md b/docs/output.md index 8eef1b2..abaeac3 100644 --- a/docs/output.md +++ b/docs/output.md @@ -13,7 +13,11 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d 1. [Parameter check](#parameter-check): Several parameters are validated to ensure that the pipeline can run successfully. -2. `RUN_CV` subworkflow: Finds the optimal hyperparameters for each model in a cross-validation setting. +2. `PREPROCESS_CUSTOM` subworkflow: This subworkflow is only triggered if there is a custom dataset and if in the corresponding folder, there is a file named `[dataset_name]_raw.csv`. If this is the case, CurveCurator is run on the raw data. + - [Preprocess raw viability](#preprocess-raw-viability): The raw viability data is put in a format suitable for CurveCurator. + - [Fit curves](#fit-curves): Curves are fitted using CurveCurator. + - [Postprocess CurveCurator data](#postprocess-curvecurator-data): The individual curves.tsv files are collected and one output file is written. +3. `RUN_CV` subworkflow: Finds the optimal hyperparameters for each model in a cross-validation setting. - [Load response](#load-response): The response data is loaded. - [CV split](#cv-split): The response data is split into cross-validation folds. - [Make model channel](#make-model-channel): From the input baseline and model names, channels are created. This @@ -23,7 +27,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Train and predict CV](#train-and-predict-cv): All models are trained and evaluated in a cross-validation setting. - [Evaluate and find max](#evaluate-and-find-max): For each CV split, the best hyperparameters are determined using a grid search per model -3. `MODEL_TESTING` subworkflow: The best hyperparameters are used to train the models on the full training set +4. `MODEL_TESTING` subworkflow: The best hyperparameters are used to train the models on the full training set and predict the test set. Optionally, randomization and robustness testes are performed. - [Predict full](#predict-full): The model is trained on the full training set (train & validation) with the best hyperparameters to predict the test set. @@ -37,7 +41,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Evaluate final](#evaluate-final): The performance of the models is calculated on the test set results. - [Collect results](#collect-results): The results of the evaluation metrics per model are collected into four overview tables. -4. `VISUALIZATION` subworkflow: Plots are created summarizing the results. +5. `VISUALIZATION` subworkflow: Plots are created summarizing the results. - [Critical difference plot](#critical-difference): A critical difference plot is created to compare the performance of the models. - [Violin plot](#violin-plot): A violin plot is created to compare the performance of the models over the CV folds. @@ -49,7 +53,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Save tables](#save-tables): Saves the performance metrics of the models in a table. - [Write html](#write-html): Writes the plots to an HTML file per setting (LPO/LCO/LDO). - [Write index](#write-index): Writes an index.html file that links to all the HTML files. -5. [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +6. [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### Parameter check @@ -57,6 +61,7 @@ The process `PARAMS_CHECK` performs the following checks: - `--models` / `--baselines`: Check if the model and baseline names are valid (for valid names, see the [usage](usage.md) page). - `--test_mode`: Check whether the test mode is LPO, LCO, LDO or a combination of these. +- `--path_data`: Check if the path to the data is valid. - `--dataset_name`: Check if the dataset name is valid, i.e., GDSC1, GDSC2, or CCLE. - `--cross_study_datasets`: If supplied, check if the datasets are valid, i.e., GDSC1, GDSC2, or CCLE or a combination of these. @@ -68,14 +73,55 @@ The process `PARAMS_CHECK` performs the following checks: Partial_Correlation. - `--response_transformation`: If supplied, checks whether the response transformation is either standard, minmax, or robust. +- `--measure`: Which measure of drug response should be used for the file. Available options are "LN_IC50", "EC50", "IC50", "pEC50", "AUC", "response". Default: "LN_IC50". +- `--curve_curator`: Whether to run CurveCurator on a custom dataset. Default: false. This requires raw viability data to be located at "//\_raw.csv". It emits the path to the data but mostly so that the other processes wait for `PARAMS_CHECK` to finish before starting. +### Subworkflow `PREPROCESS_CUSTOM` + +This process is only triggered if there is a custom dataset and if in the corresponding folder, there is a file named `[dataset_name]_raw.csv`. + +#### Preprocess raw viability + +The file is processed to be in a format suitable for CurveCurator. One process will be started per dosage. + +
        +Output files + +- "${dataset_name}/\*/config.toml": Configuration files for CurveCurator. Each subdirectory corresponds to a different dosage. +- "${dataset_name}/\*/curvecurator_input.tsv": Input file for CurveCurator. Each subdirectory corresponds to a different dosage. + +
        + +#### Fit curves + +CurveCurator is run on the input files to fit the curves. + +
        +Output files +- "curves.tsv": The fitted curves. These will be collected and postprocessed in the next step. +- "mad.txt": Other output - Median absolute deviation analysis is performed to detect problematic experiments, the results are stored in this file. +- "dashboard.html" - A dashboard with an overview of the fitted curves. +- "curveCurator.log" - Log file of the CurveCurator run. +
        + +#### Postprocess CurveCurator data + +The individual curves.tsv files are collected and one output file is written to `path_data/dataset_name/dataset_name.csv`. +This file contains the new adjusted measures; available are pEC50 and AUC (now internally renamed as pEC50_curvecurator, AUC_curvecurator). + +
        +Output files +- "dataset_name.csv": The postprocessed data; exported to the path_data folder. +
        + ### Subworkflow `RUN_CV` #### Load response -The response data is loaded into the pipeline. The downloaded data is exported to `--path_data` +The response data is loaded into the pipeline. If the data does not lie in `--path_data` it is downloaded and exported to +`--path_data`. This step is necessary to provide the pipeline with the response data that will be used to train and evaluate the models.
        diff --git a/docs/usage.md b/docs/usage.md index e1925b6..690cf8c 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -142,6 +142,35 @@ The following datasets are available and can be supplied via `--dataset_name`: Our pipeline also supports cross-study prediction, i.e., training on one dataset and testing on another (or multiple others) to assess the generalization of the model. This dataset name can be supplied via `--cross_study_datasets`. +The drug response measure that you want to use as the target variable can be specified via the `--measure` parameter. +Available measures are `[“AUC”, “pEC50”, “EC50”, “IC50”]`. + +We have re-fitted all the curves in the available datasets with CurveCurator to ensure that the data is processed +well. If you want to use those measures, enable the `--curve_curator` flag. + +#### Custom datasets + +You can also provide your own custom dataset via the `--dataset_name` parameter by specifying a name that is not in the list of the available datasets. +This can be prefit data (not recommended for comparability reasons) or raw viability data that is automatically fit +with the exact same procedure that was used to refit the available datasets in the previous section. + +Raw viability data + +We expect a csv-formatted file in the location `//_raw.csv` +(corresponding to the `--path_data` and `--dataset_name` options), which contains the raw viability data in long format +with the columns `[“dose”, “response”, “sample”, “drug”]` and an optional “replicate” column. +If replicates are provided, the procedure will fit one curve per sample / drug pair using all replicates. + +The pipeline then fits the curves using CurveCurator and saves the processed file to `//.csv` +For individual results, look in the work directories. + +Prefit viability data + +We expect a csv-formatted file in the location `//.csv` +(corresponding to the `--path_data` and `--dataset_name` options), with at least the columns `[“cell_line_id”, “drug_id”, ”]` +where `` is replaced with the name of the measure you provide (`[“AUC”, “pEC50”, “EC50”, “IC50”]`). +It is required that you use measure names that are also working with the available datasets if you use the `--cross_study_datasets` option. + ### Available Randomization Tests We have several randomization modes and types available. diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index 5a62777..6da9267 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -1,24 +1,14 @@ process FIT_CURVES { - //tag "$samplesheet" + tag "$dir_name" label 'high_cpu_low_mem' - publishDir "${params.path_data}/${dataset_name}", mode: 'copy' - - - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" input: val dataset_name - path toml - path curvecurator_input + tuple val(dir_name), path(toml), path(curvecurator_input) output: - path "curves.txt", emit: path_to_curvecurator_out - path "mad.txt" - path "dashboard.html" - path "curveCurator.log" + path("curves.tsv"), emit: path_to_curvecurator_out + tuple path("mad.txt"), path("dashboard.html"), path("curveCurator.log") // other output script: """ diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index 1cdea1d..f0216f8 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -17,7 +17,7 @@ process LOAD_RESPONSE { """ load_response.py \\ --dataset_name ${dataset_name} \\ - --path_data ${path_data} \\ + --path_data ${work_path} \\ ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} \\ --measure ${measure} """ diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf index 125ccae..f00be54 100644 --- a/modules/local/postprocess_curvecurator_output/main.nf +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -4,7 +4,7 @@ process POSTPROCESS_CURVECURATOR_DATA { input: val dataset_name - path curve_data + path(curve_data, stageAs: "?/*") val measure output: diff --git a/modules/local/preprocess_raw_viability/main.nf b/modules/local/preprocess_raw_viability/main.nf index 7dd8574..4d1fb44 100644 --- a/modules/local/preprocess_raw_viability/main.nf +++ b/modules/local/preprocess_raw_viability/main.nf @@ -1,24 +1,17 @@ process PREPROCESS_RAW_VIABILITY { - //tag "$samplesheet" label 'process_low' - publishDir "${path_data}", mode: 'copy' - - - //conda "conda-forge::python=3.8.3" - //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - // 'https://depot.galaxyproject.org/singularity/python:3.8.3' : - // 'biocontainers/python:3.8.3' }" input: - val dataset_name - val path_data + val(dataset_name) + path(work_path) + val useless_count output: - path "${dataset_name}/config.toml", emit: path_to_toml - path "${dataset_name}/curvecurator_input.tsv", emit: curvecurator_input + path "${dataset_name}/*/config.toml", emit: path_to_toml + path "${dataset_name}/*/curvecurator_input.tsv", emit: curvecurator_input script: """ - preprocess_raw_viability.py --path_data ${path_data} --dataset_name ${dataset_name} --cores ${task.cpus} + preprocess_raw_viability.py --path_data ${work_path} --dataset_name ${dataset_name} --cores ${task.cpus} """ } diff --git a/subworkflows/local/preprocess_custom/main.nf b/subworkflows/local/preprocess_custom/main.nf index 528d95c..872f9bd 100644 --- a/subworkflows/local/preprocess_custom/main.nf +++ b/subworkflows/local/preprocess_custom/main.nf @@ -4,17 +4,27 @@ include { POSTPROCESS_CURVECURATOR_DATA } from '../../../modules/local/postp workflow PREPROCESS_CUSTOM { take: - path_data + work_path dataset_name measure + useless_count main: File raw_file = new File("${params.path_data}/${dataset_name}/${dataset_name}_raw.csv") if (raw_file.exists()){ - PREPROCESS_RAW_VIABILITY(dataset_name, path_data) - FIT_CURVES(dataset_name, PREPROCESS_RAW_VIABILITY.out.path_to_toml, PREPROCESS_RAW_VIABILITY.out.curvecurator_input) - POSTPROCESS_CURVECURATOR_DATA(dataset_name, FIT_CURVES.out.path_to_curvecurator_out, measure) + PREPROCESS_RAW_VIABILITY(dataset_name, work_path, useless_count) + ch_toml_files = PREPROCESS_RAW_VIABILITY.out.path_to_toml + .flatten() + .map { file -> [file.parent.name, file] } + ch_curvecurator_input = PREPROCESS_RAW_VIABILITY.out.curvecurator_input + .flatten() + .map { file -> [file.parent.name, file] } + // [dose_dir_name, config.toml, curvecurator_input.tsv] + ch_fit_curves = ch_toml_files.combine(ch_curvecurator_input, by: 0) + FIT_CURVES(dataset_name, ch_fit_curves) + ch_curves = FIT_CURVES.out.path_to_curvecurator_out.collect() + POSTPROCESS_CURVECURATOR_DATA(dataset_name, ch_curves, measure) ch_measure = POSTPROCESS_CURVECURATOR_DATA.out.measure }else if(params.curve_curator){ ch_measure = Channel.of("${measure}" + "_curvecurator") diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index bea5896..9209ab5 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -38,7 +38,6 @@ def randomizations = params.randomization_mode.split(",") workflow DRUGRESPONSEEVAL { main: - ch_versions = Channel.empty() // @@ -74,20 +73,21 @@ workflow DRUGRESPONSEEVAL { params.measure ) + work_path = channel.fromPath(params.path_data) + PREPROCESS_CUSTOM ( - PARAMS_CHECK.out.path_data, + work_path, params.dataset_name, - params.measure + params.measure, + PARAMS_CHECK.out.count() ) - work_path = channel.fromPath(params.path_data) - RUN_CV ( test_modes, models, baselines, work_path, - PREPROCESS_CUSTOM.out.measure + PREPROCESS_CUSTOM.out.measure, PARAMS_CHECK.out.count() ) From c7452d862c1fcd60333ada9c24aa9df39bb17a42 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 30 Jan 2025 10:52:41 +0100 Subject: [PATCH 169/257] updated CITATIONS.md for curvecurator --- CITATIONS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CITATIONS.md b/CITATIONS.md index 53b3aca..e77b4f6 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -18,6 +18,10 @@ > Bernett, J, Iversen, P, Picciani, M, Wilhelm, M, Baum, K, List, M. Will be published soon. +- [CurveCurator](https://www.nature.com/articles/s41467-023-43696-z): For custom curve fitting on custom datasets. We also used it to re-process the response curves of GDSC1, GDSC2, CCLE, and CTRP. + + > Bayer, F.P., Gander, M., Kuster, B., The, M. CurveCurator: a recalibrated F-statistic to assess, classify, and explore significance of dose–response curves. Nature Communications. 2023 Nov;14(7902). + - [DIPK](https://doi.org/10.1093/bib/bbae153): Implemented model in the pipeline. > Li P, Jiang Z, Liu T, Liu X, Qiao H, Yao X. Improving drug response prediction via integrating gene relationships with deep learning. Briefings in Bioinformatics. 2024 May;25(3):bbae153. From 060d2b6303556047ba12f1f6eb3fb6df4dc37c03 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 30 Jan 2025 10:53:39 +0100 Subject: [PATCH 170/257] updated CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0640c8e..9d33c72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ Initial release of nf-core/drugresponseeval, created with the [nf-core](https:// - Added the docker container and the conda env.yml in the nextflow.config. We just need one container for all processes as this pipeline automates the PyPI package drevalpy. - Added usage and output documentation. +- Added CurveCurator to preprocess curves of custom datasets ### `Fixed` From 1176dc4527dd7b75ee58db887199035876269e25 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 30 Jan 2025 10:56:05 +0100 Subject: [PATCH 171/257] minor changes --- bin/postprocess_curvecurator_output.py | 2 +- bin/preprocess_raw_viability.py | 2 +- modules/local/postprocess_curvecurator_output/main.nf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/postprocess_curvecurator_output.py b/bin/postprocess_curvecurator_output.py index 6a31100..18e81f3 100755 --- a/bin/postprocess_curvecurator_output.py +++ b/bin/postprocess_curvecurator_output.py @@ -4,7 +4,7 @@ def get_parser(): - parser = argparse.ArgumentParser(description="Pre/postprocess CurveCurator viability data.") + parser = argparse.ArgumentParser(description="Postprocess CurveCurator viability data.") parser.add_argument("--dataset_name", type=str, required=True, help="Dataset name.") return parser diff --git a/bin/preprocess_raw_viability.py b/bin/preprocess_raw_viability.py index 3119279..833757d 100755 --- a/bin/preprocess_raw_viability.py +++ b/bin/preprocess_raw_viability.py @@ -4,7 +4,7 @@ import argparse def get_parser(): - parser = argparse.ArgumentParser(description="Pre/postprocess CurveCurator viability data.") + parser = argparse.ArgumentParser(description="Preprocess CurveCurator viability data.") parser.add_argument("--path_data", type=str, default="", help="Path to base folder containing datasets.") parser.add_argument("--dataset_name", type=str, required=True, help="Dataset name.") parser.add_argument("--cores", type=int, default=0, help="The number of cores used for CurveCurator fitting.") diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf index f00be54..b3a9971 100644 --- a/modules/local/postprocess_curvecurator_output/main.nf +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -1,5 +1,5 @@ process POSTPROCESS_CURVECURATOR_DATA { - label 'process_low' + label 'process_single' publishDir "${params.path_data}/${dataset_name}", mode: 'copy' input: From ead067a08d588b395803fe7b507a7cab2f4b7686 Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Thu, 30 Jan 2025 15:51:16 +0100 Subject: [PATCH 172/257] Update env.yml --- env.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/env.yml b/env.yml index 330a6d4..6042f0a 100644 --- a/env.yml +++ b/env.yml @@ -5,4 +5,4 @@ channels: dependencies: - pip - pip: - - drevalpy==1.1.1 + - drevalpy==1.1.3 From 87a26c9e172db0fa4291cfaa43dbfd86540e3d1a Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Wed, 12 Feb 2025 17:24:22 +0100 Subject: [PATCH 173/257] Update env.yml --- env.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/env.yml b/env.yml index 6042f0a..717a829 100644 --- a/env.yml +++ b/env.yml @@ -5,4 +5,4 @@ channels: dependencies: - pip - pip: - - drevalpy==1.1.3 + - drevalpy==1.1.4 From db41e2d22b7c20527a4671dafafc4d142dc453df Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Fri, 21 Feb 2025 17:25:08 +0100 Subject: [PATCH 174/257] Update env.yml --- env.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/env.yml b/env.yml index 717a829..68f9785 100644 --- a/env.yml +++ b/env.yml @@ -5,4 +5,4 @@ channels: dependencies: - pip - pip: - - drevalpy==1.1.4 + - drevalpy==1.2.0 From 967d64d3c2e7186a0d1f57c1fa60669ba5bee888 Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Mon, 24 Feb 2025 10:26:50 +0100 Subject: [PATCH 175/257] Fix python version in env.yml --- env.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/env.yml b/env.yml index 68f9785..5b76ab6 100644 --- a/env.yml +++ b/env.yml @@ -3,6 +3,7 @@ channels: - conda-forge - defaults dependencies: + - python=3.11 - pip - pip: - drevalpy==1.2.0 From a91910a290d5961de6d3838607618872298699ae Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Mon, 24 Feb 2025 11:01:48 +0100 Subject: [PATCH 176/257] Update env.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matthias Hörtenhuber --- env.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/env.yml b/env.yml index 5b76ab6..e168dd0 100644 --- a/env.yml +++ b/env.yml @@ -1,7 +1,6 @@ name: nf-core-drugresponseeval channels: - conda-forge - - defaults dependencies: - python=3.11 - pip From 8adf5a539fc4914f5e0ca23bab18a982af5eff63 Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Tue, 25 Feb 2025 16:46:15 +0100 Subject: [PATCH 177/257] Update env.yml --- env.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/env.yml b/env.yml index e168dd0..0845867 100644 --- a/env.yml +++ b/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.11 - pip - pip: - - drevalpy==1.2.0 + - drevalpy==1.2.1 From 2927f5369e5640db75248154f5d7220706c43015 Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Fri, 28 Feb 2025 16:42:55 +0100 Subject: [PATCH 178/257] Update env.yml --- env.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/env.yml b/env.yml index 0845867..99caa8b 100644 --- a/env.yml +++ b/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.11 - pip - pip: - - drevalpy==1.2.1 + - drevalpy==1.2.2 From 634640d351d662619160236b61f3644377603534 Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Sun, 2 Mar 2025 11:09:45 +0100 Subject: [PATCH 179/257] Update env.yml --- env.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/env.yml b/env.yml index 99caa8b..4c625f4 100644 --- a/env.yml +++ b/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.11 - pip - pip: - - drevalpy==1.2.2 + - drevalpy==1.2.3 From 008c24ad81dac5a312fb20249b13f23d1742c5e4 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 6 Mar 2025 16:40:10 +0100 Subject: [PATCH 180/257] forgot to give the single drug id to the cross study prediction, resulting in every model making a prediction --- bin/train_and_predict_final.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index f5f037d..05bd761 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -147,7 +147,8 @@ def compute_cross( early_stopping_dataset, response_transformation, path_out, - split_index + split_index, + single_drug_id ): split_index = split_index.split("split_")[1] cross_study_dataset = pickle.load(open(cross_study_dataset, "rb")) @@ -164,6 +165,7 @@ def compute_cross( response_transformation=response_transformation, path_out=path_out, split_index=split_index, + single_drug_id=single_drug_id ) @@ -222,7 +224,8 @@ def compute_cross( early_stopping_dataset=es_set, response_transformation=transformation, path_out=os.path.dirname(predictions_path), - split_index=args.split_id + split_index=args.split_id, + single_drug_id=drug_id ) elif args.mode == "randomization": with open(args.randomization_views_path, "r") as f: From 2fc414d5a5769bbd6e7e7f24bd872a5a10774af7 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 6 Mar 2025 17:18:51 +0100 Subject: [PATCH 181/257] new version, testing array --- env.yml | 2 +- modules/local/train_and_predict_cv/main.nf | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/env.yml b/env.yml index 4c625f4..068d4d6 100644 --- a/env.yml +++ b/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.11 - pip - pip: - - drevalpy==1.2.3 + - drevalpy==1.2.4 diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 10867e9..6f58b8d 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -2,6 +2,8 @@ process TRAIN_AND_PREDICT_CV { tag { "${model_name}_${test_mode}_gpu:${task.ext.use_gpu}" } label 'process_high' label 'process_gpu' + executor 'slurm' + array 300 input: tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters), path(path_data) From 79406697b3e0174a9739e6210fdeeb47366d062e Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 7 Mar 2025 17:15:54 +0100 Subject: [PATCH 182/257] minor mistake --- bin/consolidate_results.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bin/consolidate_results.py b/bin/consolidate_results.py index ef67065..667c722 100755 --- a/bin/consolidate_results.py +++ b/bin/consolidate_results.py @@ -31,7 +31,10 @@ def main(): args.run_id, args.test_mode, ) - randomizations = args.randomization_modes.split('[')[1].split(']')[0].split(', ') + if args.randomization_modes == "[None]": + randomizations = None + else: + randomizations = args.randomization_modes.split('[')[1].split(']')[0].split(', ') model = MODEL_FACTORY[args.model_name] if args.cross_study_datasets is None: args.cross_study_datasets = [] From d520781786b8014985ba8fdb0745e56d54c13a80 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 7 Mar 2025 20:15:04 +0100 Subject: [PATCH 183/257] new version --- env.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/env.yml b/env.yml index 068d4d6..7226972 100644 --- a/env.yml +++ b/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.11 - pip - pip: - - drevalpy==1.2.4 + - drevalpy==1.2.5 From c747af4fa6f2b7a4531a44a3e24f2176fa55cccf Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 7 Apr 2025 10:26:22 +0200 Subject: [PATCH 184/257] randomization_fix --- bin/randomization_split.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/bin/randomization_split.py b/bin/randomization_split.py index c58b957..054d904 100755 --- a/bin/randomization_split.py +++ b/bin/randomization_split.py @@ -18,14 +18,11 @@ def main(args): model = model_class() randomization_test_views = get_randomization_test_views(model=model, randomization_mode=[args.randomization_mode]) - - key = list(randomization_test_views.keys())[0] - # create as many dicts as there are elements in the value list of the key - randomization_test_view_dicts = [{"test_name": key, "view": value} for value in randomization_test_views[key]] - - for rand_dict in randomization_test_view_dicts: - with open(f'randomization_test_view_{rand_dict["test_name"]}.yaml', "w") as f: - yaml.dump(rand_dict, f) + for test_name, views in randomization_test_views.items(): + for view in views: + rand_dict = {"test_name": test_name, "view": view} + with open(f'randomization_test_view_{test_name}.yaml', "w") as f: + yaml.dump(rand_dict, f) if __name__ == "__main__": From ed89b74af3b4e9c1a75839ccc90f86bc7966bd7d Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 7 Apr 2025 13:06:32 +0200 Subject: [PATCH 185/257] fixed randomization error --- subworkflows/local/model_testing/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 65a6dfc..2759507 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -48,7 +48,7 @@ workflow MODEL_TESTING { ch_models_rand ) ch_rand_views = ch_models - .combine(RANDOMIZATION_SPLIT.out.randomization_test_views, by: 0) + .combine(RANDOMIZATION_SPLIT.out.randomization_test_views.transpose(), by: 0) .map{ model_class, model_name, rand_file -> [model_name, rand_file] } ch_best_hpams_per_split_rand = best_hpam_per_split.map { From eaf4e65c015eead57d72e8c44a78931a1dfd934e Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 8 May 2025 14:02:43 +0200 Subject: [PATCH 186/257] adapting the pipeline to the latest version, also restructuring the visualization because so many processes just create overhang --- bin/collect_results.py | 32 +++-- bin/draw_cd.py | 29 ---- bin/draw_corr_comp.py | 31 ----- bin/draw_regression.py | 38 ----- bin/draw_violin_and_heatmap.py | 52 ------- bin/evaluate_final.py | 2 +- bin/save_tables.py | 34 ----- bin/visualize_results.py | 82 +++++++++++ bin/write_html.py | 16 --- bin/write_index.py | 17 --- conf/test.config | 3 +- env.yml | 2 +- modules/local/collect_results/main.nf | 4 +- modules/local/draw_corr_comp/main.nf | 19 --- .../local/draw_critical_difference/main.nf | 19 --- modules/local/draw_heatmap/main.nf | 21 --- modules/local/draw_regression/main.nf | 20 --- modules/local/draw_violin/main.nf | 21 --- modules/local/predict_full/main.nf | 2 +- modules/local/save_tables/main.nf | 19 --- modules/local/train_and_predict_cv/main.nf | 2 - modules/local/visualize_results/main.nf | 23 +++ modules/local/write_html/main.nf | 20 --- modules/local/write_index/main.nf | 20 --- nextflow.config | 4 +- subworkflows/local/model_testing/main.nf | 5 +- subworkflows/local/visualization/main.nf | 131 ++---------------- workflows/drugresponseeval.nf | 17 +-- 28 files changed, 155 insertions(+), 530 deletions(-) delete mode 100755 bin/draw_cd.py delete mode 100755 bin/draw_corr_comp.py delete mode 100755 bin/draw_regression.py delete mode 100755 bin/draw_violin_and_heatmap.py delete mode 100755 bin/save_tables.py create mode 100755 bin/visualize_results.py delete mode 100755 bin/write_html.py delete mode 100755 bin/write_index.py delete mode 100644 modules/local/draw_corr_comp/main.nf delete mode 100644 modules/local/draw_critical_difference/main.nf delete mode 100644 modules/local/draw_heatmap/main.nf delete mode 100644 modules/local/draw_regression/main.nf delete mode 100644 modules/local/draw_violin/main.nf delete mode 100644 modules/local/save_tables/main.nf create mode 100644 modules/local/visualize_results/main.nf delete mode 100644 modules/local/write_html/main.nf delete mode 100644 modules/local/write_index/main.nf diff --git a/bin/collect_results.py b/bin/collect_results.py index 8d9adc0..3a7555f 100755 --- a/bin/collect_results.py +++ b/bin/collect_results.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import argparse import pandas as pd +import pathlib from drevalpy.visualization.utils import prep_results, write_results @@ -8,18 +9,19 @@ def get_parser(): parser = argparse.ArgumentParser(description="Collect results and write to single files.") parser.add_argument("--outfiles", type=str, nargs="+", required=True, help="Output files.") + parser.add_argument("--path_data", type=str, default="data", help="Data directory path") return parser -def parse_results(args): - # get all files with the pattern f'{model_name}_evaluation_results.csv' from args.outfiles - result_files = [file for file in args.outfiles if "evaluation_results.csv" in file] - # get all files with the pattern f'{model_name}_evaluation_results_per_drug.csv' from args.outfiles - result_per_drug_files = [file for file in args.outfiles if "evaluation_results_per_drug.csv" in file] - # get all files with the pattern f'{model_name}_evaluation_results_per_cl.csv' from args.outfiles - result_per_cl_files = [file for file in args.outfiles if "evaluation_results_per_cl.csv" in file] - # get all files with the pattern f'{model_name}_true_vs_pred.csv' from args.outfiles - t_vs_pred_files = [file for file in args.outfiles if "true_vs_pred.csv" in file] +def parse_results(outfiles): + # get all files with the pattern f'{model_name}_evaluation_results.csv' from outfiles + result_files = [file for file in outfiles if "evaluation_results.csv" in file] + # get all files with the pattern f'{model_name}_evaluation_results_per_drug.csv' from outfiles + result_per_drug_files = [file for file in outfiles if "evaluation_results_per_drug.csv" in file] + # get all files with the pattern f'{model_name}_evaluation_results_per_cl.csv' from outfiles + result_per_cl_files = [file for file in outfiles if "evaluation_results_per_cl.csv" in file] + # get all files with the pattern f'{model_name}_true_vs_pred.csv' from outfiles + t_vs_pred_files = [file for file in outfiles if "true_vs_pred.csv" in file] return result_files, result_per_drug_files, result_per_cl_files, t_vs_pred_files @@ -35,8 +37,10 @@ def collapse_file(files): if __name__ == "__main__": args = get_parser().parse_args() - # parse the results from args.outfiles - eval_result_files, eval_result_per_drug_files, eval_result_per_cl_files, true_vs_pred_files = parse_results(args) + # parse the results from outfiles.outfiles + outfiles = args.outfiles + path_data = pathlib.Path(args.path_data) + eval_result_files, eval_result_per_drug_files, eval_result_per_cl_files, true_vs_pred_files = parse_results(outfiles) # collapse the results into single dataframes eval_results = collapse_file(eval_result_files) @@ -46,7 +50,11 @@ def collapse_file(files): # prepare the results through introducing new columns algorithm, rand_setting, LPO_LCO_LDO, split, CV_split eval_results, eval_results_per_drug, eval_results_per_cell_line, t_vs_p = prep_results( - eval_results, eval_results_per_drug, eval_results_per_cell_line, t_vs_p + eval_results=eval_results, + eval_results_per_drug=eval_results_per_drug, + eval_results_per_cell_line=eval_results_per_cell_line, + t_vs_p=t_vs_p, + path_data=path_data ) # save the results to csv files diff --git a/bin/draw_cd.py b/bin/draw_cd.py deleted file mode 100755 index 6a43d44..0000000 --- a/bin/draw_cd.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env python -import argparse -import pandas as pd - -from drevalpy.visualization.critical_difference_plot import CriticalDifferencePlot - -def get_parser(): - parser = argparse.ArgumentParser(description="Draw critical difference plots.") - parser.add_argument("--name", type=str, required=True, help="Name/Setting of plot.") - parser.add_argument("--data", type=str, required=True, help="Path to data.") - return parser - - -def draw_cd(path_to_df: str, setting: str): - df = pd.read_csv(path_to_df, index_col=0) - df = df[(df["LPO_LCO_LDO"] == setting) & (df["rand_setting"] == "predictions")] - cd_plot = CriticalDifferencePlot( - eval_results_preds=df, - metric='MSE' - ) - cd_plot.draw_and_save( - out_prefix='', - out_suffix=setting - ) - - -if __name__ == "__main__": - args = get_parser().parse_args() - draw_cd(path_to_df=args.data, setting=args.name) diff --git a/bin/draw_corr_comp.py b/bin/draw_corr_comp.py deleted file mode 100755 index 47970f2..0000000 --- a/bin/draw_corr_comp.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python -import argparse -import pandas as pd - -from drevalpy.visualization.corr_comp_scatter import CorrelationComparisonScatter -from drevalpy.models import MODEL_FACTORY - - -def get_parser(): - parser = argparse.ArgumentParser(description="Draw violin plots.") - parser.add_argument("--name", type=str, required=True, help="Name/Setting of plot.") - parser.add_argument("--data", type=str, required=True, help="Path to data.") - return parser - - -def draw_corr_comp(path_to_df: str, setting: str): - df = pd.read_csv(path_to_df, index_col=0) - group_by = "drug" if setting.endswith("_drug") else "cell_line" - lpo_lco_ldo = [name for name in ["LPO", "LDO", "LCO"] if name in setting][0] - if any(name in setting for name in MODEL_FACTORY): - algorithm = setting.split("_")[0] - else: - algorithm = "all" - corr_comp = CorrelationComparisonScatter(df=df, color_by=group_by, lpo_lco_ldo=lpo_lco_ldo, algorithm=algorithm) - if corr_comp.name is not None: - corr_comp.draw_and_save(out_prefix="", out_suffix=corr_comp.name) - - -if __name__ == "__main__": - args = get_parser().parse_args() - draw_corr_comp(path_to_df=args.data, setting=args.name) diff --git a/bin/draw_regression.py b/bin/draw_regression.py deleted file mode 100755 index b8177ce..0000000 --- a/bin/draw_regression.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python -import argparse -import pandas as pd - -from drevalpy.visualization.regression_slider_plot import RegressionSliderPlot - - -def get_parser(): - parser = argparse.ArgumentParser(description="Draw regression plot.") - parser.add_argument("--path_t_vs_p", type=str, required=True, help="Path to true_vs_pred.csv.") - parser.add_argument("--name", type=str, required=True, help="Setting name.") - parser.add_argument("--model", type=str, required=True, help="Model name.") - return parser - - -def main(path_to_true_vs_pred: str, name: str, model: str): - true_vs_pred = pd.read_csv(path_to_true_vs_pred, index_col=0) - - name_split = name.split("_") - lpo_lco_ldo = name_split[0] - group_by = name_split[1] - if group_by == "cell": - group_by = "cell_line" - normalize = name.endswith("normalized") - - regr_slider = RegressionSliderPlot( - df=true_vs_pred, - lpo_lco_ldo=lpo_lco_ldo, - model=model, - group_by=group_by, - normalize=normalize, - ) - regr_slider.draw_and_save(out_prefix="", out_suffix=f"{name}_{model}") - - -if __name__ == "__main__": - args = get_parser().parse_args() - main(args.path_t_vs_p, args.name, args.model) diff --git a/bin/draw_violin_and_heatmap.py b/bin/draw_violin_and_heatmap.py deleted file mode 100755 index c64e6af..0000000 --- a/bin/draw_violin_and_heatmap.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python -import argparse -import pandas as pd - -from drevalpy.visualization.violin import Violin -from drevalpy.visualization.heatmap import Heatmap - - -def get_parser(): - parser = argparse.ArgumentParser(description="Draw violin plots or heatmaps.") - parser.add_argument("--plot", type=str, default="violinplot", help="Type of plot (violin or heatmap).") - parser.add_argument("--name", type=str, required=True, help="Name/Setting of plot.") - parser.add_argument("--data", type=str, required=True, help="Path to data.") - return parser - - -def prep_df(plot_type: str, path_to_df: str, setting: str): - df = pd.read_csv(path_to_df, index_col=0) - if setting in ["LPO", "LDO", "LCO", "LPO_normalized", "LDO_normalized", "LCO_normalized"]: - # overview plots - if setting in ["LPO", "LDO", "LCO"]: - # overview for setting, only 'rand_setting' == 'predictions' - df = df[(df["LPO_LCO_LDO"] == setting) & (df["rand_setting"] == "predictions")] - normalized_metrics = False - whole_name = False - out_suffix = f"algorithms_{setting}" - else: - # overview for normalized setting, only 'rand_setting' == 'predictions' - lpo_lco_ldo = setting.split("_")[0] - df = df[(df["LPO_LCO_LDO"] == lpo_lco_ldo) & (df["rand_setting"] == "predictions")] - normalized_metrics = True - whole_name = False - out_suffix = f"algorithms_{lpo_lco_ldo}_normalized" - else: - # algorithm-wise plots - name_split = setting.split("_") - lpo_lco_ldo = name_split[0] - algorithm = name_split[1] - df = df[(df["LPO_LCO_LDO"] == lpo_lco_ldo) & (df["algorithm"] == algorithm)] - normalized_metrics = False - whole_name = True - out_suffix = f"{algorithm}_{lpo_lco_ldo}" - if plot_type == "violinplot": - out_plot = Violin(df=df, normalized_metrics=normalized_metrics, whole_name=whole_name) - else: - out_plot = Heatmap(df=df, normalized_metrics=normalized_metrics, whole_name=whole_name) - out_plot.draw_and_save(out_prefix="", out_suffix=out_suffix) - - -if __name__ == "__main__": - args = get_parser().parse_args() - prep_df(args.plot, args.data, args.name) diff --git a/bin/evaluate_final.py b/bin/evaluate_final.py index 6e0bc1d..a70c6ad 100755 --- a/bin/evaluate_final.py +++ b/bin/evaluate_final.py @@ -6,7 +6,7 @@ def get_parser(): parser = argparse.ArgumentParser(description="Evaluate the predictions from the final model.") - parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LDO).") + parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LDO, LTO).") parser.add_argument("--model_name", type=str, required=True, help="Model name.") parser.add_argument("--pred_file", type=str, required=True, help="Path to predictions.") return parser diff --git a/bin/save_tables.py b/bin/save_tables.py deleted file mode 100755 index 4e42562..0000000 --- a/bin/save_tables.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python -import argparse -import pandas as pd - -from drevalpy.visualization.html_tables import HTMLTable - - -def get_parser(): - parser = argparse.ArgumentParser(description="Save table as html.") - parser.add_argument("--path_eval_results", type=str, required=True, help="Path to evaluation results.") - parser.add_argument("--lpo_lco_ldo", type=str, required=True, help="LPO_LCO_LDO.") - return parser - - -def main(path_eval_results: str, lpo_lco_ldo: str): - df = pd.read_csv(path_eval_results) - df = df[df["LPO_LCO_LDO"] == lpo_lco_ldo] - - if "per_drug" in path_eval_results: - grouping = "drug" - elif "per_cl" in path_eval_results: - grouping = "cell_line" - else: - grouping = "all" - - out_suffix = f"{grouping}_{lpo_lco_ldo}" if grouping != "all" else lpo_lco_ldo - - html_table = HTMLTable(df=df, group_by=grouping) - html_table.draw_and_save(out_prefix="", out_suffix=out_suffix) - - -if __name__ == "__main__": - args = get_parser().parse_args() - main(args.path_eval_results, args.lpo_lco_ldo) diff --git a/bin/visualize_results.py b/bin/visualize_results.py new file mode 100755 index 0000000..55ec46c --- /dev/null +++ b/bin/visualize_results.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python +import os +import pathlib +import argparse +import pandas as pd + +from drevalpy.visualization.utils import create_output_directories, draw_test_mode_plots, draw_algorithm_plots, create_html, create_index_html + + +def get_parser(): + parser = argparse.ArgumentParser(description="Write individual LCO/LTO/LDO/LPO html files.") + parser.add_argument("--test_modes", type=str, nargs="+", required=True, help="LPO, LDO, LCO, or LTO.") + parser.add_argument("--eval_results", type=str, required=True, help="Path to the evaluation results.") + parser.add_argument("--eval_results_per_drug", type=str, required=True, help="Path to the evaluation results per drug.") + parser.add_argument("--eval_results_per_cl", type=str, required=True, help="Path to the evaluation results per cell line.") + parser.add_argument("--true_vs_predicted", type=str, required=True, help="Path to the true vs predicted results.") + parser.add_argument("--path_data", type=str, required=True, help="Path to the data.") + return parser + + +if __name__ == "__main__": + args = get_parser().parse_args() + result_path = pathlib.Path(".") + outdir_name = "report" + create_output_directories(result_path=result_path, custom_id=outdir_name) + test_modes = args.test_modes + + ev_res = pd.read_csv(args.eval_results, index_col=0) + ev_res_per_drug = pd.read_csv(args.eval_results_per_drug, index_col=0) + ev_res_per_cl = pd.read_csv(args.eval_results_per_cl, index_col=0) + t_vs_p = pd.read_csv(args.true_vs_predicted, index_col=0) + + for test_mode in test_modes: + unique_algos = draw_test_mode_plots( + test_mode=test_mode, + ev_res=ev_res, + ev_res_per_drug=ev_res_per_drug, + ev_res_per_cell_line=ev_res_per_cl, + custom_id=outdir_name, + path_data=args.path_data, + result_path=result_path, + ) + # draw figures for each algorithm with all randomizations etc + unique_algos = set(unique_algos) - { + "NaiveMeanEffectsPredictor", + "NaivePredictor", + "NaiveCellLineMeansPredictor", + "NaiveDrugMeanPredictor", + } + for algorithm in unique_algos: + draw_algorithm_plots( + model=algorithm, + ev_res=ev_res, + ev_res_per_drug=ev_res_per_drug, + ev_res_per_cell_line=ev_res_per_cl, + t_vs_p=t_vs_p, + test_mode=test_mode, + custom_id=outdir_name, + result_path=result_path, + ) + # get all html files from {result_path}/{run_id} + all_files: list[str] = [] + for _, _, files in os.walk(f"{result_path}/{outdir_name}"): # type: ignore[assignment] + for file in files: + if file.endswith("json") or ( + file.endswith(".html") and file not in ["index.html", "LPO.html", "LCO.html", "LDO.html"] + ): + all_files.append(file) + # PIPELINE: WRITE_HTML + create_html( + run_id=outdir_name, + test_mode=test_mode, + files=all_files, + prefix_results=f"{result_path}/{outdir_name}", + ) + # PIPELINE: WRITE_INDEX + create_index_html( + custom_id=outdir_name, + test_modes=test_modes, + prefix_results=f"{result_path}/{outdir_name}", + ) + diff --git a/bin/write_html.py b/bin/write_html.py deleted file mode 100755 index a5272d0..0000000 --- a/bin/write_html.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env python -import argparse -from drevalpy.visualization.utils import create_html - - -def get_parser(): - parser = argparse.ArgumentParser(description="Write individual LCO/LDO/LPO html files.") - parser.add_argument("--run_id", type=str, required=True, help="Run ID.") - parser.add_argument("--test_mode", type=str, required=True, help="LPO, LDO, or LCO.") - parser.add_argument("--files", type=str, nargs="+", required=True, help="Paths to files.") - return parser - - -if __name__ == "__main__": - args = get_parser().parse_args() - create_html(run_id=args.run_id, lpo_lco_ldo=args.test_mode, files=args.files, prefix_results="") diff --git a/bin/write_index.py b/bin/write_index.py deleted file mode 100755 index f2d6ddf..0000000 --- a/bin/write_index.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python -import argparse - -from drevalpy.visualization.utils import create_index_html - - -def get_parser(): - parser = argparse.ArgumentParser(description="Write index.html.") - parser.add_argument("--run_id", type=str, required=True, help="Run ID.") - parser.add_argument("--test_modes", type=str, required=True, help="Test modes.") - return parser - - -if __name__ == "__main__": - args = get_parser().parse_args() - settings = args.test_modes.split(",") - create_index_html(custom_id=args.run_id, test_modes=settings, prefix_results="") diff --git a/conf/test.config b/conf/test.config index 469f88b..a40011b 100644 --- a/conf/test.config +++ b/conf/test.config @@ -28,6 +28,7 @@ params { //input = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' run_id = 'test_run' - dataset_name = 'Toy_Data' + dataset_name = 'TOYv1' + cross_study_datasets = 'TOYv2' n_cv_splits = 2 } diff --git a/env.yml b/env.yml index 7226972..612ea33 100644 --- a/env.yml +++ b/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.11 - pip - pip: - - drevalpy==1.2.5 + - drevalpy==1.3.0 diff --git a/modules/local/collect_results/main.nf b/modules/local/collect_results/main.nf index e426caf..962d345 100644 --- a/modules/local/collect_results/main.nf +++ b/modules/local/collect_results/main.nf @@ -4,6 +4,7 @@ process COLLECT_RESULTS { input: path(outfiles) + val(path_data) output: path('evaluation_results.csv'), emit: evaluation_results @@ -14,7 +15,8 @@ process COLLECT_RESULTS { script: """ collect_results.py \\ - --outfiles $outfiles + --outfiles $outfiles \\ + --path_data $path_data """ } diff --git a/modules/local/draw_corr_comp/main.nf b/modules/local/draw_corr_comp/main.nf deleted file mode 100644 index c0487f8..0000000 --- a/modules/local/draw_corr_comp/main.nf +++ /dev/null @@ -1,19 +0,0 @@ -process DRAW_CORR_COMP { - tag "${name}" - label 'process_single' - publishDir "${params.outdir}/${params.run_id}/corr_comp_scatter", mode: 'copy' - - input: - tuple val(name), path(eval_results_per_group) - - output: - path('corr_comp_scatter*.html'), emit: corr_comp_scatter, optional: true - - script: - """ - draw_corr_comp.py \\ - --name $name \\ - --data $eval_results_per_group - """ - -} diff --git a/modules/local/draw_critical_difference/main.nf b/modules/local/draw_critical_difference/main.nf deleted file mode 100644 index e06c486..0000000 --- a/modules/local/draw_critical_difference/main.nf +++ /dev/null @@ -1,19 +0,0 @@ -process DRAW_CRITICAL_DIFFERENCE { - tag "${lpo_lco_ldo}" - label 'process_single' - publishDir "${params.outdir}/${params.run_id}/critical_difference_plots", mode: 'copy' - - input: - tuple val(lpo_lco_ldo), path(eval_results) - - output: - path('critical_difference*.svg'), emit: critical_difference, optional: true - - script: - """ - draw_cd.py \\ - --name $lpo_lco_ldo \\ - --data $eval_results - """ - -} diff --git a/modules/local/draw_heatmap/main.nf b/modules/local/draw_heatmap/main.nf deleted file mode 100644 index 673562c..0000000 --- a/modules/local/draw_heatmap/main.nf +++ /dev/null @@ -1,21 +0,0 @@ -process DRAW_HEATMAP { - tag "${name}" - label 'process_single' - publishDir "${params.outdir}/${params.run_id}/heatmaps", mode: 'copy' - - input: - val(name) - path(eval_results) - - output: - path('heatmap*.html'), emit: heatmap - - script: - """ - draw_violin_and_heatmap.py \\ - --plot heatmap \\ - --name $name \\ - --data $eval_results - """ - -} diff --git a/modules/local/draw_regression/main.nf b/modules/local/draw_regression/main.nf deleted file mode 100644 index d75e683..0000000 --- a/modules/local/draw_regression/main.nf +++ /dev/null @@ -1,20 +0,0 @@ -process DRAW_REGRESSION { - tag "${name}_${model}" - label 'process_single' - publishDir "${params.outdir}/${params.run_id}/regression_plots", mode: 'copy' - - input: - tuple val(name), val(model), path(true_vs_pred) - - output: - path('regression_lines*.html'), emit: regression_lines - - script: - """ - draw_regression.py \\ - --path_t_vs_p ${true_vs_pred} \\ - --name ${name} \\ - --model ${model} - """ - -} diff --git a/modules/local/draw_violin/main.nf b/modules/local/draw_violin/main.nf deleted file mode 100644 index e9c71a3..0000000 --- a/modules/local/draw_violin/main.nf +++ /dev/null @@ -1,21 +0,0 @@ -process DRAW_VIOLIN { - tag "${name}" - label 'process_single' - publishDir "${params.outdir}/${params.run_id}/violin_plots", mode: 'copy' - - input: - val(name) - path(eval_results) - - output: - path('violin*.html'), emit: violin_plot - - script: - """ - draw_violin_and_heatmap.py \\ - --plot violinplot \\ - --name $name \\ - --data $eval_results - """ - -} diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 0a31a1e..427f9ed 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -11,7 +11,7 @@ process PREDICT_FULL { output: tuple val(test_mode), val(model_name), path('**predictions*.csv'), emit: ch_vis - path('**cross_study/cross_study*.csv'), emit: ch_cross, optional: true + tuple val(test_mode), val(model_name), path('**cross_study/cross_study*.csv'), emit: ch_cross, optional: true path('**best_hpams*.json'), emit: ch_hpams script: diff --git a/modules/local/save_tables/main.nf b/modules/local/save_tables/main.nf deleted file mode 100644 index eec8ef4..0000000 --- a/modules/local/save_tables/main.nf +++ /dev/null @@ -1,19 +0,0 @@ -process SAVE_TABLES { - tag "${lpo_lco_ldo}_${eval_results}" - label 'process_single' - publishDir "${params.outdir}/${params.run_id}/html_tables", mode: 'copy' - - input: - tuple val(lpo_lco_ldo), path(eval_results) - - output: - path('table*.html'), emit: html_table - - script: - """ - save_tables.py \\ - --path_eval_results ${eval_results} \\ - --lpo_lco_ldo ${lpo_lco_ldo} - """ - -} diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 6f58b8d..10867e9 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -2,8 +2,6 @@ process TRAIN_AND_PREDICT_CV { tag { "${model_name}_${test_mode}_gpu:${task.ext.use_gpu}" } label 'process_high' label 'process_gpu' - executor 'slurm' - array 300 input: tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters), path(path_data) diff --git a/modules/local/visualize_results/main.nf b/modules/local/visualize_results/main.nf new file mode 100644 index 0000000..0870e18 --- /dev/null +++ b/modules/local/visualize_results/main.nf @@ -0,0 +1,23 @@ +process VISUALIZE_RESULTS { + label 'process_single' + publishDir "${params.outdir}/${params.run_id}", mode: 'copy' + + input: + tuple path(eval_results), path(eval_results_per_drug), path(eval_results_per_cl), path(true_vs_predicted) + val(path_data) + + output: + path('report/*'), emit: html_out + + script: + """ + visualize_results.py \\ + --test_modes ${params.test_mode.replace(',', ' ')} \\ + --eval_results $eval_results \\ + --eval_results_per_drug $eval_results_per_drug \\ + --eval_results_per_cl $eval_results_per_cl \\ + --true_vs_predicted $true_vs_predicted \\ + --path_data $path_data + """ + +} diff --git a/modules/local/write_html/main.nf b/modules/local/write_html/main.nf deleted file mode 100644 index c9e703d..0000000 --- a/modules/local/write_html/main.nf +++ /dev/null @@ -1,20 +0,0 @@ -process WRITE_HTML { - tag "${test_mode}" - label 'process_single' - - input: - val(run_id) - tuple val(test_mode), path(files) - - output: - path('*.html'), emit: html_out - - script: - """ - write_html.py \\ - --run_id $run_id \\ - --test_mode $test_mode \\ - --files $files - """ - -} diff --git a/modules/local/write_index/main.nf b/modules/local/write_index/main.nf deleted file mode 100644 index a5551e8..0000000 --- a/modules/local/write_index/main.nf +++ /dev/null @@ -1,20 +0,0 @@ -process WRITE_INDEX { - label 'process_single' - - input: - val(run_id) - val(test_modes) - val(nr_html_files) - - output: - path('*.html'), emit: html_out - path('*.png'), emit: graphic_elements - - script: - """ - write_index.py \\ - --run_id ${run_id} \\ - --test_modes ${test_modes} - """ - -} diff --git a/nextflow.config b/nextflow.config index 2c0f9e3..a7595c7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -14,14 +14,14 @@ params { // For this pipeline run_id = 'my_run' models = 'NaiveDrugMeanPredictor' - baselines = 'NaivePredictor' + baselines = 'NaiveMeanEffectsPredictor' test_mode = 'LPO' randomization_mode = 'None' randomization_type = 'permutation' n_trials_robustness = 0 dataset_name = 'GDSC2' cross_study_datasets = '' - curve_curator = false + curve_curator = true optim_metric = 'RMSE' n_cv_splits = 10 response_transformation = 'None' diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 2759507..c48542d 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -35,7 +35,7 @@ workflow MODEL_TESTING { params.response_transformation, params.model_checkpoint_dir ) - ch_vis = PREDICT_FULL.out.ch_vis + ch_vis = PREDICT_FULL.out.ch_vis.concat(PREDICT_FULL.out.ch_cross) if (params.randomization_mode != 'None') { ch_randomization = channel.from(randomizations) @@ -118,7 +118,8 @@ workflow MODEL_TESTING { ch_collapse = EVALUATE_FINAL.out.ch_individual_results.collect() COLLECT_RESULTS ( - ch_collapse + ch_collapse, + work_path ) emit: diff --git a/subworkflows/local/visualization/main.nf b/subworkflows/local/visualization/main.nf index db70508..cf3d1b8 100644 --- a/subworkflows/local/visualization/main.nf +++ b/subworkflows/local/visualization/main.nf @@ -1,133 +1,24 @@ -include { DRAW_CRITICAL_DIFFERENCE } from '../../../modules/local/draw_critical_difference' -include { DRAW_VIOLIN } from '../../../modules/local/draw_violin' -include { DRAW_HEATMAP } from '../../../modules/local/draw_heatmap' -include { DRAW_CORR_COMP } from '../../../modules/local/draw_corr_comp' -include { DRAW_REGRESSION } from '../../../modules/local/draw_regression' -include { SAVE_TABLES } from '../../../modules/local/save_tables' -include { WRITE_HTML } from '../../../modules/local/write_html' -include { WRITE_INDEX } from '../../../modules/local/write_index' +include { VISUALIZE_RESULTS } from '../../../modules/local/visualize_results' workflow VISUALIZATION { take: - test_modes // from input - models // from input - baselines // from input evaluation_results // from MODEL_TESTING evaluation_results_per_drug // from MODEL_TESTING evaluation_results_per_cl // from MODEL_TESTING true_vs_pred // from MODEL_TESTING + work_path // from input main: - ch_test_modes = channel.from(test_modes) - ch_test_modes_normalized = ch_test_modes.map { it + "_normalized" } - - ch_models = channel.from(models) - ch_baselines = channel.from(baselines) - ch_models_baselines = ch_models.concat(ch_baselines) - - ch_combined = ch_test_modes.combine(ch_models_baselines) - ch_combined_mapped = ch_combined.map { it[0] + "_" + it[1] } - - ch_cd = ch_test_modes.combine(evaluation_results) - DRAW_CRITICAL_DIFFERENCE( - ch_cd - ) - - ch_vio_heat = ch_test_modes.concat(ch_test_modes_normalized).concat(ch_combined_mapped) - - DRAW_VIOLIN ( - ch_vio_heat, - evaluation_results - ) - - DRAW_HEATMAP ( - ch_vio_heat, - evaluation_results - ) - - def suffixes = ['LCO': '_drug', - 'LDO': '_cell_line', - 'LPO': ['_drug', '_cell_line']] - - ch_test_modes_extended = ch_test_modes.flatMap { test_mode -> - def modeSuffixes = suffixes[test_mode] - if (modeSuffixes instanceof String) { - return [test_mode + modeSuffixes] - } else { - return modeSuffixes.collect { test_mode + it } - } - } - - ch_modes_algos = ch_test_modes_extended.combine(ch_models_baselines) - ch_modes_algos = ch_modes_algos.map { it[1] + "_" + it[0] } - ch_test_modes_extended = ch_test_modes_extended.concat(ch_modes_algos) - - ch_test_modes_extended_drug = ch_test_modes_extended.filter { it.endsWith("_drug") } - ch_test_modes_extended_cl = ch_test_modes_extended.filter { it.endsWith("_cell_line") } - - ch_test_modes_extended_drug = ch_test_modes_extended_drug.combine(evaluation_results_per_drug) - ch_test_modes_extended_cl = ch_test_modes_extended_cl.combine(evaluation_results_per_cl) - - ch_test_modes_extended = ch_test_modes_extended_drug.concat(ch_test_modes_extended_cl) - - DRAW_CORR_COMP ( - ch_test_modes_extended - ) - - def suffixes_regr = ['LCO': ['_cell_line', '_cell_line_normalized'], - 'LDO': ['_drug', '_drug_normalized'], - 'LPO': ['_drug', '_drug_normalized', '_cell_line', '_cell_line_normalized']] - - ch_regr = ch_test_modes.flatMap { test_mode -> - def modeSuffixes = suffixes_regr[test_mode] - return modeSuffixes.collect { test_mode + it } - } - ch_regr = ch_regr.combine(ch_models_baselines).combine(true_vs_pred) - - DRAW_REGRESSION ( - ch_regr - ) - - ch_drug = ch_test_modes.filter { it == 'LCO' || it == 'LPO' } - ch_drug = ch_drug.combine(evaluation_results_per_drug) - ch_cl = ch_test_modes.filter { it == 'LDO' || it == 'LPO' } - ch_cl = ch_cl.combine(evaluation_results_per_cl) - - ch_tables = ch_test_modes.combine(evaluation_results) - ch_tables = ch_tables.concat(ch_drug).concat(ch_cl) - - SAVE_TABLES ( - ch_tables - ) - - ch_html_files = DRAW_CRITICAL_DIFFERENCE.out.critical_difference - .concat(DRAW_VIOLIN.out.violin_plot) - .concat(DRAW_HEATMAP.out.heatmap) - .concat(DRAW_CORR_COMP.out.corr_comp_scatter) - .concat(DRAW_REGRESSION.out.regression_lines) - .concat(SAVE_TABLES.out.html_table) - .flatten() - ch_lpo = ch_html_files - .filter { it.baseName.contains('LPO') } - .map { it -> ['LPO', it] } - ch_lco = ch_html_files - .filter { it.baseName.contains('LCO') } - .map { it -> ['LCO', it] } - ch_ldo = ch_html_files - .filter { it.baseName.contains('LDO') } - .map { it -> ['LDO', it] } - ch_html_files = ch_lpo.concat(ch_lco).concat(ch_ldo).groupTuple(by: 0) - - WRITE_HTML ( - params.run_id, - ch_html_files - ) - - WRITE_INDEX ( - params.run_id, - params.test_mode, - WRITE_HTML.out.html_out.count() + ch_input_vis = evaluation_results.concat( + evaluation_results_per_drug, + evaluation_results_per_cl, + true_vs_pred + ).collect() + + VISUALIZE_RESULTS( + ch_input_vis, + work_path ) } diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 9209ab5..5d8e0a5 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -8,13 +8,6 @@ include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pi include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_drugresponseeval_pipeline' include { PARAMS_CHECK } from '../modules/local/params_check' -include { DRAW_VIOLIN } from '../modules/local/draw_violin' -include { DRAW_HEATMAP } from '../modules/local/draw_heatmap' -include { DRAW_CORR_COMP } from '../modules/local/draw_corr_comp' -include { DRAW_REGRESSION } from '../modules/local/draw_regression' -include { SAVE_TABLES } from '../modules/local/save_tables' -include { WRITE_HTML } from '../modules/local/write_html' -include { WRITE_INDEX } from '../modules/local/write_index' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // @@ -33,6 +26,10 @@ include { VISUALIZATION } from '../subworkflows/local/visualization' def test_modes = params.test_mode.split(",") def models = params.models.split(",") def baselines = params.baselines.split(",") +// if NaiveMeanEffectsPredictor is not in baselines, add it +if (!baselines.contains("NaiveMeanEffectsPredictor")) { + baselines = baselines + "NaiveMeanEffectsPredictor" +} def randomizations = params.randomization_mode.split(",") workflow DRUGRESPONSEEVAL { @@ -101,13 +98,11 @@ workflow DRUGRESPONSEEVAL { ) VISUALIZATION ( - test_modes, - models, - baselines, MODEL_TESTING.out.evaluation_results, MODEL_TESTING.out.evaluation_results_per_drug, MODEL_TESTING.out.evaluation_results_per_cl, - MODEL_TESTING.out.true_vs_predicted + MODEL_TESTING.out.true_vs_predicted, + work_path ) emit: From 3464f9bb4e8ac1dff66376253c1eecdae542da21 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 8 May 2025 14:43:59 +0200 Subject: [PATCH 187/257] updated documentation --- docs/output.md | 110 ++++++------------------------------------------- docs/usage.md | 76 ++++++++++++++++++++-------------- 2 files changed, 58 insertions(+), 128 deletions(-) diff --git a/docs/output.md b/docs/output.md index abaeac3..b80ac40 100644 --- a/docs/output.md +++ b/docs/output.md @@ -42,17 +42,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Collect results](#collect-results): The results of the evaluation metrics per model are collected into four overview tables. 5. `VISUALIZATION` subworkflow: Plots are created summarizing the results. - - [Critical difference plot](#critical-difference): A critical difference plot is created to compare the performance - of the models. - - [Violin plot](#violin-plot): A violin plot is created to compare the performance of the models over the CV folds. - - [Heatmap](#heatmap): A heatmap is created to compare the average performance of the models over the CV folds. - - [Correlation comparison](#correlation-comparison): Renders a plot in which the per-drug/per-cell line - correlations between y_true and y_predicted are compared between different models. - - [Regression plots](#regression-plots): Plots in which the y_true and y_predicted values are compared between - different models. - - [Save tables](#save-tables): Saves the performance metrics of the models in a table. - - [Write html](#write-html): Writes the plots to an HTML file per setting (LPO/LCO/LDO). - - [Write index](#write-index): Writes an index.html file that links to all the HTML files. 6. [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### Parameter check @@ -255,97 +244,24 @@ csv`, `evaluation_results_per_cell_line.csv`, and `true_vs_pred.csv`. ### Subworkflow `VISUALIZATION` -#### Critical difference - -The critical difference plot measures whether a model is significantly better than another model measured over its -average rank over all CV folds. - -
        -Output files - -- `critical_difference*.svg`: SVG file with the critical difference plot. - -
        - -#### Violin plot - -The violin shows the distribution of the performance metrics over the CV folds. This plot is rendered overall for -all real predictions and once per algorithm to compare the real predictions against, e.g., the randomization results. - -
        -Output files - -- `violin*.html`: HTML file with the violin plot. - -
        - -#### Heatmap - -The heatmap shows the average performance of the models over the CV folds. This plot is rendered overall for all -real predictions and once per algorithm to compare the real predictions against, e.g., the randomization results. - -
        -Output files - -- `heatmap*.html`: HTML file with the violin plot. - -
        - -#### Correlation comparison - -Renders a plot in which the per-drug/per-cell line correlations between y_true and y_predicted are compared between -different models. - -
        -Output files - -- `corr_comp_scatter*.html`: HTML file with the violin plot. - -
        - -#### Regression plots - -Plots in which the y_true and y_predicted values are compared between different models. +All plots are created in the `visualization` subworkflow. They are saved in the results/report directory.
        Output files -- `regression_lines*.html`: HTML file with the violin plot. - -
        - -#### Save tables - -Saves the performance metrics of the models in an html table. - -
        -Output files - -- `table*.html`: HTML file with the violin plot. - -
        - -#### Write html - -Creates a summary HTML file per setting (LPO/LCO/LDO) that contains all the plots and tables. - -
        -Output files - -- `{LPO,LCO,LPO}.html`: HTML file with the violin plot. - -
        - -#### Write index - -Writes an index.html file that links to all the HTML files. - -
        -Output files - -- `index.html`: HTML file with the violin plot. +- `critical_difference*.svg`: The critical difference plot measures whether a model is significantly better than another model measured over its + average rank over all CV folds. +- `critical_difference*.html`: The corresponding p-values in a table. +- `violin*.html`: The violin shows the distribution of the performance metrics over the CV folds. This plot is rendered overall for + all real predictions and once per algorithm to compare the real predictions against, e.g., the randomization results. +- `heatmap*.html`: The heatmap shows the average performance of the models over the CV folds. +- `comp_scatter*.html`: Renders a plot in which the per-drug/per-cell line performances between y_true and y_predicted are compared between + different models. +- `regression_lines*.html`: Plots in which the y_true and y_predicted values are compared between different models (not rendered for Naive Predictors). +- `table*.html`: Saves the cross-study performance metrics of the models in an html table. +- `{LPO,LCO,LTO,LPO}.html`: Creates a summary HTML file per setting (LPO/LCO/LTO/LDO) that contains all the plots and tables. +- `index.html`: HTML file that links to all the HTML files. - `*.png`: Some png files for the logo, etc. -
        ### Pipeline information diff --git a/docs/usage.md b/docs/usage.md index 690cf8c..1733228 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -16,22 +16,30 @@ reproducible manner. We offer three settings: - **Leave-Cell-Line-Out (LCO)**: Random cell lines are left out for testing but the drugs might already be present in the training set. This setting is **more challenging** than LPO but still relatively easy. The application scenario for this setting is when you want to test whether your model can **predict the response of a new cell line**. This - is very relevant for **personalized medicine or drug repurposing**. + is very relevant for **personalized medicine**. +- **Leave-Tissue-Out (LTO)**: Random tissues of origin are left out for testing but the drugs and cell lines might already be + present in the training set. This setting is **more challenging** than LCO because for LCO, very similar cell lines might + end up in the test dataset. Because it can still leverage drug means, it is still relatively easy, though. The application + scenario for this setting is when you want to test whether your model can **predict the response of a new tissue**. + This is very relevant for **drug repurposing**. - **Leave-Drug-Out (LDO)**: Random drugs are left out for testing but the cell lines might already be present in the training set. This setting is the **most challenging** one. The application scenario for this setting is when you want to test whether your model can **predict the response of a new drug**. This is very relevant for **drug development**. -An underlying issue is that drugs have a rather unique IC50 range. That means that by just predicting the mean IC50 +An underlying issue is that drugs have a rather unique IC50/EC50 range. That means that by just predicting the mean response that a drug has in the training set (aggregated over all cell lines), you can already achieve a rather good prediction. This is why we also offer the possibility to compare your model to a **NaivePredictor** that predicts -the mean IC50 of all drugs in the training set. We also offer two more advanced naive predictors: -**NaiveCellLineMeanPredictor** and **NaiveDrugMeanPredictor**. The former predicts the mean IC50 of a cell line in -the training set and the latter predicts the mean IC50 of a drug in the training set. +the mean response of all drugs in the training set. We also offer three more advanced naive predictors: +**NaiveCellLineMeanPredictor**, **NaiveDrugMeanPredictor**, and **NaiveMeanEffectsPredictor**. +The NaiveCellLineMeanPredictor predicts the mean response of a cell line in the training set, the NaiveDrugMeanPredictor +predicts the mean response of a drug in the training set. The NaiveMeanEffectsPredictor combines both sources of variation +and predicts responses as the sum of the overall mean (NaivePredictor) + cell line + drug-specific means. +**The NaiveMeanEffectsPredictor is always run.** Furthermore, we offer a variety of more advanced **baseline models** and some **state-of-the-art models** to compare your model against. Similarly, we provide commonly used datasets to evaluate your model on (GDSC1, GDSC2, CCLE, -CTRPv2). You can also provide your **own dataset or your own model by contributing to our PyPI package +CTRPv1, CTRPv2). You can also provide your **own dataset or your own model by contributing to our PyPI package [drevalpy](https://github.com/daisybio/drevalpy.git)** Before contributing, you can pull our respective repositories. More information can be found in the [drevalpy readthedocs](https://drevalpy.readthedocs.io/en/latest/). @@ -47,7 +55,7 @@ The typical command for running the pipeline is as follows: nextflow run nf-core/drugresponseeval \ -profile \ --run_id myRun \ - --test_mode \ + --test_mode \ --models \ --baselines \ --dataset_name \ @@ -63,7 +71,7 @@ The `test_mode` parameter specifies the evaluation setting, e.g., `--test_mode L The `models` and `baselines` parameters are lists of models and baselines to be evaluated, e.g., `--models ElasticNet,RandomForest --baselines NaivePredictor,NaiveCellLineMeanPredictor,NaiveDrugMeanPredictor`. -The `dataset_name` parameter specifies the dataset to be used for evaluation, e.g., `--dataset_name GDSC2`. +The `dataset_name` parameter specifies the dataset to be used for evaluation, e.g., `--dataset_name CTRPv2`. If you do not want to re-download the data every time you run the pipeline, you can specify the path to the data with the `path_data` parameter, e.g., `--path_data /path/to/data`. @@ -111,33 +119,39 @@ set. They can be used in all three settings. The following models are available: -| Model Name | Baseline / Published Model | Multi-Drug Model / Single-Drug Model | Description | -| -------------------------- | -------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| NaivePredictor | Baseline Method | Multi-Drug Model | Most simple method. Predicts the mean response of all drugs in the training set. | -| NaiveCellLineMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a cell line in the training set. | -| NaiveDrugMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a drug in the training set. | -| ElasticNet | Baseline Method | Multi-Drug Model | Fits an [Sklearn Elastic Net](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html), [Lasso](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html), or [Ridge](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html) model on gene expression data and drug fingerprints (concatenated input matrix). | -| GradientBoosting | Baseline Method | Multi-Drug Model | Fits an [Sklearn Gradient Boosting Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html) gene expression data and drug fingerprints. | -| RandomForest | Baseline Method | Multi-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression data and drug fingerprints. | -| MultiOmicsRandomForest | Baseline Method | Multi-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression, methylation, mutation, copy number variation data, and drug fingerprints (concatenated matrix). The dimensionality of the methylation data is reduced with a PCA to the first 100 components before it is fed to the model. | -| SingleDrugRandomForest | Baseline Method | Single-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression data for each drug separately. | -| SVR | Baseline Method | Multi-Drug Model | Fits an [Sklearn Support Vector Regressor](https://scikit-learn.org/1.5/modules/generated/sklearn.svm.SVR.html) gene expression data and drug fingerprints. | -| SimpleNeuralNetwork | Baseline Method | Multi-Drug Model | Fits a simple feedforward neural network (implemented with [Pytorch Lightning](https://lightning.ai/docs/pytorch/stable/)) on gene expression and drug fingerprints (concatenated input) with 3 layers of varying dimensions and Dropout layers. | -| MultiOmicsNeuralNetwork | Baseline Method | Multi-Drug Model | Fits a simple feedforward neural network (implemented with [Pytorch Lightning](https://lightning.ai/docs/pytorch/stable/)) on gene expression, methylation, mutation, copy number variation data, and drug fingerprints (concatenated input) with 3 layers of varying dimensions and Dropout layers. The dimensionality of the methylation data is reduced with a PCA to the first 100 components before it is fed to the model. | -| SRMF | Published Model | Multi-Drug Model | [Similarity Regularization Matrix Factorization](https://doi.org/10.1186/s12885-017-3500-5) model by Wang et al. on gene expression data and drug fingerprints. Re-implemented Matlab code into Python. The basic idea is represent each drug and each cell line by their respective similarities to all other drugs/cell lines. Those similarities are mapped into a shared latent low-dimensional space from which responses are predicted. | -| MOLIR | Published Model | Single-Drug Model | Regression extension of [MOLI: multi-omics late integration deep neural network.](https://doi.org/10.1093/bioinformatics/btz318) by Sharifi-Noghabi et al. Takes somatic mutation, copy number variation and gene expression data as input. MOLI reduces the dimensionality of each omics type with a hidden layer, concatenates them into one representation and optimizes this representation via a combined cost function consisting of a triplet loss and a binary cross-entropy loss. We implemented a regression adaption with MSE loss and an adapted triplet loss for regression. | -| SuperFELTR | Published Model | Single-Drug Model | Regression extension of [SuperFELT: supervised feature extraction learning using triplet loss for drug response](https://doi.org/10.1186/s12859-021-04146-z) by Park et al. Very similar to MOLI(R). In MOLI(R), encoders and the classifier were trained jointly. Super.FELT(R) trains them independently. MOLI(R) was trained without feature selection (except for the Variance Threshold on the gene expression). Super.FELT(R) uses feature selection for all omics data. | -| DIPK | Published Model | Multi-Drug Model | [Deep neural network Integrating Prior Knowledge](https://doi.org/10.1093/bib/bbae153) from Li et al. Uses gene interaction relationships (encoded by a graph auto-encoder), gene expression profiles (encoded by a denoising auto-encoder), and molecular topologies (encoded by MolGNet). Those features are integrated using multi-head attention layers. | +| Model Name | Baseline / Published Model | Multi-Drug Model / Single-Drug Model | Description | +| ------------------------------ | -------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| NaivePredictor | Baseline Method | Multi-Drug Model | Most simple method. Predicts the mean response of all drugs in the training set. | +| NaiveCellLineMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a cell line in the training set. | +| NaiveDrugMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a drug in the training set. | +| NaiveMeanEffectsPredictor | Baseline Method | Multi-Drug Model | Predicts the drug- and cell-line specific mean effects. | +| ElasticNet | Baseline Method | Multi-Drug Model | Fits an [Sklearn Elastic Net](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html), [Lasso](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html), or [Ridge](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html) model on gene expression data and drug fingerprints (concatenated input matrix). | +| SingleDrugElasticNet | Baseline Method | Single-Drug Model | Fits an ElasticNet model on gene expression data for each drug separately. | +| SingleDrugProteomicsElasticNet | Baseline Method | Single-Drug Model | Fits an ElasticNet model on proteomics data for each drug separately. | +| GradientBoosting | Baseline Method | Multi-Drug Model | Fits an [Sklearn Gradient Boosting Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html) gene expression data and drug fingerprints. | +| RandomForest | Baseline Method | Multi-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression data and drug fingerprints. | +| MultiOmicsRandomForest | Baseline Method | Multi-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression, methylation, mutation, copy number variation data, and drug fingerprints (concatenated matrix). The dimensionality of the methylation data is reduced with a PCA to the first 100 components before it is fed to the model. | +| ProteomicsRandomForest | Baseline Method | Multi-Drug Model | Fits Random Forest on proteomics data and drug fingerprints. | +| SingleDrugRandomForest | Baseline Method | Single-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression data for each drug separately. | +| SVR | Baseline Method | Multi-Drug Model | Fits an [Sklearn Support Vector Regressor](https://scikit-learn.org/1.5/modules/generated/sklearn.svm.SVR.html) gene expression data and drug fingerprints. | +| SimpleNeuralNetwork | Baseline Method | Multi-Drug Model | Fits a simple feedforward neural network (implemented with [Pytorch Lightning](https://lightning.ai/docs/pytorch/stable/)) on gene expression and drug fingerprints (concatenated input) with 3 layers of varying dimensions and Dropout layers. | +| MultiOmicsNeuralNetwork | Baseline Method | Multi-Drug Model | Fits a simple feedforward neural network (implemented with [Pytorch Lightning](https://lightning.ai/docs/pytorch/stable/)) on gene expression, methylation, mutation, copy number variation data, and drug fingerprints (concatenated input) with 3 layers of varying dimensions and Dropout layers. The dimensionality of the methylation data is reduced with a PCA to the first 100 components before it is fed to the model. | +| SRMF | Published Model | Multi-Drug Model | [Similarity Regularization Matrix Factorization](https://doi.org/10.1186/s12885-017-3500-5) model by Wang et al. on gene expression data and drug fingerprints. Re-implemented Matlab code into Python. The basic idea is represent each drug and each cell line by their respective similarities to all other drugs/cell lines. Those similarities are mapped into a shared latent low-dimensional space from which responses are predicted. | +| MOLIR | Published Model | Single-Drug Model | Regression extension of [MOLI: multi-omics late integration deep neural network.](https://doi.org/10.1093/bioinformatics/btz318) by Sharifi-Noghabi et al. Takes somatic mutation, copy number variation and gene expression data as input. MOLI reduces the dimensionality of each omics type with a hidden layer, concatenates them into one representation and optimizes this representation via a combined cost function consisting of a triplet loss and a binary cross-entropy loss. We implemented a regression adaption with MSE loss and an adapted triplet loss for regression. | +| SuperFELTR | Published Model | Single-Drug Model | Regression extension of [SuperFELT: supervised feature extraction learning using triplet loss for drug response](https://doi.org/10.1186/s12859-021-04146-z) by Park et al. Very similar to MOLI(R). In MOLI(R), encoders and the classifier were trained jointly. Super.FELT(R) trains them independently. MOLI(R) was trained without feature selection (except for the Variance Threshold on the gene expression). Super.FELT(R) uses feature selection for all omics data. | +| DIPK | Published Model | Multi-Drug Model | [Deep neural network Integrating Prior Knowledge](https://doi.org/10.1093/bib/bbae153) from Li et al. Uses gene interaction relationships (encoded by a graph auto-encoder), gene expression profiles (encoded by a denoising auto-encoder), and molecular topologies (encoded by MolGNet). Those features are integrated using multi-head attention layers. | ### Available Datasets The following datasets are available and can be supplied via `--dataset_name`: -| Dataset Name | Number of drugs | Number of Cell Lines | Description | -| ------------ | --------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------- | -| GDSC1 | 345 | 987 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 1. | -| GDSC2 | 192 | 809 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 2. | -| CCLE | 18 | 471 | The Cancer Cell Line Encyclopedia (CCLE) dataset. The response data will soon be replaced with the data from CTRPv2. | +| Dataset Name | Number of drugs | Number of Cell Lines | Description | +| ------------ | --------------- | -------------------- | -------------------------------------------------------------------- | +| CTRPv1 | 354 | 243 | The Cancer Therapeutics Response Portal (CTRP) dataset version 1. | +| CTRPv2 | 545 | 886 | The Cancer Therapeutics Response Portal (CTRP) dataset version 2. | +| CCLE | 24 | 503 | The Cancer Cell Line Encyclopedia (CCLE) dataset. | +| GDSC1 | 378 | 970 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 1. | +| GDSC2 | 287 | 969 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 2. | Our pipeline also supports cross-study prediction, i.e., training on one dataset and testing on another (or multiple others) to assess the generalization of the model. This dataset name can be supplied via `--cross_study_datasets`. @@ -146,7 +160,7 @@ The drug response measure that you want to use as the target variable can be spe Available measures are `[“AUC”, “pEC50”, “EC50”, “IC50”]`. We have re-fitted all the curves in the available datasets with CurveCurator to ensure that the data is processed -well. If you want to use those measures, enable the `--curve_curator` flag. +well. By default, we use those measures. If you do not want to use those measures, disable the `--curve_curator` flag. #### Custom datasets From 5c17b78bea868625ede34e9ca495db891a672f51 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 8 May 2025 14:50:48 +0200 Subject: [PATCH 188/257] updated README.md --- README.md | 4 +- assets/dreval_summary.svg | 49 ++++++++++++++++++ assets/drevalpy-2-qr.svg | 1 - .../drugresponseeval_pipeline_simplified.png | Bin 381627 -> 0 bytes 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 assets/dreval_summary.svg delete mode 100644 assets/drevalpy-2-qr.svg delete mode 100644 assets/drugresponseeval_pipeline_simplified.png diff --git a/README.md b/README.md index 7676837..9675449 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ [![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) -# ![drevalpy_summary](assets/drevalpy-2-qr.svg) +# ![drevalpy_summary](assets/dreval_summary.svg) ## Introduction @@ -33,8 +33,6 @@ tuning is fair and consistent. With its flexible model interface, DrEval support ranging from statistical models to complex neural networks. By contributing your model to the DrEval catalog, you can increase your work's exposure, reusability, and transferability. -# ![Pipeline diagram showing the major steps of nf-core/drugresponseeval](assets/drugresponseeval_pipeline_simplified.png) - 1. The response data is loaded 2. All models are trained and evaluated in a cross-validation setting 3. For each CV split, the best hyperparameters are determined using a grid search per model diff --git a/assets/dreval_summary.svg b/assets/dreval_summary.svg new file mode 100644 index 0000000..20484da --- /dev/null +++ b/assets/dreval_summary.svg @@ -0,0 +1,49 @@ +Commonly used response datasets316 506 (269 024)545886CTRPv2Curves Unique treatments Unique cell lines 234 437 (197 324) 354 (180) 243 (24)CTRPv111 670 (4611)24 (23) 503 (54)CCLE60 758 (35 682)378 (266)970 (394)GDSC1395 025287 (204)969 (393)GDSC2In brackets: not occurring in CTRPv2LDO generalizationLCO generalizationSimple models to avoid overfitting Unbiased evaluationTrue responsePredicted responseGlobal Pearson: 0.90Avg. Pearson per drug: 0.01Corrected metricsNaive baselinesFair hyperparameter tuning of all baseline & competitor modelsAblation studiesMore consistent data & metricsOriginal metricCurveCurator metricAUClnIC50pEC50Response agreement across datasetsApplication-aware splitsLeave-Pairs-Out (LPO): Missing value imputationLeave-Cell-Lines-Out (LCO): Personalized medicineLeave-Tissue-Out (LTO):Drug repurposingLeave-Drugs-Out (LDO): Drug designCell linesDrugsk foldsTestValidationLoad responsePreprocess response with CurveCuratorRandomization testsRobustness testsPredict CV test sets (+ cross-study datasets) with optimal hyperparametersInput optionsdrevalpyCross-validation with inner hold-outEvaluationVisualizationHTML reportCritical Difference Diagram: MSEOverall Friedman-Chi2 p-value: 2.26e-19ModelsSRMFDIPKMOLIRSuperFELTRBaselinesNaive PredictorNaive Cell Line Mean PredictorNaive Drug Mean PredictorNaive Mean Effects PredictorElasticNetGradient BoostingRandom ForestMulti-OMICs RFSVRSimple Neural NetworkMulti-OMICs Neural NetworkPackage versionsAvailable as packagePreprocessing scriptsDocumentationCode availableAvailable as pipelineEasily extendableFAIReR1 class ProteomicsRandomForest (RandomForest):2 cell_line_views = ["proteomics"]34 @classmethod5 def get_model_name(cls) -> str:6 return "ProteomicsRandomForest"7 8 def load_cell_line_features(9 self,10 data_path: str,11 dataset_name: str12 ) -> FeatureDataset:13 return load_and_select_gene_features(14 feature_type="proteomics",15 gene_list=None,16 data_path=data_path,17 dataset_name=dataset_name18 )Morgan fingerprintsMolGNet embeddingsRNAseq gene expessionMicroarray gene expressionCopy number variationRRBS methylationBeadChip methylationMutationsDIA protein expressionBIONIC gene embeddingsVariable input features \ No newline at end of file diff --git a/assets/drevalpy-2-qr.svg b/assets/drevalpy-2-qr.svg deleted file mode 100644 index fe98ebf..0000000 --- a/assets/drevalpy-2-qr.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/drugresponseeval_pipeline_simplified.png b/assets/drugresponseeval_pipeline_simplified.png deleted file mode 100644 index 4342280f28a2dafd098c60e498ea4e30e7a21bc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381627 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
        t9=$%-y;aBzD;4Y4KVc&c`9cy0 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 From d7ed4f37f75238128baae6ff688478c274cea2be Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 8 May 2025 15:02:03 +0200 Subject: [PATCH 189/257] updated changelog and schema --- .nf-core.yml | 2 +- CHANGELOG.md | 5 +++++ conf/modules.config | 16 ---------------- nextflow_schema.json | 14 +++++++------- 4 files changed, 13 insertions(+), 24 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 135705f..9fdd627 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -24,4 +24,4 @@ template: - igenomes - multiqc - fastqc - version: 1.0dev + version: 1.1dev diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d33c72..554b34d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## v1.1dev - [date] + +- Simplified visualization: multiple short processes were creating overhang -> more efficient in one process. +- Fixed errors that arose from the latest drevalpy version. + ## v1.0dev - [date] Initial release of nf-core/drugresponseeval, created with the [nf-core](https://nf-co.re/) template. diff --git a/conf/modules.config b/conf/modules.config index 81b7393..ce40008 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -147,20 +147,4 @@ process { saveAs: { filename -> null } ] } - - withName: 'WRITE_HTML' { - publishDir = [ - path: { "${params.outdir}/${params.run_id}" }, - mode: 'copy', - saveAs: { filename -> filename } - ] - } - - withName: 'WRITE_INDEX' { - publishDir = [ - path: { "${params.outdir}/${params.run_id}" }, - mode: 'copy', - saveAs: { filename -> filename } - ] - } } diff --git a/nextflow_schema.json b/nextflow_schema.json index 6a9687b..75b53fb 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -20,7 +20,7 @@ "baselines": { "type": "string", "description": "Baselines to be tested.", - "help_text": "Baselines to be tested." + "help_text": "Baselines to be tested. NaiveMeanEffectsPredictor will always be included." } } }, @@ -39,7 +39,7 @@ "dataset_name": { "type": "string", "description": "Name of the dataset.", - "help_text": "Name of the dataset used for the pipeline. This can be either one of the provided datasets ('GDSC1', 'GDSC2', 'CCLE', 'CTRPv2', 'Toy_Data') in which case the datasets with the fitted curves is downloaded, or a custom dataset name, pointing either to raw viability measurements for automatic curve fitting (see 'curve_curator' option, which is required in this case), or prefit data (not recommended for dataset comparability reasons due to potential differences in fitting procedures)." + "help_text": "Name of the dataset used for the pipeline. This can be either one of the provided datasets ('GDSC1', 'GDSC2', 'CCLE', 'CTRPv2', 'TOYv1', 'TOYv2) in which case the datasets with the fitted curves is downloaded, or a custom dataset name, pointing either to raw viability measurements for automatic curve fitting (see 'curve_curator' option, which is required in this case), or prefit data (not recommended for dataset comparability reasons due to potential differences in fitting procedures)." }, "outdir": { "type": "string", @@ -57,7 +57,7 @@ } }, "mode_options": { - "title": "Mode options (LPO/LCO/LDO)", + "title": "Mode options (LPO/LCO/LTO/LDO)", "type": "object", "fa_icon": "fa-solid fa-table-cells-column-lock", "description": "Define the mode in which the pipeline will be run.", @@ -67,7 +67,7 @@ "type": "string", "description": "Run the pipeline in test mode LPO (Leave-random-Pairs-Out), LCO (Leave-Cell-line-Out), or LDO (Leave-Drug-Out).", "default": "LPO", - "help_text": "Which tests to run (LPO=Leave-random-Pairs-Out, LCO=Leave-Cell-line-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO LCO LDO' to run all tests. Default is LPO." + "help_text": "Which tests to run (LPO=Leave-random-Pairs-Out, LCO=Leave-Cell-line-Out, LTO=Leave-Tissue-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO,LCO,LTO,LDO' to run all tests. Default is LPO." } } }, @@ -80,7 +80,7 @@ "randomization_mode": { "type": "string", "description": "Randomization mode for the pipeline.", - "help_text": "Which randomization tests to run, additionally to the normal run. Default is None which means no randomization tests are run. Modes: SVCC, SVRC, SVCD, SVRD. Can be a list of randomization tests e.g. 'SCVC SCVD' to run two tests. Default is None. SVCC: Single View Constant for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..). For each experiment one cell line view is held constant while the others are randomized. SVRC Single View Random for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." + "help_text": "Which randomization tests to run, additionally to the normal run. Default is None which means no randomization tests are run. Modes: SVCC, SVRC, SVCD, SVRD. Can be a list of randomization tests e.g. 'SCVC,SCVD' to run two tests. Default is None. SVCC: Single View Constant for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..). For each experiment one cell line view is held constant while the others are randomized. SVRC Single View Random for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." }, "randomization_type": { "type": "string", @@ -120,7 +120,7 @@ "type": "string", "default": "LN_IC50", "description": "The name of the measure to use", - "help": "The name of the measure to use, default 'LN_IC50'. If using one of the available datasets (see 'dataset_name' option), this is restricted to one of ['LN_IC50', 'EC50', 'IC50', 'pEC50', 'AUC', 'response']. This corresponds to the names of the columns that contain theses measures in the provided input dataset. If providing a custom dataset (see 'dataset_name' option), this may differ. If the option 'curve_curator' is set, the prefix '_curvecurator' is automatically appended, e.g. 'LN_IC50_curvecurator', to allow using the refit measures instead of the ones originally published for the available datasets (see 'dataset_name' option for details), allowing for better dataset comparability (refit measures are already provided in the available datasets or computed as part of the fitting procedure when providing custom raw viability datasets, see 'curve_curator' option for details)." + "help": "The name of the measure to use, default 'LN_IC50'. If using one of the available datasets (see 'dataset_name' option), this is restricted to one of ['LN_IC50', 'EC50', 'IC50', 'pEC50', 'AUC', 'response']. This corresponds to the names of the columns that contain theses measures in the provided input dataset. If providing a custom dataset (see 'dataset_name' option), this may differ. If the option 'curve_curator' is set (true by default), the prefix '_curvecurator' is automatically appended, e.g. 'LN_IC50_curvecurator', to allow using the refit measures instead of the ones originally published for the available datasets (see 'dataset_name' option for details), allowing for better dataset comparability (refit measures are already provided in the available datasets or computed as part of the fitting procedure when providing custom raw viability datasets, see 'curve_curator' option for details)." }, "cross_study_datasets": { "type": "string", @@ -137,7 +137,7 @@ "properties": { "curve_curator": { "type": "boolean", - "description": "If True, use refit measures instead of original measures reported by the authors for the available datasets, or invoke automatic fitting of custom raw viability data.", + "description": "True by default. Use refit measures instead of original measures reported by the authors for the available datasets, or invoke automatic fitting of custom raw viability data.", "help_text": "This allows using refit measures (see 'measure' option for details) for available datasets, which allows better comparability between datasets. When providing a custom dataset (see 'dataset_name' option), setting this to True expects a csv-formatted file at //_raw.csv (also see 'path_data' option), which is fitted automatically with the same procedure as the available datasets, to provide fair comparison. The fitted data will then be stored at //.csv." }, "optim_metric": { From df6bf78e1c83e3f9b0951fdeeee77de2030941e8 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 9 May 2025 11:25:16 +0200 Subject: [PATCH 190/257] new version --- .nf-core.yml | 2 +- docs/usage.md | 8 +++-- env.yml | 4 +-- nextflow.config | 2 +- ro-crate-metadata.json | 73 ++++++++++++++++++++++++++++++++++-------- 5 files changed, 68 insertions(+), 21 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index d0c4e6e..d026711 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -24,4 +24,4 @@ template: - igenomes - multiqc - fastqc - version: 1.1dev + version: 1.1 diff --git a/docs/usage.md b/docs/usage.md index 1733228..261274c 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -30,9 +30,10 @@ reproducible manner. We offer three settings: An underlying issue is that drugs have a rather unique IC50/EC50 range. That means that by just predicting the mean response that a drug has in the training set (aggregated over all cell lines), you can already achieve a rather good prediction. This is why we also offer the possibility to compare your model to a **NaivePredictor** that predicts -the mean response of all drugs in the training set. We also offer three more advanced naive predictors: -**NaiveCellLineMeanPredictor**, **NaiveDrugMeanPredictor**, and **NaiveMeanEffectsPredictor**. -The NaiveCellLineMeanPredictor predicts the mean response of a cell line in the training set, the NaiveDrugMeanPredictor +the mean response of all drugs in the training set. We also offer four more advanced naive predictors: +**NaiveCellLineMeanPredictor**, **NaiveTissueMeanPredictor**, **NaiveDrugMeanPredictor**, and **NaiveMeanEffectsPredictor**. +The NaiveCellLineMeanPredictor predicts the mean response of a cell line in the training set, the NaiveTissueMeanPredictor +the mean response of a tissue of origin in the training set, the NaiveDrugMeanPredictor predicts the mean response of a drug in the training set. The NaiveMeanEffectsPredictor combines both sources of variation and predicts responses as the sum of the overall mean (NaivePredictor) + cell line + drug-specific means. **The NaiveMeanEffectsPredictor is always run.** @@ -124,6 +125,7 @@ The following models are available: | NaivePredictor | Baseline Method | Multi-Drug Model | Most simple method. Predicts the mean response of all drugs in the training set. | | NaiveCellLineMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a cell line in the training set. | | NaiveDrugMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a drug in the training set. | +| NaiveTissueMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a tissue in the training set. | | NaiveMeanEffectsPredictor | Baseline Method | Multi-Drug Model | Predicts the drug- and cell-line specific mean effects. | | ElasticNet | Baseline Method | Multi-Drug Model | Fits an [Sklearn Elastic Net](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html), [Lasso](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html), or [Ridge](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html) model on gene expression data and drug fingerprints (concatenated input matrix). | | SingleDrugElasticNet | Baseline Method | Single-Drug Model | Fits an ElasticNet model on gene expression data for each drug separately. | diff --git a/env.yml b/env.yml index 612ea33..53347cd 100644 --- a/env.yml +++ b/env.yml @@ -2,7 +2,7 @@ name: nf-core-drugresponseeval channels: - conda-forge dependencies: - - python=3.11 + - python=3.12 - pip - pip: - - drevalpy==1.3.0 + - drevalpy==1.3.1 diff --git a/nextflow.config b/nextflow.config index ee40998..adfe09f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -250,7 +250,7 @@ manifest { mainScript = 'main.nf' defaultBranch = 'master' nextflowVersion = '!>=24.04.2' - version = '1.0dev' + version = '1.1' doi = '' } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index dfaef99..184b5e7 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -21,9 +21,9 @@ { "@id": "./", "@type": "Dataset", - "creativeWorkStatus": "InProgress", - "datePublished": "2025-04-30T12:25:42+00:00", - "description": "

        \n \n \n \"nf-core/drugresponseeval\"\n \n

        \n\n[![GitHub Actions CI Status](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/drugresponseeval/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/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/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![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/drugresponseeval)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23drugresponseeval-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/drugresponseeval)[![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)\n\n## Introduction\n\n**nf-core/drugresponseeval** is a bioinformatics pipeline that ...\n\n\n\n\n\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/drugresponseeval \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> 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).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/drugresponseeval/usage) and the [parameter documentation](https://nf-co.re/drugresponseeval/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/drugresponseeval/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/drugresponseeval/output).\n\n## Credits\n\nnf-core/drugresponseeval was originally written by Judith Bernett.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#drugresponseeval` channel](https://nfcore.slack.com/channels/drugresponseeval) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "creativeWorkStatus": "Stable", + "datePublished": "2025-05-09T09:23:07+00:00", + "description": "

        \n \n \n \"nf-core/drugresponseeval\"\n \n

        \n\n[![GitHub Actions CI Status](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/drugresponseeval/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/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/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A524.04.2-23aa62.svg)](https://www.nextflow.io/)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![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/drugresponseeval)\n\n[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core)\n[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)\n[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n# ![drevalpy_summary](assets/dreval_summary.svg)\n\n## Introduction\n\n**DrEval** is a bioinformatics framework which includes a PyPI package (drevalpy) and a Nextflow\npipeline (this repo). DrEval ensures that evaluations are statistically sound, biologically\nmeaningful, and reproducible. DrEval simplifies the implementation of drug response prediction\nmodels, allowing researchers to focus on advancing their modeling innovations by automating\nstandardized evaluation protocols and preprocessing workflows. With DrEval, hyperparameter\ntuning is fair and consistent. With its flexible model interface, DrEval supports any model type,\nranging from statistical models to complex neural networks. By contributing your model to the\nDrEval catalog, you can increase your work's exposure, reusability, and transferability.\n\n1. The response data is loaded\n2. All models are trained and evaluated in a cross-validation setting\n3. For each CV split, the best hyperparameters are determined using a grid search per model\n4. The model is trained on the full training set (train & validation) with the best\n hyperparameters to predict the test set\n5. If randomization tests are enabled, the model is trained on the full training set with the best\n hyperparameters to predict the randomized test set\n6. If robustness tests are enabled, the model is trained N times on the full training set with the\n best hyperparameters\n7. Plots are created summarizing the results\n\nFor baseline models, no randomization or robustness tests are performed.\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/drugresponseeval \\\n -profile \\\n --models \\\n --baselines \\\n --dataset_name \\\n --path_data \\\n```\n\n> [!WARNING]\n> 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).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/drugresponseeval/usage) and the [parameter documentation](https://nf-co.re/drugresponseeval/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/drugresponseeval/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/drugresponseeval/output).\n\n## Credits\n\nnf-core/drugresponseeval was originally written by Judith Bernett (TUM) and Pascal Iversen (FU\nBerlin).\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n## Contributions and Support\n\nContributors to nf-core/drugresponseeval and the drevalpy PyPI package:\n\n- [Judith Bernett](https://github.com/JudithBernett) (TUM)\n- [Pascal Iversen](https://github.com/PascalIversen) (FU Berlin)\n- [Mario Picciani](https://github.com/picciama) (TUM)\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#drugresponseeval` channel](https://nfcore.slack.com/channels/drugresponseeval) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -31,6 +31,9 @@ { "@id": "assets/" }, + { + "@id": "bin/" + }, { "@id": "conf/" }, @@ -40,6 +43,15 @@ { "@id": "docs/images/" }, + { + "@id": "modules/" + }, + { + "@id": "modules/local/" + }, + { + "@id": "modules/nf-core/" + }, { "@id": "workflows/" }, @@ -93,7 +105,7 @@ }, "mentions": [ { - "@id": "#bf0d6ab4-ef72-4f18-9816-b5efd10254e0" + "@id": "#e99c7d5d-539d-4d45-9903-abc448d7b3c8" } ], "name": "nf-core/drugresponseeval" @@ -115,14 +127,18 @@ }, { "@id": "main.nf", - "@type": ["File", "SoftwareSourceCode", "ComputationalWorkflow"], + "@type": [ + "File", + "SoftwareSourceCode", + "ComputationalWorkflow" + ], "creator": [ { "@id": "https://orcid.org/0000-0001-5812-8013" } ], "dateCreated": "", - "dateModified": "2025-04-30T12:25:42Z", + "dateModified": "2025-05-09T11:23:07Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -141,21 +157,30 @@ "robustness-assessment", "training" ], - "license": ["MIT"], + "license": [ + "MIT" + ], "maintainer": [ { "@id": "https://orcid.org/0000-0001-5812-8013" } ], - "name": ["nf-core/drugresponseeval"], + "name": [ + "nf-core/drugresponseeval" + ], "programmingLanguage": { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow" }, "sdPublisher": { "@id": "https://nf-co.re/" }, - "url": ["https://github.com/nf-core/drugresponseeval", "https://nf-co.re/drugresponseeval/dev/"], - "version": ["1.0dev"] + "url": [ + "https://github.com/nf-core/drugresponseeval", + "https://nf-co.re/drugresponseeval/1.1/" + ], + "version": [ + "1.1" + ] }, { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow", @@ -170,11 +195,11 @@ "version": "!>=24.04.2" }, { - "@id": "#bf0d6ab4-ef72-4f18-9816-b5efd10254e0", + "@id": "#e99c7d5d-539d-4d45-9903-abc448d7b3c8", "@type": "TestSuite", "instance": [ { - "@id": "#3624178e-5d4f-4fe3-9d0a-964444e30b9d" + "@id": "#9df76f78-73dd-491d-9a49-baa63dc5b4ec" } ], "mainEntity": { @@ -183,7 +208,7 @@ "name": "Test suite for nf-core/drugresponseeval" }, { - "@id": "#3624178e-5d4f-4fe3-9d0a-964444e30b9d", + "@id": "#9df76f78-73dd-491d-9a49-baa63dc5b4ec", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/drugresponseeval", "resource": "repos/nf-core/drugresponseeval/actions/workflows/ci.yml", @@ -205,6 +230,11 @@ "@type": "Dataset", "description": "Additional files" }, + { + "@id": "bin/", + "@type": "Dataset", + "description": "Scripts that must be callable from a pipeline process" + }, { "@id": "conf/", "@type": "Dataset", @@ -220,6 +250,21 @@ "@type": "Dataset", "description": "Images for the documentation files" }, + { + "@id": "modules/", + "@type": "Dataset", + "description": "Modules used by the pipeline" + }, + { + "@id": "modules/local/", + "@type": "Dataset", + "description": "Pipeline-specific modules" + }, + { + "@id": "modules/nf-core/", + "@type": "Dataset", + "description": "nf-core modules" + }, { "@id": "workflows/", "@type": "Dataset", @@ -308,4 +353,4 @@ "name": "Judith Bernett" } ] -} +} \ No newline at end of file From 0c88c497fda89ae579fc158ff02f6aaf0ba20a99 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 9 May 2025 11:33:20 +0200 Subject: [PATCH 191/257] small error fix --- modules/local/collect_results/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/collect_results/main.nf b/modules/local/collect_results/main.nf index 962d345..f776ff0 100644 --- a/modules/local/collect_results/main.nf +++ b/modules/local/collect_results/main.nf @@ -8,8 +8,8 @@ process COLLECT_RESULTS { output: path('evaluation_results.csv'), emit: evaluation_results - path('evaluation_results_per_drug.csv'), emit: evaluation_results_per_drug - path('evaluation_results_per_cl.csv'), emit: evaluation_results_per_cl + path('evaluation_results_per_drug.csv'), emit: evaluation_results_per_drug, optional: true + path('evaluation_results_per_cl.csv'), emit: evaluation_results_per_cl, optional: true path('true_vs_pred.csv'), emit: true_vs_pred script: From 6181ab3d1b1ac717de9f1e98d2001a4f354691b6 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 9 May 2025 11:55:36 +0200 Subject: [PATCH 192/257] linting --- .nf-core.yml | 2 +- README.md | 9 +++++---- conf/test.config | 2 -- conf/test_full.config | 3 ++- nextflow.config | 28 +++++++++++++++++++++------- 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index d026711..d0c4e6e 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -24,4 +24,4 @@ template: - igenomes - multiqc - fastqc - version: 1.1 + version: 1.1dev diff --git a/README.md b/README.md index 9675449..5ce3d78 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![GitHub Actions CI Status](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml) -[![GitHub Actions Linting Status](https://github.com/nf-core/drugresponseeval/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/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/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![GitHub Actions Linting Status](https://github.com/nf-core/drugresponseeval/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/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/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.14779984-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.14779984) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) @@ -94,10 +94,11 @@ For further information or help, don't hesitate to get in touch on the [Slack `# ## Citations - - +If you use nf-core/drugresponseeval for your analysis, please cite it using the following doi: [10.5281/zenodo.14779984](https://doi.org/10.5281/zenodo.14779984) - +The underlying data is available at doi: [10.5281/zenodo.12633909](https://doi.org/10.5281/zenodo.12633909). + +The underlying python package is drevalpy, availably on [PyPI](https://pypi.org/project/drevalpy/) as standalone. An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. diff --git a/conf/test.config b/conf/test.config index a40011b..7f33ebf 100644 --- a/conf/test.config +++ b/conf/test.config @@ -23,8 +23,6 @@ params { config_profile_description = 'Minimal test dataset to check pipeline function' // 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 = params.pipelines_testdata_base_path + 'viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' run_id = 'test_run' diff --git a/conf/test_full.config b/conf/test_full.config index 54f3257..f9e33fb 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,7 +15,8 @@ params { config_profile_description = 'Full test dataset to check pipeline function' run_id = 'full_test_run' - dataset_name = 'Toy_Data' + dataset_name = 'TOYv1' + cross_study_datasets = 'TOYv2' n_cv_splits = 5 models = 'ElasticNet' randomization_mode = 'SVRC' diff --git a/nextflow.config b/nextflow.config index adfe09f..7936539 100644 --- a/nextflow.config +++ b/nextflow.config @@ -178,7 +178,6 @@ profiles { includeConfig !System.getenv('NXF_OFFLINE') && params.custom_config_base ? "${params.custom_config_base}/nfcore_custom.config" : "/dev/null" // Load nf-core/drugresponseeval 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/drugresponseeval.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile @@ -235,14 +234,29 @@ manifest { name = 'nf-core/drugresponseeval' author = """Judith Bernett""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead contributors = [ - // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 [ name: 'Judith Bernett', - affiliation: '', - email: '', - github: '', - contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') - orcid: '' + affiliation: 'Data Science in Systems Biology, TUM School of Life Sciences, Technical University of Munich, Germany.', + email: 'judith.bernett@tum.de', + github: 'JudithBernett', + contribution: [author, maintainer], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: '0000-0001-5812-8013' + ], + [ + name: 'Pascal Iversen', + affiliation: 'Freie Universität Berlin, Department of Mathematics and Computer Science, Germany. Hasso-Plattner-Institute, Digital Engineering Faculty, University of Potsdam, Germany.', + email: 'pascal.iversen@fu-berlin.de', + github: 'PascalIversen', + contribution: [author], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: '0000-0001-9877-4300' + ], + [ + name: 'Mario Picciani', + affiliation: 'Computational Mass Spectrometry, TUM School of Life Sciences, Technical University of Munich, Germany.', + email: 'mario.picciani@tum.de', + github: 'picciama', + contribution: [contributor], // List of contribution types ('author', 'maintainer' or 'contributor') + orcid: '0000-0003-0428-1703' ], ] homePage = 'https://github.com/nf-core/drugresponseeval' From 6f8261d382f248aeb914f1786546d33abd08ea68 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 9 May 2025 12:03:35 +0200 Subject: [PATCH 193/257] old nextflow doesn't like contribution types --- nextflow.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nextflow.config b/nextflow.config index 7936539..e54f5ca 100644 --- a/nextflow.config +++ b/nextflow.config @@ -239,7 +239,7 @@ manifest { affiliation: 'Data Science in Systems Biology, TUM School of Life Sciences, Technical University of Munich, Germany.', email: 'judith.bernett@tum.de', github: 'JudithBernett', - contribution: [author, maintainer], // List of contribution types ('author', 'maintainer' or 'contributor') + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') orcid: '0000-0001-5812-8013' ], [ @@ -247,7 +247,7 @@ manifest { affiliation: 'Freie Universität Berlin, Department of Mathematics and Computer Science, Germany. Hasso-Plattner-Institute, Digital Engineering Faculty, University of Potsdam, Germany.', email: 'pascal.iversen@fu-berlin.de', github: 'PascalIversen', - contribution: [author], // List of contribution types ('author', 'maintainer' or 'contributor') + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') orcid: '0000-0001-9877-4300' ], [ @@ -255,7 +255,7 @@ manifest { affiliation: 'Computational Mass Spectrometry, TUM School of Life Sciences, Technical University of Munich, Germany.', email: 'mario.picciani@tum.de', github: 'picciama', - contribution: [contributor], // List of contribution types ('author', 'maintainer' or 'contributor') + contribution: [], // List of contribution types ('author', 'maintainer' or 'contributor') orcid: '0000-0003-0428-1703' ], ] From f9cd89482896c46b283301a62df87f12c0d614bc Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 9 May 2025 13:05:07 +0200 Subject: [PATCH 194/257] v1.1.0 instead of 1.1 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 554b34d..dcc80bc 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.1dev - [date] +## v1.1.0dev - [date] - Simplified visualization: multiple short processes were creating overhang -> more efficient in one process. - Fixed errors that arose from the latest drevalpy version. From 273b04cb5a97948c72121e096cd1bb1ff06c2af9 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 9 May 2025 14:19:18 +0200 Subject: [PATCH 195/257] updating usage information for contributing own models --- docs/usage.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/usage.md b/docs/usage.md index 261274c..cc7448d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -143,6 +143,20 @@ The following models are available: | SuperFELTR | Published Model | Single-Drug Model | Regression extension of [SuperFELT: supervised feature extraction learning using triplet loss for drug response](https://doi.org/10.1186/s12859-021-04146-z) by Park et al. Very similar to MOLI(R). In MOLI(R), encoders and the classifier were trained jointly. Super.FELT(R) trains them independently. MOLI(R) was trained without feature selection (except for the Variance Threshold on the gene expression). Super.FELT(R) uses feature selection for all omics data. | | DIPK | Published Model | Multi-Drug Model | [Deep neural network Integrating Prior Knowledge](https://doi.org/10.1093/bib/bbae153) from Li et al. Uses gene interaction relationships (encoded by a graph auto-encoder), gene expression profiles (encoded by a denoising auto-encoder), and molecular topologies (encoded by MolGNet). Those features are integrated using multi-head attention layers. | +#### Custom models + +If you want to use your own model, you must contribute it to drevalpy. Please follow the following steps: + +1. Fork the [drevalpy repository](https://github.com/daisybio/drevalpy) +2. Create a mamba environment: `mamba create -n drevalpy python=3.12` +3. Install the dependencies: `pip install poetry` `poetry install` +4. Implement your model (for more information on that, check the [ReadTheDocs](https://drevalpy.readthedocs.io/en/latest/runyourmodel.html)) +5. Test your model with the tests in `tests/`. Also implement your own tests. +6. (You can then open a PR to the main repository for contributing your model) +7. Install drevalpy into your environment: `pip install -e .` +8. From your environment, try to run the pipeline: `nextflow run nf-core/drugresponseeval -r dev -profile test` +9. If everything works, try running your model: `nextflow run nf-core/drugresponseeval -r dev --models --dataset_name ` + ### Available Datasets The following datasets are available and can be supplied via `--dataset_name`: From 3dea58314b5aad525a883620bd976cb27db7216f Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Fri, 9 May 2025 14:23:45 +0200 Subject: [PATCH 196/257] Update docs/usage.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/usage.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index cc7448d..6a3a0b1 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -149,7 +149,9 @@ If you want to use your own model, you must contribute it to drevalpy. Please fo 1. Fork the [drevalpy repository](https://github.com/daisybio/drevalpy) 2. Create a mamba environment: `mamba create -n drevalpy python=3.12` -3. Install the dependencies: `pip install poetry` `poetry install` +3. Install the dependencies: + - Run: `pip install poetry` + - Then run: `poetry install` 4. Implement your model (for more information on that, check the [ReadTheDocs](https://drevalpy.readthedocs.io/en/latest/runyourmodel.html)) 5. Test your model with the tests in `tests/`. Also implement your own tests. 6. (You can then open a PR to the main repository for contributing your model) From 42a4796c6c18b4bebd3c877847bf882900b30b61 Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Fri, 9 May 2025 14:44:21 +0200 Subject: [PATCH 197/257] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ce3d78..67ef3f1 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,12 @@ [![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) -# ![drevalpy_summary](assets/dreval_summary.svg) + ## Introduction +# ![drevalpy_summary](assets/dreval_summary.svg) + **DrEval** is a bioinformatics framework which includes a PyPI package (drevalpy) and a Nextflow pipeline (this repo). DrEval ensures that evaluations are statistically sound, biologically meaningful, and reproducible. DrEval simplifies the implementation of drug response prediction From 68927491f568a38f63000f8a1ea098de56f97482 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 9 May 2025 14:47:20 +0200 Subject: [PATCH 198/257] wrong space --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 67ef3f1..37dea31 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,6 @@ [![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) - - ## Introduction # ![drevalpy_summary](assets/dreval_summary.svg) From 64af57a1e49583fb0163b2ee6ce3635065a89bb0 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 9 May 2025 15:39:50 +0200 Subject: [PATCH 199/257] bug for when output is optional for evaluation --- bin/visualize_results.py | 10 ++++++++-- subworkflows/local/visualization/main.nf | 3 +++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/bin/visualize_results.py b/bin/visualize_results.py index 55ec46c..837b088 100755 --- a/bin/visualize_results.py +++ b/bin/visualize_results.py @@ -26,8 +26,14 @@ def get_parser(): test_modes = args.test_modes ev_res = pd.read_csv(args.eval_results, index_col=0) - ev_res_per_drug = pd.read_csv(args.eval_results_per_drug, index_col=0) - ev_res_per_cl = pd.read_csv(args.eval_results_per_cl, index_col=0) + if args.eval_results_per_drug == "NONE_drug.csv": + ev_res_per_drug = None + else: + ev_res_per_drug = pd.read_csv(args.eval_results_per_drug, index_col=0) + if args.eval_results_per_cl == "NONE_cl.csv": + ev_res_per_cl = None + else: + ev_res_per_cl = pd.read_csv(args.eval_results_per_cl, index_col=0) t_vs_p = pd.read_csv(args.true_vs_predicted, index_col=0) for test_mode in test_modes: diff --git a/subworkflows/local/visualization/main.nf b/subworkflows/local/visualization/main.nf index cf3d1b8..7bc109a 100644 --- a/subworkflows/local/visualization/main.nf +++ b/subworkflows/local/visualization/main.nf @@ -10,6 +10,9 @@ workflow VISUALIZATION { work_path // from input main: + // evaluation_results_per_cl and evaluation_results_per_drug are optional + evaluation_results_per_drug = evaluation_results_per_drug.ifEmpty(file("NONE_drug.csv")) + evaluation_results_per_cl = evaluation_results_per_cl.ifEmpty(file("NONE_cl.csv")) ch_input_vis = evaluation_results.concat( evaluation_results_per_drug, evaluation_results_per_cl, From dbc85a9b0393f5cce43fcb4ee1cac0465149be5d Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 15 May 2025 09:15:16 +0200 Subject: [PATCH 200/257] harmonized versions --- .nf-core.yml | 2 +- CHANGELOG.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index d0c4e6e..3268b90 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -24,4 +24,4 @@ template: - igenomes - multiqc - fastqc - version: 1.1dev + version: 1.1.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index dcc80bc..7d41007 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## v1.1.0dev - [date] +## v1.1.0 - [date] - Simplified visualization: multiple short processes were creating overhang -> more efficient in one process. - Fixed errors that arose from the latest drevalpy version. -## v1.0dev - [date] +## v1.0.0 - [date] Initial release of nf-core/drugresponseeval, created with the [nf-core](https://nf-co.re/) template. From e90346f23eabcaf05f909253ed4c30457792a821 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 28 May 2025 11:41:07 +0200 Subject: [PATCH 201/257] some quick fixes * changes process_single to process_medium for collect/visualize results * if multiple randomization modes are supplied, they have to be supplied as str to the script of consolidate_results * transpose was at the wrong spot after consolidate_results --- modules/local/collect_results/main.nf | 2 +- modules/local/consolidate_results/main.nf | 2 +- modules/local/visualize_results/main.nf | 2 +- subworkflows/local/model_testing/main.nf | 5 +++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/local/collect_results/main.nf b/modules/local/collect_results/main.nf index f776ff0..816ad67 100644 --- a/modules/local/collect_results/main.nf +++ b/modules/local/collect_results/main.nf @@ -1,5 +1,5 @@ process COLLECT_RESULTS { - label 'process_single' + label 'process_medium' publishDir "${params.outdir}/${params.run_id}", mode: 'copy' input: diff --git a/modules/local/consolidate_results/main.nf b/modules/local/consolidate_results/main.nf index 4b13898..7a6220f 100644 --- a/modules/local/consolidate_results/main.nf +++ b/modules/local/consolidate_results/main.nf @@ -22,7 +22,7 @@ process CONSOLIDATE_RESULTS { --n_cv_splits ${params.n_cv_splits} \\ ${params.cross_study_datasets != '' ? '--cross_study_datasets ' + params .cross_study_datasets.replace(',', ' ') : ''} \\ - --randomization_modes ${rand_modes}\\ + --randomization_modes "${rand_modes}"\\ --n_trials_robustness ${params.n_trials_robustness} """ diff --git a/modules/local/visualize_results/main.nf b/modules/local/visualize_results/main.nf index 0870e18..e0d4470 100644 --- a/modules/local/visualize_results/main.nf +++ b/modules/local/visualize_results/main.nf @@ -1,5 +1,5 @@ process VISUALIZE_RESULTS { - label 'process_single' + label 'process_medium' publishDir "${params.outdir}/${params.run_id}", mode: 'copy' input: diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index c48542d..b65b972 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -102,11 +102,12 @@ workflow MODEL_TESTING { randomizations, ch_vis.count() // wait for ch_vis to finish ) - CONSOLIDATE_RESULTS.out.ch_vis.transpose() + ch_consolidate = CONSOLIDATE_RESULTS.out.ch_vis.transpose() // filter out SingleDrugModels that have been consolidated ch_vis = ch_vis - .concat(CONSOLIDATE_RESULTS.out.ch_vis.transpose()) + .concat(ch_consolidate) + .transpose() .map{ test_mode, model, pred_file -> [model, test_mode, pred_file] } .combine(ch_models_baselines, by: 0) .map{ model, test_mode, pred_file -> [test_mode, model, pred_file] } From ac4d2f8b50bfb93c409e8f92d168d3a24beb4e18 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 28 May 2025 17:15:13 +0200 Subject: [PATCH 202/257] Various fixes: * substituted curve_curator option for no_refitting because default true does not make sense * updated schema to get ready to ditch the python parameter check * updated documentation --- docs/output.md | 2 +- docs/usage.md | 2 +- modules.json | 18 +++++- modules/local/params_check/main.nf | 4 +- nextflow.config | 6 +- nextflow_schema.json | 60 +++++++++++++------- subworkflows/local/preprocess_custom/main.nf | 6 +- workflows/drugresponseeval.nf | 2 +- 8 files changed, 66 insertions(+), 34 deletions(-) diff --git a/docs/output.md b/docs/output.md index b80ac40..6c8b285 100644 --- a/docs/output.md +++ b/docs/output.md @@ -63,7 +63,7 @@ The process `PARAMS_CHECK` performs the following checks: - `--response_transformation`: If supplied, checks whether the response transformation is either standard, minmax, or robust. - `--measure`: Which measure of drug response should be used for the file. Available options are "LN_IC50", "EC50", "IC50", "pEC50", "AUC", "response". Default: "LN_IC50". -- `--curve_curator`: Whether to run CurveCurator on a custom dataset. Default: false. This requires raw viability data to be located at "//\_raw.csv". +- `--no_refitting`: If CurveCurator should not be run on a custom dataset. Default: false (CurveCurator is run). Running CurveCurator on your custom data requires raw viability data to be located at "//\_raw.csv". It emits the path to the data but mostly so that the other processes wait for `PARAMS_CHECK` to finish before starting. diff --git a/docs/usage.md b/docs/usage.md index 6a3a0b1..bdc0107 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -178,7 +178,7 @@ The drug response measure that you want to use as the target variable can be spe Available measures are `[“AUC”, “pEC50”, “EC50”, “IC50”]`. We have re-fitted all the curves in the available datasets with CurveCurator to ensure that the data is processed -well. By default, we use those measures. If you do not want to use those measures, disable the `--curve_curator` flag. +well. By default, we use those measures. If you do not want to use those measures, enable the `--no_refitting` flag. #### Custom datasets diff --git a/modules.json b/modules.json index 4430ebe..759c498 100644 --- a/modules.json +++ b/modules.json @@ -4,7 +4,23 @@ "repos": { "https://github.com/nf-core/modules.git": { "modules": { - "nf-core": {} + "nf-core": { + "custom/dumpsoftwareversions": { + "branch": "master", + "git_sha": "76cc4938c1f6ea5c7d83fed1eeffc146787f9543", + "installed_by": ["modules"] + }, + "fastqc": { + "branch": "master", + "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", + "installed_by": ["modules"] + }, + "multiqc": { + "branch": "master", + "git_sha": "f2d63bd5b68925f98f572eed70993d205cc694b7", + "installed_by": ["modules"] + } + } }, "subworkflows": { "nf-core": { diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf index bf947e1..75d7c2b 100755 --- a/modules/local/params_check/main.nf +++ b/modules/local/params_check/main.nf @@ -11,7 +11,7 @@ process PARAMS_CHECK { val n_trials_robustness val dataset_name val cross_study_datasets - val curve_curator + val no_refitting val optim_metric val n_cv_splits val response_transformation @@ -34,7 +34,7 @@ process PARAMS_CHECK { --n_trials_robustness $n_trials_robustness \\ --dataset_name $dataset_name \\ ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} \\ - ${curve_curator ? '--curve_curator --curve_curator_cores 1' : ''} \\ + ${no_refitting ? '--no_refitting' : '--curve_curator_cores 1'} \\ --path_data $work_path \\ --measure $measure \\ --optim_metric $optim_metric \\ diff --git a/nextflow.config b/nextflow.config index e54f5ca..3c8ed1a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -15,13 +15,13 @@ params { run_id = 'my_run' models = 'NaiveDrugMeanPredictor' baselines = 'NaiveMeanEffectsPredictor' - test_mode = 'LPO' + test_mode = 'LCO' randomization_mode = 'None' randomization_type = 'permutation' n_trials_robustness = 0 - dataset_name = 'GDSC2' + dataset_name = 'CTRPv2' cross_study_datasets = '' - curve_curator = true + no_refitting = false optim_metric = 'RMSE' n_cv_splits = 10 response_transformation = 'None' diff --git a/nextflow_schema.json b/nextflow_schema.json index 75b53fb..939cc64 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -15,12 +15,14 @@ "models": { "type": "string", "description": "Model to be tested.", - "help_text": "Model to be tested." + "help_text": "Model to be tested. See the documentation for a list of pre-implemented models. Can be multiple models separated by ','.", + "default": "NaiveDrugMeanPredictor" }, "baselines": { "type": "string", "description": "Baselines to be tested.", - "help_text": "Baselines to be tested. NaiveMeanEffectsPredictor will always be included." + "help_text": "Baselines to be tested. See documentation of a list of available models. For baselines, randomization and robustness tests are not run. The NaiveMeanEffectsPredictor will always be included.", + "default": "NaiveMeanEffectsPredictor" } } }, @@ -33,19 +35,22 @@ "properties": { "run_id": { "type": "string", - "description": "Run ID for the pipeline.", - "help_text": "You will need to set a run identifier for the pipeline. This is used to create a unique output directory for each run." + "description": "Run name for the pipeline. The subdirectory in results will be named like this.", + "help_text": "You will need to set a run identifier for the pipeline. This is used to create a unique output directory for each run.", + "default": "my_run" }, "dataset_name": { "type": "string", - "description": "Name of the dataset.", - "help_text": "Name of the dataset used for the pipeline. This can be either one of the provided datasets ('GDSC1', 'GDSC2', 'CCLE', 'CTRPv2', 'TOYv1', 'TOYv2) in which case the datasets with the fitted curves is downloaded, or a custom dataset name, pointing either to raw viability measurements for automatic curve fitting (see 'curve_curator' option, which is required in this case), or prefit data (not recommended for dataset comparability reasons due to potential differences in fitting procedures)." + "description": "Name of the dataset. Pre-supplied datasets are CTRPv2, CTRPv1, CCLE, GDSC1, GDSC2, TOYv1, TOYv2.", + "help_text": "Name of the dataset used for the pipeline. This can be either one of the provided datasets ('GDSC1', 'GDSC2', 'CCLE', 'CTRPv2', 'TOYv1', 'TOYv2) in which case the datasets with the fitted curves is downloaded, or a custom dataset name, pointing either to raw viability measurements for automatic curve fitting, or pre-fit data (see no_refitting option; not recommended for dataset comparability reasons due to potential differences in fitting procedures).", + "default": "CTRPv2" }, "outdir": { "type": "string", "format": "directory-path", "description": "The output directory where the results will be saved. Default is results/", - "fa_icon": "fas fa-folder-open" + "fa_icon": "fas fa-folder-open", + "default": "results" }, "email": { "type": "string", @@ -66,8 +71,8 @@ "test_mode": { "type": "string", "description": "Run the pipeline in test mode LPO (Leave-random-Pairs-Out), LCO (Leave-Cell-line-Out), or LDO (Leave-Drug-Out).", - "default": "LPO", - "help_text": "Which tests to run (LPO=Leave-random-Pairs-Out, LCO=Leave-Cell-line-Out, LTO=Leave-Tissue-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO,LCO,LTO,LDO' to run all tests. Default is LPO." + "default": "LCO", + "help_text": "Which tests to run (LPO=Leave-random-Pairs-Out, LCO=Leave-Cell-line-Out, LTO=Leave-Tissue-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO,LCO,LTO,LDO' to run all tests. Default is LCO." } } }, @@ -80,13 +85,15 @@ "randomization_mode": { "type": "string", "description": "Randomization mode for the pipeline.", - "help_text": "Which randomization tests to run, additionally to the normal run. Default is None which means no randomization tests are run. Modes: SVCC, SVRC, SVCD, SVRD. Can be a list of randomization tests e.g. 'SCVC,SCVD' to run two tests. Default is None. SVCC: Single View Constant for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..). For each experiment one cell line view is held constant while the others are randomized. SVRC Single View Random for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..)." + "help_text": "Which randomization tests to run, additionally to the normal run. Default is None which means no randomization tests are run. Modes: SVCC, SVRC, SVCD, SVRD. Can be a list of randomization tests e.g. 'SCVC,SCVD' to run two tests. Default is None. SVCC: Single View Constant for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..). For each experiment one cell line view is held constant while the others are randomized. SVRC Single View Random for Cell Lines: in this mode, one experiment is done for every cell line view the model uses (e.g. gene expression, mutation, ..).", + "default": "None" }, "randomization_type": { "type": "string", "default": "permutation", "description": "Randomization type for the pipeline.", - "help_text": "type of randomization to use. Choose from \"permutation\", \"invariant\". Default is \"permutation" + "help_text": "type of randomization to use. Choose from \"permutation\", \"invariant\". Default is \"permutation", + "enum": ["permutation", "invariant"] } } }, @@ -100,7 +107,8 @@ "type": "integer", "default": 0, "description": "Number of trials to run for the robustness test", - "help_text": "Number of trials to run for the robustness test. Default is 0, which means no robustness test is run. The robustness test is a test where the model is trained with varying seeds. This is done multiple times to see how stable the model is." + "help_text": "Number of trials to run for the robustness test. Default is 0, which means no robustness test is run. The robustness test is a test where the model is trained with varying seeds. This is done multiple times to see how stable the model is.", + "minimum": 0 } } }, @@ -114,18 +122,21 @@ "type": "string", "format": "directory-path", "description": "Path to the data directory.", - "help_text": "Path to the data directory." + "help_text": "Path to the data directory. The downloaded data will be exported here. If you supply custom data, it goes here, too.", + "default": "data" }, "measure": { "type": "string", "default": "LN_IC50", - "description": "The name of the measure to use", - "help": "The name of the measure to use, default 'LN_IC50'. If using one of the available datasets (see 'dataset_name' option), this is restricted to one of ['LN_IC50', 'EC50', 'IC50', 'pEC50', 'AUC', 'response']. This corresponds to the names of the columns that contain theses measures in the provided input dataset. If providing a custom dataset (see 'dataset_name' option), this may differ. If the option 'curve_curator' is set (true by default), the prefix '_curvecurator' is automatically appended, e.g. 'LN_IC50_curvecurator', to allow using the refit measures instead of the ones originally published for the available datasets (see 'dataset_name' option for details), allowing for better dataset comparability (refit measures are already provided in the available datasets or computed as part of the fitting procedure when providing custom raw viability datasets, see 'curve_curator' option for details)." + "description": "The name of the drug response measure to use.", + "help": "The name of the measure to use, default 'LN_IC50'. If using one of the available datasets (see 'dataset_name' option), this is restricted to one of ['LN_IC50', 'EC50', 'IC50', 'pEC50', 'AUC', 'response']. This corresponds to the names of the columns that contain theses measures in the provided input dataset. If providing a custom dataset (see 'dataset_name' option), this may differ. If the option 'no_refitting' is not set (default), the prefix '_curvecurator' is automatically appended, e.g. 'LN_IC50_curvecurator', to allow using the refit measures instead of the ones originally published for the available datasets (see 'dataset_name' option for details), allowing for better dataset comparability (refit measures are already provided in the available datasets or computed as part of the fitting procedure when providing custom raw viability datasets, see 'no_refitting' option for details).", + "help_text": "Column of the response dataset in which the drug response is stored. ", + "enum": ["LN_IC50", "pEC50", "AUC", "response", "EC50", "IC50"] }, "cross_study_datasets": { "type": "string", "description": "Datasets for cross-study prediction.", - "help_text": "List of datasets to use to evaluate predictions across studies. Default is empty string which means no cross-study datasets are used." + "help_text": "List of datasets to use to evaluate predictions across studies. Can be a combination like 'CTRPv1,CCLE'. Default is empty string which means no cross-study datasets are used." } } }, @@ -135,27 +146,32 @@ "fa_icon": "fas fa-cogs", "description": "Additional options for the pipeline.", "properties": { - "curve_curator": { + "no_refitting": { "type": "boolean", - "description": "True by default. Use refit measures instead of original measures reported by the authors for the available datasets, or invoke automatic fitting of custom raw viability data.", - "help_text": "This allows using refit measures (see 'measure' option for details) for available datasets, which allows better comparability between datasets. When providing a custom dataset (see 'dataset_name' option), setting this to True expects a csv-formatted file at //_raw.csv (also see 'path_data' option), which is fitted automatically with the same procedure as the available datasets, to provide fair comparison. The fitted data will then be stored at //.csv." + "description": "False by default (=refitting). By default, we use measures calculated with CurveCurator instead of original measures reported by the authors for the available datasets, or invoke automatic fitting of custom raw viability data with CurveCurator. Set this flag to disable this option.", + "help_text": "By default, measures calculated by CurveCurator (by re-fitting the response curves, see 'measure' option for details) are used for available datasets, which allows better comparability between datasets. When providing a custom dataset (see 'dataset_name' option), we expect a csv-formatted file at //_raw.csv (also see 'path_data' option) containing the raw response data. We fit the curves by default with CurveCurator to provide fair comparison to our other available datasets. The fitted data will then be stored at //.csv. If you want to disable this option, set the flag.", + "default": false }, "optim_metric": { "type": "string", "description": "Optimization metric for the pipeline.", "default": "RMSE", - "help_text": "Optimization metric for the pipeline. Default is RMSE." + "help_text": "Optimization metric for the pipeline. All models will minimize (MSE, RMSE, MAE)/maximize (R^2, Pearson, Spearman, Kendall) this metric calculated on the validation set. Default is RMSE.", + "enum": ["RMSE", "MSE", "MAE", "R^2", "Pearson", "Spearman", "Kendall"] }, "n_cv_splits": { "type": "integer", "default": 10, "description": "Number of cross-validation splits.", - "help_text": "Number of cross-validation splits. Default is 5." + "help_text": "Number of cross-validation splits. Default is 10.", + "minimum": 2 }, "response_transformation": { "type": "string", "description": "Response transformation", - "help_text": "Transformation to apply to the response variable possible values: standard, minmax, robust" + "help_text": "Transformation to apply to the response variable possible values: None, standard, minmax, robust", + "default": "None", + "enum": ["None", "standard", "minmax", "robust"] }, "model_checkpoint_dir": { "type": "string", diff --git a/subworkflows/local/preprocess_custom/main.nf b/subworkflows/local/preprocess_custom/main.nf index 872f9bd..780ef57 100644 --- a/subworkflows/local/preprocess_custom/main.nf +++ b/subworkflows/local/preprocess_custom/main.nf @@ -26,10 +26,10 @@ workflow PREPROCESS_CUSTOM { ch_curves = FIT_CURVES.out.path_to_curvecurator_out.collect() POSTPROCESS_CURVECURATOR_DATA(dataset_name, ch_curves, measure) ch_measure = POSTPROCESS_CURVECURATOR_DATA.out.measure - }else if(params.curve_curator){ - ch_measure = Channel.of("${measure}" + "_curvecurator") - }else{ + }else if(params.no_refitting){ ch_measure = measure + }else{ + ch_measure = Channel.of("${measure}" + "_curvecurator") } emit: measure = ch_measure diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 5d8e0a5..a8a04c8 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -62,7 +62,7 @@ workflow DRUGRESPONSEEVAL { params.n_trials_robustness, params.dataset_name, params.cross_study_datasets, - params.curve_curator, + params.no_refitting, params.optim_metric, params.n_cv_splits, params.response_transformation, From ce8074e750b09eaa51082869584b00cd14908708 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 30 May 2025 13:08:42 +0200 Subject: [PATCH 203/257] Parameter check is now fully done with nf-core/Groovy --- bin/check_params.py | 13 --- main.nf | 23 ++++- modules/local/load_response/main.nf | 1 - modules/local/params_check/main.nf | 44 --------- .../local/preprocess_raw_viability/main.nf | 1 - nextflow_schema.json | 10 ++- subworkflows/local/preprocess_custom/main.nf | 51 +++++++---- subworkflows/local/run_cv/main.nf | 11 +-- .../main.nf | 90 ++++++++++++------- workflows/drugresponseeval.nf | 42 ++------- 10 files changed, 132 insertions(+), 154 deletions(-) delete mode 100755 bin/check_params.py delete mode 100755 modules/local/params_check/main.nf diff --git a/bin/check_params.py b/bin/check_params.py deleted file mode 100755 index 990e4e3..0000000 --- a/bin/check_params.py +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python -import sys -from drevalpy.utils import get_parser, check_arguments - - -def main(argv=None): - """Coordinate argument parsing and program execution.""" - args = get_parser().parse_args(argv) - check_arguments(args) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/main.nf b/main.nf index add7842..3d6725b 100644 --- a/main.nf +++ b/main.nf @@ -28,13 +28,21 @@ include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_drug // WORKFLOW: Run main analysis pipeline depending on type of input // workflow NFCORE_DRUGRESPONSEEVAL { + take: + models // channel: [ string(models) ] + baselines // channel: [ string(baselines) ] + work_path // channel: path to the data channel.fromPath(params.path_data) main: // // WORKFLOW: Run pipeline // - DRUGRESPONSEEVAL () + DRUGRESPONSEEVAL ( + models, + baselines, + work_path + ) } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -53,14 +61,21 @@ workflow { params.validate_params, params.monochrome_logs, args, - params.outdir//, - //params.input + params.outdir, + // pipeline-specific input + params.models, + params.baselines, + params.path_data ) // // WORKFLOW: Run main workflow // - NFCORE_DRUGRESPONSEEVAL () + NFCORE_DRUGRESPONSEEVAL ( + PIPELINE_INITIALISATION.out.models, + PIPELINE_INITIALISATION.out.baselines, + PIPELINE_INITIALISATION.out.work_path, + ) // // SUBWORKFLOW: Run completion tasks // diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index f0216f8..de56807 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -7,7 +7,6 @@ process LOAD_RESPONSE { path work_path val cross_study_datasets val measure - val useless_count output: path 'response_dataset.pkl', emit: response_dataset diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf deleted file mode 100755 index 75d7c2b..0000000 --- a/modules/local/params_check/main.nf +++ /dev/null @@ -1,44 +0,0 @@ -process PARAMS_CHECK { - label 'process_single' - - input: - val run_id - val models - val baselines - val test_mode - val randomization_mode - val randomization_type - val n_trials_robustness - val dataset_name - val cross_study_datasets - val no_refitting - val optim_metric - val n_cv_splits - val response_transformation - val path_data - val measure - - output: - val path_data - - script: - def work_path = new File("${path_data}").absolutePath - """ - check_params.py \\ - --run_id $run_id \\ - --models ${models.replace(',', ' ')} \\ - --baselines ${baselines.replace(',', ' ')} \\ - --test_mode ${test_mode.replace(',', ' ')} \\ - --randomization_mode ${randomization_mode.replace(',', ' ')} \\ - --randomization_type $randomization_type \\ - --n_trials_robustness $n_trials_robustness \\ - --dataset_name $dataset_name \\ - ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} \\ - ${no_refitting ? '--no_refitting' : '--curve_curator_cores 1'} \\ - --path_data $work_path \\ - --measure $measure \\ - --optim_metric $optim_metric \\ - --n_cv_splits $n_cv_splits \\ - --response_transformation $response_transformation \\ - """ -} diff --git a/modules/local/preprocess_raw_viability/main.nf b/modules/local/preprocess_raw_viability/main.nf index 4d1fb44..09260a7 100644 --- a/modules/local/preprocess_raw_viability/main.nf +++ b/modules/local/preprocess_raw_viability/main.nf @@ -4,7 +4,6 @@ process PREPROCESS_RAW_VIABILITY { input: val(dataset_name) path(work_path) - val useless_count output: path "${dataset_name}/*/config.toml", emit: path_to_toml diff --git a/nextflow_schema.json b/nextflow_schema.json index 939cc64..3841ddc 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -72,7 +72,8 @@ "type": "string", "description": "Run the pipeline in test mode LPO (Leave-random-Pairs-Out), LCO (Leave-Cell-line-Out), or LDO (Leave-Drug-Out).", "default": "LCO", - "help_text": "Which tests to run (LPO=Leave-random-Pairs-Out, LCO=Leave-Cell-line-Out, LTO=Leave-Tissue-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO,LCO,LTO,LDO' to run all tests. Default is LCO." + "help_text": "Which tests to run (LPO=Leave-random-Pairs-Out, LCO=Leave-Cell-line-Out, LTO=Leave-Tissue-Out, LDO=Leave-Drug-Out). Can be a list of test runs e.g. 'LPO,LCO,LTO,LDO' to run all tests. Default is LCO.", + "pattern": "^((LPO|LCO|LTO|LDO)?,?)*(? [file.parent.name, file] } - ch_curvecurator_input = PREPROCESS_RAW_VIABILITY.out.curvecurator_input + def preimplemented_datasets = ['GDSC1', 'GDSC2', 'CCLE', 'CTRPv1', 'CTRPv2', 'TOYv1', 'TOYv2'] + if(!params.no_refitting){ + File raw_file = new File("${params.path_data}/${dataset_name}/${dataset_name}_raw.csv") + // refit with CurveCurator or use measures refitted with CurveCurator + if (dataset_name in preimplemented_datasets) { + // the dataset was already fit, use the pre-fitted curves and derived measure + ch_measure = channel.of("${measure}" + "_curvecurator") + } else { + log.info "Using a custom dataset: ${dataset_name}. If you want to use a pre-fitted dataset, please use one of the following: ${preimplemented_datasets.join(', ')}." + // the dataset is not pre-fitted, we need to refit it + if(!raw_file.exists()){ + throw new Exception("Raw data file not found: ${raw_file}. You want to refit a custom dataset with CurveCurator which requires raw viability data to be located at ${raw_file} but the file does not exist. Please provide the raw data in the correct format or set `no_refitting` to true in your parameters.") + }else{ + PREPROCESS_RAW_VIABILITY(dataset_name, work_path) + ch_toml_files = PREPROCESS_RAW_VIABILITY.out.path_to_toml .flatten() .map { file -> [file.parent.name, file] } - // [dose_dir_name, config.toml, curvecurator_input.tsv] - ch_fit_curves = ch_toml_files.combine(ch_curvecurator_input, by: 0) - FIT_CURVES(dataset_name, ch_fit_curves) - ch_curves = FIT_CURVES.out.path_to_curvecurator_out.collect() - POSTPROCESS_CURVECURATOR_DATA(dataset_name, ch_curves, measure) - ch_measure = POSTPROCESS_CURVECURATOR_DATA.out.measure - }else if(params.no_refitting){ - ch_measure = measure + ch_curvecurator_input = PREPROCESS_RAW_VIABILITY.out.curvecurator_input + .flatten() + .map { file -> [file.parent.name, file] } + // [dose_dir_name, config.toml, curvecurator_input.tsv] + ch_fit_curves = ch_toml_files.combine(ch_curvecurator_input, by: 0) + FIT_CURVES(dataset_name, ch_fit_curves) + ch_curves = FIT_CURVES.out.path_to_curvecurator_out.collect() + POSTPROCESS_CURVECURATOR_DATA(dataset_name, ch_curves, measure) + ch_measure = POSTPROCESS_CURVECURATOR_DATA.out.measure + } + } }else{ - ch_measure = Channel.of("${measure}" + "_curvecurator") + log.warn "You have set `no_refitting` to true. We discourage this option for comparability to our pre-supplied datasets. If you want to use a custom dataset, please ensure it is processed in the correct format." + File processed_file = new File("${params.path_data}/${dataset_name}/${dataset_name}.csv") + if(dataset_name !in preimplemented_datasets){ + if (!processed_file.exists()){ + throw new Exception("Processed data file not found: ${processed_file}. You want to use a custom dataset but the file does not exist. Please provide the processed data in the correct format or set `no_refitting` to false in your parameters.") + } + } + ch_measure = measure } emit: measure = ch_measure diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index f0b92ca..1946d40 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -8,16 +8,15 @@ include { EVALUATE_FIND_MAX } from '../../../modules/local/evalu workflow RUN_CV { take: - test_modes // LPO,LDO,LCO - models // model names for full testing - baselines // model names for comparison + test_modes // LPO,LDO,LCO, LTO + ch_models // channel of model names for full testing + ch_baselines // channel of model names for comparison work_path // path to data measure - useless_count // how do I make it wait for check params to finish? main: - LOAD_RESPONSE(params.dataset_name, work_path, params.cross_study_datasets, measure, useless_count) + LOAD_RESPONSE(params.dataset_name, work_path, params.cross_study_datasets, measure) ch_test_modes = channel.from(test_modes) ch_data = ch_test_modes.combine(LOAD_RESPONSE.out.response_dataset) @@ -29,8 +28,6 @@ workflow RUN_CV { // [test_mode, [split_1.pkl, split_2.pkl, ..., split_n.pkl]] ch_cv_splits = CV_SPLIT.out.response_cv_splits - ch_models = channel.from(models) - ch_baselines = channel.from(baselines) ch_models_baselines = ch_models.concat(ch_baselines) ch_input_models = ch_models .collect() diff --git a/subworkflows/local/utils_nfcore_drugresponseeval_pipeline/main.nf b/subworkflows/local/utils_nfcore_drugresponseeval_pipeline/main.nf index ac67b92..96c119f 100644 --- a/subworkflows/local/utils_nfcore_drugresponseeval_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_drugresponseeval_pipeline/main.nf @@ -26,12 +26,15 @@ include { UTILS_NEXTFLOW_PIPELINE } from '../../nf-core/utils_nextflow_pipelin workflow PIPELINE_INITIALISATION { take: - version // boolean: Display version and exit - 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 - outdir // string: The output directory where the results will be saved - //input // string: Path to input samplesheet + version // boolean: Display version and exit + 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 + outdir // string: The output directory where the results will be saved + // pipeline-specific input + models // string: Comma-separated list of models to run + baselines // string: Comma-separated list of baseline models to run + path_data // string: Path to the data directory containing the input data main: @@ -64,32 +67,59 @@ workflow PIPELINE_INITIALISATION { ) // - // Create channel from input file provided through params.input + // Custom tests // - /* - Channel - .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { - meta, fastq_1, fastq_2 -> - if (!fastq_2) { - return [ meta.id, meta + [ single_end:true ], [ fastq_1 ] ] - } else { - return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2 ] ] - } - } - .groupTuple() - .map { samplesheet -> - validateInputSamplesheet(samplesheet) - } - .map { - meta, fastqs -> - return [ meta, fastqs.flatten() ] - } - .set { ch_samplesheet } - */ + + // it is possible to supply a custom model name, but write a warning + valid_model_names = [ + 'NaivePredictor', + 'NaiveDrugMeanPredictor', + 'NaiveCellLineMeanPredictor', + 'NaiveMeanEffectsPredictor', + 'NaiveTissueMeanPredictor', + 'ElasticNet', + 'RandomForest', + 'SVR', + 'SimpleNeuralNetwork', + 'MultiOmicsNeuralNetwork', + 'MultiOmicsRandomForest', + 'GradientBoosting', + 'SRMF', + 'DIPK', + 'ProteomicsRandomForest', + 'SingleDrugRandomForest', + 'MOLIR', + 'SuperFELTR', + 'SingleDrugElasticNet', + 'SingleDrugProteomicsElasticNet'] + ch_models = channel.from(models.split(',').collect { it.trim() }) + def baseline_list = baselines.split(",") + // if NaiveMeanEffectsPredictor is not in baselines, add it + if (!baseline_list.contains("NaiveMeanEffectsPredictor")) { + baseline_list = baseline_list + "NaiveMeanEffectsPredictor" + log.warn "NaiveMeanEffectsPredictor baseline model was not specified, adding it to the list of baselines." + } + ch_baselines = channel + .from(baselines) + .map { baseline -> + if(!valid_model_names.contains(baseline)){ + error("Invalid baseline model specified: ${baseline}. If you use a custom model, please specify it under --models. For baselines, please use one of the following: ${valid_model_names.join(', ')}") + } else { + baseline + } + } + + new_models = ch_models + .filter { model -> !valid_model_names.contains(model) } + new_models.view { model -> log.warn "You have specified a model not pre-implemented by us: ${model}. If it is your own model in your own fork of drevalpy and you are working in a custom environment, all good :) If not, here is the list of pre-implemented models: ${valid_model_names.join(', ')}" } + + work_path = channel.fromPath(path_data) + emit: - //samplesheet = ch_samplesheet - versions = ch_versions + models = ch_models + baselines = ch_baselines + work_path = work_path + versions = ch_versions } /* diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index a8a04c8..e3b25e0 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -7,7 +7,6 @@ include { paramsSummaryMap } from 'plugin/nf-schema' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_drugresponseeval_pipeline' -include { PARAMS_CHECK } from '../modules/local/params_check' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // @@ -24,16 +23,15 @@ include { VISUALIZATION } from '../subworkflows/local/visualization' */ def test_modes = params.test_mode.split(",") -def models = params.models.split(",") -def baselines = params.baselines.split(",") -// if NaiveMeanEffectsPredictor is not in baselines, add it -if (!baselines.contains("NaiveMeanEffectsPredictor")) { - baselines = baselines + "NaiveMeanEffectsPredictor" -} def randomizations = params.randomization_mode.split(",") workflow DRUGRESPONSEEVAL { + take: + models // channel: [ string(models) ] + baselines // channel: [ string(baselines) ] + work_path // channel: path to the data channel.fromPath(params.path_data) + main: ch_versions = Channel.empty() @@ -48,35 +46,12 @@ workflow DRUGRESPONSEEVAL { // newLine: true // ).set { ch_collated_versions } - ch_models = channel.from(models) - ch_baselines = channel.from(baselines) - ch_models_baselines = ch_models.concat(ch_baselines) - - PARAMS_CHECK ( - params.run_id, - params.models, - params.baselines, - params.test_mode, - params.randomization_mode, - params.randomization_type, - params.n_trials_robustness, - params.dataset_name, - params.cross_study_datasets, - params.no_refitting, - params.optim_metric, - params.n_cv_splits, - params.response_transformation, - params.path_data, - params.measure - ) - - work_path = channel.fromPath(params.path_data) + ch_models_baselines = models.concat(baselines) PREPROCESS_CUSTOM ( work_path, params.dataset_name, - params.measure, - PARAMS_CHECK.out.count() + params.measure ) RUN_CV ( @@ -84,8 +59,7 @@ workflow DRUGRESPONSEEVAL { models, baselines, work_path, - PREPROCESS_CUSTOM.out.measure, - PARAMS_CHECK.out.count() + PREPROCESS_CUSTOM.out.measure ) MODEL_TESTING ( From d8695a4701ba2a4f4c575aece3bb292c66317502 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 2 Jun 2025 15:56:49 +0200 Subject: [PATCH 204/257] I think I managed to do the load_response more Nextflow-y now * if the file is not in path_data, I get it from nextflow and unzip it (extra module for that). If it is in the folder, I use the cached data * added zenodo link - needs to be updated for newer datasets --- bin/load_response.py | 51 ++++++++++++++++-------- conf/modules.config | 16 ++++++++ modules/local/load_response/main.nf | 19 +++++---- modules/local/unzip/main.nf | 16 ++++++++ nextflow.config | 1 + nextflow_schema.json | 7 ++++ subworkflows/local/run_cv/main.nf | 60 +++++++++++++++++++++++++++-- 7 files changed, 140 insertions(+), 30 deletions(-) create mode 100644 modules/local/unzip/main.nf diff --git a/bin/load_response.py b/bin/load_response.py index a411d11..606e531 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -1,19 +1,28 @@ #!/usr/bin/env python import argparse import pickle -from drevalpy.datasets.loader import load_dataset +import pathlib +import pandas as pd +from drevalpy.datasets.loader import AVAILABLE_DATASETS +from drevalpy.datasets.dataset import DrugResponseDataset +from drevalpy.datasets.utils import CELL_LINE_IDENTIFIER, DRUG_IDENTIFIER, TISSUE_IDENTIFIER def get_parser(): parser = argparse.ArgumentParser(description="Load data for drug response prediction.") - parser.add_argument("--dataset_name", type=str, required=True, help="Name of the dataset to load.") - parser.add_argument("--path_data", type=str, default="data", help="Path to the data directory.") + parser.add_argument("--response_dataset", type=str, default="data", help="Path to the drug response file.") parser.add_argument( - "--cross_study_datasets", - nargs="+", - default=[], - help="List of datasets to use to evaluate predictions across studies. " - "Default is empty list which means no cross-study datasets are used.", + "--cross_study_dataset", + action="store_true", + default=False, + help="Whether to load cross-study datasets.", + + ) + parser.add_argument( + "--no_refitting", + action="store_true", + default=False, + help="If the CurveCurated measures should not be used.", ) parser.add_argument( "--measure", @@ -25,18 +34,26 @@ def get_parser(): def main(args): - response_data = load_dataset(dataset_name=args.dataset_name, path_data=args.path_data, measure=args.measure) - cross_study_datasets = [load_dataset(dataset_name=ds, path_data=args.path_data, measure=args.measure) for ds in args.cross_study_datasets] - + dataset_name = pathlib.Path(args.response_dataset).stem + input_file = pathlib.Path(f"{dataset_name}.csv") + if dataset_name in AVAILABLE_DATASETS: + response_file = pd.read_csv(input_file, dtype={"pubchem_id": str}) + response_data = DrugResponseDataset( + response=response_file[args.measure].values, + cell_line_ids=response_file[CELL_LINE_IDENTIFIER].values, + drug_ids=response_file[DRUG_IDENTIFIER].values, + tissues=response_file[TISSUE_IDENTIFIER].values, + dataset_name=dataset_name, + ) + else: + response_data = DrugResponseDataset.from_csv( + input_file=input_file, measure=args.measure, tissue_column=TISSUE_IDENTIFIER + ) + outfile = f"cross_study_{dataset_name}.pkl" if args.cross_study_dataset else "response_dataset.pkl" # Pickle the object to a file - with open("response_dataset.pkl", "wb") as f: + with open(outfile, "wb") as f: pickle.dump(response_data, f) - for cs_dataset in cross_study_datasets: - ds_name = cs_dataset.dataset_name - with open(f"cross_study_{ds_name}.pkl", "wb") as f: - pickle.dump(cs_dataset, f) - if __name__ == "__main__": arg_parser = get_parser() diff --git a/conf/modules.config b/conf/modules.config index ce40008..baf45e0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -18,6 +18,22 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] + withName: 'UNZIP_RESPONSE' { + publishDir = [ + path: { params.path_data }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: 'UNZIP_CS_RESPONSE' { + publishDir = [ + path: { params.path_data }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: 'LOAD_RESPONSE' { publishDir = [ path: params.path_data, diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index de56807..6b67426 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -1,24 +1,23 @@ process LOAD_RESPONSE { - tag "${dataset_name} (cross: ${cross_study_datasets})" + tag "${response.baseName}" label 'process_single' input: - val dataset_name - path work_path - val cross_study_datasets - val measure + tuple val(measure), path(response) + val no_refitting + val cross_study_dataset output: - path 'response_dataset.pkl', emit: response_dataset + path 'response_dataset.pkl', emit: response_dataset, optional: true path 'cross_study_*.pkl', emit: cross_study_datasets, optional: true script: """ load_response.py \\ - --dataset_name ${dataset_name} \\ - --path_data ${work_path} \\ - ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} \\ - --measure ${measure} + --response_dataset ${response} \\ + --measure ${measure} \\ + ${no_refitting ? '--no_refitting' : ''} \\ + ${cross_study_dataset ? '--cross_study_dataset' : ''} """ } diff --git a/modules/local/unzip/main.nf b/modules/local/unzip/main.nf new file mode 100644 index 0000000..38d82d8 --- /dev/null +++ b/modules/local/unzip/main.nf @@ -0,0 +1,16 @@ +process UNZIP { + tag "${dataset_name}" + label 'process_single' + + input: + tuple val(dataset_name), path(file) + + output: + tuple val(dataset_name), path("${file.baseName}/"), emit: unzipped_archive + + script: + """ + unzip ${file} + """ + +} diff --git a/nextflow.config b/nextflow.config index 3c8ed1a..790d9ea 100644 --- a/nextflow.config +++ b/nextflow.config @@ -28,6 +28,7 @@ params { path_data = 'data' model_checkpoint_dir = 'TEMPORARY' measure = 'LN_IC50' + zenodo_link = 'https://zenodo.org/records/15533857/files/' // Boilerplate options outdir = 'results' diff --git a/nextflow_schema.json b/nextflow_schema.json index 3841ddc..a133704 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -141,6 +141,13 @@ "help_text": "List of datasets to use to evaluate predictions across studies. Can be a combination like 'CTRPv1,CCLE'. Default is empty string which means no cross-study datasets are used.", "default": "", "pattern": "^(?:|(?:GDSC[12]|CCLE|CTRPv[12]|TOYv[12])(,(?:GDSC[12]|CCLE|CTRPv[12]|TOYv[12]))*)$" + }, + "zenodo_link": { + "type": "string", + "description": "Link to the latest Zenodo version of the dataset.", + "default": "https://zenodo.org/records/15533857/files/", + "help_text": "Link to the Zenodo dataset from where pre-supplied datasets like CTRPv2 are downloaded.", + "pattern": "^https://zenodo.org/records/[0-9]+/files/$" } } }, diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 1946d40..6b2782f 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -1,4 +1,7 @@ -include { LOAD_RESPONSE } from '../../../modules/local/load_response' +include { UNZIP as UNZIP_RESPONSE } from '../../../modules/local/unzip' +include { UNZIP as UNZIP_CS_RESPONSE } from '../../../modules/local/unzip' +include { LOAD_RESPONSE as LOAD_RESPONSE } from '../../../modules/local/load_response' +include { LOAD_RESPONSE as LOAD_CS_RESPONSE } from '../../../modules/local/load_response' include { MAKE_MODEL_CHANNEL as MAKE_MODELS } from '../../../modules/local/make_model_channel' include { MAKE_MODEL_CHANNEL as MAKE_BASELINES } from '../../../modules/local/make_model_channel' include { CV_SPLIT } from '../../../modules/local/cv_split' @@ -16,7 +19,58 @@ workflow RUN_CV { main: - LOAD_RESPONSE(params.dataset_name, work_path, params.cross_study_datasets, measure) + File response_path = new File("${params.path_data}/${params.dataset_name}/${params.dataset_name}.csv") + if (!response_path.exists()) { + log.info "Downloading response dataset ${params.dataset_name} from Zenodo: ${params.zenodo_link}${params.dataset_name}.zip" + ch_unzip = channel + .fromPath("${params.zenodo_link}${params.dataset_name}.zip") + .map { file -> [params.dataset_name, file] } + UNZIP_RESPONSE(ch_unzip) + ch_response = UNZIP_RESPONSE.out.unzipped_archive + .map { dataset_name, path_to_dir -> + file("${path_to_dir}/${dataset_name}.csv", checkIfExists: true) + } + }else{ + log.info "Using existing response dataset ${params.dataset_name} from ${response_path}" + ch_response = channel.fromPath(response_path, checkIfExists: true) + } + + if (params.cross_study_datasets != '') { + def cross_study_datasets = params.cross_study_datasets.split(',') + log.info "Using cross-study datasets: ${cross_study_datasets.join(', ')}" + // iterate over cross-study datasets and load them + ch_all_cs = channel + .of(cross_study_datasets) + .map { dataset_name -> [dataset_name, file("${params.path_data}/${dataset_name}/${dataset_name}.csv")]} + ch_cs_cached = ch_all_cs + .filter { dataset_name, dataset_path -> + dataset_path.exists() + } + .map { dataset_name, dataset_path -> + file("${dataset_path}", checkIfExists: true) + } + + ch_cs_to_be_loaded = ch_all_cs + .filter { dataset_name, dataset_path -> + !dataset_path.exists() + } + .map { dataset_name, dataset_path -> + [dataset_name, "${params.zenodo_link}${dataset_path.baseName}.zip"] + } + UNZIP_CS_RESPONSE(ch_cs_to_be_loaded) + ch_cs_loaded = UNZIP_CS_RESPONSE.out.unzipped_archive + .map { dataset_name, path_to_dir -> + file("${path_to_dir}/${dataset_name}.csv", checkIfExists: true) + } + ch_cross_study_datasets = ch_cs_cached.concat(ch_cs_loaded) + } else { + ch_cross_study_datasets = channel.empty() + } + ch_response = measure.combine(ch_response) + ch_cross_study_datasets = measure.combine(ch_cross_study_datasets) + LOAD_RESPONSE(ch_response, params.no_refitting, false) + LOAD_CS_RESPONSE(ch_cross_study_datasets, params.no_refitting, true) + ch_test_modes = channel.from(test_modes) ch_data = ch_test_modes.combine(LOAD_RESPONSE.out.response_dataset) @@ -93,6 +147,6 @@ workflow RUN_CV { emit: best_hpam_per_split = ch_best_hpams_per_split - cross_study_datasets = LOAD_RESPONSE.out.cross_study_datasets + cross_study_datasets = LOAD_CS_RESPONSE.out.cross_study_datasets.collect() ch_models = MAKE_MODELS.out.all_models.splitCsv(strip: true) } From a62850660200b8ec5e6ad42b6cbb0c2081afd46a Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 2 Jun 2025 16:16:28 +0200 Subject: [PATCH 205/257] have to add containers --- modules.json | 20 +------------------- modules/local/unzip/environment.yml | 5 +++++ modules/local/unzip/main.nf | 5 +++++ 3 files changed, 11 insertions(+), 19 deletions(-) create mode 100644 modules/local/unzip/environment.yml diff --git a/modules.json b/modules.json index 759c498..423fa34 100644 --- a/modules.json +++ b/modules.json @@ -3,25 +3,7 @@ "homePage": "https://github.com/nf-core/drugresponseeval", "repos": { "https://github.com/nf-core/modules.git": { - "modules": { - "nf-core": { - "custom/dumpsoftwareversions": { - "branch": "master", - "git_sha": "76cc4938c1f6ea5c7d83fed1eeffc146787f9543", - "installed_by": ["modules"] - }, - "fastqc": { - "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] - }, - "multiqc": { - "branch": "master", - "git_sha": "f2d63bd5b68925f98f572eed70993d205cc694b7", - "installed_by": ["modules"] - } - } - }, + "modules": {}, "subworkflows": { "nf-core": { "utils_nextflow_pipeline": { diff --git a/modules/local/unzip/environment.yml b/modules/local/unzip/environment.yml new file mode 100644 index 0000000..070d526 --- /dev/null +++ b/modules/local/unzip/environment.yml @@ -0,0 +1,5 @@ +channels: + - conda-forge + - bioconda +dependencies: + - conda-forge::unzip=6.0 diff --git a/modules/local/unzip/main.nf b/modules/local/unzip/main.nf index 38d82d8..957b79c 100644 --- a/modules/local/unzip/main.nf +++ b/modules/local/unzip/main.nf @@ -2,6 +2,11 @@ process UNZIP { tag "${dataset_name}" label 'process_single' + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + "oras://community.wave.seqera.io/library/unzip:6.0--2d90c8369f967b58" : + "community.wave.seqera.io/library/unzip:6.0--0e729f0c20458893" + input: tuple val(dataset_name), path(file) From 220953d0c3d7871dd075e697e09aa2b1dbba4801 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 2 Jun 2025 16:21:07 +0200 Subject: [PATCH 206/257] forgot "" --- modules/local/unzip/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/unzip/main.nf b/modules/local/unzip/main.nf index 957b79c..6da0bfe 100644 --- a/modules/local/unzip/main.nf +++ b/modules/local/unzip/main.nf @@ -4,8 +4,8 @@ process UNZIP { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - "oras://community.wave.seqera.io/library/unzip:6.0--2d90c8369f967b58" : - "community.wave.seqera.io/library/unzip:6.0--0e729f0c20458893" + 'oras://community.wave.seqera.io/library/unzip:6.0--2d90c8369f967b58' : + 'community.wave.seqera.io/library/unzip:6.0--0e729f0c20458893' }" input: tuple val(dataset_name), path(file) From 4629517da78bad4cae5c04060cf364d62febfc7e Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 2 Jun 2025 17:01:54 +0200 Subject: [PATCH 207/257] updated documentation --- docs/output.md | 39 +++++++-------------------------------- 1 file changed, 7 insertions(+), 32 deletions(-) diff --git a/docs/output.md b/docs/output.md index 6c8b285..179d3ab 100644 --- a/docs/output.md +++ b/docs/output.md @@ -11,13 +11,11 @@ All paths are relative to the top-level results directory. The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -1. [Parameter check](#parameter-check): Several parameters are validated to ensure that the pipeline can run - successfully. -2. `PREPROCESS_CUSTOM` subworkflow: This subworkflow is only triggered if there is a custom dataset and if in the corresponding folder, there is a file named `[dataset_name]_raw.csv`. If this is the case, CurveCurator is run on the raw data. +1. `PREPROCESS_CUSTOM` subworkflow: This subworkflow is only triggered if there is a custom dataset and if in the corresponding folder, there is a file named `[dataset_name]_raw.csv`. If this is the case, CurveCurator is run on the raw data. - [Preprocess raw viability](#preprocess-raw-viability): The raw viability data is put in a format suitable for CurveCurator. - [Fit curves](#fit-curves): Curves are fitted using CurveCurator. - [Postprocess CurveCurator data](#postprocess-curvecurator-data): The individual curves.tsv files are collected and one output file is written. -3. `RUN_CV` subworkflow: Finds the optimal hyperparameters for each model in a cross-validation setting. +2. `RUN_CV` subworkflow: Finds the optimal hyperparameters for each model in a cross-validation setting. - [Load response](#load-response): The response data is loaded. - [CV split](#cv-split): The response data is split into cross-validation folds. - [Make model channel](#make-model-channel): From the input baseline and model names, channels are created. This @@ -27,7 +25,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Train and predict CV](#train-and-predict-cv): All models are trained and evaluated in a cross-validation setting. - [Evaluate and find max](#evaluate-and-find-max): For each CV split, the best hyperparameters are determined using a grid search per model -4. `MODEL_TESTING` subworkflow: The best hyperparameters are used to train the models on the full training set +3. `MODEL_TESTING` subworkflow: The best hyperparameters are used to train the models on the full training set and predict the test set. Optionally, randomization and robustness testes are performed. - [Predict full](#predict-full): The model is trained on the full training set (train & validation) with the best hyperparameters to predict the test set. @@ -41,31 +39,8 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [Evaluate final](#evaluate-final): The performance of the models is calculated on the test set results. - [Collect results](#collect-results): The results of the evaluation metrics per model are collected into four overview tables. -5. `VISUALIZATION` subworkflow: Plots are created summarizing the results. -6. [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution - -### Parameter check - -The process `PARAMS_CHECK` performs the following checks: - -- `--models` / `--baselines`: Check if the model and baseline names are valid (for valid names, see the [usage](usage.md) page). -- `--test_mode`: Check whether the test mode is LPO, LCO, LDO or a combination of these. -- `--path_data`: Check if the path to the data is valid. -- `--dataset_name`: Check if the dataset name is valid, i.e., GDSC1, GDSC2, or CCLE. -- `--cross_study_datasets`: If supplied, check if the datasets are valid, i.e., GDSC1, GDSC2, or CCLE or a - combination of these. -- `--n_cv_splits`: Check if the number of cross-validation splits is a positive integer > 1. -- `--randomization_mode`: If supplied, checks if the randomization is SVCC, SVCD, SVRC, SVRD, or a combination of these. -- `--randomization_type`: If supplied, checks if the randomization type is valid, i.e., permutation or invariant. -- `--n_trials_robustness`: Checks if the number of trials for robustness tests is >= 0. -- `--optim_metric`: Checks if the optimization metric is either MSE, RMSE, MAE, R^2, Pearson, Spearman, Kendall, or - Partial_Correlation. -- `--response_transformation`: If supplied, checks whether the response transformation is either standard, - minmax, or robust. -- `--measure`: Which measure of drug response should be used for the file. Available options are "LN_IC50", "EC50", "IC50", "pEC50", "AUC", "response". Default: "LN_IC50". -- `--no_refitting`: If CurveCurator should not be run on a custom dataset. Default: false (CurveCurator is run). Running CurveCurator on your custom data requires raw viability data to be located at "//\_raw.csv". - -It emits the path to the data but mostly so that the other processes wait for `PARAMS_CHECK` to finish before starting. +4. `VISUALIZATION` subworkflow: Plots are created summarizing the results. +5. [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### Subworkflow `PREPROCESS_CUSTOM` @@ -109,8 +84,8 @@ This file contains the new adjusted measures; available are pEC50 and AUC (now i #### Load response -The response data is loaded into the pipeline. If the data does not lie in `--path_data` it is downloaded and exported to -`--path_data`. +The response data is loaded into the pipeline. If the data does not lie in `--path_data` it is downloaded from Zenodo +(`--zenodo_link`) and exported to `--path_data`. If it is downloaded, it is additionally unzipped by the UNZIP module. This step is necessary to provide the pipeline with the response data that will be used to train and evaluate the models.
        From 98b1acbd6ff62c314c6786321e5c30926d7e142b Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 3 Jun 2025 09:23:49 +0200 Subject: [PATCH 208/257] does it at least work like this? --- modules/local/unzip/main.nf | 2 +- subworkflows/local/run_cv/main.nf | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/local/unzip/main.nf b/modules/local/unzip/main.nf index 6da0bfe..b046430 100644 --- a/modules/local/unzip/main.nf +++ b/modules/local/unzip/main.nf @@ -11,7 +11,7 @@ process UNZIP { tuple val(dataset_name), path(file) output: - tuple val(dataset_name), path("${file.baseName}/"), emit: unzipped_archive + tuple val(dataset_name), path("${file.baseName}/"), path("${file.baseName}/${file.baseName}.csv"), emit: unzipped_archive script: """ diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 6b2782f..374c4b8 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -27,8 +27,8 @@ workflow RUN_CV { .map { file -> [params.dataset_name, file] } UNZIP_RESPONSE(ch_unzip) ch_response = UNZIP_RESPONSE.out.unzipped_archive - .map { dataset_name, path_to_dir -> - file("${path_to_dir}/${dataset_name}.csv", checkIfExists: true) + .map { dataset_name, path_to_dir, response_file -> + file(response_file, checkIfExists: true) } }else{ log.info "Using existing response dataset ${params.dataset_name} from ${response_path}" @@ -59,8 +59,8 @@ workflow RUN_CV { } UNZIP_CS_RESPONSE(ch_cs_to_be_loaded) ch_cs_loaded = UNZIP_CS_RESPONSE.out.unzipped_archive - .map { dataset_name, path_to_dir -> - file("${path_to_dir}/${dataset_name}.csv", checkIfExists: true) + .map { dataset_name, path_to_dir, response_file -> + file(response_file, checkIfExists: true) } ch_cross_study_datasets = ch_cs_cached.concat(ch_cs_loaded) } else { From e26b32456232cb211289359a70861158307c6355 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 3 Jun 2025 10:00:04 +0200 Subject: [PATCH 209/257] probably because it was not a path --- modules/local/collect_results/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/collect_results/main.nf b/modules/local/collect_results/main.nf index 816ad67..f297063 100644 --- a/modules/local/collect_results/main.nf +++ b/modules/local/collect_results/main.nf @@ -4,7 +4,7 @@ process COLLECT_RESULTS { input: path(outfiles) - val(path_data) + path(path_data) output: path('evaluation_results.csv'), emit: evaluation_results From 34b5b1a8a7b9e49d59920ecf92a7d9c7c09b4d3c Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 3 Jun 2025 11:04:31 +0200 Subject: [PATCH 210/257] NO_FILE has to exist for AWS. Also added icon and made main the default branch. --- assets/NO_FILE | 0 bin/visualize_results.py | 4 ++-- docs/images/drugresponseeval_icon.png | Bin 0 -> 61280 bytes nextflow.config | 3 ++- subworkflows/local/visualization/main.nf | 4 ++-- 5 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 assets/NO_FILE create mode 100644 docs/images/drugresponseeval_icon.png diff --git a/assets/NO_FILE b/assets/NO_FILE new file mode 100644 index 0000000..e69de29 diff --git a/bin/visualize_results.py b/bin/visualize_results.py index 837b088..f99ed1c 100755 --- a/bin/visualize_results.py +++ b/bin/visualize_results.py @@ -26,11 +26,11 @@ def get_parser(): test_modes = args.test_modes ev_res = pd.read_csv(args.eval_results, index_col=0) - if args.eval_results_per_drug == "NONE_drug.csv": + if args.eval_results_per_drug == "NO_FILE": ev_res_per_drug = None else: ev_res_per_drug = pd.read_csv(args.eval_results_per_drug, index_col=0) - if args.eval_results_per_cl == "NONE_cl.csv": + if args.eval_results_per_cl == "NO_FILE": ev_res_per_cl = None else: ev_res_per_cl = pd.read_csv(args.eval_results_per_cl, index_col=0) diff --git a/docs/images/drugresponseeval_icon.png b/docs/images/drugresponseeval_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5f832e9b1c546024a63b9fbda626c530b046d6cf GIT binary patch literal 61280 zcmeEt_dna+`+wTrt-Awv7h0>ssMaWo+HFy__ZDi`h*4riLI>Jv&7xLfZ&6~0sJ*EX zv15+}F+vF88}C2j`_sqc;TMnNysmSd>s;r$p3mp`s;jNac;)UD006+K_C{GB0Jz|A z_WSQ8`d^NH^$Y-j5P+KUOGAIF^=StGTT2rmb0I!%Uu;{1+s;4W<+=ASi{RKrh^n5R zA&C$hfSJ{|;S@Egrh4H}XhJfAybNk}1&`-pc|Z7dwvz1bO)Ig1phu>zm%z zIPZW+^koZ2X*|Tyw|#(_{>lIQ`9BZ*|MP&S;RA593L%W2=h?qek?zmzHzwNWwzswF zMRDH4aJ!oEsTaZhRBsb&rZb!JVbpuMj5fL0q5-x_n--OaQf@W(1>J#-Hf3cVVQuY^ z|Ne+zU&>*`!SU=iL_6*)U#%zIO@od@Cy1VPC+1Jn&z();o5^ffQ1C;OI9hq_#}BC3 zGf78ZQ%kpRqc4TF%b3F2+ss?$?VPSn{zv(x#;(2B@a~$^*~be%xel1FB7&{B?sCgM zdnW9Nmi&24bkyDMv$flIZ82;9T~l+P`bXxe0tQ1pf1dsye=ZMFB12m{5Vu*_kD?`g zig97lH(GRG<-~t(?`UJT=7xCq`;gbxB`(khd+L+p%vK?==6PF%p~t@BpQDfVuUT+Y zto|lT2$3_4p};faXMa&s`tm~E$KNmgJ~&vj!5pTQ#c4tMY;#xf5_V6|Cejs{o0|jg zk)lG|kP&jvEZHtG$zaGz@(*V$t2cv~9R4}`SWv~B%`Zvi&u#56U;lhv2F5~5-V85M zZWtSPZ~|5TY@U#p2kk$cTrZeKOKKi3IQ~h$Nkl}~fJ@g{(~Ye?=mP+c#Lu?tK5=xK zn}s!w^&dL}Fxco4>z7#bdqGs5$q%`;OF>Abs~ zVB_WGU73-t%z0z=r^$`Gtm5Kss+!(=Kh8p9_8i%u$YhyJun`sQQ(CZ74fD!vn;2>O zJvNs9a&R!Oh=hw-g^WJl#asaBE(M0_c-;E$u2-#9Vuqglg^v#cYsFL)7CpWNRs{jI zmSGOnu3*We$yG(x=dHzvNH&06Easkd+Nzvgr3896`R6*Eu(A1>pC^@zg;o5Xpn`i; zN>hkSm3&57u)BB|AoQg39?B~-)QgOG_>kb1KRzLq-?I!*t+xt;s}O&yPI;- z6hm3PV0n7thzVg#AN|WZn<6!tj8yX?TRLZ;Ms?qg{W^F$hha+xs%SVH+;rsKrHH$3Abr)TVJ;cVF_n zvUYV7QDGybq9Fdl+}r$wb$paGe-PK5`U&}V!8K2 zuu^P%KUVVdQsLwWw8dtY#S6?Q#)gHmWj^N)0H0) z^6A1S1*28g?3t>JR@IxDd$bW|pru{q0JbU|>R$CpX>Iabo8(H=VzE2RbzyBr0A{|< z)B6*WZ+D}bIYsm&^18TRLCd$&QE?xn&|iCaHi>ur7AE^EweDPq?Dlr}{`XoYgNm_l z*CO0=B&helvsh^Q`09l=JUPq#XIVa9Xopg3c3`mKZoNt!puXG5rucg!y)PUs?^BjlLh+boa!;$C^UWRx!5?Z z^Z>TU{4K}~AD54T1JZ-JR|lR!C|D}I%>GC;yzGh@NWitYACuGQ`nzq&)6{YbXj3LC z?ap$%c)6{^A+)WP%*MuT-AIN4L6wTx4S1%OqhRtkW3%#=;<9C5QTh${hz0}zm~%)Q z+su(c%bR|V$Tj0Or&}Ah z=yw^wU8?n>l7@BGuh+Q)`9U^~*x!HonV&fBeyORE%;7&VwW|!yVVs3rBb|CxbW5a; zFBeyhofl*|TRQVY@bRbKYBHy^-JsU}>!*bmE~QycgzS5~eKTT9)BKqVwLIFFDMrSS;OUB1kET>cPs z_}EqZyJQf_1b?bd&(BV16W*0x%f$8dR=7AIe@Q0vmq-JswO9wjoRU_`bi+^{%$(#( za`|?5cxmH{#t7v?2<7jzu1%){lX zKGD-W_vx>n+tK@6PDP}n%f|2DO`--YQ9WEW-{qYEy6AuYQJEg~TO`My%gw(5ewS`w z@WRtjP0C>L{pmgLaf%YaALGEH(PE@lg>;SecI1?q`t1@{HUz6)Tu;J)S6D#TPZLu@ z08(wKYO;Z!`=G@AIaE3J z+y|GclvfXYeI-;BN)dDVP&~l@5_I4f%my!Ed{iCY$ZVL?@(W&Nnn?1^?#$mK*0Lle z?rR@YV=v0;J2tk zJWuoWx8JU;ZH<0JVJX*NY-A&}yefG`-p2DfdF=aQwIGV%3&@LwB*_GEKaZ~u0T|%Q1jTU*;uv~)1Xz(MaQ;X zVr~pZQ!i=%O-itUo=+w%4A7@H${+q)yD}sFzFlgf`6Q%njDMgoMIiH!;`8oSm4Xiw z3xDCF7JnY&o-WrV7*;ab1vc_HbhQdiI{Zp$lMQg9LgWL8Oox53pfRq(`%re@;-N5< zQP+4HTR&iyXBB^EnAyO7;1?x_(W&-?Z-_mi$P@t=XWT5wqG0ku2mvK7RbA4iw*`!CNVm5zwo;oC4lgdd%UWR+58H20`RXj@ z+j6PpRa(#!+M=+=&EcYrR_;J*Rk6qLr1uUpVX~&p_-R{gb!iS&8UXk?jD1$>fY%!i z)?+0u%3e&)-1lSr#*xQeRp`zQD1`Hhm*%ut9XOX~>5>Ka&yT|!EJpLB9ZIn7ri*Yl z#m(O6C@FVI!M|NnNA|;xW@X~Tztd9PTn*OC6{ZUq?a-AV>ffpoquBLFY?!S4{Mxf` z9&pMSZb!zTUgK|xQLMo++88rG1LZoHs3+LsoNlGQA4y@-_6bL(kSTKllVf-o>eYCL z&^sxI#jd)ag?IXm=}};kI`*kM$K$HCM?u}q;9?E0nyPVSi%^^1c&wiPAA(?zn8oKf z&2u5$_*;Xu17DJo2$`v?o(8p;JG#*Mg#{x2_*E`#UzQUC*f|TyRA=Yvo~q)YuZmwA zoEpu_?Wv<_$T+$DtKK^sVXl*{y`OmwY5y>YLsP!vmwx^OV#ih+f!T$7tPT>fdOmSq zMvN300JA9MRVk@eS(o<24^1(=?kw}l4r{E4eP%Jme0L>4VOX2ll!isIBRfkOAtYDG zzh@tw!*%MJix_+O?Iz@}-ca?AfXS%SR&Lh{TYb)Q>0z3csGk|f#ZhGl3<5r403h0C zL}fBQX6Ei)kwPHdbpYDh<*0On@~n3ybzkK5b07m`5*(yC5dZ7e(RCfBOvIR7Q>0;l zpFID5dKLv<^+QlwGtQ`MlfI7shM9Fns-s|OzDOjDdT5GF;Fihu+7 z)>a)9pR|1$(y^*cd?h!O8-#eqG(xjoOd*I#ywcd%D?>MUs=XLx7?b8)p+IdRL#m5F^aJ*?OWdX?!- zQX%X!0~B)50`r+@Rc(BxaQWBADa30(a`Q7_Fn!hOet@CXH|W6Ogs!AHu+_L~NdDbr zDp$pK%db_A-nPtzhG#dNb6-L1OU*S#SJ;W!|K?j5{XI@0UrA}u0b1Tn)1>c*;zcG= zM3%b;;4y#G-1F)AM{Lnz-2T2#fXwgo*-J_9hQNw3i-Az zl^|Pk*q)e;>&IRl?f74sXddI~d&}xaKuGL{3UhXDuB3i-FkmaNp*f4V$0-fc4-pvp zoz7SItu9nK7tEO4!&?0z?%spF;>c!n)QUZKdi(pFVxD7n^;ecd`(2hh zO(DyuA77#pPlu~Mn0-|%w>8Oi>+J_KZd0rD<6BJ4_CEp(YD0n2yAJ?}EK<{|?0YI7 z__~%M_Uyo3{3nImsQM+KV<6dLOvR$Uot*_`WV$x@A9hSaHsE^nhj=B2?@zwp0ZzWU%?0;wEsp%CSlpjEO7LX{ zSe0mWP7&R?Ma6Z1ayN~f&Nbux5w%K`BCb@YsYt zs7c|WS6)zEKtw$XZm9iuyx(iuB$d!xpYXr06wwbV zEikNqyj1wtS8bJZO)(L&p(4(i?umd%cl2;TMw{{02QN_w;jv;i@0c%|$@%D^{N!F* zh1zA=#VoCqu@vK;yDY5ybL^u%;p|eiGg$!%hB!!Wqu*r-na={!5n=9XPu}IaQvkE^ zo179*xAd+WT|Sxki^&gcWf;>S$U5lx=jDBp7Q?qx2Lbey9j5XARt?6fLP>FPFo9n* ziRln*lHjU)#CKm$VZ7e#b-C)sPYE#vD}_<3U4hA)K>nozAt4Q06bG_JPowc>F0&2c z$aL5&^^n5%<(Y0Z1h6Gc@4`up2uW2S$4#u^wC43udQ)Ojkn$Knp(7sV>ldN1oEI+= zK2}K@)k*b9)^YgkTcBXY9NgqlEtrmnPTuVsjo+yT353GLMIcfNAZtyfa7y|suh|PVBn~Vr* zO5G#A!nN~S*K1F5zw{F%ul|w8bt$BV5~l@ST%kEm0VB+b!wi>bM;b&_8uI0QVuhyJ zJ1ub9o|o;bkHpV6scVOO24%!>{Nd1CG}Rl6K%GqOwJ_~95nVxFXp*98%NF`eiNGY} zITJ;L+>^V6(wviIE}18`8n!ob1tOH%#Ku%ZHSy3Wf-*Ar=Wa!U)s-Is&`VIU7j)zZ%^hT5UFva zxWChjv6%WdhvY1%=+8N^yL27W7%3akuvMhIG7~Yf!3n7Uc#@VTtJ?p@gtbYzvIJl- zVs$$Eg^M70Ej@E_ex7CGyl+KSw2&Ta)y!B-m?SOPh5DzQmw%wLG9o|8*0Q?D)b1Xc)w?628P284l^`P;czKNV8D*k%#}0M~JLk zYdrg+`Y@$6K9~8m!xBfd&;E7IgnACmezDv>|LZ3Y%1W1GY?0Y<5%d z(zdUw>NL6*mvU7tbbex;48SXSQ%@mr-gqiXaxwZOIs#pI3l-Lj!Di&*k#uxfGwcTzMw`J`G3Bd2K}z<_~m4{@h9$;vEb6P}g?> zBWRv&rLPUMF3Ng}?|YC~ShKO_n_5BT7SI(!C}WjJd9H<=OCth!&kI|=kFtDS*KboVs#eE1r_ z@>r6=YN?RR0#-%X2z1$55;s$(>d~mhwK=UZBbsEt+$+7avHov>-Jg(hdT+9F(+@9% za_sYB^dgY%Q_MJ2g0r7TOnAmJ1Gq>TTLQya6~P$F?K=gh-2c(<=!3@*4YQ9yda?$< zMSX0gxU7z2Z>mrf9-LRd--{}LyB$?No_v2&oC8TdJ(+(P)!9P#A@l2~gxgPWb(h4h z;-3_0BJyPRJ)ivp7}($XB|u_hEmfXL3f3KYv?mTYDD2J5TxL;ynSWLe_Pt6hOt&_s z33xOd#Mb{UMFdf357c_!8`nU?_wfri1#h5u^{TS%)%CUEbAEqgP|vSW_$RMesr$$b z=vI3Gw%909@cnlo0)@)Jni~OLyysr(Mdc$d{$X8XozN;L!5)q4>E;Xjt}RZ+%tebR z98FcSuAeGU$11}$8<^89Ss*X1V(t6}R^Jumx#Iz|*WDS@rgNNDr!Kg&lqg#P(*+15 z{)N86$!bkvaz6j z^f!9D5_LMD4=8w_xbLSya!v-taP`=&RO)@ps%fnHBjk%(&AI7D^DX+$<`R2U2aa<#aC*OLD`5|2S>~1XqeMnUm6p2W z0J=r;V)gv_6viC6!Pq@p!`*M6d!oeNT_c{6Pf(W|ysZ88QAYVgkx_AD&%{6s$u zk0f!NTTPm_0_c%NVzR|Z0x|B~)+6R0NyjmD_jn)RC_Ohe@75P*P?OFDg`PBsfnwMT zgag-Fk3d+NJIBYnJ7b(so*_BBr>xP-{f}y2*R(M@m;QLmJ#{2_f8blN{rN>b;`jw^ z3V^Y7(i^O0QEhsPG%*GX9Z8#8!HzEn93)tY@qd(e!2bQf18M59L|hB$sIgllb4i8v z%fGYyd_&JHxAT+vIl>CV*2T*Y7-Kik+#_M-^6o5+KIerjce3jLl5A?LEz&iU#f*&e z@;W~*GK#r&xFp5YsPlQ8YGKB&3k~}f|EyID?jAr__2hD-@QnMh!&qyJ(x398^TWTS z=DH66bcs{9WLCN@!h(+yZO*AHhn?4oQTw3O`vW_0eRhLPT3qiHAnW+v0*MO4x`1kt z(>D_11vCt*-Y5^rB$Y4t9R?Aj=zU|*ojc;Hm$bM9prl3>_q8$YP3Q?ztzR=>O@gGg zwr>~xkIO|tc7popz;psbPhXEx4yiP2sZx=@=jTSFhNf|tDMu>D;-ivEnF#ZuNio2P z%*2b)b!3cq8lgGvOXNfc!RhkWMHWbtQCEMn*_jV&K+@V~_R~CBxL^^TlkI}3O52}g zb1uH=$_#aG-v7i;<*wk5hFI-{6>8Ps?=o4tj)Hvbwu_lJW~Crv;yX zU43-%7roymLEL4)7)K&}mQZ-B8JHU~z?0NuFiJ764_S*d@;IpKEg8)u2 zz{p%EsOzbz(YvOIAp)8;8{8`XexsseF-(W5ek8J)I2to>msB+3yZz+-@cX!H5r`+j z+58c0eG5Bt`xfhT*uH8!xsVRyj67xz*EvxGy4@J`a{NYB`kw{&?`M3#nvI!QY)woF zeuP#rj*st*C*-^zD7DL`#o{96zi<{DUZ}9qWbb!Wn4{*+`AV$?8z<%{@jPF)FiV2l z`nzE)Ue>i)-D2b91nNvjo=YF~KWGrJzRQxNY*?$goQEA?ne8K!;&Wtt{oeTADiIU@ z2u1ZtOWvt=E+bQ&e^r=~%WdAt#F+O5zjO_m!*dHjpAzfHphM5$2jj7JQgW}kL1wWH zv+7`Wdh*D^|LXcg$12+|@?AG7d|~i2%iznQ;GXy;f7D`ey+$l3)Vj{>pCft_{Gh3Q zVB~JS9Vr>j`0ScSo)``72o1jT&^vDQ4p$ztv27WNE6vPs#Bv&TF5S4ssdYqwj=!pp zwDDd~^F-t$#Q&s>yH({HcWkc29a<$F|4hC&P)tP-(Lh49;Z0!UqQo5*DIEBD4%HM| zOrzRVu|(u#)X~nr_(8laSq&oDpiaF|`8=671@Ap4khJeFYhVZ1XG_RRYz7=E^08?b zliXQa6o$1`F+nxX8N?$?f~R5J-YGOyP<_VUzg{7MSE%$r25MncZ4JoROAG6lr_d2= z-=eGP4+_6M$SXof|4GSNW~s!oU=(Z2t{rJoL*dqz@>b>|#p5k3STZpgS_ZD=8HZA+ z4lIy44h=^u4KVs*$X)D{puj9hOP<+}t7;DlW9hiBw2DH|SKhn>xuS+GPS82aOyMuk zoN-xPH}FX_qmrIhUT`(2mHGy^H#E|*e$|XKl%WFT9nC93(){0qJYX)4-9Gh}2eDrY zpPkO;w-NG~w~Pzu97OT{$MDLFo|w8v`=PNM7k6gb4~M+gQo=IwCCNJzU(37wbfP?} zpZnoCxVf#Zr`^w`x0Bh$0}AW>c`^xIbTGw?cJ2Jkn^WW&_7I0PyS3n`x4y?ambNom z=ZqBRD!eclEk^LY1oClja*Ti6s!?G48o2tKmOS_UoS$yU)YZVxIW-4*E{VQzD$y^tiaJ+#9m z^K3CtKABCbh;)_oSlu2j%-GqW+UyibcG8lbnva5lO-{y6z6Mo;%Ih0p-{d&tjVD9` zO4e7n4nW00h+9tnQwo1S+_D&KV2SX290ZUcjoOG$Qm&++@O>W#7YN7g&uTLVG=|pp z1i~ge#dny$ML!`08oB##2Zv48m(h8QI|Qd2TdyDJOLgf@iH}?TT6XkW$M)&W++%*- zSjq@2?F1=CMLQWog++?*iue_?@!~`jo^h<5208EjV-{U+b>n?GZ`)k7p+&O&V(S+n zP_pY&@9dy^#L6bO)$Zz?>G^NruY9d`%Ign1CdGmm{>8y7zb}?e+@oNg>nkRv_J+p7 zQEGzH#%745$36O0oeb=(b=q=6j@v!&PfP7u-M)&-xqA!{1T`xrb|$@6AB5b+(aYPH zh#2t*Y-lF`Xs-3I5s$zGOUj683uw^{d{<8Eu2iF`xi6`dMtRe+F=H4a;G&2V`c(Rx ze#=;Js_bIh%BoqDZaw*Ql1fK6QXJrtKD2}?gUn&U2|$&eW*KU66cOG-bZzw7(3^Dc zDcV9&Jrj}|)H%?6Ukup0-6qoa783jxV{VtCnZP5&-GzIHZfR=sRZ$7WixeQmd)g1D z+|@}1>T^0zkh(>V(x_`BoRgE9q5k*!3dfIf`$wu1!B+pui@1qPI@2Q&V%0aiE#(bva>kr>C4c%a#o*Bi+U4d%KtYvznXt zOjZ_og(_vP1QA9Kf*sdm5x$_rv0lw_=O>CB8wnD33T(B%#aR!>@(iBfL8nId3ih9M zX`l92R%>!s`I@zN^AlfX6PZPNJ}EZvq2|N8`m-sPkRf#jF;xOw>fSI zEpLJIE9PxR7fc4@PSz~=slT6JIo0xIssFj^1J7{J19%cXhvT5{$WmotZ5a%s%X7N8 z`G%%DeQl>3(qWTb-m;WBcqXXi{mT^$J^Bg&28Ku&^u?at75}T_N3|q*( zlG*W0cHvar_d|_|h8BfHN>O8J5EX%LbEGs7e@aJ)#kz$8RTiItAs0gomSg<*Rr9YZ z=@c)x#^qRLP1fg;yFM)zS~Z zP_Ws0=+%Gqakx!+uazFaWqkWQ6cfWV@srY){T*vkYK>GecQ-9GSb{n4$;vh}FkW9HMuY^51zYqv?cQ^vZ0C9lAew%p4OZN<-`PrO4VeW2@( z|2;7w@W;mQrI>EihT&g^m&;t)73!as>gedenN-`*B{F`Isr0s`GxY-D)n5Zw@af<3 zHfq3zyXchmj9$@E*w2OmA@`a-PjsRLWzck?=}HWpv?Y=G-x1MbX8F&zsCZ#7z@`~#d(TN<>KP_ZiR#-QO)8rn>u^>)Ht2$1+%cIGiG`sf(_5_AN_fk>c-@=jN00Dh z`X!8^yF%_{COhi;RfU1oDOX61@Fi$=gMA?N{1j>H742iB-(7e5hV-@Eza3Vd#Ry!f zBrZ*SnmGL795yK@a5~$0a$BMI1>=qIL!WW<+mDiO;`2XYy9~>n%5L2*zFD-p$|{w6 zN;iS03aF|OG?>BYKvl^N(29y~cw5?L=40*R;_{G=hJ?5b2KO$moY!h^gY%D2o8IE) zkB-@o*xa8WF#KALh#9lQN^yFu59Tz$3!nbvT$6PO>_BgfP(MC!ia&aOLE`nd6?`V6 zZUNzi(d}9$8$qhk(DTpRH5xtU!6P@Jt4e0M3O~#8*59;|x`i-&a&q;^x{?bo;?cqM zZc+Z#3db`+vRvjH=b`!cxMpg%tTovCC^&7HFWoHzX5NxJujqrEQ&>Dq8=h#KI+|+r zgdDmDfisCPuyzr@6h^Me6TNb4jchj48)#cT0PVVHYUaJn!|8W2M z^vRL^g}lgHeT`~`&ZJ)xP4W@h`S-$5Pr00u%$~HxP?Nmap0IbftMTzuJrNCC9vbe0 zG>*D|(IsG-EvoW3mjcgmoIu$&WI4 z?J2nAC{5iFnxsc!_W6%l?FrDD4+ek0j%^LQ;jS%1FtC3iMxEKFf}M5H@II7eV!Zqw z^oZSwqrID|TP~LH=3AQ5D=eMq02S1#fTW2JLR_%Uv)NSUNO)|%@VZ=yV@cglp+A%R z-0n5N60hBep3PE`_C4{f0?PdXtyARNwIho>Z6HpfXXNPTfa0TOup;dQOq8JKC>xL< zaBRC1$0$9L~K3T^dI*`Pu%vqR{Wd44Ga{QqC6ZRQk@isW`<=P z=yVF_E4nMFl+JDsW@^sukt2Uyh6~}p1_Wr|FJM*Jzq{kg3tEN>3d#Sq-(s?nb3wnq z(Ux#hV)L&7DrX>}f+K8dhu%j(1S3DfT*bxip7DT&N&M|F`I)|t{SRen%|$&dBh?F3XUfzNr1v1_jr_Pi|e!@sjMah-C!Oex|kcwvZbkL0oW`{@&rSFR3!dhNC^V1~K z6I$v8>`V4hVIc zJ?XA|c9e!9@rBV1QK`|e4C(fB1&$LWna^I~b4IO^1`8+!AO_gBh*x3=Dfw$;F<1@;s+WsV9XZ^JfsCNHsV zD#7*8D+&p9d+Z4fiB$Ms?NS}lDV>tx*@D|J0c#bl}s z8`hq;?P^ZV+mfn~<;;#v^-3po-}azEoy80$o3q?lTpXV|xZ_E04i(M)c<7Xo;#Gj> z&?d(=D8(Xt;H0DG%kDZ7IzN4-1xvrHSZKPEdoUMH2CerSW>09+G#Mih_Z^!WZtNym zNrxQ{Jqae+O%G>-8g0UkYKimiw8w6;)L;|R!Ux*qndWI|K;E<59^Z_d`0r;4lS*Yq zV+3sOzxIa}Pn=T5hH}{%o>oIwWi+y|FtWHg-{NxzsBr?%SSr2Hd+cQ67WlHsC>4DD zMf@&v3jP=wGkkSQaJD}EjkEt~z-<;>hj%k`1N)^QzP%KPh*kEPVx96&dRM51)7t!P&!e_-VEDZ8z8*M1PpsN)RUVe7P$%~<)}{lXSq zkaO^$zSkm1O1KazSCsW)2sQcziu0Gc@au@&;8IZa5b?pwJ5nom^8lzYQ?Cru&=8y2 zREg)2zB1GENN_P*4Ny1={FEpW^p^bd7I{VM0T&K77JCfWQ{RC{a&u< z+F6a9Lmv;ohwF;wU~uyno{Mi4XL+2J22c|(j9d80&jT4ESk?8K%+|tsI=ey>zohcqibW{q^ZuNRHy?h0)Q`LhRDa?BG$v4Dx=x0jrt4or%43JCG>t^ zd?TsLm{LJS%FAq6Kd0V%(@rLV*TNY`J$CS1J%w*ht;Tufxx_8Q`{@k~Zr0=kL#1@f z)CZA?NdfxjaytcJf7GItoJk=MT~ELhTnF^Usz64*YhEPskAym^1l0946i) z+Nfl5&$+6^AzavzuTg~kX2+Z3NYU5?xzVTJtY z=&zf<)B;7;?;5o%?5=9+ZNvUt9=en^@V!N6W8=lPeper5X1MnBXB`kuT`*Wf&2!%2 z;=X^inBBo3QY&_SGaN1tSHE5P} zF*#(OR{H5$goFqwx#M;1zWHIig(t2A-?^8Ty>p7J8)o=mOlbu92l+gr{T(Wtu?Q%p z_tIk$*+r)q2g*rU$I3+-_K92_oLg6|-0#F6yjrla=43NvP@}J(77%u^N~+?y14@pA zmQi6&j`gvmhLNLAIwexIv=6jcTrNy_pkwW|UKc9onc1s#^BqdsV1n)*!T%|}`#7qY zO%NFDZ)Wb=V#vO+;&HTXbQya>^J7=-&a%3PrLvaq;1`P%bzf%NPMF9~|9$f%RXfm2MK;TVKo9q%OC>@%lu(LRG%~a}qj}i9h6FY|Z zt%Wng1J=M{q5fJv%MLg+Q;Gq1mPjuABPQ3yGf=#Cv!E=j!!LV+UY8vBRW{IZ9|$dE zAwAe{89yHoH}bM0PNv4`>mtcY#5j+#(O?Eoz86J1DYJPlGfr-B+F)h=iPW%;ao4cE z9Sn*_Td^OQ*VcL*(xE7z!gxjN)^mCJh^#GZ&?CtBT=Xz@;9r2Dd3E}s&?bj;mMJhj zK*`DKeTk)4$BULmzeM8G_V=t8k!$_$#`kL&)IBybk<4sXiOI!FT2Xhovd}Wuj)%Y# zP}*l60;p1UHwE^`>!4`$NPrN%;7l)2H-)|@0QSnbuo>zi*`q_t?@0WWg?VG@>Ljsc`!bb~ zO*_!_>CWH(nz-VSY1ge2xFtUmeK|1uN^- zp%lckdaj&G54_du?`-#XR|Z5N+_^dkVUhZ+kEwoEZNvd1a3Wse&z31R+1fjfh@sjf z(iem7JUu+u@jLG+!2tYcd*nojs^=E4sk64(1?ugOk-}+-2UQpGxm0fP;=U@98~g|h zF?$3f7bOR15Ok!Z#21 zyw3yTcNULsW{s#MNr9KrN)1glxt(hUMK~-^U@nwtKg6xuw+mcPA5N4zL|6to8^K>U zMykRT*OZ6D?fr1vkgX<$oSGU_Xl>NH;asiv+ik4uFdd_j+3(9khkbX#I%byVqOUmZ zxXo0h%qdjXhRo)d!2VnxOZB#vGj-!|ldGjeOpB$>);xVl4wgO;e?2wg;*2%EWKfB% z6nI=HS55FXOD@N59mpxr>lV6PNvq}!a1V7J(6Ld#%=cZN)qW-c78s!DAPU{T&AHfa zf_dzR$Ot?7S*jYvwS%(`E+EqE)Ze^`Mhz%TZXIbqqy498eFz(`#c|1yOM@C9l!V}u zLse)}lp1&RfZVQT3#sUv`IM){xZUQ?zFY0zQ-zk9h8@awwC~Y5_w30==-c2yIp&(D zK1-9<^@gd3liwrUnROc9RS4``)Y^0r!)(?JvzhIwNnB3+$oLK4QZ)HblRaID@cDbQ z_sGB%07rFRhjx(Q)8|7(9Vp&r*1zSIxeh)qL*&>(k!}61@5rQv>)7uM(-LEFTJThR zl;7zJ;++tL1Fyy>S4%{|tjY49mJro2Hd_~$Lh24z^(l=M9EK}bFEmg^Zpw~<#cudP z_Q}ZA-Pk$l(H(Ue##BQ*^P`Rg*&?E~3Z7Fp{Eo-kUx^;$fN6;yLGxX~ZDdpa#=OZj zB?E9Sy;!KlT6dI`MIdUw#kZ{F})D`%H|_}ai=%8-s*rUJ>t8fpY}ezJrQ zJ}udg3$D>n^!g4SN`tl#_zsqLskulWY{ZaC>vz8nwcl)lNn5N zobT&Qb@;mOe)HEZN$st3v;R!rRzNSMJ#^eOV6~Y^#jNBU`vpB7)={KoBS}xRxF3z+ zA!5MgHdbMb%^#=CP2S<7jcWWzV&xF|oCU1`J55Iq#Nt@fKHhVIgeW)=hQg!)zNd|IEO!kZQH8Wy8hW3 zVex73fsJRcW-T$%6L&Gc2j94nnF#ze#`)xR*VUr-p4B~kS5Qyj#z4i_wmBfbjzAyb zk$T1AI!5}8W~5W%A$Bg@&x+QdbHnR|^S!J?%myQ+ca~Nh=YlH4#KcA_p*co-_rGiP zqer%m>v?I)f`nZxYTS*`WA2QA<}wGheV`Y@VM716@%kLdtD zPehzlkM>b;=?55F_6e;bN!Hl4Wn3`89m~42$bHH`P)Oc!aJ*qxj%A0pW*ZB8mG(h%JQUz8j zHXq{@6ehN&BDjNQM%SGiiA*Ak2Et zsuaidp2>GvdFFVws{r`tzm{1GNeb2n)$<7niwh&;1z95Ms!A(#6b@UrAUahGwf<#! zIn2p~T|p2I2|U{&?x3v?a};ABIC~*oEo^16EU8!Ls41__Ni(UKNf4v2w*6q-kYNXhoffbAcUBl?- zTlZUb1vfU)BxCCd^|HwgWDk3OWA$Tn_R7Nl{PBR{u!+B<=YYD|c(rl2+cn0hN(s^n zW3{k~HGy?}j})Ob_$~5xW18{9%911>zMU0phk zO=BED1yT2Av=`404d>}d9U}?(hZ56tHyK=gsuFt8lxJ_RDa}7AooC9a{>I}2$0Mu9 zkSoR!4};O!GJ6Kg-fyxf#`m0SCB2sUJ7=2XCm^SvT-l%3%X9pkzt}KBekhI@nFUsWQ+blU2)o+ zbRp1p+~Ec*YaV7wl^lFZ3C5l%{2VPdVr}u>89Dxx6?WL<^hL7};f9E};dq^25j(F0 z={pfR(c8a;Oqe?Ei;YjrWqikkdoWY;oBoF6kA$1kN{%|LiErGZLVurCXn1C~+@{!a zSHHD(_1d2IKY-ihD^WUZ;?&E0r7#E3Fg8XIa`XH~^c{0zvgr8s9(YYS*ifT0w9Fb5vBTI8j zSz^+YgEMtwE}jrpE(0v#)VIz5fW1^U>G=$6ExT^$+ujB`^ONg%L*raPpnl?h-~`UNMOi~}9R=xyxR3GX5}%E;IcOc;sR{*-qY9@oKg>+lzM zz40+pjWgm(CKDUWFJ;5=og9DIRl0oT55qKNvl`^iDM_?$$@~^M-Zo9W!-9kBae_h) zC$@s>Gx%13gyqB06Y@E0s4(2}?e9ZvMgN?!k;|-O?^o8rs2aM|q`?0~im-AmB&t@x zM;is1NixnC&R;!np-gpzwN>)_w6~Qo4zyY9jF94i6GVX)@9o87t?OyDS+H_~gl5@5 z`5l&cWgoE(+$EIj$N)Ql+Y4Az+oWX2msc1eP-qGF|963ohr0N4%?$l04O)`9r3>w^ ztd+^b#zmGw?fmIxy?EEU1lxN2K;Ow?bfnLn<)^Yw`RxIVbl5WB;0u4dwq=QMcK!|! zN=gY+@dY7a!;V7^oz-D0b6OG}H{bcsRMzfJ>`BTo=#-k&9Qr8w#~+Xdu3kG6suZf* zB5LRa}7f<$Tpm}ZRVBvD{*lIUK8J*O3yhd&e7 zi~@ZYY{5-MPt+Hl%tBBOb^O9?8=RYxBk<=|fpF$3PaU0Pn7`~q8`k+acgA{bL+n_6 z>U*}1UF}#e%DwYnx6&=-u5T~=d3oU2g4}Q>PH}O5$-O83@1Lvkr*j8K=#&S~_n;CZ znJpV(7yUr$cyAxtFgF`lb@k{{iP_NB`YvOs5~z@l=I8WGq8Ov5cg0nYnw}JE!p9nF z?h(?x=H4h{Zv_XRpV=G~wZ?n)Y>glNxcaE@8~J{^T0{@yRno*zP6I+x&e21M`xSAt z$irXAMJZ3>-J%R6kNT@2y8yQ3Z-L4M&UdCARi~&tyl&(aRDEsBit-~3ax(oekK~2& z&wQ+T>aI)6b-KecD=}S*+j}NwY`s>9Db)bURv0SE+7}&#-{mT*zV)9y*Cs<$f>2y? zHvQP&WrUvP%>N`)Yfe<-V; zh?jif()ZRlFVd3E9ENqQY8^5pA+|ns+_+qdmWP;UdS$#(&da|sj{5!oi2BCxI-4%s zw6Sg5ww=bdZL4t_+iKjjX>8ke(#B4j#&&jap7j0BIe+(cJu_?8tXa74HM4V{mLaxg z3#WF^m14E971TQqLv%ver#YEMlw6*O*o=rrWZQS*GwhyYV?C70nYC^S?Y-;`Gicd* zkcsU4pZ?^pF`z{qq;fg6y${rz_i7xxTx0xQO?6l_We>n}aj^atlleciyvN_+KgR~w z2hydB4+#Co9&}}!H}Epu!oy_$OS*tstma z(55vvJQZKqBebOScs7yXPhV?1&UTS1-z&j>vjTAs0uGs}uDT!F9_3S0HmA%$A#Li# zV5l2SETHOsq*YBolUK}y5LNQmNAD%);{^+IJZR_Au?WVaR)RA%fOWUNx?{FRyLwE~ zZbn=8&P%-w;c`f=Ld(DMEKmAxrZ4-UI zDp{g1{>dA1i!{&6>3iUL%`)^FLwZSg``zX291zhKM~R--7UJA*uKOa*Q8i9r` z_Gf3W1AT$**{83Hu`RDY9{t@gxK~v#^t5yT_)%VEJK%!mxZ;=I-rgtR(FIXy2~HyH z6exi?gQ8`|b39hF{5Iw9EAw&8N{Ik;PFZa9`zREu;TIlP(qD&mnPceiI;)E4w!5g$ zd%=pI<@)QV*gH0cQvwQ(;M>>e7X>*NF53NR-$<@Q0xodUJC?1A_${$3__}$;SMKot;>`h7Zg!4`4nOa8vfaQ_*eR;4vNz}LaPTt^~OVSH^7;X3~UE8&_Z-93KG(H1pdf(7DrQu{_)1w>T zDA)RduY6f?NJK>cUAD$NXep zLZqz)yk<$h30UI{{BGBSgaH96YVOgqf=YEspm4!mlwu~!4M}kq^;IF#$c8s|S-u5W z<46qgo0G^l;D#3u85!Ta2W+Nq?$c)s+YBQ$sx^?-_GjSMpTC59Hhtb(_>(u3vRntp z*{^Kh@G0IBrr1b<()bW6xrm_Mz3_~#L^~qF+xB=<5 z8j8ZgRmE!Al`?P7PwS6KAjB9!va2sVp{ONkL`eCb7Vn9lXFUs9SyQ~#m$_+aFO?o} z*Nxjwea`kWwPjp*{Ji--k1_9;725zuMf$*oqu+vYy%kv4C~s7Vnw$W|s0wwXZRxYe4lk1o&~NLD7lXa^oIB%v`3reV-{a#^zNt$aEnJn|e$ zY)hGR;KT1$WYwzk2Q`UWqhrhD_8Re9_`ha`*;;hQqu|IAwnN{X8$qQ2N2vUjoPbKM z+g9bugD-(g&wm3-(zpthqPQ8(B1gcpxeZ?Yz)MJ{{T}A49kC=N(q!M_)AO?nimCXT zM>AcQbr}C#)$2)5k5{>Qd@i55atCdo&D1G`f${*LcN-Ygx{=uSC#Q|kCp>IVi9ZF) z5)Wrg%DaX*_j?lDF{IyRiv!QcrzgL-SHyFP972Bfl@7o6lj!pmBuzQ@Ur%cdjARJ3 zZ76pL85)mY>`pdtQb_Xe?-sV)T;p!p$qzJ8>US&1nil4<{Yq?`yIEn>=~lB;Q$kLb z;Ap~sTaUDb;p4rw9|8_^44}+L6(U*OH(d%JekkM10y!&(4SOpdSB3A3aT;ySoUf+8 zf#5jLGycFPysF&@zFSsP^gg1h@Hv=bQijm;CLz!PkX`~$`W;?Dw?57qzX+d+Nqchlh#4 z`7o5((Lc1}%h6UFl@~nI*2@bQ`X!dX!t1uK0<8)x2a6QDNmhBS^0UJTP`y9t9PJZ{ zaJK(TP(CTpt7D5wP-hn-SlB_wmS6B>=LLoVnvV0V8DB-sNPY8#=Nu+8;%Hd1Tv}(? zIlwucdeU5Ye(I8##G}g(c<2a4_HC$07#5;ur$S7p+(b+{ARd-Zw}{@}FFjgq^iMv% zHN?R^@_7*^xONY_-@8tL9{F4!VqtI-q5745_2Sylpf|Yu_q6aA+qridJ|XsnZ*r0> z@}TfKwZQ%ty^*?CPTW-M2(Tb3_G*T=do0_9q6*qogcxquY>#7!$D=^-pPS%8t}^3p z^v{BB0=d6V+z;LCpuL5kWujipa<=c)_ULHysLM5D(`NgLQ#J&vGwP@8O}!=)=F_xt zn3V+P#Eax{C=R1i5Cg+MH*V1igB1_4pDStG>4TwaDCDuF>Od)#UGU)N%&q}a{Dp&w z_9=bd)GOf)EK<<5*KbjIykfT+ee=J_aX<4)GZ77}Gw?k0M!UKTsWMS|aXTEL90+7` zLTdZO)OJD8Z|76Dj^Pz&cfr&&&H3DFI5QjoR<`*iq3i2Urhv#YHYMD#x`?TY3!Y<6 zTU#$Cbu-L6;Qp`S>p9c!*v;4c&g(BRJJ$UVAIa`Ee9t>czDZFCy0d;Zal(5q zFm=-YR-t!8M;puOFo1t%xC&?X$ur#V@q}lWiF;u|bEZ>H?%{ghLZ3hKbIzk*|7oUW9@{Z;rbw7NcAK zrZ~FGmuwI?Qx~s24PNyRpetpPB5{E@00z7#Dg-w8m3_pUFb z2nj#Bqlt`d%?aB(R(M&NI1FM;>b<638W4_t(@o>LiK{h8e}Gx$4YSLqtaF*Cp-B`* z=9UUC^8R(?d^pXi55gE`*YF0GGg@r|&&}nDyp%hJM;tr@EemHMdG%-US&Xnb?iks` zd8%aEh@$^^LRd8IY#6G0D;AGb<7hl(IGuf$!TajZ2VY-b=g*%b&eq#QVq)M^X_8*P z6YG39&t^-(%(B1UaiKvt+Dyk!LAd%m316w(_z@Wy`Cy?k+nq2Pn|Z2JQ4tPvf?C7F ze6@@wnVb)n0!_y7Hm9{*eGzvxxe*5t2p$k<58ft#mz%IL4-iQE#9tl!_dZLq38qJ& z%xfUgiCi@Ukt3yt?_0U`B#x7M%oIfJS~_h;(JymT zraAlO&^m_8Ay(E9A)bn>kj)j={rVJh`ynIrEt8Ik2`LmNm6;O=Yfr>GQq%fV| z3zZiNL3bx;4}?|s(f?VJAY;{}(Y*e?&h zzTZ>_C(a@1mA`?lb^2!9KIklzYgK>q2i>i?xJ6f1#;He!o<{Iqu4@IULdxC-VAH9? zoNabbBRQpqEq*wEGaFVz!uwrLu?`x#>mP_hm8M8O!)vr3v}X*DAVCOD7Sm}z%33wD zz0VxFjbOnj!#%pj8Fl9Kbhusm4KcoSmu~RU&)1Dgk8mxxq&%Kjc#2R9TgcWR;W(l- zktsm&c(HQi*860s_N2yA4s25&alnh*zV0=7Xeum2Z}PR zE&*WX8X7GVM)d<>LQu|mWHjXcnaFXaK2=pY=3`X*3}&x%&ljn)dU z*4%==`OCV^zljlmiGvV1C#*3aMLT?@c&E_jrp3g>3KyRrb`zXmo;;)#6y{;T@6XnE z0rBz?owuKUn5*vI^*4UKHQxMAwWw97lrMy5=KpkKV^hIi-c_Q|?6mneo}L;N^xPVd z$pH&(_bw|4uf^IUY>K@}*lH3<6bBEGb$gN@P?9V^bCqytK6hbX~4I6p3;SJ8yOj$akd2`r)%0$O6eB}bO?ie z1b>oQ{H7V_x+ZA8T%g-%JJafB^_9y3PeMY%+y{B9%AmdFer$9`)KT9^AuF_I0kGAv zJOb*{tGmq3LsUCYm_8gD+EfMigR0pDS*Cozf!@R_jY!-+#uf&CfY5#Ouv%4^3PpA5 zP0J(;<0NLP=3vS<8owP^@7<<2I;EOdN(n6^|=J>!D- zczb=fmjbdmMz;ka(4tZiA)$1Ub!*PZtlVMxq=9K6dF+}R#j?8qgYidm1`Vbl|)=qer^>PWihR>6AKs+-?MT>uV+&a+Ont?89QIMxI?eDXq$P2=z+c zG*Igr218;7K6nZhZ=W3C33M_RljlEq{SZeP0uPD%b|=Zvs6fnwkO^l5OqwQ^X#yz! zQQlvO{LqN{)u20s-3SXw^9FuHi1rsKjSal{HztENifjfG;(WPQL_8sXa6$s|#8=i` z#s|=}5JNz?jQ0$}Cb0aE$jg^H7I%FPxR9)8l_2$B02tek@1 z9$io_=(z5UL0XKbhdtdM%Y}FAH9N8x_kiK>IDdok3e+|?r_gWrL^SO1B6Wxx2Rpam z^Ekqo$QL&9>8`J@Z?LE`A5AuP$bIZDbsOV`wsL;qr21U#0C`SIw4>c6OtZZ5_ak+L z6pIV6XUpuwrmrwT`!2%0hs2()ySccyi`!#q^eE`);3g&}Tj%G+|C`#azBQ@i5T+`84iZ#g}Q;e&39x z{Q8^IRV_FhjWYG5k0h(O7fx{6 z_deO?7M**IW)TFlV4f61gm^G1^t+kuU@@U&e&mcv`(tI_UCy1M)MT3ocyTa&vLH`XA zQAi76e7W91{Ai&RZo5FPW$Tvo@6_G?kTjFf>w{T|%8zivrercw{$gh{^Erx$N^Brj zd3qQ%G#XdyWarzm@Eildvpqes0>_n@ERDejveFGr)6^!o75^kLdn!=k{T1^aY*8e8eipo14SyTsH=b zv97W5(t5z%5di_#5t-4b3TLtE`SH3hnlfcu@_BmA%PK5o^K@(IlVjWGbEb9SktPG| zXiP@1X*2Ow7dD5!CKw8|sEp#`G0UFk+c#@g9tacH8cdw_1>4auGP567H;dM0UCC)J z0Vr&{=sxoPhUAA@-J1w}!}yHjt!l|cyLeG75Fcz3I(rX1vWemOGu+#Gz6jKSJ_ z>Yc0eMg#;K?Z@W_k^waR_AHJnNG;R87S<^wX0(9tQS@PFvmeL=goO2&p_{|cJwa#wcW8BE5#xy7H1)keN>}7J>sAq#Pe%9xZEN?P$-A}WN0TvNhs+o&=iys z6c@({WcxzgP~l{ZuV4)hYWa598^swH2N>L4yxYzBcP_i%nSrf(_!HOmhY%m*W+!oaO1*&A<)l`~bSZps1YSRa_u@ zow$X+%wJ2v54jIQc1F?_glqG({h&dYksPnmsw(5`;z%O6^eFqA?@aLAY?95XN+GXv z&8@?Lm7S|9e>g6t>i}@<@n^^4_6`oQc*!1QyndA;WJwz~YtfYGgfCtp;wVLm^LPE6 zT{&=nrog$W9rr#avudw;7fP+VVlyD!34vOKP+SY1q~14ODWa<4;EgOm*r|pAh2cb{ zHux`B+tr?I-|ct=Ps$r<-+lGoL>p@_X8q1!3}C0Tleud=*1JQ4BshEPq`&A=kKE5@ z5EKLXGx(v#Q{FsXEY9_sN}!`^i(4;$WBNHRS7dgrwH(Cc3Htsm@e>k)`$9+!St}33 zxoXaU<+>^2$8-NdeBhk>>ng56Ha&8l2lg$~^tyMQs=!C@7@ioCx)z;~ z+eh9W63w+r5Zi(WI=f-McI}=(Wij9Xd)LL9- zu}@bT$6c5G{MI9?!Vb~7i~xCqSsV|Kd``R9GQYo@hH1&%l-zZUY)x=Kc#)gvXySwi zNd1SxLaVEI{VaZK6MEgn*v6-MNqx zYIRLwtBgPEiZGOmJ176Wozq>V=uMhg1sW(WEKlG_O%bn_l)E zT7C|$p@fpzuviCKM{*DkEq~WXEM0=a&$<~kdo#AyZi|-Ux4*^={%h9k>_BC{t(7zV zd!IWw;AXgT61x$HE{2NDybRchA_ZGFOG9ilQ>Ff<$(YzC+a~8%juzh+y;8=?6MX9% zPKKrPQ=YZ92G|_k`Pql-kB`^pAj9HKMaJ-=xN=*9VzI{^=bZ!l!|BVMqrh+n(_#5d z{q8GHh^dS1Az8<0%-#HMODijQwc;Dqt@@FTPfH|05_RT?dM$sk8UKcpU?_wwlU-5%kz{S2<$6?_anMe9R>N?xaaWP4Z$~-qHALw->em>jrShcpH zCIz>-do3W`n6#(xKU`{Tlry3XyR?i>9BYNQ4csh#LfW2a&k<;OAq+jy`G7tYIF;#T zfXliDAIvooQI6f96*tgTdXEX}vW?0ZYLa?>!~OLntB1Q>JI3^>uRBzgl2dMg+fjS) z+iori)zHua&9Md--oGTFVO2q`^)GH1FwXOg#w!v_^=`O1APvar-Ho?cX3w7pT8_U1 zjjHTfm-Ev+&hs5+vUn5thV*I8yzg$PZEo#B>5?q-fqwCMy!)qu7+4e8P)R1o#vaUac>F?^z1QLmt3l@8S#_o=`CPA{k{dyjy9S(Y#H);j4(1P|77pNQ1j6AFUA`^G zX=;5Sg%CDK4!J9GPf1zvU(=;4--VnnVAn4_-xCm!S$Ye_Kv7lc+x}D(&Td{^MKI~<%4Wp&#OV5k#vdu0XKsfaW&>md#|My^kwbFT z;^XFhe`j{}`T97Ru-wtV<#Abl@Jj(4D}zi*2BY1|S&V^AMJp+c+t0yJLgf})vokpY zTD=+^1{-emVlon8L_LJlGVZzabD z6#WZHM)L9#!&=f`dv9Id<2;!0?f&T`kO?YDP}%En>zXmuG&O~vCpc`yHmSA}phE%B z-@*ZTx}|W3@E3e|@hxGU>y0KLI2Ll%oodoOEcZ?)`Ve2T55UsEDKH7PzVl28HBN11azfB$}1#-S)LWZ)Tg z(=aqVH?c=o%IznMQw@YP3DXlB>*eoxQkyI+&(HlI9SINyfm}j#TkMfzCDdV{sqRz@ z?;*2yI^JjVqTV9%v|xzT{`ELBLW0dLPPa)w|DOy+%U>twqOpW#bd38nJZV)MVSk^o z$MHjxGT#Z&F$WcXChTnTBzMY+toTwc^^si|s7n-P@A*wgQKk+3g5oHzq1;}$IqcHC z-A?N#y4(u6{oMkKfG2xl36h zdi+pr!L^nz@@i!rpv6+Q%UjLRe0r!;Un%FoqB|N~{cJx9#>it!A=ph%;{M+Z7TocO zLVypl)2GGt#b&igsBjSf4Hb3?${v1I$ez6^_cWn2Bp>y;qUNP{8e{cyJsD|7oCsNF zeNlxjM@ih9(8d}HL=vrb&W|%{_5z>cS>=MpeZ8`#>+mc=D)Ii_nBI+uS3}(NM3mVK z?OHbi8N<`=j_+!wIY*dQUnA|4uH1!N+BtS&Jzk%^O^$~Sb5OZ8ss=(uQ-=Ilf5>9W z^#J*OO8`E+J$zG?19cN2sOJuVPo|*)q?Q7q$8cMgbZ z_;b0rAw*H4cVgwX?gUNj8*MR(D2fu==VdRL%yWH2KyrXxgSOd)44(w#4BFIn32ujV7vOfP*V04IR= z^!o!*O=+ms(PW?Li}f7)b>~jGGnrt)fFx-`;YWHE&rsI83}KgJz0Bq${M|`^7P+++ zPyQmH6=Ye#=kNXHh2(L*TbiV9>Go%7~d`kcrMs$LhR23|fr%ITI zmt)L*Tpy|>dRK4&93XYZZbfO0S8I_oE2S;Im<5>yn}wK#nuVDS#hYpN*o7{_RpT1+ zcZ8qAcj9hYeH6yGCuaDfm55@f4@f41uEl6j`k!$i%p-UPkdIc6jMIb9p_SfrvPvt# zglwIr^mIuoOyzVV94@NlFOj5)4XYX34_D9S?K17dveefG}JJDWQ$(_lo_ z)YM$7W$T}s!V330veYc+T*5vX2 z`7B>^+JwRcLy^pDb9F>Xp8H%P!3~@eE9!S$X&r2i`v}KuD*ZfH__C?Q9F$~uT3`;l zPHb8Y?_rx3;mr=+7jnGX%9RDb#C<}3mv-7s+G`iLNKh@fDiuS{>h}XMhL~qfM%T}X zOTb%Ku))eaW$3ry8m-H`@f6i}2HFc8cb8opQv|3|l$?&j1i}O`yTa!mJ?yl$VmsEf z_4I;5{29NpRx;;+Y;YHe+@L|R{==+2wZ_Ar951qV8VBuS7qc7^AjS3OW&Re(jAtwY z|IaWi_wIj0X`&LlSLN6BQge5uujmA9WlHgpJt^&2r9z{E?!_fft|M%OIt$#O*TS{4 z*q?MDn|Dk~AF6V7MT|v+c>p9hZ)15f_m^sKZ4Ya2Z7*wI?buYh5>|(%*W|^@HmCZP zzqikRYgw`g8Lh#$s|H-2K*F>xY8bIYftq_24U6}a4#$UYj_+o5>_3Hp8chm-7cBuM z>H^s^3J?C-50w5MrdZ>@JoK8rV|&ohO_t0tJMW%qlXN z3C7|)4ytJ9?5d=yQ>svX8OYR_YOgV(3Z;KawpTvx%QGJcJAvCd!vvG0_SI_!kRqKt zOC=i#Z!V$y9K=9{5XFhHI1!K}qg6aqaYP?fhLWDkKQ&nxTCSKSg$ZWynA3YKeX6;} zmkIFqb#Q3G5|==MFcCoOUtemCmQYQd`@SxW)vv89MKeyq=Evd3;lXU@1I#6l=DVpZ z{LgqJ$IJf~s~!3RKgM`{A<^^fB1^*fk&2UnWeO%|39bW`p>+FUnm3#0S{xW!Hx#1w zeYR32Cc+zmyfYV4n7#pNB>tW$EsA7Q2<&ybnBHR|`~hvW*8`Ye3rsVn!SB<7<PG;_4CO4``lDg5<%XJd~0y^7Ihqxmi{*W(YX=ew%AD}zb89wr1y3gl7ZOSIN zf`Soscu6_O2%8|4K2Qsor3=e|7d=W-R#E-CRnCdf84ZS{Gw7MN#c)iNpQBqJ}*az4kD)L2H(lX^esKj<< z*qWwBUvA5jCF|YEr5#`A4u_K~Q6McPb&85s)ux|c5+~@M{+TwGj{aF@|IcaxyA6>3 ztuH;sQFO<@)t}){fuTxp^`ejk;=nl%~D)3gF0#l&YLfnMV5bhSTwSJ?LTMblUS;<-mw(%}gww2+6FN zW>lL~*3^!_`DjESg4dY=P*;pttEONf=+}}bZBn>+x^%gA(<7YB%Pxq48RyA$j}hik zPAgrZfF1x9xEY0xDQXF0tjMo%J5(3 zYHsS9z$K-oa~>idrjz3+f<%IatMv&$l`UJ-o}7ah7~|ozyfRU)5x4Eny|YR&QDl+! z!S|H&FXmLKj&rXbIODnZlXrX@&&SC0HhM&kY4)rE{EJeQL1FTA4R@hykkPU)JD@V* z!pZ{EuS3q^^j3&alYwrVxSLbRCg=D*(l7`OSkgZ8Rq%3aJ9*(9I}^yFe-gU`jDB+F z0HLP$kIVYDw>`~05oO3rZ-B|$lF%;CmRHR=sq4Vs_cTP6r=4Q6 zkb?dUeqMG-6rG>T2MTk7O4?o@Cp)(LzvAt*UT&28fLpqqsw0sqmlrc*(CGD-m_=<* za2c7DmdG|L=65g8jWpeMKF^L=X$1roYB@ZbiN^8Q`Wo7@3PTj21C$)}ux4Xx>xWXU zVluzCTZS`1SqM7LmisIxbkr{HAxON^q3jxydGcgc%~juLgn8%3?XzMYXea+zDB2_B@GID z?xy@x^x&7l0JFE{dsJR3qAmQV2)^V)c##^}7*|9S@RR~Cmkn@Ddr&aD7DNFe!>nQP zd4{SCNZ%XoOF{FJf23;MTA}KreR~=h)cSW$T^x_J*nYV4W%`el_-&#uO8fo?s1TR& zuVvvMWxCO-$DFuBs_a;WAV~Qia;nNSWUt*qA^~jO3;FWP`2M2nIlE*{?vkNB_bN67 zDC)&x^V5N}>rz(iVT=Tu%}=RzM&poV)`wSmW@qH3$t;FoFL)uR3d;oAxhAf|4OT`Y z+aaj@-LUN-hjz4*b*q)*${5`z3;l{huz1l9$L_;S$ok)!U8JXw$s4!p!p8xB}+C=u)P)KsT3!r!` z#AH)LGKUeuuQUv_2ncY&WHTxq)6bWOMX+o!)pY8~X+HJ5Ks2BL=HG%JFD_I*^zDNH zlBTT?6KEUd>f{@iBO@iI;M8JJ>+T3F5%F}$e*blygGuk5nefssO5GJ)GFcXobkZJM zG<*_g1skjl8cBVi1D=bQAJ^fv@9VI>SpGN~nSGQl=@Grq5D^}N?c%TevE`#iiK$?f zQV|puS+DN|5Q(Xv?q*(g5-K2)4I2e*O_~Q=yR7mXH z@#unmD*Ryiq;lcA@Bp_Eo@;4sBn7Fev@(XB{xF5g66l09^-dJI+xi#fkAP1Xjd~)^ zl;<43H_7g1Np)Pf>?YGVQbz^cP7!?l@n!;|;vOQh=vS!jTwMh4CqD7Bwbqu_9r08~ zHH;OWg|Mzp-F|@brYKUnP1WqUSd7iz&fh)0xIF<3z6pLc;?#Uq@gQjc1{$bKr6lNnR}VN(BS>rR-jLkgEtyjQrc zynM_49&8u6Q^cPIv~~8|C|=);QTc-ku^GEjv`@x531xDYNnz0c%uW*4Sgc!HpKn0e zJH&w!vbuQMfXC$JatjSwY?Tlp^+ayyGy4W|zZd~OO zRsWj0(bw((JUo2^y7>`8Jm2cybJ#yo$Q&>S8NbSEGopKwqS4ODl8iDbrH%bPshs@m zRS(ca(*VfQ3y=fbDMAkKMBd3-0rrJ}myiH+UcLjm35%hqtG3*`2BLZ`Iq}_7hXzyp z3l=LTbtfoH969joamP50Z~p3-KWF5Zs?>-Xl;XgqpIU*wQ#gCnNiDi0cDrjxRwzcV zVP}%6s*{YC5x?qu){FtxEa?imvOF}bg8k7h2Ax2q{6lwHo>=~c^uqrkKmdsdIU#1) zYFY*->Q4exLiXMqTsaQ|Z9VEUKR-^9~?@VyH-ELb1rJs)oEUPULAn+XH8t zQYhALv)y6L)q4`D?jZc^K`Et194IP{&PzF`NHSW~ucdjq8;d0Rm2}Z`p+D+Jy=dbq zv?oMd%2$4~FYZdXuUVJu&u&0AlqU#fqFN}{7sPjx0|*cbWFfwhCRA~V+_F}ST{1H( zfy7ocuzMk4Y_gnpESI)1)x_5N9r5VD&rX@4>Kwk9B%j8p_NK`qWJ#8B`nnOy^W_L) zWzwt4lN?qgc4tgW%ORM>Apy9-N0`;VDI1Dp85+u=pJ6!0$;%>UOwW(&ULgaKhVOa_-ZMS-1RcsnQB|ILdUaI< zYi}UA%fiPePhkq?_6Vd%bf260I{1>jtD*jsM*>5M1|7BibIChSf~{@qyPgGW%bHn8 zY%40r7aOPD5BGiA;19(){liYOTW){#xLEZ6Fsi8dyy`4t85D@wDU}>NkNO@Ur|Cn9 zHpc(>=9zCZ$6i-B&q{o)L-;Gab6UuTpFDherSrMKHUf2r$B!-!T3D*ObZbosZ<=kA zUwjsikpu{Z#<}!%(-*TrZxU2de^8})=Z3yYG7 zcm!7%!x35j%F3qVL!910eiFXs8c7#1tHx9=)K%-$c&l$}3=vDi6ZzQ$UZA+iTrgW> zG2{N*$C}GB1w&|Kyu|^?XjSDlj^Xaw0fc#n$9``({KGK%aO3REPu0lEnWFdX0UQX@ zt#)MS+EFgq(i%aj4wdaSEfd}MpM`c6-gk>E5{f4&CU;eu;s@LmSF=Klr{EM6w%k^R z6O`!iAwLhh3{6DVI<@Eq8m4wXBmBcNqdsQ&VqiK30RyK#E*^nZhf)m?-IU9cvb!`z zjiPc;OSV2WVS16W+&`}B5xut*h@!}DVN!%QTkLb8jULFxcy5k`W6JGpFs~aABx~fb zQpgiCP#bNOA}{@Ap1^a=tp##+x`5xrSqMf7CKJ+2N*nNT9qHmaptBuLrZEF@+!jhU z-2o{Q3ms~wiZ{6!pl>Bu8LoZ#-{u473VbQiG^!)^>dX9UaS*tJl{!X?V2y;J)$+M; zUs~o>eCM~($VSUR)S4?2;X)A^eYLU>a4W36r=!ttB^}WTAf$&hWlewz!IGAwUvfhW zht{Gy4q!uv)3SkZHMC2@NXq@Vu9Z$1rmx?{lPkN44pCs97j|p@-{^wpvr-78)62?Y zExo62w_keU7hQ)ESp+W(nHiu+FD&_o|1c?IlzHONVwM&N@9U6`;3R^9i48W;5k)W7tA)vCzg`bplTb< zf!9P3z38%2o$dI{G^apfGavoNSmL_dTZOHQ@Gh;Y7vyLX$8?JPC+Ef#1Krr;1p5n; zjcH*Za=u=3IRj%0X{;h=lu_&q>mglaYCrf@SekLU?UThKr;jqPHwb=Scc+joY!=yR zps$?!=l%x=hiTAIxUZCa-z9~$`_@JN#E^AwMp*^9>i5TeM<59+PU zwDA&bS*m9G`?aDWBSNSqKem6A`tsIG<3M+YvSlbyUQg%6un0{KJIOIC7d?sIwH?BQ zu`xb99c7(+y8(bk0nH96(|10gMwXUR(~WJ%#%GGmaXU<jrW5xNScIW>GXp@=J{`>aVI86qW>6b_|a7a>OkQlXyU7$}- zP3<>jOVWq1fW5=gI#im}Lk&^Zm{nnaw5#ahz~L;gdh?lr%0BklsnGmN(Uh7j^#{%7VZ8IhFk&+L!NsT#2LHZq((3|% zmwJ0IlAGb(P5%CYG&yZ{nFCxn3(IMTVVSb4K7L??kdJQ&46fT}O%VSZK_DzNq!EAv zCD@|DK2{DUIwv9`hQ7+gxkgm>ssZ=ILpjq!^MFMxP%MEWIIuV*3*;Svw#T>gze9Su z6YmIjvUFHs$LcmEb7qB3DATYj5%_83!><6}Nu9p= zKE`Xwm~;TVQm`^s%<>};rLyL}>$k_4ki;QEhh9p**RK4U`dJ}G?XiitvDZ(my|`mLRrNlh2I&Sna2SHHOANk z0|7gVV;uz=zRtK(CI9`2Ft++Fn{wJRAF&0A0)_}Y7p{@J z#ca|0|F{9lOEk28{eQdvuF2*a%Y0>|#lRz2@cnA5N!la@npE1n)bs$*T3AJlm=4nI z{O%dMGEA%AHonY>!{%@coUD# z)1Vu0-bJ=Z!ePz+?=!}+7xdYgZc{{|0(~UO_~0hB`>XJ@2NI02)R<1A5q(n7cja`2 z(`Z8;YR;fMNhy@jo#p;1CyM0R)TazPyV(I@D+R#}`QMbT6z1O2o!s-9iMtKRdLsnMr zMi6C=(L1l`X~SA2TsM@<;>47504-?cu&uyY@F9#%5_NU#UPM8ZTZIPnh3Z9s_Iz0{ z+wA`iL4ek$``-{BU^KsrB3mNzo8SrvuEJ7P>rUY5i6O#SjP-1A--LCZ3t5SNR-y6D zA2^S7s;+AN_8;jHrIm>D3d=wE?l5g*SM?W4(9?(G{Zo2Iorta60n3HkPU}pt{X&vJ zliK-75!KL52o!*}=F^bP`5w{7NO>8){BIkFJaFu$V8{2??!mtu%frDjV2sHVLvPM7 zLp}lqht4aBfWL!r2r1p(|6?m6aPe9S2!VY!%VYnx()@aK77WY@Uq(VyJr(bCn-uR7 zW8o`$`s9zzww|whgbfXhU~6h1=6)b*9^wtPl-BQT1nwn{KL z0#1sDSQGqJv{)t zjx|y_B-*d{lU7>?g7EL)q8}xFEtQ()#e)}-zQQlljySk5wv;{7lqgi3Z-21D*f<;c z4h(b=3>TM4hUPAhRW7dMNEW~Vxcw{K{g$`3#ee>XXO+=Nw*hos@kj;ZQ5AR$5oA^- znp^g$ZDxaVg+-5yxpEU$^kbo(YK;cak_-`#{JNIp%=^ZwT=$b-0UHF0Lp08u<(tFj zl4AUFBLRTKzygvGfCicW9~VThM)913N4EUF3L>27LfO0N)P}RE0j-7wz=IewKjpA- z*vumb8f<=%u&^jUaqe0@>_71N3HruP)BueKXty~9+liDFq}()s{^G5Wgh0BmPv~K6 z>c-z1aT>^$w$d<%a;`#_hC$kD@9YP{94YUPnP)WMV2gg^G^bU-Qp5bID5G?LE#a{v zzo}g zep8)zGx?A0wbRK8UNV4u;Yj&k95GuPss%RaEZ;MH+kY%5&f_n=nWv}cOudzoa;bV^ zVq(ug!!3Wfuyd%>ir z(-Lky&Kx>#3b3Stz-00TfOd&8=lChv>Vb~vg=aScJ8lVdoE2CX=vTP-$%Q~68Urtg zUECb1afu&l{IA|tgKE9{gB_BLZMSd>6~^|fryY@_M zuqN#_{`T3ZtIuHtKxLQ{m4OatF(idKzjAIY+Us05qI{?FXC~UztF0dZq8|?uxkFz& zV>y)ohvVvspI18e|GZ|{+>iC||0aT`UIepaypPAERfW*3(uW29B*Y$zjn)M8jzKmd z2d81G+wv>NWM)9aSxD_E(s$Ru1)Es76jaP71%>H;@{z11l{JERex{@tjHr`}1_Ff^ z8VT)p*#E_4=TXY63ny)0NmR_!?R_O(dpaRB+dDfSf!i^b*9kK4t1+jRpkM$VCpz)J zt1U9LqDjRCE(S^rkAkw`!ZRep*fP+AT64%E2+cxLx(@Fry;^*npzTV4q}o*$kK&WN z>AQ=tmW^>)oxpSJW0QGWhiq$L?9CEC)G@jKI~j6wph7rBFl6?qSCI zIuh@;wnq!~-JOdBH%6&D8-|Y9Yx*PAfiD1uu+U|8&pc z_2QO{J{iap(WJX3&^}*|({&dy5D8GMw0e@*x7lv}NugBUFl0CP=$n8cC~~vi051rF zH!DV`HemZ2uJOOnG5=>L&wHxmj6*dJP<;!3QMym30v0Agt~WBx#A&2K_}lidhSRVfI8PaYVY|Gi37Uo3e6 zljDT=F6FeH06DWr*^)-Rn;TgmM~S6tf-jXi1o)p?0I;eajkUm>qIdF@B@dL>* z5Kk%#D>8edl4_XJpNz}{_kW;qLeh5~;lEVaxG3a}sVM@45`{|`}L;TL85d@U-1N~?f?bf+L84U*E`AthZ)w}P~!bc5v5 z-JrBf$I`IU-AgR6?0e(${ruj4;J$KZ&N(yJ+*2g%-%8fF-QUz*E)|3_H(utC5$L5O^HYwQCJL!d5wq&1Un@>I2uzlRsr**s;PGU;G^RfSq_lc{aXnfIJP&rXO?xad@^YkEq?~Rb(g< zhC)M2?+8);e3aNg!uz@-P5;~!_+c;Q6K*U^@*hE;e(ej7d1$?@dyW@0J2fLdq>E*` zOE1EbixrHt?9X>UDzT#+Ab1IZhXy%@HGcBuYE_xO{#!L?H>OJRQ|Y>^yZ?6?KQNbg zS*+~-f2fW&?KroLiGek_$$0+52FQyW>l5&6#r!;y5EZazmP@jO*yR^{wW=;nj>W92 zT>J1Q>dz>Ip4Cw;x`4vc(>D(Tb8Y|n6W3i)`f@A23$sqUQc39)d}t(ei)KVCI;{tP z6pZY5R-qum(gLvIdNhIx;MI|_=z-RdvJbj@K}JDyUw&$|kRizYTkFI5Y#xj2JiO_t z^kDgS`|_q3wLQkeimLiDsth{Fbfvm)H-M+aBbkEzpI^2!@$hJZBf?nB%0;#s=~gS* zq&uEl5l_z}?2-a?e5|Edi47io=%s9+AVX@5d5Gr|p55VKbgJl7xe4b>yM;{2)2#GH zB_6MiGkGHRnTW=m$ee_x`it7k91l|{0zahQ&fWxvL`ax`jVnICfMno!wT7E)(vdnO zD5M7&Rq=RJCGpl;Ey?>m;XHayiHK`T%Z`ey1^7roo`nc+v0g+*@LV4JXt!~oAwgo zv6e8j0~gMma{Nd0%EzaORt)7e&*GRE#ltpJ;(5rMOFtFHA4EPBP-XV73ul;xEVY;x zBXJUY;Z&PUq&7prPm7Q%J3sK2+wdQo7}16r27fzV{SRy4tr_WYugu&>W?uDn7F*&@ zwE{VDH8p}4>2L-tkw1S%|Mtv9E?!8Ue+e0-I!mc}?LG1|r~xfaTp@Emw8o?Dx}Gcl zZW&80&s*$tLl@8ErfEu=43~`P+?jdnnA2nN^6RKTEeop)qpjfEg_SWOOhgeP;V(g; zb!qVcNPMt<@~aiT@^3L4x3ShbVuOlW@xH}vXICuAr8!9Y`#{Q}V4W~gl^_2xxDoe3 z29jeKKmv4lo8+`8v!g;z^lQwYzDQpudQuHUu`m->UD~IsFIIb0+`m3IOZ#p2>V4D# zrlDo9d|%u76mrb*k1BE1eoBbRs25}DV~zmZCmjABAw&UnK?$OQVg~T_M*BWzRSJgm zMX#DyVc-S|9Cs=1QvKaPH+KEv?L~^Tn5C}F!6C23E@e&qw|*v826R@(;oTF75 zM@1iZ30;Vz;@{r6@06QpC0l~B`mc?pe8fOgIgJPX?rT@YG1?Z5zZa|D{nYDMjV&tP zym3RLurkc8FH#y+QYX3S$mJmO)3isoz@#v3HyQ&Sxc+M&7SlH zrHmF!Oaw_201Bo4u*g0m{iOsD@^Qd>H3agkJ^spFtSi(^`$re$CSo9VFBXsiqg)($N(MiY;>HwxbrC zhZ3{_ZyWS@qc~!K_iMXD%SogxgZL;Y;#jW_P}=h@`PTkUEFF|J19Z}wHdN8_f6A3R z=^%-7pqT$thg_4Zs;<94LtX9}+0Lh*<$b+A64I6l&Kmze8! zp)rB?y_l$0pO{$LlK03(4tY>1=reXxhOpRWozdiu-eT^cv=5h0|69b-bBp&Pc65DD zf;MYc#98XSujQzeknJsME!G%TT&8Ru>@Gda46cPatWct-uj&l=-n^$E@2R93o-x3wU{@{|CT09 zN>03NZRqXxTNq%WG?osziHtJi$8lNog zx6hAKy&1cmHnuARD_n5IxA-v%FvKlWJg`g+dqgQZ55qp=r6UBwN;=t#aTl?zKyKDk?tcHb_+|*%ds);#4zu zlB2E8`Hi+F_uFwGT0g_DPF(lu!Wc@-$#rU>s9!Siv9f(cJ$03gX@`OUvkk+lAa|R3 z>kH6LZ>Hm~y~4nwxF^*y%jh*&9Oi(LFJm0SzR+$;t@fB4Z%qI6txFGR5}5A!OY%ZURZ1 zoNJZMjc_)-A<+J-hX`@ndWZYr&f%RKM^ch@nw{kF=Ba#O(q58;nxs2s<&owO&GN1` zmiJQLsQwWA)i(~IGF{`PwmN4rc;Bo~9%NB~A^)jr+Jdj-V%#G?E4~*mt~HT`(3n_hqI&IH2XkwT%TGn-Y>5k zbh*#3Qzd5#BtU;b^v>`fx5T!7axNaXe+ZQAg$ia*+&3ne1=;BEh^N-PNToeh83QeW zWNVIFdihy&t5U6X+wmfF7dG-IzeeN<`L9`z;-?|yT zw*J<{GE@w$+-zX_TozI9`(jL_>kF?njqB+Wmfz?7Z!0XF-mTP0_&rk;^yTGa7?Bmg z1(f%@Jzi$NAY%oP&KE##_(ktwG;Oyq^LRfv;dGNJ+>QcPsKInS8%6R(v6D(MKd~dY7mRzY}aY)7r zbhY{5)xZ2Hz4EPXgUk2CM4kle<=1K7xl5mY-?`|Z$_lIr#%)|?v14{DVA}J=H(s@o)(=L4w%FZ(uT|p5 zcToQx<;R%V+HVulq^a6IB@Ej7Eull?PB8!7kfYqUSz-3ULE+=CH~ExKB(>4cO)(wJ z-~cEQxH|fRGkNi4Z|alNb4>IY4qUM##1XDR%eNZ%_Qf%)O-|j1kj}nLif(sZg6QPy zE8Q(f)T@WhXI2CcH5a^s4Dp9GA-$b*y@GGM_bL@1(>t68FST!37;L%OU z#C`-+Re!rN%9>HIiwhMG)pwpSU`4X>qE*`s5h8 z=%oWRT6uzy(=-`wQ2KPa&{wW|na{O0$9IF^H4{jF4Ak!W*C&oQ5DOFm zKcsmQ;mZ37kKgPnoava-ox_pvY2es9{Qd_TH3#IBajt4M-_w6s)n(WArBiaP4fN5I zd>-xX4IU=dB@C&VmAPzIyWB-Pfay1y%yq0S+N5}kxuiDXd;3QbZwDdCbYg#>hB|HF-@i{PT(CSg-WKJm5~KY0=>;trtGLA4jnps7Tv_j@1s zF}aYh6K;i3=hMMUzy4q@H$A@<}$@eZAkS!`Fg<(^4|U+Y>%|;QPAnbs+9g&{>gX z+f!2t+sB-4%S4cWM<9I}zR0f&0K|uMBz5Sv`or>#f7K4$mp}uO zpi{0y^^{fPVA%?N7%u+HVqF~A!a_Q53Q0g{q$IrA&Vt`CtRAhckxP8&Qg3p*Brn7A zYxm=PSCt~u$l+csok`Q0JEV%`CA>xc<%r(`Ne96sZn?-L8s=9M!xQ&dd_WxJNli;(^?zY!E`0O)rESAg zY8KY>@)DCPdgZL4%_!DA#M##IUo?uI`1n)%OG?Tm^{AkAKXWnr>mBeE_T8LCil<>}CY>(~t~DLE!`{9xPay@$^` zM@GOHg1I>p-2Tf#Jj5#liia+%q|+&DAZ681ZY&slXL7DB&ccMT)#E5y!w)~wr#QJw zyRxJBNF{{Dbm{Y(2ib0dpM16nu1;E;oi_SSVx4e;bbQ$D{^0+2Z9b&?8?@GqI}H#p zYJ6P2fjB)k14?Rgep^0A3!?B*dOe}g0VnvRoTH~R( z6Zlddi<^fg{^ug|a>=_$fGM$qVCwYc@fK=coa~33i)}924Jw;Lis;KMxWBKUttMv2 zYVYsrId1(Rq*-_4+TOG8o-nb_$9*r@|A~k#h_1+GWw=bB@`P!>y3GBg-9&5K;noG2 ze@FUfyx_(A12=3V4EwKUM*2K~JYq z{?J&W|H}-7$4y!-pr4DS-7~K!`oM2frmM>0W~J4U@K>;U_sX9+f71W~XK}d^l_XDp z;)RVy$j9?utX=GsN9cnyNnX#__AHZDgl*Xv4mL-uncrW5aeTbfmRu}O!~Qm;2?CHV z?~ye%KDFXEJMj5$lL}K}&p#oLx;%Yd2S_ha?HPO-j{%2P`ykYr;bFMB?{D-=@4Qrh zNSbZnz*8AFUnN~{Z-IOO=hRw`Qi|L$0X{DIxy7zQr`L<=0~F38eY?L3cSvmo_2KGK zI?fC^=Q;D7euvDx+)#R<`33(XO>^)J|)HqKWkA%o^#HA3KS*U} z4?AC7W^j#iG(CuaJ=|v(uT{Uk++}6)I7nK-TM+YD7i zE4u(52bb}{XC~iJr=u2AOwX>6hh5xPr&}CUOj*DM?g}#*H%CD^L zOQQrqHY(rnd^avpE0}Hjy#sVah)s(Szvuh$KjI!+`>b|{UN%t{j&zzb>J#3wai91j ztE`frk~V#r{^M8+&){n0z!7ug{ANPjO*#D$%apk9*krEn|U@SHD-o-l~%q#!)vYD2fkk=<(@cL>PH&OO<=C#o0 zbM`fbljR!ya^ywgiy>unN&2U!mGM;L)JVyiHv4`iUkxU}Dgx#x#Zm~79dB^8kB+8H zKRgZelpv!G;RBvH-j@T^E}e$cU-M0Cy!ghRpWzYQ<~~ib$-&E;G)xw+rmkM_s(OZs z6+b?nfc6+w9fpzA831Rr%~kMgU0wLX>-_WOSj)BJS3vqD5g*dTvMK}AgoI{^RWAFBIzVxp> zm+z&#NGI-bh!o!so?XzkyL^XjaSvHT*HSqfoC91R!=RB(4YhSCRgWMI`#?g@#^^c! zuTXVu&>M5+Q8xMdOWXs>lp?1M$J_xkfC`Sq`A~~=?cG2{%6^I2_G4DQoxXZeIJyXX zxZ(w{*aU)a8}Vc!8JVm11r$8<_WZW_Pd~6facBE!@?dKywR;oiFnnzgE@7$feSnuNo@a%A<|g(38AM_r2GIV2rS)L4C!8GFwg&#)m6nU zw%$e=&?_ah?9sKS*~I#1=WkU(*&IVccg_+0@8Qr^PZv47B#b)=;3WnL!1O4(NrVDp ze<&*G`dV6A@_NX6!;gWg34pPVF}h{rkFBm{rU^`B@?(A~}5nEj?!1;uM_(sq2n1ET@rnXY=pJD`7x{HTQO zdOg{9EjXYSR0C7Ck7Sd=2@@i!``#J->1zx+wNx+IXV`!nJuRZWo}d01YO8^IiFmkf(L^^{*aj38f3?s}zz~Ehn|a z_`Mmc8tBhNIsER%@W{`u{W=tzi`6|HS=<4<1j33LRsNbh{#v}Os7|jCah(zRKc3xv zV&4BgXcnlxy4sL$?w|yE>g0HDaRTqFynaF1&dng=hYx#m;s+_Mc}o|HZ|P;J$5+v&mE(wcoO41VX7-4jemtf0aGUUb#*EY?7DRPkvJ& z?s{0*wN&#Gd>vL^bt6Nb8*-(&siKU?zC2)A52PEV#jTJG)=`Ao>8g(}2=$}sQqf3w zXm>C8x}?y^X=~%aevZH0c5fX%?s6H7nu#$_^0 zU_*9I9%ogd*n0e7PEutRD-p9}`IiYh=qVY_X$kU=cGpD>fp}79qgogbuaLp!lIm&sV9XA;RRo%8?mfFva?dRADwvkay zfqyvj0AFgHcddFB<&0_;MU)%R?HTVZ43i%ZzYFzZ&WKL;{CfLor2Ee!R#lUFg^Fjq zUdg(YK!W)esO*ANpiF1bf7&BC~N2?;9KQN2@BF7_*zejy# z1M_Nq);i!vb()+@EFJT=UGu2UsegyZklYX>wOE-JM5;hK`&o0j2i!>K<8QquisIh=y|^0JCur&Ia#~ud(Ct}ls?@{O1M{;E@Kahk$iuo{7 z`2wmS>NEA12~>2%Fj^btx1Hh8-$e~ z87c*ugFvyL7kDn2>XM$&vGp`GF;2F!jkG903U+b7A}-|-nyDLkc55FLfIg25dwYAN zJ6Zzw(XW8VO82Wj) zWra11LY-*3FK}D?QzS@K>GjX&KFt+b_DgrKY$O}s?R}t4jI8PFY>*wv)_@W zq=xwKh`yvx^h;1AE5`f~aoDW3v$ie5j`I+9|9N|0v9|8;2t_G)v2BfWz{Fbp*0#xX z6RBMaGvoccOO&PAdGMKtz)JyE*1c{(|TUmM){U5tgTkA0WyT) z_>Y;AE91uM;k!@cmh}nUuEoc3!58@HD=B|Ta|kVLhkj>7w8GlGX5#{9jZ4&iWJ6{@W0JkF)S-<>S@iOE zjtTqImPd8=*VWZHhK-5sxNP>b?45{FPM?(pvx?IB)tl_o1b>`Vf2T8futnEuQ^8xm zh1GQCMp=VYc`mC!M@Jt((IFcMcYPEjg18+DND1OlWpB`_C|%q)7D0PWXGzv5!M%Sy zPu3MyV~FG~awTgv{Q0%oax@F{I}p8-T?y_}22U(#X>qgps#Qv8RXX*-CS1>HSh*z- zaQylysZyy%z)=uWX^;5pROlb)>4o_*?`fl^0EjGoy*JZuGP#xq+$^I_P6dmzWjDF4 zKNTURy6OJ=uK9d~bN-z$2vWJ(;G*@4vwgNk=L=nZkGp-Ze_qwL{#y?`5mKlw?e`f-c)|KJ0Yd6C& zmTaCF+C{68FX|&zm_4`%DK*#PJ=AI{Y;f;pi)4@_!fTsVc+O|wF#Lt_%%CP(A; zKEvquHe-^ewcMB(5v9#)d6{?gSg}DEDCvg1*{kUZ z*L=ss{f@yqP|So2iTme8$j#6+PLp?=#7n~V+KhYTO$OFz^$7jE78zOxeFbmj zWvW*eZ|u>I%w4YN=M5|>4XHa3UK#vYFDzP{0P9`8HDWcg75^toktS55h@Wa2WmT^2JtYqWBNekoW38!sH)gn-9f)Bba_@0p()R%XcE`;9ygKLwdeMlDS4?v-EsTZ(+2s=M4!V6T|c9bkNoxK zJ)sJY4{J~*+T233EvQ$cB2>?UmQ~D@q0L|-$<2!B9e96gMT?k4^P|+IBVlc9=-x0@ zdT}!nMjDXhLMWUn#Q4IZaHb%`uK6o|tn>JeLlFshcZdqOH<6F82kl!L9l2F@gCR6A zLZ%faY3noS^DXt*+GGBPIc$ooW4wk5$fIl|Od|6fHJysFjlPkqkiM+QH68>32p z;~uYQ1iEmjxx9EYL?v3jbD8G0R~xhMw*8l4!EHC+@no;ShUN4}hoX}%}bxs@7mVOZw5 z)`?Y=&vyTVm=Y2m8bMQJE>+Z!MkB8)%(*$8l${ZgoBfbpb*eGr&^zy;O4Wd+>pi}h zj}3Z!P$pOaIQurUwQ+x$2T2;BlkeEBUvaJD*13z)xQXcTsRgN8#?7jZ7fl@5Ua6T| zau!bZA8Ut>-fccmOn}%}ly_!(ML(+f;BUT1 z5ZNTcgTb8VYri_%ZBZ2c=XtGJG{5vn8qc7?+WIRbVz09Mb{;-cdhZ3yTX~EVcnz8b zt(_|E*oIuaRe$pJjvYl!9Q~OfwIE|4(EbVkz-aAri8ZdB4exvH9f?ra;41-Zz`}d% zBjy150}tG1ikr2r4thJw3~4DwpJTY6Qgn!tka5QiQpY8hUQUWrSKkf%Z+?)|hU(bT z39|gK({_(+A;>9G0Vwyiy?8>|{2^fZ`i!rW9_hAQIV1F>S?wTUB80`00c$sPIC!oP z4z2B_c0RYukaP4aBa*}@^^WM#taD|XfFCVE)%*!`Nw#Ga|Wj*umkLJg%9zsiHU)!HlxYS_RN@NG6IKgE8;JPOG-v zX)H3Hh_fYEA{0{DaSbuJT&G2P?T*gelDJ;)O&S*=>bLZGvXddn6aofW2J`Y4+ezp5 z^V2$dE@dj7U#YTG+VVk@o**(Fsp+S&6x_?^tDoy}yqi1!(d~;(j+`im{r6oosAQby z_8IWvm^Q#+&MH+_=%!4PmN4cc8QRg(W|cxh$w;fkrc>VHgm8mTIDaHl9cBlK zAj`7iLW;7o>MDyGjkiju+eFB&P@=7N7UEI6`z98?y>W41Rk)u^i7~XSn zY+PCx-UF>ymR#i>0DkZ3*q(ADeg0E+k-7xcUQg{Z`qI|=xdtxSpM|&fX+-zY>%u3i z#r%{nEPlr4Xp4|^Nc7n@WyYnYqvV^LKERL<%#D%XCupXeG|X`1C4-kUW)47M_82ad z$aL*D1~tV`Q}yw=l_i9l&Kxj&oGMAiWafuYu<~_i`@A zYuy#zwq zI9SpS<}oAhj45x-rF2_$W)TtmFY#abTx+%TI||EQ2B5 zCqc98iAI(Yb>RvUYJye?J!bWQ&$EHcA2*NX69x^DD{dfY#L1?ZQm>Ic6n&E)XMm)h z(r1?JTUfEPqmX;P&{0C>25ftIHQDHAnx|f znVh{l3$Kd6720p;d24g~r2+M#jQ<#5K}DVJ)fvry!`A_3QQ!IxbDYGU*|&rEamF|(cM?7Vw_y|xo$>(Abs;GaFWuYGVDclv0f`r=JZ!+Z8BIFz&f z#d;+5Nk(0!rhPBr?8D{KA@O9!Y!V@peBYhDfYfgOSNipd93OQ%de7d(asu#1foH#G zcqKF}ZCRyW%nByrrtQ$;X3bD}e!$cTCXa=?lm=G%i>&K2b^X}#H_Jshxl|wnJoEq2`2bf5)x6Kb@t_Z zF>WG`%A*kym%mhbn{L;!%Qfo#Q}!RK^|O_*BXRsJ25xl{WE~%J?P=b$j z3SH~!T{oM2?EeuT0p1Mj>CPE_8D46Z)XL%jrhS{&Df}1Ujt!ECMcqncdP_DkOU^p= z6)i-2S;_o9y|kG0pW|4+sZX`DWUgVwh-$_`xji$g#*QT=lwwf_;56-Z%=`Xi4NqlMs5PObA%Ja<(XzdNYx0ko5ZfKkn=+6z9sfTJLxM_6nE^HplX%uH( zZf0*NM`rT^YGBxH_b|XzdF=d@6Rvd9J|plv$)mSAtVjHl zN3YW>(~4WPcyzd3I2+<<{`yRi>4iUQr-E(`Hg*JznHCqdl^3d^bRVpTc+UF8^?s3% zEdMU0`#B=i5TD;7tmB}f1b*P<&B-O}R$$Y%OBy%pRyDTlQP@fDH~3ldJVCb2a-SH= zn-{z9eg7T2(jgTi{&RcK&>V zSNa`)v?1BaLbjaS>RIrtgdb^jx%jc}r0#kKX+rCGs?4UUNf%l(p_$&Hy&Bs&^HQ`G zS%x_+#kfYSuppdpRKK;}rBv>=LyhPAbZR$~YPI|A zAkhGBfafgP1=Hn?Rt0z>T?}oGVJpEsI@EBIHH3^>PL&lhp~p%H%A!_NhC%WgCt-%P z%Pt$5OS#@3c{J-4)<=BC;66S6gyB*0S=viw0@}2MrruvuYdX;zG-Cu*uz|j1xe3Ly zE{}arbFDoFbQBBtuhbnHG%BzTE&pkMQU+#h_am7ABWVk*wrS*N8|ApY48P32r&`p< zrqE2VrRGsYPa+c%i`$P!kz-m7nZ=E~+38KbL!Jj7+s4gy8Fh*(z>?m}(ekqMOV+o` z{(i+d`6~jy{XqQ4&V`sR59K!AYPLRMF`EAT0i=8yqNz!D?;q222E0P}|Kh3cnyDsb z0UU~l)z!f@&rqMH8;fhveWk%X;i$ZyI3Q^ldqsNw?kPdTC~N;)hENi!Y- zj86@gD&dikDOlj3+5m*$^>u~_e^tVSnzlLprlM3M;+-WdWi3Bi)(($yt3cUBX`pN4 zr@d<}CJskiTu&oz3}xzhUpnz@GNNWcYKtdCPZ+i-t>9C37MrFe$2+*2H65VJ<93~{ z5~-1YMr7gV?VjK$>~B8K4p}vsdC9-Au6013@)-weZgSFYE2SLSquKnu7Twn)^$`O; zPdUqSr&h()M(}zsn#E64+7=&W>8i<=@h~v&iJ4}GBidFsYfGFtHiuAq!2v#UmI*1{ zf%BjYeihLx{^UgP@(V&(s}?t4`kF(G`oDZS_{|Aa&#sqBi3WGhP`2!NjJ54d8v*dc z7BPq7=eYa|*t~8ZgK+Q**kG?)2gsMy8W|_Gm*|Ckzm>6cNXc6%EQT0t!#2Nnt~6$d5q z>kz2!wH$WuSqw)!a~T)gvCTEugALxZsaLqoC{xaDJk_+;ldksr_?#l)Ug{0s3|faM zV=(xY1+uM9k3JnFx;7d1j=ar3(r1}iINDnxpB&NhTduJ2%&^7zA(@cokD4zyUC8cF zjl_`is|Q7)i0?s7V#bPy4mR&z{F67-az3ag?|^2Pqv*}pC9p%Qt8w#o``3>YrFfAc zivceX5{}6MiLydN{5v<(UGR4hxYm_5Y%#yi)YXHBTZt!BmRiof;Dt2gFW+TaB&M99 zv#z>Z%RRwiCj_;edckH@nj{zANm2u-vt9=?GP#?QGsww+VEqgncIJmzs#2ov+|T!xtk=@kK)NV6H2BX&(&qJy=5!eF)uSw<=vH3*lu>~a)szoRQ>V!^n z$ZPBucsHw-R&kaa({HbuVf21w4|fF-iLFHgqM;>$;FNz0NTsg!lAR|fvA?{j;Kq=m zh8P^~s-D*C;?i=wEpAqfugS~&w>u=xOP@LS@l>DOtYC+d!50q9Z`@1t6WosGm9#`X zn+*8sDLpW&G(+mjqP3}G4j}@w$p4r79#yzO75wkMsgueUX)HGRxK2&&SpCj4-J>$;WhL`Qn z$&iGw+x$v%!~AP;9p6qp)q-8jxF@`wm&81n(`i9e_!gD;j)qiQ9R7Uw3^N*s zpMe1~azfIJ*q)G6Lp}tE@YRnpPhz8%Mot0J_>qDoMxWw&^Bv8vy z_TRmQ(u!t`)2Z#NL#EF8Z3va`ABKebek%V z)fIJ)F|c&)$`yK`<+gpdw84N5@8CkRO2xr&G!dGrCMQT66Yp+3KZBOYm(1t5FePmN zcf;bbVW3is!e#cKrOZEwsOzdz%F2cAy(B*kp*zOV*U+$_3%8z##4~LE z0%N`G--&3~!yApoNtlsGnk*CPzF7E7i|gH+m(lM+MW`VMN-3_nxBEph@kDgJOTzaz zlF9qmM{@5l#`JRJ1k`xQh+iPn?^K&zy{WSI>tU0Z9(e_vV ziC`lg-)y~cb?_spi1!bdNrz2h!cPBDKEe+5d&;Let#Mtzs=Q$K;fq#jOv2qX888B0 z%MBR0KGH6jCgD*!5!n{%D4@cQV&w2Jxz!zUJzzS`?x;T&iu26UnYb)|Rj!&?+Caqg z>GEboHE7A(WsD~8cDLrTB5p9bGqz2IDeX2}UUvz4zx7hs{I3XuaPc?9j=l@Zk=Gd8 zz_bekD&Ivfsg9HZ;Q9pAriVrxU<9c&jsDT@v} ztyMQ}mJQhy{#^Zu>B>L0l*RoXd@9A^&ve*~h3jI8N+vvFLwt%A>c}tJpQWlFWmzcj zV9<3QH9^#^gbFD0E58aB@0{6t4CtRtRabX)dD@!1)` z{`^&qB<|BG-M}VkRo-o3dX0%J4WYF`587>sbiEvn4A@$gU*aI?&vL<+lDn1h$edHK zKqMh^rchfg$*c$$#(Qe!wh_+*0t7UWVJKK(MPqMfOM>#US7M};Erfy^Qcc(?s*?4- zNgLv5Vh5{;B6FS}IZaQt=OU52YvNb!;mQ5wKDhg{MLz$IIn^QFYPdX7tB!2Z2O*!_?- zyJhWD^XiY^A1U4~^mbP;adFqBGm?4tOCdX&l_ z$@-&gH>x9K#U6~Tv^QXK&GMIout+Ul!*d@^nem72osJ3o`S_~N=lwGriM2!`*3|=l ze%i2zCY**7!n&}{4OrKGf16@b=aJc;Zxu{<^s(2-G){@g>NOh1T%1nJU&fs=B-8pW zvexIZ3rULVG{?GX11=K?DY$yN8azsM$6v=AehsWmi4pQ(a8omP7(jon=N}!)8||-4 z)N9tRgKgU52x2LC?T%F~IWh57akS5mI!^g~+!YZ}E<@O(7QWlNQjx)H`|s!DVK+Le zI`btNU_MFH(4PD?7-SR7uEKMpHF_s*Y|Il@&W-Von)&eXs?DHcuyWyb@*hpj&imV` z6d7trq>uGMGGPsQdnopg+Ru!Xbm~p#`jP6oFGhppddERaQ>@E<#2|#E$@r1&tTK;Q zy@3wdjTWIgx@LdaXNThzOmBD9?iuCHx6+dNf=A_p8_M!oyhNhSvjV#6`~&y4%t7ef zkF;cg4*l7qnn`JLheec6|D2~D8%7Azy@(tJ>69d3)0H1&uV1&clK8J~ zzLk_jjK??%td~?Q16ivnhnUW4KaV47inf&p|A7_3^56`PZ9@|&lW|90RM76bxTd^B z*Eaps<=?7~K}UGuTiHAx|3L~nMea}zKu~=iGWiOj6Pd zy4WbUPNBR_)9Rs!^ci%$&YkF=_lT_&@|C3Ly}MFUVq&XXs)6^BBQ@7FdAe4KizwUI zOcQsl#=l?2&jn?%42egE6_;T9AU+_*aZ#K^GILfn39s0^A7jS4kvbR}IC8$kS0yii z>0eBA;{3okT2O4TU+5#7R#)3nvcK0%2R-`UK&#$#BKY%*3qZToH<4X=jx<6B=P5QN zRqq>^Y@%iNo0_7msP%ujq>+GEH)EwFr!vUUvVGsXhJK$hKXC7>T#pDJ_NHKqRiApm zJz>g7ohPKwxwRKx>tQ>aAwi3~&s3tH?0#Bi;-5 z245CU zxY<0BH~KI~1sH)>q>c9Y)YMRPQrUG80 zuQytm%a-sHDCk@4KHaeU`Z}fFp5r-N2ZEyy|TG#9pYD5bzxUpr`Tv zjHSI!z%FJj!zGM=gUC{s7l_>s<{RQ3;lQ+_k$Y&^qw!oPLy+`lqL(f#8rzRE#?Bp{%2Rz)^jtwdb)*i@VukN{8azoo92mCDO+Ay#GXNG69KW0bnA{bUGHj$t z{zwU1dpN7}W-R0~ZD-W1d+TLn@KWasgrafk#L*i;RoX1ki%e!_)@Uh`iO7!FUFE!| zxZ&(2BnVQT$87IHsj2hqHp|HAN;{ip3|#GVA<&wJQ^tF%XeSm%mjwQ(%Go*x<$3xv!89`y|Eu-gK@(^(@P9Zev=SFfkzdtj{q zBQJq9PRrOyS)Ugh*<7Vs;7CXUbqVF!%d|5UzT>9&)5R%e*co(x<)ib3naGg79d zHwug3ChKc2OON6ULVZ;MFHcLKUuU`e5Ag9f^tRd%mWb}vqT%3K6u6}2zFH1l{K&m9 zr0#rk48S~@%U5e0G?($M=Q{}(Z(a}c3JvIWZteO(VVXtZJvY??;fn>ZcMa(_DZA2f zp0HW!xc}GQceXXzbnRY%fG^bmhAJh1B2okiic(FeiV}KLqzFj81?es7BLssKLFvT^ z(xf+$5)@HxBm^naiwX%+m4F!Pp789Su#e;YviUeOnYox*Yp!#h>s(3Z6V2WY7Q&}8 zp5qP^qo~K~jRpR#8h?+$=Diq^;FB>B33glC>`iEPF|kTtoceh-4vCOYY|nK|jnNJX zVFW5dtkRa4$Pe&ruHsV4*X+J652`M`mn$8d0&mX%@o zHLDvy5`x4a9o#7I$fm|lxe@la`AzMT=~}2^UH%54032@p#k0MK?d_CiZaLeUF=!WHCP#QDbcPCd0M;DL( zdyZ<1ihac4?w!#VR`_&4GYflPkQdM*z7lwwCE2CKTE?$tqa>IwKF-Sj8ELI;M(iJO zY9&b<4_8TnqGkfXLYgU(2I%^l2B(Yj69-x*+kK<@tL+vZV@gdk9?#c6o+!pzOPNnJ zWr6w<881ECHtEs}iQN(lDl)$sK|_2u5srJ|i~Y2L+m zD+xc1bzYjTDbYhxLgntI9yE?pw)U@aBYzhHu2D|Mo^mvNqq14|_hSRcrc4$gSc;Vn z@sgQ#AXRF8L#ple+RCN5?bQVOkaC%gm9$j^&RtVx0=^+$%9dr%NO8zX*n5D$bX2p6 zN&gf)K+BEiCK{bx4pe))bImh7#DvK!;(xMN9g*HQwwcD9%J&ud$k&#nvR=gWk9_L; zx`j?7Ry6HIQ8TFO1#+cQo&kmNuIEd#r^g#e;iEI%H`uzJivW9(^(^TH9WC z{y3@i;;R#YiTDEh6@BZ_DD)S_f?tODu{?e*QVm}BN(jO$%k!kuo%{Rim1nk6<0SfT z=*-&c^lGF_yw6$LFc3duDN*8QenK|u_jHZv*xvLf660W4UEU6I`xo_wE$WjM7utINd$3KL!_l-! zHi3rFQ2^|3ff*V+N0F#&ic@}_r;C7}UDz)LF94J33*{J7E3Lwd77gW|?;jSN|D^Kn zye_xeCL9G!R9mfXNGI|~zA&V2j<5ZBh&eyN%UH*5e!QbkJYSY%r0KEbH@t(WX}MLS z*k@g)ZKEa0hp*AHI)Og3pl86X7RX305F$OlK?lFudILqFFV(X9P4I_s*q5(m75S^$ z1D-M zHf76YzLvh|$0hgO>$^beCXKi2gx<_gN*H&?NpNXghqDO6zPRJ#a?`V^PfrfmB>WMG zcM$bA1BRdNq`*gS&>iHgDJr{DmTuWpw$V{jRhDX`;&AJ)vsZ~7$l!o`Av!vL|Fb;g zKwx`qN9oW<*VA*hwaiQVO@j(dobK-67mbG_%0O;G!=Tc)!s!fOlhfjqY`(>_@*c}L zARVc3*YbE>YH}*Q$%cg_Xnc4G0vm})vNxo#kURJ^P6>f1pX9%-Z-)=zndFMX=eM`r zRep8_X(BV7R8&Q1E8n(nxO)8fznn!tMfabdzIz_=9}Hxb%T_Tr6!_LsCP3L_;T@^Q z(?I_kHNe;bi8jaQ+dAj4?*({U+Kt3paX67;iF_%Kw8ck8Z$V}z0{5W;TU16ve>WK? zT9M0cT164EO0!P!;ZFgorF{>hJh}0}%XQl;+i%cm@E~E|V+rl@Il4{d(|JUV1!20t zwRKT%_=$XyiB61f%(LnDc58VVwOjGNPuhASN<_TA+HqY3aASH1grS*#&#}mHd5vy& zi?xI2pzaz+hb=2n=+dYSgwcU%d3#o4oXOhX3s-|0jU1Z?)=XPaGU7eE)j$?I`VUHZ z_U34E`;^(i_=REVvK`BiGC%VhC;2#usaER4+K9WC2sg#teVE(_Vp@E*BDCv-?g18~ zt+{cLw$WDyWtnh0q^7c;MG%}E>;&&_A;~8++q^UE8Ad>)CsDN~3&i$L5^yGRPl37ggpFJ&E5 z3a_pa3I;1Smnbf1O=}i2c`_sKX}PH2V6dMRYn!h`yU#{+Y$bG6gV_c_a6%)|gs~?d z8{{-)KLk;T+Vap^^W|6#=JxwuZ|wYeE`d$UQJii0teMZ`$+maQHc&{KK&ZOhv+Nsy zc`c&8bu_#pN2Ix!ll}tx+-{`=?GmZlu#Pb6!4d6kO#$ zwHvL{f>g*JP}XUYfVYaVstEZ$_s^$`+Ine62CnlW|6u*|x;nt)WwW-`v0Eqf1L2pa zqOf>vQr9i;vK>(s4iLYUC!H)DOkC?Jybo@&5C`{i@t}e*C6@ln0VYHqFCn}=mnYg% zvjQJ`<6$q2MfK%DVOE)0*n_dKl6LXgcK-@wKiuN6T?d}c&N>q>Kz|iE4H_0 zCu$y!;)MZu@bu~yC@J^^73wO?g-^HuY=e*!58fZvJS7=uve(&Uf$B5CzXLOFafJJ+ zl3gKlnU5@m@sHK07if{#-hd-*BeL9DfG5jf;9qzrf@pmm4G}K5OzycJ_RpDAS{QgEC{BT->^Xh}yfR zrZ5hcT zw=7w%_X3s;(G%~(v}Q$V=G0|FqgL-zjv1m^%|GlF(6bExTzHV@z~K7iY-(8}c{8bs zkT3$6jdkb5+d^l+|F)%ri|7&!nY1jI>o`4qSluIuAUJlzH?GP5AahB!xJZq#!&y$i z=I{KjUb>?3vc83GZ}_MB9Xo9P9}AEtj|-b-PId;|)EdRi5FIw*s6lEdr(ZM-E`32| z#p{8kCrAxe`JeKIb(L@+e`n7Xj82QGD8s+m$*Q{RWFB?d+WJjd5*?!+{kwllg$o9|T~`9cSMGULkei*tGLJ1+7&`4# zSLZ5?G=dCxXrE?f$Aw0t?LNbRj4ZDlnuE0ZGg0CI_5nsviH3YKSumqn#a7Tj0qjv) z#i2Z|nL{@*Ipsx5`8U5djb*^cZ4uH4Pv}_&ehdLh1`7;^fkzmpr8gnTR#1SE=JNJ? zmsx2-4r#9@`fCB*-e9$wH7d!DOCOCECc}S4yOhfm(ANqX9 zG-XMs`4PJTKSrq#?lv<~t~B~Z(~t>#oxsOrEtkpnMrpi?sZvxXinma65x_SiVhK20 zZGQkmI7$i>z>2{+o3*Qjpm@0udqM6??AcW}=ERXlZ@8+6fqkic%SWsl($rzliA%o7ZSaGmDdTe#mjvLdnig8 zQ3$X&r1*|i)CxTXqf>#FIWHTUgCTdHoR8B(^aQ}RQYqfYn?C~(m#HQR7OpJrrSV}k z`MH}NjaeAEE)Yg&ynOwVZm+)z+!b)C#%S~%urb%P3m<^@Rco;XT9mt`-B^SxUhYTf z$oH$lN@LTJxrnCHcMD;GW`F{T$*Tf-mTq7>FK~vFHd&ou+E#s4wR`@w&G^aU*q0Jd z;{ca%k7B3h`5+0*c^N?r0FLp^3on&|Qyt9OPOc-;$I+{24zpQCOR4N9!SH#9AE55y zR$dY$03ijYJyhiQFx&V~h`vG6h|Ky!=~>YX&9g9AQNI-&f$VL+IRkuA>30lwoYp}=M>ki>}9mwA(n%~nde>{X(dQl z`ZETX*mhg_s%Y|IIPh_k7V`-MtCS^Py5Snuo##3leOhrL7Xa_@45|dg`daDxs_397 zuPxV8blOu&&z;H}q!ID;>kJQDS#C8#-yxl^iYf9xPupcFI9l@Jw;f*ZDb9XIJ}SGK zo`s4Q5fZxl&pHJ7v|6v_{S?CtsyL*7`I_?7b?&51IEyT-q197uPJ24CO)5rXH_sW4 z0*t8qWAHxX@1^lz5&WFZ;qQi#LZJM`0dX^|`ipzd$=Oz*d+xGcL5dr#Bm zeMuvN>-o{{W&>vdm-*Ny+P_GSO6G#HlP$J`aIrVeJ&nDJ@N!vAnm24zqIh#YdMEy? z)sx2(jaDT6*Au~I2K`GIoa&p?OT{(j(IO5V(VOEDiW}pfjXDm)TruaYU0bmdT=vZK zfM#uKl4+0T?t`)Y0m4dJ{gH|&~X(VVjm+jYzYE&ABd@qA{LsDKjE3}h%2Kpf)E8S1Z2J_A)-O@1`0 ze{>nR+Xxp&wn*96EEF7uN#zL7S0|r_`rW*K?Ya(}HL={#IQ3ch_6gDmCm8kmyYV4p z=h&XsV0a%?51uGmGfYlazK`HMVx#I<+eW{r=X|DI&O2QV1T4O7RldikK?M>Aq?Vl% z5MU!NZ#vYE5EgmcL>JM6$pLwbiVqmpUJ!EExX43-c8?iSv_4M?!-*JqE5=$9T<(}g zmE6P9$8~?3p{%0@`t{Lnnf?GXx}GCTL;YSgxCw8S629Z8-wbIFJxlj4=ApIe`Yf(yJ)IYc9azdk@&>}u%PJKN^v-1I3P!+yxg( z?|WMhKnCay?>w8$YZa7c7HHs=lIGl5WOZe&kV`yA5!ubt^E}N%qU$rTq^Fu7#}ZZ~ zJbozR#t5uccyuWcbRhERAvCb6s_6p5#m5oc32;T zO~9}$9~}-4ERhAJYyW0eYLW7TIzX=aiugxdNq2b-Ynx#fl@scI6FRE((WP3p=hO2g zhd@&PUEMl%t%GWzZd^$ye(d2iKPiwEax+z%dpqIMA=^`ItuL+ALa*cYapU}3*&x&d zhKc&-oq{CG3k7_K%yyjcK&~m_q8D3H%i4P2p^^r}sDJ=|P}307y_O8V&LQEE@VwKR zm(ES3-7vPRf8>)C@0{p+#aNKk zOQdY@Zf|E4vq9ZW&78g!Uc z@~alY#n(RH&P?cLTyXhT1*bP6j1^+R$mPXl{zxTSBm{-&bHDGj!USG8*>idAUk0|* zd8unLw$~nj2Z>RR3x@qWr)Z8~+-U~B7r}uNNH@Y&Ai1Lfl#blt z1C0un7?+0 zyUH8tfOmKIPYs*x=X8PEShEj%WjW!?`xG*3vS}iAD*&&TgbN^wIP^yp(zDngHO#&7 zWIlD~)30)7J|QXxd-GW&1p(G(QHa$7k`tG0yN8q|VW|J=_VbUn-SZZxo$qr}c^rjZ zzi~A4Lrk>C9uS{f@jHH9-k~ETg?^C@s(-NSH>wT*z5%kMs#<9Aw2s4Z?&h9(P*G3W z67AOigIx;`T#zPA_QHQnySB$NL8lRim6db*4hihnseugugo_`()wTq?ZwDWgL=9Ir zO^fa0nQ6=WdUM^yIV)tef-JTWT zd4ME}LqCMw=%iIW7357D*9MGydUw^N7HN&e%#-biCQ2dpGNQ*in*0wfhy&_Yi7)rK z)?|NS*Jcyn_27a1*GbROptuAskc6k`>RC_)kVm7_)r9yk6k3Eo(un|J#fl}kL; zB|gd}e;BnU(jPhMprtD#UOH26wT&W^l+6?v#ni?ORH|m!vGaQW3LkCrf1qyZb!mt6 z56q-Ji3X#c(|4FIbAvpbk=k~YQ zKf^8TajoU{9!l39pW0$>u#J+32OJn*3taIMKL!0yV!@gd{2>BXMD*WqO30`(hIH?z z1e#o0a@YWV$L;lE{cYLFu;1oqN#%l9WN)^ z=21wF8OSbowuOrfKOp?7>^mllx8>PaIIPwFJtQhHyN0%@lEF%y^St%1iDo>#9We^WB=AhZCOMBe<7yI zpF082CgrSy{2*}o_rrIRhTYzQQ>jz7>lbp_xB(GJCWy{owzBr42vQ?c+)Xw>UO6E8 zd??P*@L%CicayY|o&R8|`go?NIP(m^v3!kOVS*rt+h_PCk0r`=NDL7#cU#M=eHAof z4VI(Ve!w5fz#7^|7{uLqr$ErGD=ixA;^?7b#)rYv9_?Jen7xH!fuMprp?<;`lWZNi zvo0aDAT}`4$C^6anAn%i=8X@3oxvF zEO1tapg6b1w(-oJ)^G$g*BcQZV*m>g=r=HHj0S4es&GpiTF_w^qd3W3C6W*GBl^Pj z{I^S)RTAJ6lCsN8@vw|%cac*bqI`(xfAiFS~i&QxH4ic&3Ax9!( z&c^J6=fvjRD%bY6LDnl(3%SK}$jlT`$XehN$rfyuNf%7GtInjx*%2biAuV(o4``p0 z**TJbg}Y|yX`DS_w->&l<-VT-jvCS+t#0MKh#kw&nB<#x*4wMTNAnN^?cHI23OowC zuvgN~kAb3|qSUw$^_WJ+%B?`}Q>o5=gAi$?+#PHBwlI}`j*47yZt{!xzXS4LerLViqjI(^)^F^6==3nt&k)A4N`HK`C zIxcm>H NH5vA*Z@d;<%r`z}-N1Ykpt81@f#?rI!^gc_6;Tw>B z!J&fMO~*?mls}V^5Fl<_B`tdGi!rR$Q#N~MiQ+t1KejvV-wfWg5L7tUKhn4Is_H)_ zQku`z(kyDM{W<@xGVDnu<|bpt!g$vQ{#cQZ(r}iG$1S4C4u|oc4#R;U)dB`EG3<}1 z5$Q{panmw|6R5)XjSKHrJKO0b8!&GQYuWVulVoqp!9XE)<<1GCET) zG z8wL+rC3qxQ{BrJ3f;{oiVDcDUa^?U}nkow9%`V#6XD=QNRbG?W*i=c(>VYXMe*iBdy zV#;FKLbUC(ZEkw;ww)TQ<-TLs3Qp507Y+4<- zI2ZJBfDZ12|Eg@XEfEMmx57jw`dUd}m#+|-n$px}ESaoQl=^uh{fNPa4Zf~?Ii6ae zSY!KP&Nuu^Y1ZrgotYK>$l~!sN{+Gbj7!5halBb(R?E)G)B-O|v>%G}R|*cOf7DnI z@^or#uUKnV)OjmO^D=`NBpxo&eTi`;G}?smHn3_IgFvx-g`2nfPkY6-0r;(x`)QTY z)$CDgqnkTF9^_>YQ3La)(@_3CF429A1 Date: Tue, 3 Jun 2025 12:30:43 +0200 Subject: [PATCH 211/257] Updated changelog, citations, TODOs. --- .github/workflows/awsfulltest.yml | 2 +- CHANGELOG.md | 2 ++ CITATIONS.md | 2 +- README.md | 6 ++++++ .../main.nf | 15 ++++++++------- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 7ceef4b..bd20f25 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -24,7 +24,7 @@ jobs: - name: Launch workflow via Seqera Platform uses: seqeralabs/action-tower-launch@v2 - # TODO nf-core: You can customise AWS full pipeline tests as required + # You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters with: diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d41007..cc3efe5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## v1.1.0 - [date] +- Added support for AWS: changed the structure of load response and parameter check to conform more to Nextflow + best practices. - Simplified visualization: multiple short processes were creating overhang -> more efficient in one process. - Fixed errors that arose from the latest drevalpy version. diff --git a/CITATIONS.md b/CITATIONS.md index e77b4f6..8e6f818 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -2,7 +2,7 @@ ## [DrugResponseEval](https://github.com/nf-core/drugresponseeval/) -> Bernett, J, Iversen, P, Picciani, M, Wilhelm, M, Baum, K, List, M. Will be published soon. +> Bernett, J., Iversen, P., Picciani, M., Wilhelm, M., Baum, K., & List, M. **From Hype to Health Check: Critical Evaluation of Drug Response Prediction Models with DrEval.** > [10.1101/2025.05.26.655288](doi.org/10.1101/2025.05.26.655288) > _bioRxiv_, 2025-05. ## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) diff --git a/README.md b/README.md index 37dea31..6870e53 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,12 @@ For further information or help, don't hesitate to get in touch on the [Slack `# If you use nf-core/drugresponseeval for your analysis, please cite it using the following doi: [10.5281/zenodo.14779984](https://doi.org/10.5281/zenodo.14779984) +> Our corresponding publication is at doi [10.1101/2025.05.26.655288](doi.org/10.1101/2025.05.26.655288) +> +> Bernett, J., Iversen, P., Picciani, M., Wilhelm, M., Baum, K., & List, M. **From Hype to Health Check: Critical Evaluation of Drug Response Prediction Models with DrEval.** +> +> _bioRxiv_, 2025-05. + The underlying data is available at doi: [10.5281/zenodo.12633909](https://doi.org/10.5281/zenodo.12633909). The underlying python package is drevalpy, availably on [PyPI](https://pypi.org/project/drevalpy/) as standalone. diff --git a/subworkflows/local/utils_nfcore_drugresponseeval_pipeline/main.nf b/subworkflows/local/utils_nfcore_drugresponseeval_pipeline/main.nf index 96c119f..fe426a9 100644 --- a/subworkflows/local/utils_nfcore_drugresponseeval_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_drugresponseeval_pipeline/main.nf @@ -192,11 +192,12 @@ def validateInputSamplesheet(input) { // Generate methods description for MultiQC // def toolCitationText() { - // TODO nf-core: Optionally add in-text citation tools to this list. + // Optionally add in-text citation tools to this list. // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "Tool (Foo et al. 2023)" : "", // Uncomment function in methodsDescriptionText to render in MultiQC report def citation_text = [ "Tools used in the workflow included:", + "DrEvalPy (Bernett, Iversen et al. 2025)", "." ].join(' ').trim() @@ -204,10 +205,11 @@ def toolCitationText() { } def toolBibliographyText() { - // TODO nf-core: Optionally add bibliographic entries to this list. + // Optionally add bibliographic entries to this list. // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "
      2. Author (2023) Pub name, Journal, DOI
      3. " : "", // Uncomment function in methodsDescriptionText to render in MultiQC report def reference_text = [ + "
      4. Bernett, Iversen et al. (2025). From Hype to Health Check: Critical Evaluation of Drug Response Prediction Models with DrEval. bioRxiv, 2025-05.
      5. " ].join(' ').trim() return reference_text @@ -234,12 +236,11 @@ def methodsDescriptionText(mqc_methods_yaml) { meta["nodoi_text"] = meta.manifest_map.doi ? "" : "
      6. If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
      7. " // Tool references - meta["tool_citations"] = "" - meta["tool_bibliography"] = "" + //meta["tool_citations"] = "" + //meta["tool_bibliography"] = "" - // TODO nf-core: Only uncomment below if logic in toolCitationText/toolBibliographyText has been filled! - // meta["tool_citations"] = toolCitationText().replaceAll(", \\.", ".").replaceAll("\\. \\.", ".").replaceAll(", \\.", ".") - // meta["tool_bibliography"] = toolBibliographyText() + meta["tool_citations"] = toolCitationText().replaceAll(", \\.", ".").replaceAll("\\. \\.", ".").replaceAll(", \\.", ".") + meta["tool_bibliography"] = toolBibliographyText() def methods_text = mqc_methods_yaml.text From 28fd9fed41f5b686026f9e822f4a71f170c7e428 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 4 Jun 2025 09:59:19 +0200 Subject: [PATCH 212/257] modules.json fix, now also dumpsoftwareversions --- modules.json | 8 +- .../custom/dumpsoftwareversions/main.nf | 24 +++++ .../custom/dumpsoftwareversions/meta.yml | 36 +++++++ .../templates/dumpsoftwareversions.py | 101 ++++++++++++++++++ 4 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/custom/dumpsoftwareversions/main.nf create mode 100644 modules/nf-core/custom/dumpsoftwareversions/meta.yml create mode 100755 modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py diff --git a/modules.json b/modules.json index 4430ebe..617cf6f 100644 --- a/modules.json +++ b/modules.json @@ -4,7 +4,13 @@ "repos": { "https://github.com/nf-core/modules.git": { "modules": { - "nf-core": {} + "nf-core": { + "custom/dumpsoftwareversions": { + "branch": "master", + "git_sha": "76cc4938c1f6ea5c7d83fed1eeffc146787f9543", + "installed_by": ["modules"] + } + } }, "subworkflows": { "nf-core": { diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf new file mode 100644 index 0000000..800a609 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -0,0 +1,24 @@ +process CUSTOM_DUMPSOFTWAREVERSIONS { + label 'process_single' + + // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container + conda "bioconda::multiqc=1.14" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" + + input: + path versions + + output: + path "software_versions.yml" , emit: yml + path "software_versions_mqc.yml", emit: mqc_yml + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + template 'dumpsoftwareversions.py' +} diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml new file mode 100644 index 0000000..c32657d --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/meta.yml @@ -0,0 +1,36 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json +name: custom_dumpsoftwareversions +description: Custom module used to dump software versions within the nf-core pipeline template +keywords: + - custom + - dump + - version +tools: + - custom: + description: Custom module used to dump software versions within the nf-core pipeline template + homepage: https://github.com/nf-core/tools + documentation: https://github.com/nf-core/tools + licence: ["MIT"] +input: + - versions: + type: file + description: YML file containing software versions + pattern: "*.yml" + +output: + - yml: + type: file + description: Standard YML file containing software versions + pattern: "software_versions.yml" + - mqc_yml: + type: file + description: MultiQC custom content YML file containing software versions + pattern: "software_versions_mqc.yml" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py new file mode 100755 index 0000000..da03340 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python + + +"""Provide functions to merge multiple versions.yml files.""" + + +import yaml +import platform +from textwrap import dedent + + +def _make_versions_html(versions): + """Generate a tabular HTML output of all versions for MultiQC.""" + html = [ + dedent( + """\\ + +
  • + + + + + + + + """ + ) + ] + for process, tmp_versions in sorted(versions.items()): + html.append("") + for i, (tool, version) in enumerate(sorted(tmp_versions.items())): + html.append( + dedent( + f"""\\ + + + + + + """ + ) + ) + html.append("") + html.append("
    Process Name Software Version
    {process if (i == 0) else ''}{tool}{version}
    ") + return "\\n".join(html) + + +def main(): + """Load all version files and generate merged output.""" + versions_this_module = {} + versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, + } + + with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + + # aggregate versions by the module name (derived from fully-qualified process name) + versions_by_module = {} + for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + if versions_by_module[module] != process_versions: + raise AssertionError( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + + versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", + } + + versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), + } + + with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) + with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + + with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) + + +if __name__ == "__main__": + main() From af1021404bb9fc5a80a440e4e945afe240cf2b5c Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 4 Jun 2025 14:20:28 +0200 Subject: [PATCH 213/257] added versions everywhere, removed visualization subworkflow because it was just one module, moved it to model_testing --- main.nf | 5 ++++ modules/local/collect_results/main.nf | 16 +++++++--- modules/local/consolidate_results/main.nf | 7 +++++ modules/local/cv_split/main.nf | 9 ++++++ modules/local/evaluate_final/main.nf | 11 +++++++ modules/local/evaluate_find_max/main.nf | 12 ++++++++ modules/local/fit_curves/main.nf | 8 ++++- modules/local/hpam_split/main.nf | 7 +++++ modules/local/load_response/main.nf | 8 +++++ modules/local/make_model_channel/main.nf | 13 ++++++++ .../postprocess_curvecurator_output/main.nf | 7 +++++ modules/local/predict_full/main.nf | 14 +++++++++ .../local/preprocess_raw_viability/main.nf | 7 +++++ modules/local/randomization_split/main.nf | 14 +++++++++ modules/local/randomization_test/main.nf | 13 ++++++++ modules/local/robustness_test/main.nf | 13 ++++++++ modules/local/train_and_predict_cv/main.nf | 13 ++++++++ modules/local/visualize_results/main.nf | 13 ++++++++ ro-crate-metadata.json | 27 ++++++++++++----- subworkflows/local/model_testing/main.nf | 30 ++++++++++++++++--- subworkflows/local/preprocess_custom/main.nf | 5 ++++ subworkflows/local/run_cv/main.nf | 10 ++++++- subworkflows/local/visualization/main.nf | 27 ----------------- workflows/drugresponseeval.nf | 11 ++----- 24 files changed, 248 insertions(+), 52 deletions(-) delete mode 100644 subworkflows/local/visualization/main.nf diff --git a/main.nf b/main.nf index add7842..8f0cb43 100644 --- a/main.nf +++ b/main.nf @@ -34,7 +34,12 @@ workflow NFCORE_DRUGRESPONSEEVAL { // // WORKFLOW: Run pipeline // + ch_versions = Channel.empty() DRUGRESPONSEEVAL () + ch_versions = ch_versions.mix(DRUGRESPONSEEVAL.out.versions) + + emit: + versions = ch_versions } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/modules/local/collect_results/main.nf b/modules/local/collect_results/main.nf index f776ff0..52d33dc 100644 --- a/modules/local/collect_results/main.nf +++ b/modules/local/collect_results/main.nf @@ -7,16 +7,24 @@ process COLLECT_RESULTS { val(path_data) output: - path('evaluation_results.csv'), emit: evaluation_results - path('evaluation_results_per_drug.csv'), emit: evaluation_results_per_drug, optional: true - path('evaluation_results_per_cl.csv'), emit: evaluation_results_per_cl, optional: true - path('true_vs_pred.csv'), emit: true_vs_pred + path('evaluation_results.csv'), emit: evaluation_results + path('evaluation_results_per_drug.csv'), emit: evaluation_results_per_drug, optional: true + path('evaluation_results_per_cl.csv'), emit: evaluation_results_per_cl, optional: true + path('true_vs_pred.csv'), emit: true_vs_pred + path("versions.yml"), emit: versions script: """ collect_results.py \\ --outfiles $outfiles \\ --path_data $path_data + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + END_VERSIONS """ } diff --git a/modules/local/consolidate_results/main.nf b/modules/local/consolidate_results/main.nf index 4b13898..557f151 100644 --- a/modules/local/consolidate_results/main.nf +++ b/modules/local/consolidate_results/main.nf @@ -10,6 +10,7 @@ process CONSOLIDATE_RESULTS { output: tuple val(test_mode), val(model_name), path('**split*.csv'), emit: ch_vis, optional: true + path("versions.yml"), emit: versions script: def outdirPath = new File(params.outdir).getAbsolutePath() @@ -25,5 +26,11 @@ process CONSOLIDATE_RESULTS { --randomization_modes ${rand_modes}\\ --n_trials_robustness ${params.n_trials_robustness} + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + END_VERSIONS """ } diff --git a/modules/local/cv_split/main.nf b/modules/local/cv_split/main.nf index 74b36d9..6ba6bbe 100644 --- a/modules/local/cv_split/main.nf +++ b/modules/local/cv_split/main.nf @@ -8,6 +8,7 @@ process CV_SPLIT { output: tuple val(test_mode), path("split*.pkl") , emit: response_cv_splits + path("versions.yml"), emit: versions script: @@ -16,6 +17,14 @@ process CV_SPLIT { --response $response \\ --n_cv_splits $n_cv_splits \\ --test_mode $test_mode + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + END_VERSIONS """ } diff --git a/modules/local/evaluate_final/main.nf b/modules/local/evaluate_final/main.nf index aa252f8..e5a88a5 100644 --- a/modules/local/evaluate_final/main.nf +++ b/modules/local/evaluate_final/main.nf @@ -7,6 +7,7 @@ process EVALUATE_FINAL { output: path('*.csv'), emit: ch_individual_results, optional: true + path("versions.yml"), emit: versions script: """ @@ -14,6 +15,16 @@ process EVALUATE_FINAL { --test_mode $test_mode \\ --model_name "${model_name}" \\ --pred_file $pred_file + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + scipy: \$(python -c "import scipy; print(scipy.__version__)") + END_VERSIONS """ } diff --git a/modules/local/evaluate_find_max/main.nf b/modules/local/evaluate_find_max/main.nf index c2637a3..34caa1b 100644 --- a/modules/local/evaluate_find_max/main.nf +++ b/modules/local/evaluate_find_max/main.nf @@ -8,6 +8,7 @@ process EVALUATE_FIND_MAX { output: tuple val(model_name), val(split_id), val(test_mode), path('best_hpam_combi_*.yaml'), emit: best_combis + path("versions.yml"), emit: versions script: """ @@ -17,6 +18,17 @@ process EVALUATE_FIND_MAX { --hpam_yamls $hpam_yamls \\ --pred_datas $pred_datas \\ --metric $metric + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + scipy: \$(python -c "import scipy; print(scipy.__version__)") + yaml: \$(python -c "import yaml; print(yaml.__version__)") + END_VERSIONS """ } diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index 6da9267..7f683ff 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -7,11 +7,17 @@ process FIT_CURVES { tuple val(dir_name), path(toml), path(curvecurator_input) output: - path("curves.tsv"), emit: path_to_curvecurator_out + path("curves.tsv"), emit: path_to_curvecurator_out tuple path("mad.txt"), path("dashboard.html"), path("curveCurator.log") // other output + path("versions.yml"), emit: versions script: """ CurveCurator ${toml} --mad + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + curve_curator: \$(python -c "import curve_curator; print(curve_curator.__version__)") + END_VERSIONS """ } diff --git a/modules/local/hpam_split/main.nf b/modules/local/hpam_split/main.nf index 78d0002..1d5fa7a 100644 --- a/modules/local/hpam_split/main.nf +++ b/modules/local/hpam_split/main.nf @@ -7,12 +7,19 @@ process HPAM_SPLIT { output: tuple val(model_name), path("*.yaml") , emit: hpam_combi + path("versions.yml"), emit: versions script: """ hpam_split.py \\ --model_name "${model_name}" + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + yaml: \$(python -c "import yaml; print(yaml.__version__)") """ } diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index f0216f8..799e589 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -12,6 +12,7 @@ process LOAD_RESPONSE { output: path 'response_dataset.pkl', emit: response_dataset path 'cross_study_*.pkl', emit: cross_study_datasets, optional: true + path("versions.yml"), emit: versions script: """ @@ -20,6 +21,13 @@ process LOAD_RESPONSE { --path_data ${work_path} \\ ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} \\ --measure ${measure} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + END_VERSIONS """ } diff --git a/modules/local/make_model_channel/main.nf b/modules/local/make_model_channel/main.nf index a9373aa..be709eb 100644 --- a/modules/local/make_model_channel/main.nf +++ b/modules/local/make_model_channel/main.nf @@ -8,6 +8,7 @@ process MAKE_MODEL_CHANNEL { output: path '{models,baselines}*.txt', emit: all_models + path("versions.yml"), emit: versions script: """ @@ -15,6 +16,18 @@ process MAKE_MODEL_CHANNEL { --models "${models}" \\ --data ${response_data} \\ --file_name ${name} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)") + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS """ } diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf index b3a9971..0ad97d5 100644 --- a/modules/local/postprocess_curvecurator_output/main.nf +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -10,9 +10,16 @@ process POSTPROCESS_CURVECURATOR_DATA { output: path "${dataset_name}.csv", emit: path_to_dataset val "${measure}" + "_curvecurator", emit: measure + path("versions.yml"), emit: versions script: """ postprocess_curvecurator_output.py --dataset_name ${dataset_name} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + END_VERSIONS """ } diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 427f9ed..c8c2a01 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -14,6 +14,8 @@ process PREDICT_FULL { tuple val(test_mode), val(model_name), path('**cross_study/cross_study*.csv'), emit: ch_cross, optional: true path('**best_hpams*.json'), emit: ch_hpams + path("versions.yml"), emit: versions + script: """ train_and_predict_final.py \\ @@ -27,6 +29,18 @@ process PREDICT_FULL { --path_data $path_data \\ --cross_study_datasets $cross_study_datasets \\ --model_checkpoint_dir $model_checkpoint_dir \\ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)") + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS """ } diff --git a/modules/local/preprocess_raw_viability/main.nf b/modules/local/preprocess_raw_viability/main.nf index 4d1fb44..6f29ca7 100644 --- a/modules/local/preprocess_raw_viability/main.nf +++ b/modules/local/preprocess_raw_viability/main.nf @@ -9,9 +9,16 @@ process PREPROCESS_RAW_VIABILITY { output: path "${dataset_name}/*/config.toml", emit: path_to_toml path "${dataset_name}/*/curvecurator_input.tsv", emit: curvecurator_input + path("versions.yml"), emit: versions script: """ preprocess_raw_viability.py --path_data ${work_path} --dataset_name ${dataset_name} --cores ${task.cpus} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + END_VERSIONS """ } diff --git a/modules/local/randomization_split/main.nf b/modules/local/randomization_split/main.nf index 2a8ec1d..6598c3e 100644 --- a/modules/local/randomization_split/main.nf +++ b/modules/local/randomization_split/main.nf @@ -7,10 +7,24 @@ process RANDOMIZATION_SPLIT { output: tuple val(model_name), path('randomization_test_view*.yaml'), emit: randomization_test_views + path("versions.yml"), emit: versions script: """ randomization_split.py --model_name "${model_name}" --randomization_mode ${randomization_mode} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)") + platform: \$(python -c "import platform; print(platform.__version__)") + yaml: \$(python -c "import yaml; print(yaml.__version__)") + END_VERSIONS """ } diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index c21b00f..8072f5c 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -12,6 +12,7 @@ process RANDOMIZATION_TEST { output: tuple val(test_mode), val(model_name), path('**randomization*.csv'), emit: ch_vis + path("versions.yml"), emit: versions script: """ @@ -27,6 +28,18 @@ process RANDOMIZATION_TEST { --randomization_views_path $randomization_views \\ --randomization_type $randomization_type \\ --model_checkpoint_dir $model_checkpoint_dir \\ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)") + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS """ } diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index 4e4cd84..d9cd333 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -12,6 +12,7 @@ process ROBUSTNESS_TEST { output: tuple val(test_mode), val(model_name), path('**robustness*.csv'), emit: ch_vis + path("versions.yml"), emit: versions script: """ @@ -26,6 +27,18 @@ process ROBUSTNESS_TEST { --path_data $path_data \\ --robustness_trial $robustness_iteration \\ --model_checkpoint_dir $model_checkpoint_dir \\ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)") + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS """ } diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 10867e9..5bb144a 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -11,6 +11,7 @@ process TRAIN_AND_PREDICT_CV { output: tuple val(model_name), val(test_mode), val(cv_data.baseName), path(hyperparameters), path("prediction_dataset_*.pkl"), emit: pred_data + path("versions.yml"), emit: versions script: """ @@ -22,5 +23,17 @@ process TRAIN_AND_PREDICT_CV { --cv_data $cv_data \\ --response_transformation $response_transformation \\ --model_checkpoint_dir $model_checkpoint_dir + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)") + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS """ } diff --git a/modules/local/visualize_results/main.nf b/modules/local/visualize_results/main.nf index 0870e18..72da4ed 100644 --- a/modules/local/visualize_results/main.nf +++ b/modules/local/visualize_results/main.nf @@ -8,6 +8,7 @@ process VISUALIZE_RESULTS { output: path('report/*'), emit: html_out + path("versions.yml"), emit: versions script: """ @@ -18,6 +19,18 @@ process VISUALIZE_RESULTS { --eval_results_per_cl $eval_results_per_cl \\ --true_vs_predicted $true_vs_predicted \\ --path_data $path_data + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + matplotlib: \$(python -c "import matplotlib; print(matplotlib.__version__)") + plotly: \$(python -c "import plotly; print(plotly.__version__)") + scikit_posthocs: \$(python -c "import scikit_posthocs; print(scikit_posthocs.__version__)") + scipy: \$(python -c "import scipy; print(scipy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + END_VERSIONS """ } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index e804b9c..7514ea4 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "Stable", "datePublished": "2025-06-03T11:01:28+00:00", - "description": "

    \n \n \n \"nf-core/drugresponseeval\"\n \n

    \n\n[![GitHub Actions CI Status](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/drugresponseeval/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/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/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![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/drugresponseeval)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23drugresponseeval-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/drugresponseeval)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![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)\n\n## Introduction\n\n**nf-core/drugresponseeval** is a bioinformatics pipeline that ...\n\n\n\n\n\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run nf-core/drugresponseeval \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\n> [!WARNING]\n> 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).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/drugresponseeval/usage) and the [parameter documentation](https://nf-co.re/drugresponseeval/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/drugresponseeval/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/drugresponseeval/output).\n\n## Credits\n\nnf-core/drugresponseeval was originally written by Judith Bernett.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\n\n## Contributions and Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#drugresponseeval` channel](https://nfcore.slack.com/channels/drugresponseeval) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\n\n\n\n\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "description": "

    \n \n \n \"nf-core/drugresponseeval\"\n \n

    \n\n[![GitHub Actions CI Status](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/drugresponseeval/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/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/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.14779984-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.14779984)\n\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![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/drugresponseeval)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23drugresponseeval-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/drugresponseeval)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![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)\n\n## Introduction\n\n# ![drevalpy_summary](assets/dreval_summary.svg)\n\n**DrEval** is a bioinformatics framework which includes a PyPI package (drevalpy) and a Nextflow\npipeline (this repo). DrEval ensures that evaluations are statistically sound, biologically\nmeaningful, and reproducible. DrEval simplifies the implementation of drug response prediction\nmodels, allowing researchers to focus on advancing their modeling innovations by automating\nstandardized evaluation protocols and preprocessing workflows. With DrEval, hyperparameter\ntuning is fair and consistent. With its flexible model interface, DrEval supports any model type,\nranging from statistical models to complex neural networks. By contributing your model to the\nDrEval catalog, you can increase your work's exposure, reusability, and transferability.\n\n1. The response data is loaded\n2. All models are trained and evaluated in a cross-validation setting\n3. For each CV split, the best hyperparameters are determined using a grid search per model\n4. The model is trained on the full training set (train & validation) with the best\n hyperparameters to predict the test set\n5. If randomization tests are enabled, the model is trained on the full training set with the best\n hyperparameters to predict the randomized test set\n6. If robustness tests are enabled, the model is trained N times on the full training set with the\n best hyperparameters\n7. Plots are created summarizing the results\n\nFor baseline models, no randomization or robustness tests are performed.\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/drugresponseeval \\\n -profile \\\n --models \\\n --baselines \\\n --dataset_name \n```\n\n> [!WARNING]\n> 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).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/drugresponseeval/usage) and the [parameter documentation](https://nf-co.re/drugresponseeval/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/drugresponseeval/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/drugresponseeval/output).\n\n## Credits\n\nnf-core/drugresponseeval was originally written by Judith Bernett (TUM) and Pascal Iversen (FU\nBerlin).\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n## Contributions and Support\n\nContributors to nf-core/drugresponseeval and the drevalpy PyPI package:\n\n- [Judith Bernett](https://github.com/JudithBernett) (TUM)\n- [Pascal Iversen](https://github.com/PascalIversen) (FU Berlin)\n- [Mario Picciani](https://github.com/picciama) (TUM)\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#drugresponseeval` channel](https://nfcore.slack.com/channels/drugresponseeval) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/drugresponseeval for your analysis, please cite it using the following doi: [10.5281/zenodo.14779984](https://doi.org/10.5281/zenodo.14779984)\n\nThe underlying data is available at doi: [10.5281/zenodo.12633909](https://doi.org/10.5281/zenodo.12633909).\n\nThe underlying python package is drevalpy, availably on [PyPI](https://pypi.org/project/drevalpy/) as standalone.\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -127,7 +127,11 @@ }, { "@id": "main.nf", - "@type": ["File", "SoftwareSourceCode", "ComputationalWorkflow"], + "@type": [ + "File", + "SoftwareSourceCode", + "ComputationalWorkflow" + ], "creator": [ { "@id": "https://orcid.org/0000-0001-5812-8013" @@ -153,21 +157,30 @@ "robustness-assessment", "training" ], - "license": ["MIT"], + "license": [ + "MIT" + ], "maintainer": [ { "@id": "https://orcid.org/0000-0001-5812-8013" } ], - "name": ["nf-core/drugresponseeval"], + "name": [ + "nf-core/drugresponseeval" + ], "programmingLanguage": { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow" }, "sdPublisher": { "@id": "https://nf-co.re/" }, - "url": ["https://github.com/nf-core/drugresponseeval", "https://nf-co.re/drugresponseeval/1.1.0/"], - "version": ["1.1.0"] + "url": [ + "https://github.com/nf-core/drugresponseeval", + "https://nf-co.re/drugresponseeval/1.1.0/" + ], + "version": [ + "1.1.0" + ] }, { "@id": "https://w3id.org/workflowhub/workflow-ro-crate#nextflow", @@ -340,4 +353,4 @@ "name": "Judith Bernett" } ] -} +} \ No newline at end of file diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index c48542d..ab32565 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -5,6 +5,7 @@ include { ROBUSTNESS_TEST } from '../../../modules/local/robustnes include { CONSOLIDATE_RESULTS } from '../../../modules/local/consolidate_results' include { EVALUATE_FINAL } from '../../../modules/local/evaluate_final' include { COLLECT_RESULTS } from '../../../modules/local/collect_results' +include { VISUALIZE_RESULTS } from '../../../modules/local/visualize_results' workflow MODEL_TESTING { @@ -17,6 +18,7 @@ workflow MODEL_TESTING { work_path // from input main: + ch_versions = Channel.empty() if (params.cross_study_datasets == '') { cross_study_datasets = channel.fromPath(['./NONE.csv']) } @@ -35,6 +37,7 @@ workflow MODEL_TESTING { params.response_transformation, params.model_checkpoint_dir ) + ch_versions = ch_versions.mix(PREDICT_FULL.out.versions) ch_vis = PREDICT_FULL.out.ch_vis.concat(PREDICT_FULL.out.ch_cross) if (params.randomization_mode != 'None') { @@ -47,6 +50,7 @@ workflow MODEL_TESTING { RANDOMIZATION_SPLIT ( ch_models_rand ) + ch_versions = ch_versions.mix(RANDOMIZATION_SPLIT.out.versions) ch_rand_views = ch_models .combine(RANDOMIZATION_SPLIT.out.randomization_test_views.transpose(), by: 0) .map{ model_class, model_name, rand_file -> [model_name, rand_file] } @@ -67,6 +71,7 @@ workflow MODEL_TESTING { params.response_transformation, params.model_checkpoint_dir ) + ch_versions = ch_versions.mix(RANDOMIZATION_TEST.out.versions) ch_vis = ch_vis.concat(RANDOMIZATION_TEST.out.ch_vis) } @@ -90,6 +95,7 @@ workflow MODEL_TESTING { params.response_transformation, params.model_checkpoint_dir ) + ch_versions = ch_versions.mix(ROBUSTNESS_TEST.out.versions) ch_vis = ch_vis.concat(ROBUSTNESS_TEST.out.ch_vis) } @@ -102,6 +108,7 @@ workflow MODEL_TESTING { randomizations, ch_vis.count() // wait for ch_vis to finish ) + ch_versions = ch_versions.mix(CONSOLIDATE_RESULTS.out.versions) CONSOLIDATE_RESULTS.out.ch_vis.transpose() // filter out SingleDrugModels that have been consolidated @@ -114,6 +121,7 @@ workflow MODEL_TESTING { EVALUATE_FINAL ( ch_vis ) + ch_versions = ch_versions.mix(EVALUATE_FINAL.out.versions) ch_collapse = EVALUATE_FINAL.out.ch_individual_results.collect() @@ -121,10 +129,24 @@ workflow MODEL_TESTING { ch_collapse, work_path ) + ch_versions = ch_versions.mix(COLLECT_RESULTS.out.versions) + + // evaluation_results_per_cl and evaluation_results_per_drug are optional + evaluation_results_per_drug = COLLECT_RESULTS.out.evaluation_results_per_drug.ifEmpty(file("NONE_drug.csv")) + evaluation_results_per_cl = COLLECT_RESULTS.out.evaluation_results_per_cl.ifEmpty(file("NONE_cl.csv")) + ch_input_vis = COLLECT_RESULTS.out.evaluation_results.concat( + evaluation_results_per_drug, + evaluation_results_per_cl, + COLLECT_RESULTS.out.true_vs_pred + ).collect() + + VISUALIZE_RESULTS( + ch_input_vis, + work_path + ) + ch_versions = ch_versions.mix(VISUALIZE_RESULTS.out.versions) emit: - evaluation_results = COLLECT_RESULTS.out.evaluation_results - evaluation_results_per_drug = COLLECT_RESULTS.out.evaluation_results_per_drug - evaluation_results_per_cl = COLLECT_RESULTS.out.evaluation_results_per_cl - true_vs_predicted = COLLECT_RESULTS.out.true_vs_pred + versions = ch_versions + } diff --git a/subworkflows/local/preprocess_custom/main.nf b/subworkflows/local/preprocess_custom/main.nf index 872f9bd..7e7c0bd 100644 --- a/subworkflows/local/preprocess_custom/main.nf +++ b/subworkflows/local/preprocess_custom/main.nf @@ -10,10 +10,12 @@ workflow PREPROCESS_CUSTOM { useless_count main: + ch_versions = Channel.empty() File raw_file = new File("${params.path_data}/${dataset_name}/${dataset_name}_raw.csv") if (raw_file.exists()){ PREPROCESS_RAW_VIABILITY(dataset_name, work_path, useless_count) + ch_versions = ch_versions.mix(PREPROCESS_RAW_VIABILITY.out.versions) ch_toml_files = PREPROCESS_RAW_VIABILITY.out.path_to_toml .flatten() .map { file -> [file.parent.name, file] } @@ -23,8 +25,10 @@ workflow PREPROCESS_CUSTOM { // [dose_dir_name, config.toml, curvecurator_input.tsv] ch_fit_curves = ch_toml_files.combine(ch_curvecurator_input, by: 0) FIT_CURVES(dataset_name, ch_fit_curves) + ch_versions = ch_versions.mix(FIT_CURVES.out.versions) ch_curves = FIT_CURVES.out.path_to_curvecurator_out.collect() POSTPROCESS_CURVECURATOR_DATA(dataset_name, ch_curves, measure) + ch_versions = ch_versions.mix(POSTPROCESS_CURVECURATOR_DATA.out.versions) ch_measure = POSTPROCESS_CURVECURATOR_DATA.out.measure }else if(params.curve_curator){ ch_measure = Channel.of("${measure}" + "_curvecurator") @@ -33,4 +37,5 @@ workflow PREPROCESS_CUSTOM { } emit: measure = ch_measure + versions = ch_versions } diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index f0b92ca..98ccbb6 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -16,8 +16,9 @@ workflow RUN_CV { useless_count // how do I make it wait for check params to finish? main: - + ch_versions = Channel.empty() LOAD_RESPONSE(params.dataset_name, work_path, params.cross_study_datasets, measure, useless_count) + ch_versions = ch_versions.mix(LOAD_RESPONSE.out.versions) ch_test_modes = channel.from(test_modes) ch_data = ch_test_modes.combine(LOAD_RESPONSE.out.response_dataset) @@ -26,6 +27,7 @@ workflow RUN_CV { ch_data, params.n_cv_splits ) + ch_versions = ch_versions.mix(CV_SPLIT.out.versions) // [test_mode, [split_1.pkl, split_2.pkl, ..., split_n.pkl]] ch_cv_splits = CV_SPLIT.out.response_cv_splits @@ -45,11 +47,13 @@ workflow RUN_CV { ch_input_models, "models" ) + ch_versions = ch_versions.mix(MAKE_MODELS.out.versions) MAKE_BASELINES ( ch_input_baselines, "baselines" ) + ch_versions = ch_versions.mix(MAKE_BASELINES.out.versions) ch_models_expanded = MAKE_MODELS.out.all_models .splitCsv(strip: true) @@ -60,6 +64,7 @@ workflow RUN_CV { HPAM_SPLIT ( ch_models_baselines ) + ch_versions = ch_versions.mix(HPAM_SPLIT.out.versions) // [model_name, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml]] ch_hpam_combis = ch_models_baselines_expanded .combine(HPAM_SPLIT.out.hpam_combi, by: 0) @@ -77,6 +82,7 @@ workflow RUN_CV { ch_test_combis = ch_test_combis.combine(work_path) TRAIN_AND_PREDICT_CV(ch_test_combis, params.response_transformation, params.model_checkpoint_dir) + ch_versions = ch_versions.mix(TRAIN_AND_PREDICT_CV.out.versions) // [model_name, test_mode, split_id, // [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], @@ -87,6 +93,7 @@ workflow RUN_CV { ch_combined_hpams, params.optim_metric ) + ch_versions = ch_versions.mix(EVALUATE_FIND_MAX.out.versions) // [split_id, test_mode, split_dataset, model_name, best_hpam_combi_X.yaml] ch_best_hpams_per_split = ch_cv_splits @@ -98,4 +105,5 @@ workflow RUN_CV { best_hpam_per_split = ch_best_hpams_per_split cross_study_datasets = LOAD_RESPONSE.out.cross_study_datasets ch_models = MAKE_MODELS.out.all_models.splitCsv(strip: true) + versions = ch_versions } diff --git a/subworkflows/local/visualization/main.nf b/subworkflows/local/visualization/main.nf deleted file mode 100644 index 7bc109a..0000000 --- a/subworkflows/local/visualization/main.nf +++ /dev/null @@ -1,27 +0,0 @@ -include { VISUALIZE_RESULTS } from '../../../modules/local/visualize_results' - - -workflow VISUALIZATION { - take: - evaluation_results // from MODEL_TESTING - evaluation_results_per_drug // from MODEL_TESTING - evaluation_results_per_cl // from MODEL_TESTING - true_vs_pred // from MODEL_TESTING - work_path // from input - - main: - // evaluation_results_per_cl and evaluation_results_per_drug are optional - evaluation_results_per_drug = evaluation_results_per_drug.ifEmpty(file("NONE_drug.csv")) - evaluation_results_per_cl = evaluation_results_per_cl.ifEmpty(file("NONE_cl.csv")) - ch_input_vis = evaluation_results.concat( - evaluation_results_per_drug, - evaluation_results_per_cl, - true_vs_pred - ).collect() - - VISUALIZE_RESULTS( - ch_input_vis, - work_path - ) - -} diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 5d8e0a5..926b329 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -78,6 +78,7 @@ workflow DRUGRESPONSEEVAL { params.measure, PARAMS_CHECK.out.count() ) + ch_versions = ch_versions.mix(PREPROCESS_CUSTOM.out.versions) RUN_CV ( test_modes, @@ -87,6 +88,7 @@ workflow DRUGRESPONSEEVAL { PREPROCESS_CUSTOM.out.measure, PARAMS_CHECK.out.count() ) + ch_versions = ch_versions.mix(RUN_CV.out.versions) MODEL_TESTING ( ch_models_baselines, @@ -96,14 +98,7 @@ workflow DRUGRESPONSEEVAL { RUN_CV.out.ch_models, work_path ) - - VISUALIZATION ( - MODEL_TESTING.out.evaluation_results, - MODEL_TESTING.out.evaluation_results_per_drug, - MODEL_TESTING.out.evaluation_results_per_cl, - MODEL_TESTING.out.true_vs_predicted, - work_path - ) + ch_versions = ch_versions.mix(MODEL_TESTING.out.versions) emit: versions = ch_versions // channel: [ path(versions.yml) ] From 0164573ad420d05a2c221e294e838f62319692bd Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 4 Jun 2025 14:23:55 +0200 Subject: [PATCH 214/257] updated nextflow/nf-core utils subworkflows --- modules.json | 4 ++-- subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml | 2 -- subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml | 2 -- 3 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml diff --git a/modules.json b/modules.json index 617cf6f..221ee73 100644 --- a/modules.json +++ b/modules.json @@ -16,12 +16,12 @@ "nf-core": { "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml deleted file mode 100644 index f847611..0000000 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nextflow_pipeline: - - subworkflows/nf-core/utils_nextflow_pipeline/** diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml deleted file mode 100644 index ac8523c..0000000 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfcore_pipeline: - - subworkflows/nf-core/utils_nfcore_pipeline/** From a8e36ace7e1419b687d29ea3e0d6581d85b48941 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 4 Jun 2025 14:26:22 +0200 Subject: [PATCH 215/257] updated dumpsoftwareversions --- modules.json | 2 +- .../custom/dumpsoftwareversions/main.nf | 15 +++++-- .../custom/dumpsoftwareversions/meta.yml | 43 +++++++++++-------- .../templates/dumpsoftwareversions.py | 4 +- 4 files changed, 40 insertions(+), 24 deletions(-) diff --git a/modules.json b/modules.json index 221ee73..1f7d288 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "76cc4938c1f6ea5c7d83fed1eeffc146787f9543", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["modules"] } } diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index 800a609..dd6e210 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -1,11 +1,19 @@ +def deprecation_message = """ +WARNING: This module has been deprecated. + +Reason: +This module is no longer recommended for use, as it is replaced by the function softwareVersionsToYAML +in the utils_nfcore_pipeline subworkflow that is included in the nf-core template. + +""" process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.14" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.14--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.14--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.27--pyhdfd78af_0' : + 'biocontainers/multiqc:1.27--pyhdfd78af_0' }" input: path versions @@ -19,6 +27,7 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { task.ext.when == null || task.ext.when script: + assert true: deprecation_message def args = task.ext.args ?: '' template 'dumpsoftwareversions.py' } diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml index c32657d..dc1e412 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/custom/dumpsoftwareversions/meta.yml @@ -1,36 +1,43 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: custom_dumpsoftwareversions -description: Custom module used to dump software versions within the nf-core pipeline template +description: Custom module used to dump software versions within the nf-core pipeline + template keywords: - custom - dump - version tools: - custom: - description: Custom module used to dump software versions within the nf-core pipeline template + description: Custom module used to dump software versions within the nf-core pipeline + template homepage: https://github.com/nf-core/tools documentation: https://github.com/nf-core/tools licence: ["MIT"] + identifier: "" input: - - versions: - type: file - description: YML file containing software versions - pattern: "*.yml" - + - - versions: + type: file + description: YML file containing software versions + pattern: "*.yml" output: - yml: - type: file - description: Standard YML file containing software versions - pattern: "software_versions.yml" + - software_versions.yml: + type: file + description: Standard YML file containing software versions + pattern: "software_versions.yml" - mqc_yml: - type: file - description: MultiQC custom content YML file containing software versions - pattern: "software_versions_mqc.yml" + - software_versions_mqc.yml: + type: file + description: MultiQC custom content YML file containing software versions + pattern: "software_versions_mqc.yml" - versions: - type: file - description: File containing software versions - pattern: "versions.yml" - + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" - "@grst" +maintainers: + - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py index da03340..b83b32c 100755 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -3,11 +3,11 @@ """Provide functions to merge multiple versions.yml files.""" - -import yaml import platform from textwrap import dedent +import yaml + def _make_versions_html(versions): """Generate a tabular HTML output of all versions for MultiQC.""" From 8186a95be458ca154ddbe7c8b74e9c749026c6c0 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 4 Jun 2025 14:35:14 +0200 Subject: [PATCH 216/257] fixed pre-commit --- assets/dreval_summary.svg | 2 +- bin/visualize_results.py | 1 - .../dumpsoftwareversions/environment.yml | 7 +++ .../dumpsoftwareversions/tests/main.nf.test | 43 +++++++++++++++++++ .../tests/main.nf.test.snap | 37 ++++++++++++++++ 5 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 modules/nf-core/custom/dumpsoftwareversions/environment.yml create mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test create mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap diff --git a/assets/dreval_summary.svg b/assets/dreval_summary.svg index 20484da..0c52631 100644 --- a/assets/dreval_summary.svg +++ b/assets/dreval_summary.svg @@ -46,4 +46,4 @@ src: url(data:font/ttf;base64,AAEAAAAVAQAABABQRFNJRw8FJG4AAkS8AAAZIEdTVULiJK0IAAABXAAADUxMSU5P5Q3jlQAADqgAAAEITFRTSK4KZmAAAA+wAAABik9TLzKHrE23AAARPAAAAGBWRE1Y+vLlYQAAEZwAAAu6Y21hcJKZHVgAAB1YAAAF1GN2dCADqw9VAAAjLAAAAEZmcGdtMk1zZgAAI3QAAAFiZ2FzcAASAAkAACTYAAAAEGdseWb09tQ/AAAk6AABoZhoZG14tNncIgABxoAAACNAaGVhZOcURXoAAenAAAAANmhoZWEILQgLAAHp+AAAACRobXR4Sw8KKQAB6hwAAAYYa2Vybtrr5E8AAfA0AAAZMmxvY2EmBLxSAAIJaAAAAw5tYXhwA54HAgACDHgAAAAgbmFtZYPZvTwAAgyYAAAuq3Bvc3TDfuyKAAI7RAAACEpwcmVwyhwLswACQ5AAAAEqAAEAAAAKAMgD5gABbGF0bgAIACIABUFGSyAAOkRFVSAAUk5MRCAAalJPTSAAglRSSyAAngAA//8ACQABAAcADQATABkAHwAmACwAMgAA//8ACQACAAgADgAUABoAIAAnAC0AMwAA//8ACQADAAkADwAVABsAIQAoAC4ANAAA//8ACQAEAAoAEAAWABwAIgApAC8ANQAA//8ACwAAAAUACwARABcAHQAjACUAKgAwADYAAP//AAkABgAMABIAGAAeACQAKwAxADcAOCAgICABUmFhbHQBWGFhbHQBYGFhbHQBaGFhbHQBcGFhbHQBeGFhbHQBgGNhc2UBiGNhc2UBkmNhc2UBnGNhc2UBpmNhc2UBsGNhc2UBumRsaWcBxGRsaWcBzGRsaWcB1GRsaWcB3GRsaWcB5GRsaWcB7GRwbmcB9GRwbmcB+mRwbmcCAGRwbmcCBmRwbmcCDGRwbmcCEmZyYWMCGGZyYWMCJGZyYWMCMGZyYWMCPGZyYWMCSGZyYWMCVGxpZ2ECYGxpZ2ECaGxpZ2ECdGxpZ2ECfGxpZ2EChmxpZ2ECjmxvY2wClG9yZG4Cmm9yZG4CoG9yZG4Cpm9yZG4CrG9yZG4Csm9yZG4CuG9ybm0Cvm9ybm0CxG9ybm0Cym9ybm0C0G9ybm0C1m9ybm0C3HN1cHMC4nN1cHMC7HN1cHMC9nN1cHMDAHN1cHMDCnN1cHMDFAAAAAEAAgAAAAIAAAABAAAAAgAAAAEAAAACAAAAAQAAAAIAAAABAAAAAgAAAAEAAAACAAAAAQAAAAMABAAFAAYAAAADAAQABQAGAAAAAwAEAAUABgAAAAMABAAFAAYAAAADAAQABQAGAAAAAwAEAAUABwAAAAIADgAPAAAAAgAOAA8AAAACAA4ADwAAAAIADgAPAAAAAgAOAA8AAAACAA4ADwAAAAEADgAAAAEADgAAAAEADgAAAAEADgAAAAEADgAAAAEADgAAAAQACQAKAAsADAAAAAQACQAKAAsADAAAAAQACQAKAAsADAAAAAQACQAKAAsADAAAAAQACQAKAAsADAAAAAQACQAKAAsADAAAAAIAEAARAAAABAAQABEAEgATAAAAAgAQABEAAAADABAAEQASAAAAAgAQABEAAAABABEAAAABAAIAAAABAAgAAAABAAgAAAABAAgAAAABAAgAAAABAAgAAAABAAgAAAABAAMAAAABAAMAAAABAAMAAAABAAMAAAABAAMAAAABAAMAAAADAAoACwANAAAAAwAKAAsADQAAAAMACgALAA0AAAADAAoACwANAAAAAwAKAAsADQAAAAMACgALAA0AFwAwADgAQABIAFAAWABgAGgAcACAAIgAkACYAKgAsAC4AMAAyADQANgA4ADoAPAAAQAAAAED9AADAAAAAQT0AAEAAAABALgAAwAAAAEAtgABAAAAAQC6AAEAAAABALgAAQAAAAEBbgABAAAAAQFwAAYAAAAFAXIBggGUAaYBugABAAAAAQG+AAEAAAABAcIAAQAAAAEB2gAGAAAABQHeAfQCCAIcAjAAAQAAAAECNAAEAAAAAQI6AAQAAAABAoAABAAAAAECjAAEAAAAAQKWAAQAAAABAqAABAAAAAECtgABAAAAAQUSAAQAAAABBRgABAAAAAEFhgABBZIAHAABBZQAAQAIAAEBgwABBY7/4AACBZgAXABqAGwAbQCcAJ0AngCfAKAAoQCiAKMApAClAKYApwCoAKkAqgCrAKwArQCuAK8AsACxALIAtAC1ALYAtwC4ALkAugB7AN8A4QDjAOUA5wDpAOsA7QDvAPEA8wD1APcA+QD7AP0A/wEBAQMBBQEHAQkBCwEPAREBEwEVARcBGQEbAR0BHwEhASMBJgEoASoBLAEwAS4BMgE0ATYBOAE6ATwBPgFAAUIBRAFGAUgBSgFM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AsoAIAAgAAQAAQACAAIBAQEBAQAAAAASBeYA+Aj/AAgACP/+AAkACf/+AAoACv/+AAsAC//9AAwADf/9AA0ADf/9AA4ADv/9AA8AD//9ABAAD//9ABEAEf/8ABIAEv/8ABMAE//8ABQAFP/8ABUAFf/7ABYAFv/7ABcAF//7ABgAGP/7ABkAGf/6ABoAGv/6ABsAGv/6ABwAG//6AB0AHf/6AB4AHf/5AB8AH//5ACAAIP/5ACEAIf/5ACIAIf/5ACMAI//4ACQAJP/4ACUAJf/4ACYAJf/4ACcAJv/3ACgAJ//3ACkAKP/3ACoAKf/3ACsAKv/2ACwAK//2AC0ALP/2AC4ALf/2AC8AL//2ADAAL//2ADEAMf/1ADIAMf/1ADMAMv/1ADQAM//1ADUANP/0ADYANf/0ADcANv/0ADgAN//0ADkAOP/zADoAOv/zADsAOv/zADwAO//zAD0APP/zAD4APf/yAD8APv/yAEAAP//yAEEAQP/yAEIAQf/yAEMAQv/xAEQAQ//xAEUARf/xAEYARf/wAEcARv/wAEgAR//wAEkASP/wAEoASf/wAEsASv/vAEwAS//vAE0ATP/vAE4ATf/vAE8ATv/vAFAAT//vAFEAUP/uAFIAUf/uAFMAUv/uAFQAU//uAFUAVP/tAFYAVf/tAFcAVv/tAFgAV//tAFkAWP/sAFoAWf/sAFsAWv/sAFwAW//sAF0AXP/sAF4AXf/rAF8AXv/rAGAAX//rAGEAYP/rAGIAYf/rAGMAYf/qAGQAYv/qAGUAY//qAGYAZf/pAGcAZv/pAGgAZ//pAGkAaP/pAGoAaf/pAGsAav/oAGwAa//oAG0AbP/oAG4Abf/oAG8Abv/oAHAAbv/oAHEAcP/nAHIAcf/nAHMAcf/nAHQAcv/nAHUAc//mAHYAdP/mAHcAdv/mAHgAdv/mAHkAd//lAHoAeP/lAHsAev/lAHwAev/lAH0AfP/lAH4AfP/kAH8Aff/kAIAAfv/kAIEAf//kAIIAgf/kAIMAgf/jAIQAgv/jAIUAg//iAIYAhP/iAIcAhf/iAIgAhv/iAIkAh//iAIoAiP/iAIsAif/iAIwAiv/hAI0Ai//hAI4AjP/hAI8Ajf/hAJAAjv/hAJEAj//gAJIAkf/gAJMAkf/gAJQAkv/gAJUAk//fAJYAlP/fAJcAlf/fAJgAlv/fAJkAl//eAJoAmP/eAJsAmf/eAJwAmv/eAJ0Am//eAJ4AnP/dAJ8Anf/dAKAAnv/dAKEAn//dAKIAoP/dAKMAof/dAKQAov/cAKUAo//cAKYApP/cAKcApf/bAKgApv/bAKkAp//bAKoAqP/bAKsAqf/bAKwAqv/aAK0Aqv/aAK4ArP/aAK8Arf/aALAArf/aALEArv/ZALIAr//ZALMAsf/ZALQAsv/ZALUAs//ZALYAtP/YALcAtf/XALgAtv/YALkAt//XALoAuP/XALsAuP/XALwAuf/XAL0Auv/XAL4AvP/WAL8AvP/WAMAAvf/WAMEAvv/WAMIAv//WAMMAwP/WAMQAwf/VAMUAwv/VAMYAw//VAMcAxP/VAMgAxf/VAMkAxv/UAMoAyP/UAMsAyP/UAMwAyf/TAM0Ayv/TAM4Ay//TAM8AzP/TANAAzf/TANEAzv/SANIAz//SANMA0P/SANQA0f/SANUA0v/SANYA0//RANcA1P/RANgA1f/QANkA1v/QANoA1//QANsA2P/QANwA2f/QAN0A2v/QAN4A2//PAN8A3P/PAOAA3f/PAOEA3v/PAOIA3//PAOMA4P/PAOQA4f/OAOUA4v/OAOYA4//OAOcA5P/OAOgA5f/NAOkA5v/MAOoA5//NAOsA6P/NAOwA6f/MAO0A6v/MAO4A6//MAO8A7P/MAPAA7f/MAPEA7v/LAPIA7//LAPMA8P/LAPQA8f/LAPUA8v/LAPYA8//LAPcA9P/KAPgA9P/KAPkA9f/KAPoA9//KAPsA+P/JAPwA+P/JAP0A+f/JAP4A+v/JAP8A/P/JAPgI/wAIAAj//gAJAAn//gAKAAr//gALAAv//QAMAA3//QANAA3//QAOAA7//QAPAA///QAQAA///QARABH//AASABL//AATABP//AAUABT//AAVABX/+wAWABb/+wAXABf/+wAYABj/+wAZABn/+gAaABr/+gAbABr/+gAcABv/+gAdAB3/+gAeAB3/+QAfAB//+QAgACD/+QAhACH/+QAiACH/+QAjACP/+AAkACT/+AAlACX/+AAmACX/+AAnACb/9wAoACf/9wApACj/9wAqACn/9wArACr/9gAsACv/9gAtACz/9gAuAC3/9gAvAC//9gAwAC//9gAxADH/9QAyADH/9QAzADL/9QA0ADP/9QA1ADT/9AA2ADX/9AA3ADb/9AA4ADf/9AA5ADj/8wA6ADr/8wA7ADr/8wA8ADv/8wA9ADz/8wA+AD3/8gA/AD7/8gBAAD//8gBBAED/8gBCAEH/8gBDAEL/8QBEAEP/8QBFAEX/8QBGAEX/8ABHAEb/8ABIAEf/8ABJAEj/8ABKAEn/8ABLAEr/7wBMAEv/7wBNAEz/7wBOAE3/7wBPAE7/7wBQAE//7wBRAFD/7gBSAFH/7gBTAFL/7gBUAFP/7gBVAFT/7QBWAFX/7QBXAFb/7QBYAFf/7QBZAFj/7ABaAFn/7ABbAFr/7ABcAFv/7ABdAFz/7ABeAF3/6wBfAF7/6wBgAF//6wBhAGD/6wBiAGH/6wBjAGH/6gBkAGL/6gBlAGP/6gBmAGX/6QBnAGb/6QBoAGf/6QBpAGj/6QBqAGn/6QBrAGr/6ABsAGv/6ABtAGz/6ABuAG3/6ABvAG7/6ABwAG7/6ABxAHD/5wByAHH/5wBzAHH/5wB0AHL/5wB1AHP/5gB2AHT/5gB3AHb/5gB4AHb/5gB5AHf/5QB6AHj/5QB7AHr/5QB8AHr/5QB9AHz/5QB+AHz/5AB/AH3/5ACAAH7/5ACBAH//5ACCAIH/5ACDAIH/4wCEAIL/4wCFAIP/4gCGAIT/4gCHAIX/4gCIAIb/4gCJAIf/4gCKAIj/4gCLAIn/4gCMAIr/4QCNAIv/4QCOAIz/4QCPAI3/4QCQAI7/4QCRAI//4ACSAJH/4ACTAJH/4ACUAJL/4ACVAJP/3wCWAJT/3wCXAJX/3wCYAJb/3wCZAJf/3gCaAJj/3gCbAJn/3gCcAJr/3gCdAJv/3gCeAJz/3QCfAJ3/3QCgAJ7/3QChAJ//3QCiAKD/3QCjAKH/3QCkAKL/3AClAKP/3ACmAKT/3ACnAKX/2wCoAKb/2wCpAKf/2wCqAKj/2wCrAKn/2wCsAKr/2gCtAKr/2gCuAKz/2gCvAK3/2gCwAK3/2gCxAK7/2QCyAK//2QCzALH/2QC0ALL/2QC1ALP/2QC2ALT/2AC3ALX/1wC4ALb/2AC5ALf/1wC6ALj/1wC7ALj/1wC8ALn/1wC9ALr/1wC+ALz/1gC/ALz/1gDAAL3/1gDBAL7/1gDCAL//1gDDAMD/1gDEAMH/1QDFAML/1QDGAMP/1QDHAMT/1QDIAMX/1QDJAMb/1ADKAMj/1ADLAMj/1ADMAMn/0wDNAMr/0wDOAMv/0wDPAMz/0wDQAM3/0wDRAM7/0gDSAM//0gDTAND/0gDUANH/0gDVANL/0gDWANP/0QDXANT/0QDYANX/0ADZANb/0ADaANf/0ADbANj/0ADcANn/0ADdANr/0ADeANv/zwDfANz/zwDgAN3/zwDhAN7/zwDiAN//zwDjAOD/zwDkAOH/zgDlAOL/zgDmAOP/zgDnAOT/zgDoAOX/zQDpAOb/zADqAOf/zQDrAOj/zQDsAOn/zADtAOr/zADuAOv/zADvAOz/zADwAO3/zADxAO7/ywDyAO//ywDzAPD/ywD0APH/ywD1APL/ywD2APP/ywD3APT/ygD4APT/ygD5APX/ygD6APf/ygD7APj/yQD8APj/yQD9APn/yQD+APr/yQD/APz/yQAAAAAAAwAAAAMAAAPwAAEAAAAAABwAAwABAAACDAAGAfAAAAANAPMAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAAACgAKEAowClAK0AsgC4AL0AvAC+AMAAvwDBAMMAxQDEAMYAxwDJAMgAygDLAM0AzwDOANAA0gDRANYA1QDXANgAZgCMAH4AfwCDAHIAkgC7AIoAhQB2AJAAhAFxAKIAtAFuAI0BcgFzAIEAkQFmAWkBaAFhAW8AhgCWAWQAwgDUAJsAfQCIAW0AYwFwAWcAhwCXAGUAfACcAJ8AsQBsAHkAcwB0AHAAcQBuAG8A0wF0ANsAewFiAGEAawB4AYQBhQBnAJMAYgBkAGkAngCmAJ0ApwCkAKkAqgCrAKgArwCwAYMArgC2ALcAtQEOAGgAdQCLAVkBWgFbAJQBXQFcAVcABAHkAAAAaABAAAUAKAANAH4A/wErATcBSQFRAVMBXwFhAXcBfgGSAhsCNwLHAskC2wLdA5QDqQO8A8AgFCAa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AAEAMAAAAikB+QALAGu7AAQADAABAAQruAAEELgAB9C4AAEQuAAJ0AC4AAIvuAAARVi4AAgvG7kACAARPlm7AAUAAwAGAAQrQQMAMAAFAAFduAAFELgAANBBBQAgAAIAMAACAAJdQQMAMAAGAAFduAAGELgACtAwMRMzNTMVMxUjFSM1IzDHa8fHa8cBMsfHa8fHAAAB/9D/WQCxAJoADQBCuwABAAkAAAAEK0EDAB8AAAABXUEDAB8AAQABXQC4AAgvuAAARVi4AAwvG7kADAARPlm4AADcMDEBQQMAdgANAAFdNzMOBQc3PgE3IxOeCQ0RGixDMQ8sJQhFmiRLRj4vHQJHBy4rAAEAGwDUAWIBTgADAA0AuwABAAMAAgAEKzAxEyEHITUBLRr+0wFOegAB//MAAACyAJoAAwAiuwACAAoAAwAEKwC4AABFWLgAAi8buQACABE+WbgAANwwMTczByMUniGempoAAAAB//7/7wGHAtsAAwBiuwABAAsAAAAEK7sAAgALAAMABCsAuAAARVi4AAAvG7kAAAAhPlm4AABFWLgAAi8buQACABE+WTAxAUEDACgAAAABXUEDABcAAQABXUEDACoAAQABXUEFABYAAgAmAAIAAl0BMwEjARVy/ulyAtv9FAAAAAL//P/yAjECygAXAC0CCLgALi+4AC8vuwAkAAkADAAEK7sAFwAJABgABCtBAwDgAAwAAV1BAwCgAAwAAXFBAwDwAAwAAXFBAwBgAAwAAXJBBwAJAAwAGQAMACkADAADXUEDAD8ADAABXUEDAIAADAABckEDABAADAABckEDAMAADAABcUEDAIAADAABcUEFAJAADACgAAwAAl1BAwDAAAwAAV1BAwAPABcAAV1BAwC/ABcAAV1BAwAfABcAAXFBBwBfABcAbwAXAH8AFwADXUEDAD8AFwABXUEDAIgAFwABXUEDAA8AGAABXUEDAL8AGAABXUEDAB8AGAABcUEHAF8AGABvABgAfwAYAANdQQUALwAYAD8AGAACXUEDAIgAGAABXUEDAOAAJAABXUEDAKAAJAABcUEDAPAAJAABcUEDAGAAJAABckEDAD8AJAABXUEDAIAAJAABckEDABAAJAABckEFAJAAJACgACQAAl1BAwCAACQAAXFBAwDAACQAAV1BAwDAACQAAXFBAwA/AC8AAV0AuAAARVi4AB8vG7kAHwAhPlm4AABFWLgAKS8buQApABE+WbkABQAC/EEJAAcABQAXAAUAJwAFADcABQAEXbgAHxC5ABEAAvxBCQAIABEAGAARACgAEQA4ABEABF0wMQFBAwApABMAAV1BAwApABQAAV1BAwAKABsAAV1BAwAFACYAAV03FB4CMzI+BDU0LgIjIg4EJzQ+BDMyHgIVFA4CIyIuAooJFiYdJDcoHBEHCxknGyM2KBsQB44SJDdKXDg7WDodKVWBWDxUNhjiGS0hFClCUlJJGBouIhQpQlNSSwUxa2ZbRignRmE7TaOIVyxKYQAAAAEAYQAAAdcCvAAKAcy7AAAACQABAAQrQQMAJwAAAAFdQQMAvQAAAAFdQQMAmwAAAAFdQQMAxwAAAAFdQQMAdgAAAAFdQQMACAABAAFxQQMAqQABAAFdQQMAnAABAAFdQQMAvQABAAFdQQMAGgABAAFxQQUAaQABAHkAAQACcUEDADcAAQABXUEDAHYAAQABXUEDAJkAAgABXUEDAM0AAgABcUEDAFkAAgABcUEFAHgAAgCIAAIAAl1BBQDoAAIA+AACAAJdQQMAmAADAAFxQQMA9wADAAFdQQMAKgAJAAFdQQMAmAAJAAFdQQMA1wAKAAFdQQUAZwAKAHcACgACXUEDAJcACgABXUEDACQACgABXQC4AABFWLgACS8buQAJAB8+WbgAAEVYuAAALxu5AAAAET5ZuwAEAAMAAwAEK0EDAB8ACQABcUEDAD8ACQABXUEFAH8ACQCPAAkAAnFBAwBPAAkAAXFBAwDfAAkAAV1BAwCrAAkAAV0wMQFBAwAWAAAAAV1BAwAHAAAAAV1BAwC4AAIAAXFBAwAZAAIAAV1BAwArAAIAAV1BAwCYAAMAAXFBBQBoAAMAeAADAAJyQQMAywADAAFdQQMAKwAIAAFdQQMAKwAJAAFdISMTIzc+AzczAUOXYKsXJ0U7MRN0AcZrAg0fNCkAAAH/1gAAAi4CygAmBGC4ACgvuwAmAAkAAAAEK7sACgAJAB4ABCtBAwAPAAAAAV1BAwD/AAAAAXFBAwA/AAAAAV1BAwAQAAoAAXFBAwCAAAoAAXFBBQBQAAoAYAAKAAJxQQMA4AAKAAFdQQMAoAAKAAFdQQMAEQAMAAFdQQMAAAAMAAFdQQMAVAANAAFxQQMAxQANAAFdQQMAFQANAAFdQQMARQANAAFxQQMANAANAAFdQQMA0gANAAFdQQMAAAANAAFdQQMANAAOAAFdQQMAFQAOAAFdQQMAhgAOAAFdQQMAtQAOAAFdQQMA8gAOAAFxQQUAUAAOAGAADgACcUEDAFMADwABckEDAEQADwABckEDALUADwABXUEDAOQADwABckEDAIQADwABXUEDAPIADwABcUEFAFAADwBgAA8AAnFBAwBkABAAAXJBAwCGABAAAV1BAwAHABAAAXFBAwAmABAAAXFBAwC0ABAAAXJBAwDyABAAAXFBAwAhABEAAV1BAwDDABEAAV1BBQBUABEAZAARAAJxQQMA1AARAAFyQQcAlQARAKUAEQC1ABEAA11BAwDoABEAAV1BAwBOABEAAV1BAwA6ABEAAV1BAwAXABEAAXFBBQClABEAtQARAAJxQQMA1AARAAFxQQMANAARAAFxQQMA8wARAAFxQQMAQQARAAFxQQMA0QARAAFdQQMANgATAAFdQQMARQATAAFdQQMA6AAUAAFdQQMAuQAUAAFdQQMASQAUAAFxQQMA2QAUAAFxQQMAOgAUAAFxQQMAigAUAAFxQQMAGgAUAAFyQQMAqwAUAAFdQQUAywAUANsAFAACXUEDAPsAFAABcUEDALsAFAABckEDAC0AFAABXUEDAD8AFAABXUEFANsAFADrABQAAnJBAwBrABQAAXJBAwBrABQAAXFBAwAbABQAAV1BBQBKABQAWgAUAAJyQQMAugAUAAFxQQMAWgAUAAFxQQMAmQAUAAFdQQMAqQAUAAFxQQUAGQAUACkAFAACcUEDAAgAFAABcUEDAEgAFAABXUEDAIgAFAABXUEDAC0AFwABXUEDADoAFwABXUEDAC0AGAABXUEDABsAGAABXUEDADoAGQABXUEDAGsAGgABckEDAPoAGgABcUEDADoAGgABXUEDANsAHAABXUEDAIAAHgABcUEDAKQAHgABXUEDAGcAHgABcUEDAOAAHgABXUEDAFAAHgABcUEDABAAHgABcUEDAA8AJgABXUEDAP8AJgABcUEDAD8AJgABXQC4AABFWLgABS8buQAFACE+WbgAAEVYuAAALxu5AAAAGz5ZuAAARVi4ABMvG7kAEwARPllBAwA/AAAAAV25ABEAAvy4AAUQuQAhAAL8MDEBQQMAIwAMAAFdQQMAIwANAAFdQQMA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AEAAAAABXUEDAEAAAwABXbgABhC4AATcMDEBQQUAZQADAHUAAwACXUEFAGUABQB1AAUAAl0TIzczAzMHI9ueIZ7oniGeAWKa/p6aAAAC/9D/WQD8AfwAAwARAL+7AAIACQADAAQruwAFAAkABAAEK0EDAJUAAQABXUEDAIEAAQABXUEDAAAAAgABcUEDAAAAAwABcUEDACAABAABXUEDAHAABAABXUEDACAABQABXUEDAHAABQABXUEDAHYAEQABXQC4AAwvuAAARVi4ABAvG7kAEAARPlm6AAEAAgADK0EDAEAAAQABXUEDAEAAAgABXbgAEBC4AATcMDEBQQUAZQABAHUAAQACXUEDAHcABAABXUEDAHcABQABXRMzByMHMw4FBzc+ATcjXp4hniqeCQ0RGixDMQ8sJQhFAfyayCRLRj4vHQJHBy4rAAAAAQAu//gCKgICAAYAWgC4AAYvuAAARVi4AAMvG7kAAwARPlm4AAYQuQAAAAP8ugABAAMABhESObgAAxC5AAIAA/wwMUEDAAgABAABXUEDACgABAABXUEDAAcABQABXUEDACcABQABXQENARUlNSUCKv6RAW/+BAH8AY+SknPKdsoAAAAAAgAwAFwCKQGdAAMABwAXALsAAwADAAAABCu7AAcAAwAEAAQrMDElITUhNSE1IQIp/gcB+f4HAflca2trAAAAAAEALv/4AioCAgAGADIAuAADL7gAAEVYuAAGLxu5AAYAET5ZuQAAAAP8ugABAAYAAxESObgAAxC5AAIAA/wwMTctATUFFQUuAW/+kQH8/gRrkpJzynbKAAACAEoAAAI6AtsAAwApANm7AA4ACQAhAAQruwApAAkABAAEK7sAGAAJABkABCu7AAIACQADAAQrQQMANgAQAAFdQQUAAAARABAAEQACXUEDADoAGQABXUEJAAkAIQAZACEAKQAhADkAIQAEXbgADhC4ACvcALgAGC+4AAQvuAAARVi4AAkvG7kACQAhPlm4AABFWLgAAi8buQACABE+WbgAANxBAwAfABgAAV1BAwAsABgAAV1BAwA8ABkAAV24AAkQuQAkAAL8QQkACAAkABgAJAAoACQAOAAkAARdMDEBQQMAJgAmAAFdNzMHIwM+AzMyHgIVFA4CBw4DByM+Azc+ATU0JiMiDgIHnJ4hnjEDLUtiOStPPCQXJjIcFyYeFAOEBxopNyQdKjQjGykdEgOamgHrPFo8HhYtRjAkOC4kEAwZICgbMUIuJBMRMCMoJhQiLRgAAgAk/+8C/ALbAEsAWwKpuwAVAA0AJgAEK7sATAANAEEABCu7ADAADQALAAQruwAeAAsAHQAEK7sAAAANAFQABCtBAwCBAAAAAXFBAwBSAAAAAXFBAwDTAAAAAV1BAwAUAAAAAXFBAwB0AAAAAV1BAwDGAAAAAV1BAwAFAAAAAXFBAwA0AAAAAXFBBQCUAAAApAAAAAJdQQMAogAAAAFxQQMA8gAAAAFdQQMAEAAAAAFdQQMAsAAAAAFdQQkACQALABkACwApAAsAOQALAARdQQkABgAVABYAFQAmABUANgAVAARdQQMAPwBBAAFdQQMAPwBMAAFdQQMA9gBUAAFdQQMAewBUAAFyQQMATABUAAFxQQMAvgBUAAFxQQMAnwBUAAFxQQMAfwBUAAFxQQMA7ABUAAFdQQMALABUAAFxQQMA2gBUAAFxQQMAtgBUAAFdQQMAEABUAAFduAAwELgAXdwAuAAARVi4ACsvG7kAKwAhPlm4AABFWLgAIS8buQAhABE+WbsARgABAFcABCu7AE8AAQA8AAQruwAGAAEANQAEK0EDAB8ABQABXUEFAA8ABgAfAAYAAl1BAwCPAAYAAXFBAwAPAAYAAXG4ACsQuQAQAAH8QQkACAAQABgAEAAoABAAOAAQAARduAAhELkAGgAB/EEJAAcAGgAXABoAJwAaADcAGgAEXUEHAA8ANQAfADUALwA1AANdQQMADwA1AAFxQQMAsgA1AAFxQQMA4AA1AAFdQQMAfwA8AAFyQQUADwA8AB8APAACXUEDAH8APAABcUEDAG8ARgABXUEFAAAARgAQAEYAAl1BAwBvAFcAAV1BAwAQAFcAAV26AEkAVwBGERI5QQMAbwBKAAFdQQMA3gBKAAFxQQMAfwBPAAFyQQUADwBPAB8ATwACXUEDAH8ATwABcTAxAQ4BFRQWMzI+AjU0LgIjIg4CFRQeAjMyNjczDgEjIi4CNTQ+AjMyHgIVFA4CIyImJyMOASMiLgI1ND4CMzIWFzczBRQWMzI+AjU0JiMiDgICLwMFCAkVKSEVKkliOEFoSigsTmxBP3EnVDOgXlCMaTw8aIpORH5gOjdNTxggJwICEjogIDkrGR85UDIgRBEQUv61KyMbLSESLSAbLiESAR8KFwoKDRsxRCg8Wz8gLU9tP0JrTSorJ05UOWSJUE+JZDosT3FFTW5GISAZHhwbLz4jL1xILB8nNuIoMRwrNholMBsrNAAAAAL/swAAAnECygAHAAsB47sABgAKAAcABCu7AAIACgADAAQrQQMALAAAAAFdQQMAdQAAAAFdQQMApwABAAFdQQMAJgABAAFdQQMABAABAAFdQQMA5gACAAFyQQMApwACAAFdQQMABwACAAFxQQMAtwACAAFxQQMA1wACAAFdQQMANwACAAFdQQMA9QACAAFdQQMAhQACAAFyQQMAugADAAFyQQMAewADAAFyQQMAGwADAAFyQQMAmgADAAFyQQMAKQADAAFyQQMA8wADAAFdQQMAdQAHAAFdQQMA9QAHAAFduAAGELgACNxBAwB6AAgAAV1BBQDKAAgA2gAIAAJyQQMAigAIAAFyQQMAuQAIAAFxQQUAWQAIAGkACAACXbgAAxC4AAncQQMAGwAJAAFyQQMADAAJAAFdQQMASwAJAAFdQQMAKQAJAAFyQQMA1gAJAAFxALgAAEVYuAAALxu5AAAAIT5ZuAAARVi4AAIvG7kAAgARPlm4AABFWLgABi8buQAGABE+WbsACQACAAQABCu6AAsAAgAAERI5MDEBQQMAKQAAAAFdQQUAJgABADYAAQACXUEDADYAAgABXUEDADYAAwABXUEDADUABAABXUEDACQACAABXUEDAEoACAABXUEDADkACQABXUEDAEgACgABXQEzEyMnIQcjATMDIwFZoXecF/71WqYBPr8jAgLK/TafnwEUARwAA//8AAACpgLKAAgAHgApAZO7ABgACgAjAAQrugAIAAkAAytBAwAJACMAAV1BAwDDACMAAV1BAwDDABgAAV26AAQAIwAYERI5uAAEL0EHAH8ABACPAAQAnwAEAANdQQMACQAEAAFdQQUAswAIAMMACAACXUEDAFUACAABXUEDABYACAABXUEDANkACAABcUEDAA8ACAABXUEDAG0ACAABcUEDADYACAABXUEDAIUACAABXUEDAEQACAABXUEDADIACAABcUEDAPIACAABXUEDAHkACQABXUEHAE0ACQBdAAkAbQAJAANxQQMADwAJAAFdQQMA3QAJAAFxQQUA2wAJAOsACQACXUEDACkACQABXUEFAFgACQBo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NmWRWj5qTSoBnUc5PFk5HBMnPSshOCweBZ0YQVFjOhMTGwMTEA8hGhAUISoWGCIbGQ6TBwsQERMNBxhJETpSmFecd0YiQ2NBQkM3V2szJUIzHhcnNBxLaEEeAiYCBwgRGxIdJxYJAwYIBQAA/////AAAArMDmQImACcAAAEHAEIA9gC+AAwAQQMAPwANAAFdMDEAAP////wAAAKzA5kCJgAnAAABBwCQAO0AvgAMAEEDAD8ADAABXTAxAAD////8AAACswOZAiYAJwAAAQcAaADwAL4ADABBAwA/ABEAAV0wMQAA/////AAAArMDiQImACcAAAEHAIQA8gC+AEJBAwAgAA4AAXFBAwCfAA8AAV1BAwCfABMAAV1BAwA/ABMAAXFBAwDfABMAAV0AQQMAPwAOAAFdQQMAPwATAAFdMDH////8AAABNAOZAiYAKwAAAQcAQgAsAL4ADABBAwA/AAUAAV0wMQAA/////AAAAYoDmQImACsAAAEHAJAAFAC+AAwAQQMAPwAEAAFdMDEAAP////wAAAGZA5kCJgArAAABBwBoADYAvgAMAEEDAD8ABwABXTAxAAD////8AAABqgOJAiYAKwAAAQcAhAA6AL4APUEDAHAABQABXUEDAIAABgABXUEDAJ8ABwABXUEFAJ8ACwCvAAsAAl0AQQMAPwAGAAFdQQMAPwALAAFdMDEAAAL/6wAAAsQCygAQAB8CdbsAGQAKAAoABCu7ABAACgAVAAQruwAEAAoAHwAEK0EDADUAAQABXUEDABsAAwABXUEDADoAAwABXUEDAGkABAABcUEDAMoABAABXUEDAA8ABAABXUEDABwABAABXUEDABoABAABcUEDADYABAABcUEDAFAABAABcUEDAAkACgABXUEDAJMAEAABcUEDADYAEAABcUEDAKYAEAABXUEDAA8AEAABXUEDABsAEAABXUEDAGYAEAABcUEDAMYAEAABXUEDABIAEAABcUEDANAAEAABcUEDAB4AEQABXUEDAGYAEgABcUEDAFkAEgABcUEDAHsAEgABcUEDAIcAEgABcUEDABYAEgABXUEDAJMAEgABcUEDANoAFQABXUEDAP0AFQABcUEDAB4AFQABXUEDAA8AFQABXUEFAH8AFQCPABUAAnFBAwBuABUAAXFBAwANABUAAXFBAwDpABUAAV1BAwBZABUA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uwABAAoAAAAEK7sABQAKAAQABCu7AAoACgALAAQruwAGAAoABwAEK0EDANgAAAABXUEDADkAAAABcUEFALkAAADJAAAAAnFBAwA5AAAAAXJBAwCqAAAAAXFBAwCZAAAAAXJBAwAJAAAAAXJBAwBpAAAAAV1BAwDJAAAAAV1BBQBmAAAAdgAAAAJxQQMApAAAAAFyQQMApQABAAFyQQMABgABAAFxQQMAdgABAAFyQQMAOQABAAFxQQMAyQABAAFdQQMAOQABAAFyQQMAqgABAAFxQQMAmQABAAFyQQMACQABAAFyQQMAyQABAAFxQQUA2AABAOgAAQACXUEDANYAAQABcUEDAHYAAQABcUEDAOUAAQABckEDAGMAAQABcUEDAKcAAgABXUEDANYAAwABXUEDAMMABAABckEDAHUABAABXUEDAAUABAABckEDANgABAABXUEDABkABAABcUEDALkABAABcUEDAFkABAABckEDAKoABAABcUEDAHkABAABckEDAOkABAABcUEDAGkABAABcUEDAKkABAABXUEDANYABAABcUEDAJUABAABXUEDAPQABAABXUEDAOMABAABckEDAMIABAABXUEDAMMABQABckEDAAMABQABXUEDAHUABQABXUEDAAcABQABckEDAFkABQABckEDADoABQABXUEDANkABQABXUEDABkABQABcUEDANYABQABcUEDABUABQABckEDAOMABQABckEDAPMABQABXUEDAMIABQABXUEDAPYABgABXUEDAGYABgABcUEDAFYABgABckEDAHgABgABckEDAAkABgABcUEDADkABgABXUEDAAoABgABckEDABsABgABckEDAHwABgABcUEDADsABgABckEDAJoABgABcUEDAOkABgABcUEDAKkABgABXUEDAIcABgABckEDALYABgABcUEDABYABgABcUEDAKQABgABckEDAAMABgABXUEDAPYABwABXUEDAIcABwABXUEDAHgABwABXUEDAAkABwABcUEFANkABwDpAAcAAnFBAwAKAAcAAXJBAwCaAAcAAXFBAwAbAAcAAXJBAwB8AAcAAXFBAwA7AAcAAXJBAwDLAAcAAXFBAwB6AAcAAXJBAwDpAAcAAXJBAwCpAAcAAV1BAwA4AAcAAV1BAwDnAAcAAV1BAwBnAAcAAV1BAwBWAAcAAXJBAwAWAAcAAXFBAwDZAAgAAXFBAwCZAAgAAXJBAwA4AAgAAV1BAwA6AAkAAV1BAwCoAAkAAV1BAwB2AAoAAXJBAwBcAAoAAXFBAwDtAAoAAV1BAwANAAoAAV1BAwCMAAoAAV1BAwDmAAoAAXJBAwC2AAoAAXFBAwAVAAoAAXJBAwANAAsAAV1BAwDtAAsAAV1BAwCMAAsAAV1BAwBcAAsAAXG4AAcQuAAM3EEDAKMADAABckEDAJUADAABXUEDAPYADAABcUEDAAYADAABckEDAAcADAABXUEFACkADAA5AAwAAnFBAwDJAAwAAXFBAwCZAAwAAXJBBQDaAAwA6gAMAAJxQQMAfAAMAAFdQQMAOgAMAAFdQQMAeQAMAAFyQQMAqQAMAAFxQQMACQAMAAFxQQMAtwAMAAFdQQMAZgAMAAFxQQMAwwAMAAFyQQMAUwAMAAFxQQMAgwAMAAFdQQMAhwANAAFdQQMAOQAOAAFxQQMAdwAOAAFdQQMAhgAOAAFduAAKELgAD9xBAwAEAA8AAV1BBQDlAA8A9QAPAAJyQQMAhgAPAAFdQQMAVwAPAAFxQQUAKQAPADkADwACcUEDAKoADwABcUEDAHwADwABXUEDAPoADwABXUEHAMkADwDZAA8A6QAPAANxQQMAdgAPAAFxQQMApQAPAAFdQQMAFQAPAAFyQQMAYwAPAAFxQQMAowAPAAFyALgAAEVYuAAELxu5AAQAIT5ZuAAARVi4AAEvG7kAAQAhPlm4AABFWLgACi8buQAKABE+WbgAAEVYuAAHLxu5AAcAET5ZuwAJAAIADwAEK7sADgABAAIABCtBAwBgAAIAAV1BAwBAAAkAAV1BAwAAAAkAAV1BAwDmAAwAAXFBAwBgAA4AAV1BAwAAAA8AAV1BAwBAAA8AAV0wMRMzByE3MwMjEyEDIwE3IQeTnh4BIR6el549/t89ngIYEP7fEALKjo79NgEg/uABpE1NAAAAAAEAFAAAAkYCygAqAuK7ABEACQAdAAQruwADAAkAAgAEK7sAJwAJACgABCu7ABcACQAYAAQrQQMAtwAAAAFdQQMA+gACAAFdQQMAXAACAAFdQQMAHwACAAFdQQMAnAACAAFdQQMASgACAAFdQQMAugACAAFdQQUAGQACACkAAgACcUEDALsAAwABXUEDAFwAAwABXUEDAB8AAwABXUEDAJwAAwABXUEDAEoAAwABXUEDAPoAAwABXbgAAhC4ACncQQMAuwApAAFdQQUAGgApACoAKQACXUEDAPoAKQABXbkABwAJ/EEDAFgABwABXUEDALoABwABXUEDAPUABwABXUEDACQABwABXUEDAGAAEQABXUEDAOoAEQABXUEDAEAAEQABXUEDANAAEQABXUEDANMAFwABXUEDALkAFwABXUEDAOoAFwABXUEDAKUAFwABXUEDAMAAFwABXUEDAEAAFwABXUEDANQAGAABXUEDAOgAGAABXUEDALkAGAABXUEDAKUAGAABXUEDAEAAGAABXUEDAMAAGAABXUEDAGAAHQABXUEDAOgAHQABXUEDAPYAHQABXUEDAEAAHQABXUEDANAAHQABXUEDABoAJgABXUEDANkAJwABXUEFALsAJwDLACcAAl1BAwAaACcAAV1BAwCXACcAAV1BAwD2ACcAAV1BAwAfACgAAV1BBQC7ACgAywAoAAJdQQMA2QAoAAFdQQMA9QAqAAFdALgAAEVYuAADLxu5AAMAIT5ZuAAARVi4AA4vG7kADgAdPlm4AABFWLgAGC8buQAYABE+WbgAAEVYuAAnLxu5ACcAET5ZuwAqAAEAAAAEK7gAABC4AAXQuQAGAAH8QQMAJAALAAFduAAOELkAIQAC/DAxAUEDAIwABwABXUEFAGgAFwB4ABcAAl1BAwCNABcAAV1BAwCNABgAAV1BAwCGACcAAV1BAwB5ACcAAV1BAwB5ACgAAV1BAwCMACkAAV1BAwB5ACoAAV0TMzczBzMHIwczPgMzMhYVFA4CBwMjEz4DNTQmIyIOAgcDIxMjOWEPjg5kDmYXAggeKjgjSk0EBAYBQI4/AQQCAisZIDEkFgY6jndgAoZEREtyCxoWD0dECBkaFwf+0QEvBhESEQUXHhkoNBv+7QI7/////AAAAacDjwImACsAAAEHAHUAKwC+AAwAQQMAPwAJAAFdMDEAAP////QAAAFsAtECJgEOAAABBgB18AAADABBAwCQABgAAV0wMf////wAAAGTA3QCJgArAAAABwCLADEAvv////QAAAFdArYCJgEOAAABBgCL+wAADABBAwCQAAUAAV0wMQAB/8X/JwExAsoAHAFMuwAQAAoADwAEK7sAEQAKAA4ABCu7ABYACwAIAAQrQQMABwAAAAFdQQMAHwAIAAFdQQMADgAIAAFdQQMA7gAOAAFdQQMAiwAOAAFdQQMA2AAOAAFdQQMAyAAPAAFdQQUAWAAPAGgADwACXUEDANkADwABXUEDALgADwABcUEDAGYADwABcUEDAHIADwABXUEDANYAEAABcUEDAGgAEAABXUEDANkAEAABXUEDAAYAEAABXUEDAGQAEAABcUEDAHIAEAABXUEDAO4AEQABXUEDAIsAEQABXUEDALYAEQABcUEDAB8AFgABXUEDAA4AFgABXUEDAA4AFwABXQC4AABFWLgAEC8buQAQACE+WbgAAEVYuAARLxu5ABEAET5ZuAAARVi4AA4vG7kADgARPlm7ABkAAQADAAQrQQMALwADAAFdQQMALwAZAAFdMDEXDgEjIi4CNTQ+AjcjEzMDDgMVFBYzMjY3tBw+KgkkJBoJHzsxXZeelyQtGgoYDxAaEJgjHgQSIyAKHiImEALK/TYVIR4aDQ8TDREAAAAAAv/D/ycBGwLKABwAIAIVuwAQAAkADwAEK7sAEQAJAA4ABCu7ABYACwAIAAQruwAgAAkAHwAEK0EFAMcAAADXAAAAAl1BAwC0AAAAAV1BAwAcAA4AAXJBBQDsAA4A/AAOAAJxQQMAfAAOAAFyQQMAawAOAAFxQQMACQAOAAFyQQMA7QAPAAFdQQUAnAAPAKwADwACcUEDABsADwABcUEDAO0AEAABXUEFAJwAEACsABAAAnFBAwAbABAAAXFBAwCnABEAAV1BAwCKABEAAXJBAwAcABEAAXJBBQDsABEA/AARAAJxQQMAfAARAAFyQQMAawARAAFxQQMACQARAAFyQQMAFwARAAFxQQUABgARABYAEQACXUEDALkAHAABXUEDALcAHQABXUEDAOkAHgABXUEDALcAHgABXUEDAH8AHwABXUEDAH8AIAABXQC4AABFWLgAEC8buQAQAB0+WbgAAEVYuAARLxu5ABEAET5ZuAAARVi4AA4vG7kADgARPlm7ABkAAQADAAQrugAgAB0AAytBAwAvAAMAAV1BAwAPAAMAAXFBAwAPABkAAXFBAwAvABkAAV1BAwAPAB0AAV1BAwCQAB0AAV1BAwAPACAAAV1BAwA/ACAAAV1BAwCQACAAAV0wMQFBAwBGAA4AAV1BAwBoAA4AAXFBAwBlAA8AAV1BAwBYAA8AAV1BAwBJAA8AAV1BAwBlABAAAV1BAwBHABEAAV0XDgEjIi4CNTQ+AjcjEzMDDgMVFBYzMjY3EyM3M5oZOCYIICEXCBw1LFRuj24hKBgJFg4OFw+QjxqPmCMeBBIjIAoeIiYQAgX9+xUhHhoNDxMNEQLUdQD////8AAABSAOJAiYAKwAAAQcBWgA6AL4ADABBAwA/AAYAAV0wMQAAAAH/9AAAAPECBQADAHS7AAMACQACAAQruwAAAAkAAQAEK0EDAEcAAAABXUEDAKUAAAABXUEDAKYAAQABXUEDAKYAAgABXUEDAKUAAwABXQC4AABFWLgAAi8buQACAB0+WbgAAEVYuAAALxu5AAAAET5ZMDEBQQUABgAAABYAAAACXTMjEzODj26PAgX////8/+8DYgLKACYAKwAAAAcALAEtAAD////0/0oCMwLKACYASwAAAAcATAEYAAD////t/+8CmAOZAiYALAAAAQcAaAE1AL4ADABBAwA/AB8AAV0wMQAA////fP9KAVcC2wImAVYAAAEGAGj0AAAMAEEDAJAAFAABXTAx/////P8nAwYCygImAC0AAAAHAYEAyQAA////9P8nAkMCygImAE0AAAAGAYF5AAAA/////AAAAg8DmQImAC4AAAEHAJAAMwC+AAwAQQMAPwAGAAFdMDEAAP////QAAAGGA5kCJgBOAAABBwCQABAAvgAUQQMAjwAGAAFdQQMAvwAGAAFdMDEAAP////z/JwIPAsoCJgAuAAAABwGBAIwAAP///9L/JwEaAsoCJgBOAAAABgGB0AAAAP////wAAAJAAsoCJgAuAAAABwDeANAAAP////QAAAIBAsoAJgBOAAABBwDeAJEAAAAiQQMAHwAGAAFdQQUArwAGAL8ABgACXQBBAwCvAAYAAV0wMf////wAAAIPAsoCJgAuAAAABwFaAO3/O/////QAAAG4AsoAJgBOAAAABwFaAKr/OwAB/9QAAAIPAsoADQB6uwAKAAoADQAEK0EDACoABAABXUEDACQACgABXUEDAFQACgABcUEDACQADQABXQC4AABFWLgABC8buQAEACE+WbgAAEVYuAAMLxu5AAwAET5ZuwAIAAMABwAEK7sAAQADAAIABCtBAwAqAAgAAV24AAwQuQAKAAL8MDE3Bz8BEzMDNw8CIQchJlIVVVSeOswayikBWhz+Ccg4bzoBkf7ujHOL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XUEDANsABwABXUEDAGwABwABXUEDAK0ABwABckEDANsABwABcUEDAEsABwABcUEDAJoABwABckEDABoABwABcUEDADkABwABXUEDAEYABwABXUEDALQABwABXUEDAJIABwABcUEDALUACAABcUEDANQADAABXUEDAGYADAABXUEDANcADAABcUEDAMkADAABXUEDAKYADAABcUEDADUADAABcUEDAGMADAABckEDADIADAABXUEDAKMADQABckEDADQADQABXUEDANYADQABXUEDAMkADQABXUEDAGYADQABXUEDADUADQABcUEDAGMADQABckEDAKIADQABcUEDANIADQABcUEDAMcADwABcUEDAKcADwABckEFANYADwDmAA8AAl0AuAAARVi4AAUvG7kABQAhPlm4AABFWLgADC8buQAMABE+WbsADwABAAAABCu4AAUQuQAGAAL8uAAD0LgAABC4AAnQuQAKAAH8MDEBQQMAZQADAAFyQQMA9wADAAFyQQMAtwAPAAFyEzM3IzchByMHMwcjAyMTI2WYGeAcAlQc1hmbDpxSnlKXAdJ0hIR0S/55AYcAAf/v//cBfAKiACgCi7sABwAJAAYABCu7ABIACQAjAAQrQQMA1gAAAAFdQQMA1gAAAAFxQQMAxwAGAAFdQQUAfAAGAIwABgACcUEFAI4ABgCeAAYAAnJBBQBNAAYAXQAGAAJdQQMAKQAGAAFxQQMARAAGAAFyQQMA1AAGAAFxuAAGELgAAtxBAwDWAAIAAV1BAwDrAAIAAXFBBQAuAAIAPgACAAJdQQMAWwACAAFxQQMAVQACAAFyQQMANAACAAFxQQMAhgADAAFdQQMAVgADAAFdQQMAJQADAAFxQQMA9AAHAAFxQQMABAAHAAFyQQMAZQAHAAFyQQMAWwAHAAFxQQMATQAHAAFdQQUAjgAHAJ4ABwACckEDAHwABwABcUEDAFgABwABXUEDAAUABwABcUEDAMQABwABXUEDAFMABwABckEDAD4ACQABXbgABxC4AAvcQQMAVwALAAFyQQMAXAALAAFdQQUALgALAD4ACwACXUEDAFsACwABcUEDAAUACwABcUEDADQACwABcUEDANoAEgABcUEDABYAEgABXUEDAAAAEgABXUEDAAAAEwABXUEDAPoAGwABXUEDAEQAIwABckEDAFYAIwAB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MwIkBSgzHyEcQEI+GxodA1UDFSc8Kh49PDweGxwDVgEDEyU5KB1CRD8ZGhwEVQIUJjknHT9BQB4aGwRWAdo3WxsRFBcUJhcmQzMdEhURIhniI0Q3IhQYFCYXIUQ3IhMXEyUXAAABAAb/uAIbAlwAEwD9uwANAAkACgAEK7sAEAAJAAcABCu7AAAACQADAAQrQQMAIwABAAFdQQMAVQAEAAFdQQMAJwAFAAFdQQMA2gAIAAFdQQMAeQALAAFdQQUANQAMAEUADAACXUEDACAADAABXUEDAFYADQABXUEDAFoADgABXUEDAD0ADgABXUEDACoADgABXUEDAMYADgABXUEDANoADwABXUEDACMAEQABXUEDAFoAEwABXQC7AA8AAgAOAAQruwATAAIAEgAEK7sACAACAAkABCu7AAQAAgAFAAQrQQUAdgALAIYACwACXTAxAUEDACIACQABXUEDABIADAABXUEDABIADQABXTcHJzcjNTM3IzUhNxcHMxUjBzMV/U5yM2qqNN4BHk9xMmmpNN1VnTlkgmeBnTlkgWeCAAAAAAIABv/VAhsCQAAGAAoAMwC7AAMAAgACAAQruwAFAAIABgAEK7sACQACAAoABCswMQFBBwARAAQAIQAEADEABAADXRM1JRUNARUFNSEVBgIV/p8BYf3rAhUBGoGlh15ih52BgQACAAb/1QIbAkAABgAKAGQAuwADAAIABAAEK7sAAQACAAAABCu7AAkAAgAKAAQrQQUAFgABACYAAQACXUEDADUAAQABXUEHABkAAwApAAMAOQADAANdMDEBQQMAPAACAAFdQQMALgACAAFdQQMAFAAFAAFdNzUtATUFFQE1IRUGAWL+ngIV/esCFXKHYl6HpYH+u4GBAAAAAAIANP/dAh0C6wAFAAkAPLsABwAKAAIABCu7AAUACgAJAAQrALgAAS+4AABFWLgAAy8buQADACE+WbkABgAC/LgAARC5AAgAAvwwMQUjAxMzEwsBGwEBY3e4uXa69XBwcCMBhwGH/nkBBf77/voBBgABABgDCwEIA5kAAwAvuwADAAoAAgAEKwC4AABFWLgAAi8buQACACE+WbgAANxBBQAAAAAAEAAAAAJdMDEBIyczAQhkjJgDC44AAAAAAQCGAwsBdgOZAAMAL7sAAwAKAAIABCsAuAAARVi4AAIvG7kAAgAh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BgcGBwYIBggGCAYIBgcGBwYDAwMDAwMDAwkFBgMHBgYDBgMGBAYFBgMHBgcGBwYGCAYIBggGBwQHBAcEBgUGBQYFBgQGBQYEBwYHBgcGBwYHBgcGCQgGBQYFBgUGBQYEAwMDAwMDAwMHCAYGAgUIBgYHBwcGAgMGCAYGBgYGBgMDAwMDAwMDAwMDAwMDBgYGCw0HAAMDBQYGCwgDAwQEBwMEAwQGBgYGBgYGBgYGAwMHBwcHCQgICAgHBwgIAwYIBgoICQgJCAcHCAcKBwcHBAQEBwYDBgcGBwYEBwcDAwYDCgcHBwcEBQQHBgkGBgYEAgQHBgMGBQsHBwMNBwMMBwMDBQUGBgsDCwUDCgYHAwMGBQYGAgcDCQQFBwQKAwQHAwQDBwcDAwQEBQoKCgYICAgICAgLCAcHBwcDAwMDCAgJCQkJCQcJCAgICAcIBwYGBgYGBgoGBgYGBgMDAwMHBwcHBwcHBwcHBwcHBgcGBgMDCAYIBggGCAYIBggGCAYICAgHBwYHBgcGBwYHBggHCAcIBwgHCAcIBwMDAwMDAwMDCQYGAwgGBgMGAwYEBgUGAwgHCAcIBwcJBwkHCQcIBAgECAQHBQcFBwYHBAcFBwQIBwgHCAcIBwgHCAcKCQcGBwYHBgcFBwQDAwMDAwMDAwgIBwcCBggHBggIBwcCAwYJBwcHBwcHAwMDAwMDAwMDAwMDAwMHBwcMDQcAAwQGBwcMCAMEBAUHAwUDBQgHBwcHBwcHBwcDAwcHBwgKCAkJCggHCQkEBwkHCwkKCQoJCAcJCAsICAgEBQQHBgMHCAcHBwQHBwMDBwMMBwcIBwUGBAcGCgYGBgQDBAcHAwcGDAcHAw0IAw0IAwMGBgYGDAMMBgMLBggDBAcGBwcDBwMKBAYHBQoDBQcEBQMHBwMDBQQGCwsLBwgICAgICAwJCAgICAQEBAQKCQoKCgoKBwoJCQkJCAkHBwcHBwcHCwcHBwcHAwMDAwcHBwcHBwcHCAcHBwcGCAYGAwMIBwgHCAcJBwkHCQcJBwoJCggIBwgHCAcIBwgHCQcJBwkHCQcJBwkIBAMEAwQDBAMKBgcDCQcHAwcDBwQHBgcDCQcJBwkHCAoHCgcKBwkFCQUJBQgGCAYIBgcEBwUHBAkHCQcJBwkHCQcJBwsKCAYIBggGCAYHBAMDAwMDAwMDCAkHBwIGCQcHCAkIBwIDBwoIBwcHBwcDAwMDAwMDAwMDAwMDAwcHBw0PCAAEBAYHBw0JBAQEBQgEBQQFBwcHBwcHBwcHBwQECAgICAsJCQoKCQgKCgQHCQcMCgoKCgkICAoIDAkICAQFBAgHAwcIBwgHBQgIAwMHAwwICAkIBQYFCAcLBwcHBAMECAcEBwYNCAgDDwgDDggEBAYGBwcNAw0GAwwHCAQEBwcHBwMIAwsEBggFCwMFCAQFAwgIBAMFBQYMDAwHCQkJCQkJDQoJCQkJBAQEBAoKCgoKCgoICgoKCgoICggHBwcHBwcMBwcHBwcDAwMDCAgICAgICAgICAgICAcIBwcEAwkHCQcJBwoHCgcKBwoHCgkKCAkHCQcJBwkHCQcKCAoICggKCAoICggEAwQDBAMEAwsHBwMJBwcDBwMHBQcGBwMKCAoICggICggKCAoICQUJBQkFCAYIBggHCAUIBggFCggKCAoICggKCAoIDAsIBwgHCAcIBggFAwMDAwMDAwMJCggIAgcKCAcJCgkIAgQHCwgICAgICAMDAwMDAwMDAwMDAwQECAgIDxEJAAQEBwgIDgoEBAUGCQQGBAYICAgICAgICAgIBAQJCQkJDAoLCwsKCQsLBAgLCQ4LDAoMCwoJCwkOCgoKBQYFCQgECQkICQkFCQkEBAgEDgkKCQkGBwYJCAwICAgFAwUJCAQIBw8JCQQQCgQRCgQEBwcICA8EDwcEDggKBAQIBwgIAwkEDAUHCQYMBAYJBQYECQkEBAYFBw0NDQkKCgoKCgoPCwoKCgoEBAQECwsMDAwMDAkMCwsLCwoLCQkJCQkJCQ4ICQkJCQQEBAQJCQoKCgoKCQkJCQkJCAkICAQECgkKCQoJCwgLCAsICwgLCwsKCgkKCQoJCgkKCQsJCwkLCQsJCwkLCgQEBAQEBAQEDQgIBAsICQQJBAkGCQcJBAsJCwkLCQkMCgwKDAoLBgsGCwYKBwoHCggJBgkHCQYLCQsJCwkLCQsJCwkODAoICggKCAoHCQYEBAQEBAQEBAsLCQkDCAsJCQsLCgkDBAkNCQkJCQkJBAQEBAQEBAQEBAQEBAQJCQkQEgkABAUICQkPCwUFBQcKBAcEBgkJCQkJCQkJCQkEBAoKCgoNCwwMDAsJDAwFCQwJDwwMCwwMCgoMCg8LCgoFBgUKCAQJCgkKCQYKCgQECQQPCgkKCgYIBgoIDQgICAUEBQoJBAkIEAkJBBEKBBIKBAQICAgIEAQQCAQPCAoEBQkICQkECQQNBgcKBw0EBgoGBgQKCgQEBgYHDg4OCQsLCwsLCxAMCwsLCwUFBQUMDAwMDAwMCgwMDAwMCgsJCQkJCQkJDwkJCQkJBAQEBAkKCQkJCQkKCQoKCgoICggIBAQLCQsJCwkMCQwJDAkMCQwMDAoLCQsJCwkLCQsJDAoMCgwKDAoMCgwKBQQFBAUEBQQOCQkEDAkJBAkECQYJBwkEDAoMCgwKCgwJDAkMCQwGDAYMBgoICggKCAoGCgcKBgwKDAoMCgwKDAoMCg8NCggKCAoICggKBgQEBAQEBAQECwwKCgMIDAoJCwwLCgMECQ4KCQkJCQkEBAQEBAQEBAQEBAQEBAkKChETCgAFBQgJCRAMBQUFBwoFBwUHCQkJCQkJCQkJCQUFCgoKCg4MDQ0NCwoNDQUJDAoPDQ0MDQwLCg0LEAsLCwYHBgoJBAoKCQoKBgoKBAQJBA8KCgoKBwgGCgkOCQkJBgQFCgkFCQgRCgoEEwsEEwsFBQgICQkRBBEIBBAJCwUFCQgJCQQKBA4GCAoHDgQHCgYHBAoKBQQHBggPDw8KDAwMDAwMEQ0LCwsLBQUFBQ0NDQ0NDQ0KDQ0NDQ0LDAoKCgoKCgoPCQoKCgoEBAQECgoKCgoKCgoKCgoKCgkKCQkFBAwKDAoMCg0JDQkNCQ0JDQwNCwsKCwoLCgsKCwoNCg0KDQoNCg0KDQsFBAUEBQQFBA8JCQQMCQoECgQKBgoICgQNCg0KDQoLDQoNCg0KDAcMBwwHCwgLCAsJCgYKCAoGDQoNCg0KDQoNCg0KEA4LCQsJCwkLCAoGBAQEBAQEBAQMDQoKAwkNCgoMDQsKAwUKDgsKCgoKCgQEBAQEBAQEBAQEBAUFCgoKExULAAUGCQsLEg0FBgYICwUIBQcLCwsLCwsLCwsLBQULCwsMEA0ODg4NCw4OBgsOCxEODw0PDgwMDgwSDQwMBgcGCwoFCwwMDAsHDAwFBQsGEQwLDAwHCQcMCg8KCgoGBAYLCwULCRMLCwUVDAUVDAUFCQkKChMFEwkFEgoMBQYLCgsLBAsFEAcJCwgQBQgLBwcFDAsFBQcHCREREQsNDQ0NDQ0TDg0NDQ0GBgYGDg4PDw8PDwsPDg4ODgwOCwsLCwsLCxELCwsLCwUFBQULDAsLCwsLCwsMDAwMCgwKCgUFDQsNCw0LDgwODA4MDgwODg4MDQsNCw0LDQsNCw4MDgwODA4MDgwODAYFBgUGBQYFEAoLBQ4LCwYLBgsHCwkLBQ4MDgwODAwPCw8LDwsOBw4HDgcMCQwJDAoMBwwJDAcODA4MDgwODA4MDgwSDwwKDAoMCgwJDAcFBQUFBQUFBQ0ODAwDCg4LCw0ODQsDBQsQDAsLCwsLBQUFBQUFBQUFBQUFBQULDAwVGQwABgYKDAwUDgUGBgkNBgkGCAwMDAwMDAwMDAwGBg0NDQ0RDg8QEA4MEBAGDA8MExAQDhAPDg0QDRQODg4HCAcNCwUMDQwNDAcNDQUFDAUTDQwNDQgKCA0LEQsLCwcFBw0MBgwKFQwMBRkOBRcOBgYKCgsLFQUUCgUTCw4GBgwLDAwFDAURBwoNCREFCA0ICAUNDQYFCAcKExMTDA4ODg4ODhUQDg4ODgYGBgYQEBAQEBAQDRAQEBAQDg8MDAwMDAwMEwwMDAwMBQUFBQwNDAwMDAwNDA0NDQ0LDQsLBgUODA4MDgwQDBAMEAwQDBAPEA0ODA4MDgwODA4MEA0QDRANEA0QDRAOBgUGBQYFBgUSCwwFDwwMBQwFDAgMCgwFEA0QDRANDRAMEAwQDA8IDwgPCA4KDgoOCw0IDQoNCBANEA0QDRANEA0QDRQRDgsOCw4LDgoNCAUFBQUFBQUFDxANDQQLEA0MDxAODQQGDBINDAwMDAwFBQUFBQUFBQUFBQUGBgwNDRgbDQAHBwwNDRcQBgcHCg4HCgcJDQ0NDQ0NDQ0NDQcHDg4ODhMQERISEA4SEgcNEQ4WEhMQExEQDxIPFxAQEAgJCA4MBg4ODQ8OCA8PBgYNBhYPDg4PCQwJDwwUDAwMCAUIDg0HDQwYDg4GGxAGGxAHBwwMDAwYBhgMBhYMEAcHDQwNDQUOBhQICw4KFAYKDgkJBg8OBwYJCQsVFRUOEBAQEBAQGBIQEBAQBwcHBxISExMTExMOExISEhIQEA4ODg4ODg4WDQ4ODg4GBgYGDg8ODg4ODg4ODw8PDwwODAwHBhAOEA4QDhINEg0SDRINEhESDxAOEA4QDhAOEA4SDxIPEg8SDxIPEg8HBgcGBwYHBhUNDQYRDQ4GDgYOCQ4LDgYSDxIPEg8PEw4TDhMOEQkRCREJEAwQDBAMDwkPCw8JEg8SDxIPEg8SDxIPFxQQDBAMEAwQDA8JBgYGBgYGBgYREg8PBAwSDg4REhAOBAcOFA8ODg4ODgYGBgYGBgYGBgYGBgcHDQ8PGx4PAAgIDQ8PGhMICAgLEAgLCAsPDw8PDw8PDw8PCAgQEBAQFhMTFBQSEBUUCA8UEBgUFRIVFBIRFBEZEhISCQsJEA4HEBAPERAKEREHBw8HGBEQEBELDgoRDhYODg4JBgkQDwgPDRsQEAceEgceEggIDQ0ODhsHGw4HGQ4SCAgPDg8PBhAHFgkNEAsWBwsQCgsHERAIBwsKDRgYGBATExMTExMaFBISEhIICAgIFBQVFRUVFRAVFBQUFBITEBAQEBAQEBgPEBAQEAcHBwcQERAQEBAQEBARERERDhAODggHExATEBMQFA8UDxQPFA8UFBQREhASEBIQEhASEBURFREVERURFBEUEQgHCAcIBwgHFw8PBxQPEAcQBxAKEAwQBxQRFBEUEREVEBUQFRAUCxQLFAsSDhIOEg4RChEMEQoUERQRFBEUERQRFBEZFhIOEg4SDhIOEQoHBwcHBwcHBxMVERAFDhUQDxMUEhAFCA8XERAQEBAQBwcHBwcHBwcHBwcHCAgPEREdIRAACAkOEBAcFAgJCAwRCAwICxAQEBAQEBAQEBAICBEREREXFBUVFRMRFhUJEBURGhUXExcVExIVEhsTExMKCwoRDwgRERASEQoSEggIEAgaEhEREgsPCxIPGA8PDwoGCREQCBAOHRERCCETCCATCAgODg8PHQgdDwgbDxMICRAPEBAGEQgYCg0RDBgIDBELCwgSEQgICwoNGhoaERQUFBQUFBwVExMTEwkJCQkVFRcXFxcXERcVFRUVExQRERERERERGhARERERCAgICBESERERERERERISEhIPEQ8PCAgUERQRFBEVEBUQFRAVEBUVFRMTERMRExETERMRFhIWEhYSFhIVEhUTCQgJCAkICQgZEBAIFRARCBEIEQsRDREIFRIVEhUSEhcRFxEXERULFQsVCxMPEw8TDxILEg0SCxUSFRIVEhUSFRIVEhsYEw8TDxMPEw8SCwgICAgICAgIFBYSEgUPFhERFBYUEQUIERkSEREREREICAgICAgICAgICAgICBASEiAkEgAJCQ8SEh8WCQkKDRMJDQkMEhISEhISEhISEgkJExMTExoWFxgYFRMYGAkSFxIdGBkVGRcVFBgUHhUVFQsMCxMQCBITEhQSCxQUCAgSCB0UExMUDBEMFBEaEREQCwcKExIJEg8gExMIJBUIJBUJCQ8PEBAgCCARCB4QFQkJEhESEgcTCBoLDxMNGggNEwwNCBQTCQgNCw8cHBwSFhYWFhYWHxgVFRUVCQkJCRgYGRkZGRkTGRgYGBgVFhMSEhISEhIdEhISEhIICAgIExQTExMTExMTFBQUFBETERAJCBYSFhIWEhgSGBIYEhgSGBcYFRUSFRIVEhUSFRIYFBgUGBQYFBgUGBUJCAkICQgJCBsREggXEhIIEggSDBIPEggYFBgUGBQUGRMZExkTFwwXDBcMFREVERURFAwUDxQMGBQYFBgUGBQYFBgUHhoVERUQFRAVERQMCAgICAgICAgWGBQTBRAYExIWGBYTBQkSGxQTExMTEwgICAgICAgICAgICAkJEhQUISUSAAkKEBISIBcJCgsNFAkNCQ0SEhISEhISEhISCQkUFBQUGhcXGBgWFBkYChIYEx4YGhYaGBUUGBUfFhUVCw0LFBEJExQSFBMMFBQJCRIJHhQUFBQNEQwUERsRERELBwsUEgkSECEUFAklFQklFQkJEBARESEJIREJHxEVCQoSEhISBxQJGwsPFA0bCQ0UDQ0JFBQJCQ0MDx0dHRMXFxcXFxcgGBYWFhYKCgoKGBgaGhoaGhQaGBgYGBUXFBMTExMTEx4SExMTEwkJCQkUFBQUFBQUFBQUFBQUERQREQkJFxMXExcTGBIYEhgSGBIYGBgVFhMWExYTFhMWExkUGRQZFBkUGBQYFQoJCgkKCQoJHBISCRgSEwkTCRMMEw8TCRgUGBQYFBUaFBoUGhQYDRgNGA0VERURFREUDBQPFAwYFBgUGBQYFBgUGBQfGxURFREVERURFAwJCQkJCQkJCRcZFBQGERkUExcZFhQGCRMcFRQUFBQUCQkJCQkJCQkJCQkJCQkSFBQlKhQACgsSFRUkGQoLCw8WCg8KDhUVFRUVFRUVFRUKChYWFhYdGRsbGxkWHBsLFRsVIhsdGR0bGBcbFyMZGBgMDgwWEwoVFxUXFQ0XFwoKFQoiFxYXFw4TDhcTHhMTEwwIDBYVChUSJRYWCioYCikYCgoSEhMTJQolEwoiExgKCxUUFRUIFgoeDREWDx4KDxYODwoXFgoKDw0RISEhFRkZGRkZGSQbGRkZGQsLCwsbGx0dHR0dFh0bGxsbGBoWFRUVFRUVIhUVFRUVCgoKChYXFhYWFhYWFhcXFxcTFxMTCgoZFRkVGRUbFRsVGxUbFRsbGxgZFRkVGRUZFRkVHBccFxwXHBcbFxsYCwoLCgsKCwogFBUKGxUVChUKFQ4VERUKGxcbFxsXFx0WHRYdFhsOGw4bDhgTGBMYExcOFxEXDhsXGxcbFxsXGxcbFyMeGBMYExgTGBMXDgoKCgoKCgoKGhwXFwYTHBYVGhwZFgYKFR8XFhYWFhYKCgoKCgoKCgoKCgoKChQXFyowFgAMDBQXFygdDAwNERkMEQwQFxcXFxcXFxcXFwwMGRkZGSIdHx8fHBkgHwwXHhgmHyEcIR4bGh8aKBwbGw4QDhkVCxgaFxoYDxoaCwsXCyYaGRoaEBYQGhYiFhYVDgkOGRcMFxQqGRkLMBsLLxsMDBQUFRUqCyoWCycVGwwMFxcXFwkZCyIOExkRIgsRGRAQCxoZDAsQDxMlJSUYHR0dHR0dKR8cHBwcDAwMDB8fISEhISEZIR8fHx8bHRkYGBgYGBgmFxgYGBgLCwsLGRoZGRkZGRkZGhoaGhYaFhUMCx0YHRgdGB8XHxcfFx8XHx4fGxwYHBgcGBwYHBggGiAaIBogGh8aHxsMCwwLDAsMCyQXFwseFxgLGAsYDxgTGAsfGh8aHxobIRkhGSEZHhAeEB4QGxYbFhsWGhAaExoQHxofGh8aHxofGh8aKCIbFhsVGxUbFhoQCwsLCwsLCwsdIBoaBxUgGRgdHxwZBwwYJBoZGRkZGQsLCwsLCwsLCwsLCwwMFhoaLjQYAA0OFhoaLCANDg4THA0TDRIaGhoaGhoaGhoaDQ0cHBwbJSAhIiIfGyMiDhohGioiJB8kIR4cIh0rHx4eDxIPHBcMGhwaHBoQHBwMDBoMKhwbHBwSGBEcGCUYGBcPCg8cGg0aFi4bGww0HgwzHg0NFhYXFy4MLhgMKxceDQ4aGRoaChsMJRAVHBMlDBIcEhIMHBwNDBIQFSkpKRogICAgICAtIh8fHx8ODg4OIiIkJCQkJBwkIiIiIh4fGxoaGhoaGioaGhoaGgwMDAwbHBsbGxsbHBscHBwcGBwYFw0MIBogGiAaIhoiGiIaIhoiISIeHxofGh8aHxofGiMcIxwjHCMcIhwiHg4MDgwODA4MJxkaDCEaGgwaDBoRGhUaDCIcIhwiHB0kGyQbJBshEiESIRIeGB4YHhgcERwVHBEiHCIcIhwiHCIcIhwrJR4YHhceFx4YHBEMDAwMDAwMDCAjHBwIFyMcGiAiHxwIDRonHRsbGxsbDAwMDAwMDAwMDAwMDQ0YHBwyORsADg8YHBwwIg4PDxQeDhQOExwcHBwcHBwcHBwODh4eHh0oIiQlJSEeJiUPHCQdLSUnISckIB8lIC8hICARExEeGQ0dHhwfHRIfHw0NHA0tHx4eHxMaEx8aKRoaGRELER4cDhwYMh4eDTkgDTggDg4YGBkZMg0yGg0uGSAODxwbHBwLHg0oERceFCgNFB4UFA0fHg4NFBIXLCwsHSIiIiIiIjElISEhIQ8PDw8lJScnJycnHiclJSUlICIeHR0dHR0dLRwdHR0dDQ0NDR4fHh4eHh4eHh8fHx8aHhoZDg0iHSIdIh0lHCUcJRwlHCUkJSAhHSEdIR0hHSEdJh8mHyYfJh8lHyUgDw0PDQ8NDw0rGxwNJBwdDR0NHRIdFx0NJR8lHyUfICceJx4nHiQTJBMkEyAaIBogGh8THxcfEyUfJR8lHyUfJR8lHy8pIBogGSAZIBofEw0NDQ0NDQ0NIyYfHggZJh4dIyUiHggOHSofHh4eHh4NDQ0NDQ0NDQ0NDQ0ODhsfHzY9HQAPEBoeHjQlDxARFiAPFg8VHh4eHh4eHh4eHg8PICAgICslJigoJCApKBAeJx8xKCokKicjISgiMyQjIxIVEiAbDh8hHiEfEyEhDg4eDjEhICEhFRwUIRwsHBwbEgwSIB4PHho2ICAOPSMOPCMPDxoaGxs2DjYcDjIbIw8QHh4eHgwgDisTGSAWKw4WIBYVDiEgDw4VExkwMDAfJSUlJSUlNSgkJCQkEBAQECgoKioqKiogKigoKCgjJCAfHx8fHx8xHh8fHx8ODg4OICEgICAgICAgISEhIRwhHBsPDiUfJR8lHygeKB4oHigeKCcoIyQfJB8kHyQfJB8pISkhKSEpISghKCMQDhAOEA4QDi4dHg4nHh8OHw4fFB8ZHw4oISghKCEiKiAqICogJxUnFScVIxwjHCMcIRQhGSEUKCEoISghKCEoISghMywjHCMbIxsjHCEUDg4ODg4ODg4mKSEhCRspIB8mKCQgCQ8fLiIgICAgIA4ODg4ODg4ODg4ODg8PHSEhOkEfABARHCAgOCgQERIYIxAYEBcgICAgICAgICAgEBAjIyMiLigrKysnIiwrESAqITUrLSctKiYjKyU3JyYmExcTIx0PISQgIyEUIyMPDyAPNSMiJCMXHhUjHi8eHh0TDRMjIBAgHDoiIg9BJg9AJhAQHBwdHToPOh4PNh0mEBEgICAgDSIPLhQbIxguDxcjFxcPIyMQDxcVGzQ0NCEoKCgoKCg5KycnJycRERERKystLS0tLSMtKysrKyYnIiEhISEhITUgISEhIQ8PDw8iIyIiIiIiIyIjIyMjHiQeHRAPKCEoISghKyArICsgKyArKislJyEnISchJyEnISwjLCMsIywjKyMrJREPEQ8RDxEPMh8gDyogIQ8hDyEVIRshDysjKyMrIyUtIi0iLSIqFyoXKhcmHiYeJh4jFSMaIxUrIysjKyMrIysjKyM3LyYeJh0mHSYeIxUPDw8PDw8PDyksIyMKHSwjISkrJyMKECExJCIiIiIiDw8PDw8PDw8PDw8PEBAfIyNDTCMAExQgJSVBLhIUFBsoExsTGiUlJSUlJSUlJSUTEygoKCc1LjEyMi0oMzIUJTAmPTI0LTQwKykyKj8tKysWGhYoIhEmKSUpJhgpKRERJRE9KSgpKRojGSkjNyMjIhYPFiglEyUgQygoEUwrEUorExMgICIiQxFCIxE+IisTFCUlJSUPKBE1Fx8oGzURGygaGhEpKBMRGhgfPDw8Ji4uLi4uLkIyLS0tLRQUFBQyMjQ0NDQ0KDQyMjIyKy0oJiYmJiYmPSUmJiYmERERESgpKCgoKCgoKCkpKSkjKSMiExEuJi4mLiYyJTIlMiUyJTIxMistJi0mLSYtJi0mMykzKTMpMykyKTIrFBEUERQRFBE5JCURMCUmESYRJhkmHyYRMikyKTIpKjQoNCg0KDAaMBowGisjKyMrIykZKR4pGTIpMikyKTIpMikyKT83KyMrIisiKyMpGRERERERERERLzMpKQsiMygmLzItKAsTJjkqKCgoKCgRERERERERERERERETEyMpKUtUKAAVFiQqKkgzFRYXHy0VHxUdKioqKioqKioqKhUVLS0tLDwzNjg3Miw5OBYqNitEODoyOjYxLjgvRzIxMRkdGS0mEysuKi4rGi4uExMqE0QuLC4uHSccLic9JycmGREZLSoVKiRLLCwTVDETUzEVFSQk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AjwAFgK+/7sC7QA3AqEAGwJYADAAp/9aARYAKwI6/98DUAAQAnQATQJR//0CUQAGAlEABgJRAAYCUQA0AQMAGAEDAIYBAwAJAQMAHwEDAA0BAwARAQMAIwEDACYBAwBJAQP/+gEDAHMBAwCZARYAAgEWAD8CAAAAAmMAEQJjABEAAAABAAAZLgABBDAYAAAKASAAIwA2/8kAIwA4/9sAIwA5/+4AIwA7/8kAIwBv/7EAIwB7/8kAIwC5/8kAIwE4/8kAIwE6/8kAIwFK/+4AIwFM/8kAIwFU/8kAKAAO/38AKAAQ/38AKAAj/8kAKACc/8kAKACd/8kAKACe/8kAKACf/8kAKACg/8kAKACh/8kAKADf/8kAKADh/8kAKADj/8kALgA2/6QALgA4/7YALgA5/8kALgA7/6QALgBb/+4ALgBv/5EALgB7/6QALgC5/6QALgDZ/+4ALgDb/+4ALgE4/6QALgE6/6QALgFK/8kALgFM/6QALgFN/+4ALgFU/6QAMgAO/2cAMgAQ/2cAMgAj/7YAMgCc/7YAMgCd/7YAMgCe/7YAMgCf/7YAMgCg/7YAMgCh/7YAMgDf/7YAMgDh/7YAMgDj/7YANAA2/+4ANAA4/+4ANAA5/+4ANAA7/+4ANAB7/+4ANAC5/+4ANAE4/+4ANAE6/+4ANAFK/+4ANAFM/+4ANAFU/+4ANgAO/6QANgAP/54ANgAQ/6QANgAc/84ANgAd/84ANgAj/8kANgBD/7YANgBF/7YANgBH/7YANgBL/+cANgBR/7YANgBU/7YANgBV/7YANgBX/7YANgBZ/7YANgBb/8kANgB3/7YANgCc/8kANgCd/8kANgCe/8kANgCf/8kANgCg/8kANgCh/8kANgC8/7YANgC9/7YANgC+/7YANgC//7YANgDA/7YANgDB/7YANgDD/7YANgDE/7YANgDF/7YANgDG/7YANgDH/7YANgDO/7YANgDP/7YANgDQ/7YANgDR/7YANgDS/7YANgDV/7YANgDW/7YANgDX/7YANgDY/7YANgDZ/8kANgDb/8kANgDf/8kANgDg/7YANgDh/8kANgDi/7YANgDj/8kANgDk/7YANgDm/7YANgDo/7YANgDq/7YANgDs/7YANgDy/7YANgD0/7YANgD2/7YANgD4/7YANgD6/7YANgEM/+cANgEQ/+cANgEn/7YANgEp/7YANgEr/7YANgEt/7YANgEv/7YANgEx/7YANgEz/7YANgE1/7YANgE3/7YANgE//7YANgFB/7YANgFD/7YANgFF/7YANgFH/7YANgFJ/7YANgFL/7YANgFN/8kANgFT/7YAOAAO/6QAOAAP/9sAOAAQ/6QAOAAc/+EAOAAd/+EAOAAj/9sAOABD/9sAOABH/+cAOABL//oAOABR/9sAOABU/+4AOABX/+4AOACc/9sAOACd/9sAOACe/9sAOACf/9sAOACg/9sAOACh/9sAOAC8/9sAOAC9/9sAOAC+/9sAOAC//9sAOADA/9sAOADB/9sAOADE/+cAOADF/+cAOADG/+cAOADH/+cAOADO/9sAOADP/9sAOADQ/9sAOADR/9sAOADS/9sAOADV/+4AOADW/+4AOADX/+4AOADY/+4AOADf/9sAOADg/9sAOADh/9sAOADi/9sAOADj/9sAOADk/9sAOADy/+cAOAD0/+cAOAD2/+cAOAD4/+cAOAD6/+cAOAEM//oAOAEQ//oAOAEn/9sAOAEp/9sAOAEr/9sAOAEt/+4AOAEv/+4AOAEx/+4AOAE//+4AOAFB/+4AOAFD/+4AOAFF/+4AOAFH/+4AOAFJ/+4AOQAO/7YAOQAP/9sAOQAQ/7YAOQAc/+EAOQAd/9UAOQAj/+4AOQBD/9sAOQBH/9sAOQBL//oAOQBR/9sAOQBU/+4AOQBX/+4AOQCc/+4AOQCd/+4AOQCe/+4AOQCf/+4AOQCg/+4AOQCh/+4AOQC8/9sAOQC9/9sAOQC+/9sAOQC//9sAOQDA/9sAOQDB/9sAOQDE/9sAOQDF/9sAOQDG/9sAOQDH/9sAOQDO/9sAOQDP/9sAOQDQ/9sAOQDR/9sAOQDS/9sAOQDV/+4AOQDW/+4AOQDX/+4AOQDY/+4AOQDf/+4AOQDg/9sAOQDh/+4AOQDi/9sAOQDj/+4AOQDk/9sAOQDy/9sAOQD0/9sAOQD2/9sAOQD4/9sAOQD6/9sAOQEM//oAOQEQ//oAOQEn/9sAOQEp/9sAOQEr/9sAOQEt/+4AOQEv/+4AOQEx/+4AOQE//+4AOQFB/+4AOQFD/+4AOQFF/+4AOQFH/+4AOQFJ/+4AOwAO/54AOwAP/8MAOwAQ/54AOwAc/9sAOwAd/9sAOwAj/8kAOwBD/8kAOwBH/8kAOwBL/+4AOwBR/8kAOwBS/9sAOwBT/8kAOwBX/9sAOwBY/+4AOwCc/8kAOwCd/8kAOwCe/8kAOwCf/8kAOwCg/8kAOwCh/8kAOwC8/8kAOwC9/8kAOwC+/8kAOwC//8kAOwDA/8kAOwDB/8kAOwDE/8kAOwDF/8kAOwDG/8kAOwDH/8kAOwDO/8kAOwDP/8kAOwDQ/8kAOwDR/8kAOwDS/8kAOwDV/9sAOwDW/9sAOwDX/9sAOwDY/9sAOwDf/8kAOwDg/8kAOwDh/8kAOwDi/8kAOwDj/8kAOwDk/8kAOwDy/8kAOwD0/8kAOwD2/8kAOwD4/8kAOwD6/8kAOwEM/+4AOwEQ/+4AOwEn/8kAOwEp/8kAOwEr/8kAOwE//9sAOwFB/9sAOwFD/9sAOwFF/9sAOwFH/9sAOwFJ/9sAVAAO/7YAVAAP/9sAVAAQ/7YAVABYABIAVABbABIAVADZABIAVADbABIAVAFNABIAWAAO/8kAWAAQ/8kAWQAO/9sAWQAQ/9sAWwAO/8kAWwAQ/8kAbgBu/9kAbwBV/9sAbwBv/9kAbwB3/9sAbwEz/9sAbwE1/9sAbwE3/9sAbwFT/9sAewAO/54AewAP/8MAewAQ/54AewAc/9sAewAd/9sAewAj/8kAewBD/8kAewBH/8kAewBL/+4AewBR/8kAewBS/9sAewBT/8kAewBX/9sAewBY/+4AewCc/8kAewCd/8kAewCe/8kAewCf/8kAewCg/8kAewCh/8kAewC8/8kAewC9/8kAewC+/8kAewC//8kAewDA/8kAewDB/8kAewDE/8kAewDF/8kAewDG/8kAewDH/8kAewDO/8kAewDP/8kAewDQ/8kAewDR/8kAewDS/8kAewDV/9sAewDW/9sAewDX/9sAewDY/9sAewDf/8kAewDg/8kAewDh/8kAewDi/8kAewDj/8kAewDk/8kAewDy/8kAewD0/8kAewD2/8kAewD4/8kAewD6/8kAewEM/+4AewEQ/+4AewEn/8kAewEp/8kAewEr/8kAewE//9sAewFB/9sAewFD/9sAewFF/9sAewFH/9sAewFJ/9sAnAA2/8kAnAA4/9sAnAA5/+4AnAA7/8kAnABv/7EAnAB7/8kAnAC5/8kAnAE4/8kAnAE6/8kAnAFK/+4AnAFM/8kAnAFU/8kAnQA2/8kAnQA4/9sAnQA5/+4AnQA7/8kAnQBv/7EAnQB7/8kAnQC5/8kAnQE4/8kAnQE6/8kAnQFK/+4AnQFM/8kAnQFU/8kAngA2/8kAngA4/9sAngA5/+4AngA7/8kAngBv/7EAngB7/8kAngC5/8kAngE4/8kAngE6/8kAngFK/+4AngFM/8kAngFU/8kAnwA2/8kAnwA4/9sAnwA5/+4AnwA7/8kAnwBv/7EAnwB7/8kAnwC5/8kAnwE4/8kAnwE6/8kAnwFK/+4AnwFM/8kAnwFU/8kAoAA2/8kAoAA4/9sAoAA5/+4AoAA7/8kAoABv/7EAoAB7/8kAoAC5/8kAoAE4/8kAoAE6/8kAoAFK/+4AoAFM/8kAoAFU/8kAoQA2/8kAoQA4/9sAoQA5/+4AoQA7/8kAoQBv/7EAoQB7/8kAoQC5/8kAoQE4/8kAoQE6/8kAoQFK/+4AoQFM/8kAoQFU/8kAuQAO/54AuQAP/8MAuQAQ/54AuQAc/9sAuQAd/9sAuQAj/8kAuQBD/8kAuQBH/8kAuQBL/+4AuQBR/8kAuQBS/9sAuQBT/8kAuQBX/9sAuQBY/+4AuQCc/8kAuQCd/8kAuQCe/8kAuQCf/8kAuQCg/8kAuQCh/8kAuQC8/8kAuQC9/8kAuQC+/8kAuQC//8kAuQDA/8kAuQDB/8kAuQDE/8kAuQDF/8kAuQDG/8kAuQDH/8kAuQDO/8kAuQDP/8kAuQDQ/8kAuQDR/8kAuQDS/8kAuQDV/9sAuQDW/9sAuQDX/9sAuQDY/9sAuQDf/8kAuQDg/8kAuQDh/8kAuQDi/8kAuQDj/8kAuQDk/8kAuQDy/8kAuQD0/8kAuQD2/8kAuQD4/8kAuQD6/8kAuQEM/+4AuQEQ/+4AuQEn/8kAuQEp/8kAuQEr/8kAuQE//9sAuQFB/9sAuQFD/9sAuQFF/9sAuQFH/9sAuQFJ/9sA2QAO/8kA2QAQ/8kA2wAO/8kA2wAQ/8kA3wA2/8kA3wA4/9sA3wA5/+4A3wA7/8kA3wBv/7EA3wB7/8kA3wC5/8kA3wE4/8kA3wE6/8kA3wFK/+4A3wFM/8kA3wFU/8kA4QA2/8kA4QA4/9sA4QA5/+4A4QA7/8kA4QBv/7EA4QB7/8kA4QC5/8kA4QE4/8kA4QE6/8kA4QFK/+4A4QFM/8kA4QFU/8kA4wA2/8kA4wA4/9sA4wA5/+4A4wA7/8kA4wBv/7EA4wB7/8kA4wC5/8kA4wE4/8kA4wE6/8kA4wFK/+4A4wFM/8kA4wFU/8kBFQA2/6QBFQA4/7YBFQA5/8kBFQA7/6QBFQBb/+4BFQBv/5EBFQB7/6QBFQC5/6QBFQDZ/+4BFQDb/+4BFQE4/6QBFQE6/6QBFQFK/8kBFQFM/6QBFQFN/+4BFQFU/6QBFwA2/6QBFwA4/7YBFwA5/8kBFwA7/6QBFwBb/+4BFwBv/5EBFwB7/6QBFwC5/6QBFwDZ/+4BFwDb/+4BFwE4/6QBFwE6/6QBFwFK/8kBFwFM/6QBFwFN/+4BFwFU/6QBGQA2/6QBGQA4/7YBGQA5/8kBGQA7/6QBGQBb/+4BGQBv/5EBGQB7/6QBGQC5/6QBGQDZ/+4BGQDb/+4BGQE4/6QBGQE6/6QBGQFK/8kBGQFM/6QBGQFN/+4BGQFU/6QBGwA2/6QBGwA4/7YBGwA5/8kBGwA7/6QBGwBb/+4BGwBv/5EBGwB7/6QBGwC5/6QBGwDZ/+4BGwDb/+4BGwE4/6QBGwE6/6QBGwFK/8kBGwFM/6QBGwFN/+4BGwFU/6QBLAA2/+4BLAA4/+4BLAA5/+4BLAA7/+4BLAB7/+4BLAC5/+4BLAE4/+4BLAE6/+4BLAFK/+4BLAFM/+4BLAFU/+4BLQAO/7YBLQAP/9sBLQAQ/7YBLQBYABIBLQBbABIBLQDZABIBLQDbABIBLQFNABIBLgA2/+4BLgA4/+4BLgA5/+4BLgA7/+4BLgB7/+4BLgC5/+4BLgE4/+4BLgE6/+4BLgFK/+4BLgFM/+4BLgFU/+4BLwAO/7YBLwAP/9sBLwAQ/7YBLwBYABIBLwBbABIBLwDZABIBLwDbABIBLwFNABIBMAA2/+4BMAA4/+4BMAA5/+4BMAA7/+4BMAB7/+4BMAC5/+4BMAE4/+4BMAE6/+4BMAFK/+4BMAFM/+4BMAFU/+4BMQAO/7YBMQAP/9sBMQAQ/7YBMQBYABIBMQBbABIBMQDZABIBMQDbABIBMQFNABIBOAAO/6QBOAAP/54BOAAQ/6QBOAAc/84BOAAd/84BOAAj/8kBOABD/7YBOABF/7YBOABH/7YBOABL/+cBOABR/7YBOABU/7YBOABV/7YBOABX/7YBOABZ/7YBOABb/8kBOAB3/7YBOACc/8kBOACd/8kBOACe/8kBOACf/8kBOACg/8kBOACh/8kBOAC8/7YBOAC9/7YBOAC+/7YBOAC//7YBOADA/7YBOADB/7YBOADD/7YBOADE/7YBOADF/7YBOADG/7YBOADH/7YBOADO/7YBOADP/7YBOADQ/7YBOADR/7YBOADS/7YBOADV/7YBOADW/7YBOADX/7YBOADY/7YBOADZ/8kBOADb/8kBOADf/8kBOADg/7YBOADh/8kBOADi/7YBOADj/8kBOADk/7YBOADm/7YBOADo/7YBOADq/7YBOADs/7YBOADy/7YBOAD0/7YBOAD2/7YBOAD4/7YBOAD6/7YBOAEM/+cBOAEQ/+cBOAEn/7YBOAEp/7YBOAEr/7YBOAEt/7YBOAEv/7YBOAEx/7YBOAEz/7YBOAE1/7YBOAE3/7YBOAE//7YBOAFB/7YBOAFD/7YBOAFF/7YBOAFH/7YBOAFJ/7YBOAFL/7YBOAFN/8kBOAFT/7YBOgAO/6QBOgAP/54BOgAQ/6QBOgAc/84BOgAd/84BOgAj/8kBOgBD/7YBOgBF/7YBOgBH/7YBOgBL/+cBOgBR/7YBOgBU/7YBOgBV/7YBOgBX/7YBOgBZ/7YBOgBb/8kBOgB3/7YBOgCc/8kBOgCd/8kBOgCe/8kBOgCf/8kBOgCg/8kBOgCh/8kBOgC8/7YBOgC9/7YBOgC+/7YBOgC//7YBOgDA/7YBOgDB/7YBOgDD/7YBOgDE/7YBOgDF/7YBOgDG/7YBOgDH/7YBOgDO/7YBOgDP/7YBOgDQ/7YBOgDR/7YBOgDS/7YBOgDV/7YBOgDW/7YBOgDX/7YBOgDY/7YBOgDZ/8kBOgDb/8kBOgDf/8kBOgDg/7YBOgDh/8kBOgDi/7YBOgDj/8kBOgDk/7YBOgDm/7YBOgDo/7YBOgDq/7YBOgDs/7YBOgDy/7YBOgD0/7YBOgD2/7YBOgD4/7YBOgD6/7YBOgEM/+cBOgEQ/+cBOgEn/7YBOgEp/7YBOgEr/7YBOgEt/7YBOgEv/7YBOgEx/7YBOgEz/7YBOgE1/7YBOgE3/7YBOgE//7YBOgFB/7YBOgFD/7YBOgFF/7YBOgFH/7YBOgFJ/7YBOgFL/7YBOgFN/8kBOgFT/7YBSgAO/7YBSgAP/9sBSgAQ/7YBSgAc/+EBSgAd/9UBSgAj/+4BSgBD/9sBSgBH/9sBSgBL//oBSgBR/9sBSgBU/+4BSgBX/+4BSgCc/+4BSgCd/+4BSgCe/+4BSgCf/+4BSgCg/+4BSgCh/+4BSgC8/9sBSgC9/9sBSgC+/9sBSgC//9sBSgDA/9sBSgDB/9sBSgDE/9sBSgDF/9sBSgDG/9sBSgDH/9sBSgDO/9sBSgDP/9sBSgDQ/9sBSgDR/9sBSgDS/9sBSgDV/+4BSgDW/+4BSgDX/+4BSgDY/+4BSgDf/+4BSgDg/9sBSgDh/+4BSgDi/9sBSgDj/+4BSgDk/9sBSgDy/9sBSgD0/9sBSgD2/9sBSgD4/9sBSgD6/9sBSgEM//oBSgEQ//oBSgEn/9sBSgEp/9sBSgEr/9sBSgEt/+4BSgEv/+4BSgEx/+4BSgE//+4BSgFB/+4BSgFD/+4BSgFF/+4BSgFH/+4BSgFJ/+4BSwAO/9sBSwAQ/9sBTAAO/54BTAAP/8MBTAAQ/54BTAAc/9sBTAAd/9sBTAAj/8kBTABD/8kBTABH/8kBTABL/+4BTABR/8kBTABS/9sBTABT/8kBTABX/9sBTABY/+4BTACc/8kBTACd/8kBTACe/8kBTACf/8kBTACg/8kBTACh/8kBTAC8/8kBTAC9/8kBTAC+/8kBTAC//8kBTADA/8kBTADB/8kBTADE/8kBTADF/8kBTADG/8kBTADH/8kBTADO/8kBTADP/8kBTADQ/8kBTADR/8kBTADS/8kBTADV/9sBTADW/9sBTADX/9sBTADY/9sBTADf/8kBTADg/8kBTADh/8kBTADi/8kBTADj/8kBTADk/8kBTADy/8kBTAD0/8kBTAD2/8kBTAD4/8kBTAD6/8kBTAEM/+4BTAEQ/+4BTAEn/8kBTAEp/8kBTAEr/8kBTAE//9sBTAFB/9sBTAFD/9sBTAFF/9sBTAFH/9sBTAFJ/9sBTQAO/8kBTQAQ/8kBVAAO/6QBVAAP/54BVAAQ/6QBVAAc/84BVAAd/84BVAAj/8kBVABD/7YBVABF/7YBVABH/7YBVABL/+cBVABR/7YBVABU/7YBVABV/7YBVABX/7YBVABZ/7YBVABb/8kBVAB3/7YBVACc/8kBVACd/8kBVACe/8kBVACf/8kBVACg/8kBVACh/8kBVAC8/7YBVAC9/7YBVAC+/7YBVAC//7YBVADA/7YBVADB/7YBVADD/7YBVADE/7YBVADF/7YBVADG/7YBVADH/7YBVADO/7YBVADP/7YBVADQ/7YBVADR/7YBVADS/7YBVADV/7YBVADW/7YBVADX/7YBVADY/7YBVADZ/8kBVADb/8kBVADf/8kBVADg/7YBVADh/8kBVADi/7YBVADj/8kBVADk/7YBVADm/7YBVADo/7YBVADq/7YBVADs/7YBVADy/7YBVAD0/7YBVAD2/7YBVAD4/7YBVAD6/7YBVAEM/+cBVAEQ/+cBVAEn/7YBVAEp/7YBVAEr/7YBVAEt/7YBVAEv/7YBVAEx/7YBVAEz/7YBVAE1/7YBVAE3/7YBVAE//7YBVAFB/7YBVAFD/7YBVAFF/7YBVAFH/7YBVAFJ/7YBVAFL/7YBVAFN/8kBVAFT/7YAAAAAAKoAqgCqAPwBRAH4A9AFaAbkBwYHVgeiB+oINAhuCIIIoAjgCiQLIA2KDywQ5hKmFEAVUBdSGToZpBokGmYahhqyG1wdLB44H0AgFiDcIbgiuCOYJPQlciYAJuQnhii0KdAqaCuYLGYt1i8QL+AxHjGmMtQ0PjTANlo2nDbKNxg3SDdmOD456DtWPCo9Tj6yP6pA9EJOQyxD6kSQRNZGIEdER+pJTkquS3RMrk2QTtZPaFBSUMhRulMsU/RUDFTIVRhXPld4WOZZeFnEWgxadlvuXcpd3l4SX0BfVF+QX9xgbmEGYTBhRGFYYupjcGOCY6hkvmTQZQZlBmVSZhRnTGfcaYZpwGrSa+xtQm7ob0xvam9+cIxw8HHkcjJznHUedfJ2sHdEd354dnl2eiR6cnsEe6Z8in0efTJ9Rn1afW59hn2if9iBaoF+gZKBpoHUgeiB/IIQgjyDqIO8g9CD5IP4hAyELoSEheCF9IYIhhyGRoZahuaHuofYh/CIBIgYiFCIconai36LkIuki8CL+IwKjByMLoxsjWSNeI2KjZ6Nso3GjgiOwo/Kj96P8pAGkD6QUJFqkaCRoJJ2kqKSrpLGktqS7pTIltqW7pcClySXOJdMl2iXfJeQl6SXsJkcmoqalpqqmr6a0prqmwycpJ4YniyeRJ5YnmyegJ6Unqiezp7anu6fAp8Ookyj/KQQpCKkLqRApRSmUqZmpqymuKbEptim6qb2pwKnFqcupzqnRqdSp3CnfKeIp+KoRKhYqGSocKh8qJCopKjGqNqo7qkCqRapSql0qYipoKmsqbipzKneqfKqBKoYqiqr1K40rkCuTK5krnCvxLFGsVqxbrGCsZaxqrG+seyyBLIcskCzqrTwtQS1GLUstT61UrVqtYK1orWutbq1xrXStiK26LdMt+S4brnguta75r0MvfC+rr9Yv47AKMEMwgbC7sQUxFDEnMSwxObFIMWGxkTGtse2yFbIiMjUyQzJMslWyaDJ0spoyrTKyMsOzBbMaMyGzJTNns24zmLPktDMAAAAAQAAAYYAagAHAF8ABAABAAAAAAAKAAACAAY3AAIAAQAAACEBkgABAAAAAAAAA6EAAAABAAAAAAABABIDoQABAAAAAAACAA4DswABAAAAAAADADQDwQABAAAAAAAEACED9QABAAAAAAAFABIEFgABAAAAAAAGABsEKAABAAAAAAAHAFkEQwABAAAAAAAIAA0EnAABAAAAAAAJABYEqQABAAAAAAAKBgMEvwABAAAAAAALABcKwgABAAAAAAAMACUK2QABAAAAAAANA88K/gABAAAAAAAOABcOzQABAAAAAAASAB0O5AADAAEECQAAB0IPAQADAAEECQABADoWQwADAAEECQACABYWfQADAAEECQADAGgWkwADAAEECQAEAEIW+wADAAEECQAFACQXPQADAAEECQAGADYXYQADAAEECQAHALIXlwADAAEECQAIABoYSQADAAEECQAJACwYYwADAAEECQAKDAYYjwADAAEECQALAC4klQADAAEECQAMAEokwwADAAEECQANB54lDQADAAEECQAOAC4sqwADAAEECQAQACQs2QADAAEECQARABws/VBhcnQgb2YgdGhlIGRpZ2l0YWxseSBlbmNvZGVkIG1hY2hpbmUgcmVhZGFibGUgb3V0bGluZSBkYXRhIGZvciBwcm9kdWNpbmcgdGhlIFR5cGVmYWNlcyBwcm92aWRlZCBpcyBjb3B5cmlnaHRlZCCpIDIwMDcgTGlub3R5cGUgR21iSCwgd3d3Lmxpbm90eXBlLmNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBzb2Z0d2FyZSBpcyB0aGUgcHJvcGVydHkgb2YgTGlub3R5cGUgR21iSCwgYW5kIG1heSBub3QgYmUgcmVwcm9kdWNlZCwgdXNlZCwgZGlzcGxheWVkLCBtb2RpZmllZCwgZGlzY2xvc2VkIG9yIHRyYW5zZmVycmVkIHdpdGhvdXQgdGhlIGV4cHJlc3Mgd3JpdHRlbiBhcHByb3ZhbCBvZiBMaW5vdHlwZSBHbWJILiAgVGhlIGRpZ2l0YWxseSBlbmNvZGVkIG1hY2hpbmUgcmVhZGFibGUgc29mdHdhcmUgZm9yIHByb2R1Y2luZyB0aGUgVHlwZWZhY2VzIGxpY2Vuc2VkIHRvIHlvdSBpcyBjb3B5cmlnaHRlZCAoYykgMTk4OCwgMTk5MCwgMTk5MyBBZG9iZSBTeXN0ZW1zLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBwcm9wZXJ0eSBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBhbmQgaXRzIGxpY2Vuc29ycywgYW5kIG1heSBub3QgYmUgcmVwcm9kdWNlZCwgdXNlZCwgZGlzcGxheWVkLCBtb2RpZmllZCwgZGlzY2xvc2VkIG9yIHRyYW5zZmVycmVkIHdpdGhvdXQgdGhlIGV4cHJlc3Mgd3JpdHRlbiBhcHByb3ZhbCBvZiBBZG9iZS4gSGVsdmV0aWNhIGlzIGEgdHJhZGVtYXJrIG9mIExpbm90eXBlIEdtYkggYW5kIG1heSBiZSByZWdpc3RlcmVkIGluIGNlcnRhaW4ganVyaXNkaWN0aW9ucy4gVGhpcyB0eXBlZmFjZSBpcyBvcmlnaW5hbCBhcnR3b3JrIG9mIExpbm90eXBlIERlc2lnbiBTdHVkaW8uIFRoZSBkZXNpZ24gbWF5IGJlIHByb3RlY3RlZCBpbiBjZXJ0YWluIGp1cmlzZGljdGlvbnMuVFVNIE5ldWUgSGVsdmV0aWNhNzYgQm9sZCBJdGFsaWNMaW5vdHlwZSBHbWJIOlRVTSBOZXVlIEhlbHZldGljYSA3NiBCb2xkIEl0YWxpYzoyMDA3VFVNIE5ldWUgSGVsdmV0aWNhIDc2IEJvbGQgSXRhbGljVmVyc2lvbiAxLjAwOyAyMDA3VFVNTmV1ZUhlbHZldGljYS1Cb2xkSXRhbGljSGVsdmV0aWNhIGlzIGEgdHJhZGVtYXJrIG9mIExpbm90eXBlIEdtYkggYW5kIG1heSBiZSByZWdpc3RlcmVkIGluIGNlcnRhaW4ganVyaXNkaWN0aW9ucy5MaW5vdHlwZSBHbWJITGlub3R5cGUgRGVzaWduIFN0dWRpb0hlbHZldGljYSBpcyBvbmUgb2YgdGhlIG1vc3QgZmFtb3VzIGFuZCBwb3B1bGFyIHR5cGVmYWNlcyBpbiB0aGUgd29ybGQuIEl0IGxlbmRzIGFuIGFpciBvZiBsdWNpZCBlZmZpY2llbmN5IHRvIGFueSB0eXBvZ3JhcGhpYyBtZXNzYWdlIHdpdGggaXRzIGNsZWFuLCBuby1ub25zZW5zZSBzaGFwZXMuIFRoZSBvcmlnaW5hbCB0eXBlZmFjZSB3YXMgY2FsbGVkIEhhYXMgR3JvdGVzaywgYW5kIHdhcyBkZXNpZ25lZCBpbiAxOTU3IGJ5IE1heCBNaWVkaW5nZXIgZm9yIHRoZSBIYWFzJ3NjaGUgU2NocmlmdGdpZXNzZXJlaSAoSGFhcyBUeXBlIEZvdW5kcnkpIGluIFN3aXR6ZXJsYW5kLiBJbiAxOTYwIHRoZSBuYW1lIHdhcyBjaGFuZ2VkIHRvIEhlbHZldGljYSAoYW4gYWRhcHRhdGlvbiBvZiAiSGVsdmV0aWEiLCB0aGUgTGF0aW4gbmFtZSBmb3IgU3dpdHplcmxhbmQpLiBPdmVyIHRoZSB5ZWFycywgdGhlIEhlbHZldGljYSBmYW1pbHkgd2FzIGV4cGFuZGVkIHRvIGluY2x1ZGUgbWFueSBkaWZmZXJlbnQgd2VpZ2h0cywgYnV0IHRoZXNlIHdlcmUgbm90IGFzIHdlbGwgY29vcmRpbmF0ZWQgd2l0aCBlYWNoIG90aGVyIGFzIHRoZXkgbWlnaHQgaGF2ZSBiZWVuLiBJbiAxOTgzLCBELiBTdGVtcGVsIEFHIGFuZCBMaW5vdHlwZSByZS1kZXNpZ25lZCBhbmQgZGlnaXRpemVkIE5ldWUgSGVsdmV0aWNhIGFuZCB1cGRhdGVkIGl0IGludG8gYSBjb2hlc2l2ZSBmb250IGZhbWlseS4gVG9kYXksIHRoZSBvcmlnaW5hbCBIZWx2ZXRpY2EgZmFtaWx5IGNvbnNpc3RzIG9mIDM0IGRpZmZlcmVudCBmb250IHdlaWdodHMsIGFuZCB0aGUgTmV1ZSBIZWx2ZXRpY2EgZmFtaWx5IGNvbnNpc3RzIG9mIDUxIGZvbnQgd2VpZ2h0cy4gVGhlIG51bWJlcmluZyBzeXN0ZW0gZGVzY3JpYmVzIEhlbHZldGljYSdzIGNoYXJhY3RlcmlzdGljcyBhbmQgaXMgc2ltaWxhciB0byB0aGUgbnVtYmVyaW5nIHN5c3RlbSBvZiB0aGUgVW5pdmVycyBmYW1pbHkuIFRoZSBiYXNpYyBvciByZWd1bGFyIGZvbnQsICJIZWx2ZXRpY2Egcm9tYW4iLCBmb3JtcyB0aGUgY2VudHJhbCBwb2ludCBvZiB0aGUgc3lzdGVtIHdpdGggdGhlIGRlc2lnbmF0aW9uICI1NSByb21hbiIuIFRoZSBmaXJzdCBmaWd1cmUgb2YgdGhlIG51bWJlciBkZXNjcmliZXMgdGhlIHdlaWdodCAtIDI1IHVsdHJhIGxpZ2h0IHRvIDk1IGV4dHJhIGJsYWNrLiBUaGUgc2Vjb25kIGZpZ3VyZSBnaXZlcyB3aWR0aCBpbmZvcm1hdGlvbiAtIEhlbHZldGljYSA1MyBleHRlbmRlZCB0byBIZWx2ZXRpY2EgNTcgY29uZGVuc2VkLiBUaGUgSGVsdmV0aWNhIGZhbWlseSBub3cgZm9ybXMgYW4gaW50ZWdyYWwgcGFydCBvZiBtYW55IGRpZ2l0YWwgcHJpbnRlcnMgYW5kIG9wZXJhdGluZyBzeXN0ZW1zIGFuZCBoYXMgYmVjb21lIGEgc3R5bGlzdGljIGFuY2hvciBpbiBvdXIgdmlzdWFsIGN1bHR1cmUuIEl0IGlzIHRoZSBxdWludGVzc2VudGlhbCBzYW5zIHNlcmlmIGZvbnQsIHRpbWVsZXNzIGFuZCBuZXV0cmFsLCBhbmQgY2FuIGJlIHVzZWQgZm9yIGFsbCB0eXBlcyBvZiBjb21tdW5pY2F0aW9uLmh0dHA6Ly93d3cubGlub3R5cGUuY29taHR0cDovL3d3dy5saW5vdHlwZS5jb20vZm9udGRlc2lnbmVyc05PVElGSUNBVElPTiBPRiBMSUNFTlNFIEFHUkVFTUVOVA0KDQpZb3UgaGF2ZSBvYnRhaW5lZCB0aGlzIGZvbnQgc29mdHdhcmUgZWl0aGVyIGRpcmVjdGx5IGZyb20gTGlub3R5cGUgR21iSCBvciB0b2dldGhlciB3aXRoIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGJ5IG9uZSBvZiBMaW5vdHlwZSdzIGxpY2Vuc2Vlcy4NCg0KVGhpcyBmb250IHNvZnR3YXJlIGlzIGEgdmFsdWFibGUgYXNzZXQgb2YgTGlub3R5cGUgR21iSC4gVW5sZXNzIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIHNwZWNpZmljIGxpY2Vuc2UgYWdyZWVtZW50IGdyYW50aW5nIHlvdSBhZGRpdGlvbmFsIHJpZ2h0cywgeW91ciB1c2Ugb2YgdGhpcyBmb250IHNvZnR3YXJlIGlzIGxpbWl0ZWQgdG8geW91ciB3b3Jrc3RhdGlvbiBmb3IgeW91ciBvd24gdXNlLiBZb3UgbWF5IG5vdCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmb250IHNvZnR3YXJlLiBJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIHJlZ2FyZGluZyB5b3VyIGxpY2Vuc2UgdGVybXMsIHBsZWFzZSByZXZpZXcgdGhlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSByZWNlaXZlZCB3aXRoIHRoZSBzb2Z0d2FyZS4NCg0KR2VuZXJhbCBsaWNlbnNlIHRlcm1zIGFuZCB1c2FnZSByaWdodHMgY2FuIGJlIHZpZXdlZCBhdCB3d3cubGlub3R5cGUuY29tL2xpY2Vuc2UuDQoNCkdlbmVyZWxsZSBMaXplbnpiZWRpbmd1bmdlbiB1bmQgTnV0enVuZ3NyZWNodGUgZmluZGVuIFNpZSB1bnRlciB3d3cubGlub3R5cGUuY29tL2xpY2Vuc2UuDQoNClBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucyBjb25jZXJuYW50IGxlIGNvbnRyYXQgZCd1dGlsaXNhdGlvbiBkdSBsb2dpY2llbCBkZSBwb2xpY2VzLCB2ZXVpbGxleiBjb25zdWx0ZXIgbm90cmUgc2l0ZSB3ZWIgd3d3Lmxpbm90eXBlLmNvbS9saWNlbnNlLg0KDQpMaW5vdHlwZSBHbWJIIGNhbiBiZSBjb250YWN0ZWQgYXQ6DQoNClRlbC46ICs0OSgwKTYxNzIgNDg0LTQxOGh0dHA6Ly93d3cubGlub3R5cGUuY29tVFVNIE5ldWUgSGVsdmV0aWNhIDc2IEJvbGQgSXQAUABhAHIAdAAgAG8AZgAgAHQAaABlACAAZABpAGcAaQB0AGEAbABsAHkAIABlAG4AYwBvAGQAZQBkACAAbQBhAGMAaABpAG4AZQAgAHIAZQBhAGQAYQBiAGwAZQAgAG8AdQB0AGwAaQBuAGUAIABkAGEAdABhACAAZgBvAHIAIABwAHIAbwBkAHUAYwBpAG4AZwAgAHQAaABlACAAVAB5AHAAZQBmAGEAYwBlAHMAIABwAHIAbwB2AGkAZABlAGQAIABpAHMAIABjAG8AcAB5AHIAaQBnAGgAdABlAGQAIACpACAAMgAwADAANwAgAEwAaQBuAG8AdAB5AHAAZQAgAEcAbQBiAEgALAAgAHcAdwB3AC4AbABpAG4AbwB0AHkAcABlAC4AYwBvAG0ALgAgAEEAbABsACAAcgBpAGcAaAB0AHMAIAByAGUAcwBlAHIAdgBlAGQALgAgAFQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIAB0AGgAZQAgAHAAcgBvAHAAZQByAHQAeQAgAG8AZgAgAEwAaQBuAG8AdAB5AHAAZQAgAEcAbQBiAEgALAAgAGEAbgBkACAAbQBhAHkAIABuAG8AdAAgAGIAZQAgAHIAZQBwAHIAbwBkAHUAYwBlAGQALAAgAHUAcwBlAGQALAAgAGQAaQBzAHAAbABhAHkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQALAAgAGQAaQBzAGMAbABvAHMAZQBkACAAbwByACAAdAByAGEAbgBzAGYAZQByAHIAZQBkACAAdwBpAHQAaABvAHUAdAAgAHQAaABlACAAZQB4AHAAcgBlAHMAcwAgAHcAcgBpAHQAdABlAG4AIABhAHAAcAByAG8AdgBhAGwAIABvAGYAIABMAGkAbgBvAHQAeQBwAGUAIABHAG0AYgBIAC4AIAAgAFQAaABlACAAZABpAGcAaQB0AGEAbABsAHkAIABlAG4AYwBvAGQAZQBkACAAbQBhAGMAaABpAG4AZQAgAHIAZQBhAGQAYQBiAGwAZQAgAHMAbwBmAHQAdwBhAHIAZQAgAGYAbwByACAAcAByAG8AZAB1AGMAaQBuAGcAIAB0AGgAZQAgAFQAeQBwAGUAZgBhAGMAZQBzACAAbABpAGMAZQBuAHMAZQBkACAAdABvACAAeQBvAHUAIABpAHMAIABjAG8AcAB5AHIAaQBnAGgAdABlAGQAIAAoAGMAKQAgADEAOQA4ADgALAAgADEAOQA5ADAALAAgADEAOQA5ADMAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AIABUAGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAdABoAGUAIABwAHIAbwBwAGUAcgB0AHkAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABhAG4AZAAgAGkAdABzACAAbABpAGMAZQBuAHMAbwByAHMALAAgAGEAbgBkACAAbQBhAHkAIABuAG8AdAAgAGIAZQAgAHIAZQBwAHIAbwBkAHUAYwBlAGQALAAgAHUAcwBlAGQALAAgAGQAaQBzAHAAbABhAHkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQALAAgAGQAaQBzAGMAbABvAHMAZQBkACAAbwByACAAdAByAGEAbgBzAGYAZQByAHIAZQBkACAAdwBpAHQAaABvAHUAdAAgAHQAaABlACAAZQB4AHAAcgBlAHMAcwAgAHcAcgBpAHQAdABlAG4AIABhAHAAcAByAG8AdgBhAGwAIABvAGYAIABBAGQAbwBiAGUALgAgAEgAZQBsAHYAZQB0AGkAYwBhACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAATABpAG4AbwB0AHkAcABlACAARwBtAGIASAAgAGEAbgBkACAAbQBhAHkAIABiAGUAIAByAGUAZwBpAHMAdABlAHIAZQBkACAAaQBuACAAYwBlAHIAdABhAGkAbgAgAGoAdQByAGkAcwBkAGkAYwB0AGkAbwBuAHMALgAgAFQAaABpAHMAIAB0AHkAcABlAGYAYQBjAGUAIABpAHMAIABvAHIAaQBnAGkAbgBhAGwAIABhAHIAdAB3AG8AcgBrACAAbwBmACAATABpAG4AbwB0AHkAcABlACAARABlAHMAaQBnAG4AIABTAHQAdQBkAGkAbwAuACAAVABoAGUAIABkAGUAcwBpAGcAbgAgAG0AYQB5ACAAYgBlACAAcAByAG8AdABlAGMAdABlAGQAIABpAG4AIABjAGUAcgB0AGEAaQBuACAAagB1AHIAaQBzAGQAaQBjAHQAaQBvAG4AcwAuAFQAVQBNACAATgBlAHUAZQAgAEgAZQBsAHYAZQB0AGkAYwBhACAANQA1ACAAUgBlAGcAdQBsAGEAcgBCAG8AbABkACAASQB0AGEAbABpAGMATABpAG4AbwB0AHkAcABlACAARwBtAGIASAA6AFQAVQBNACAATgBlAHUAZQAgAEgAZQBsAHYAZQB0AGkAYwBhACAANwA2ACAAQgBvAGwAZAAgAEkAdABhAGwAaQBjADoAMgAwADAANwBUAFUATQAgAE4AZQB1AGUAIABIAGUAbAB2AGUAdABpAGMAYQAgADcANgAgAEIAbwBsAGQAIABJAHQAYQBsAGkAYwBWAGUAcgBzAGkAbwBuACAAMQAuADAAMAA7ACAAMgAwADAANwBUAFUATQBOAGUAdQBlAEgAZQBsAHYAZQB0AGkAYwBhAC0AQgBvAGwAZABJAHQAYQBsAGkAYwBIAGUAbAB2AGUAdABpAGMAYQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEwAaQBuAG8AdAB5AHAAZQAgAEcAbQBiAEgAIABhAG4AZAAgAG0AYQB5ACAAYgBlACAAcgBlAGcAaQBzAHQAZQByAGUAZAAgAGkAbgAgAGMAZQByAHQAYQBpAG4AIABqAHUAcgBpAHMAZABpAGMAdABpAG8AbgBzAC4ATABpAG4AbwB0AHkAcABlACAARwBtAGIASABMAGkAbgBvAHQAeQBwAGUAIABEAGUAcwBpAGcAbgAgAFMAdAB1AGQAaQBvAEgAZQBsAHYAZQB0AGkAYwBhACAAaQBzACAAbwBuAGUAIABvAGYAIAB0AGgAZQAgAG0AbwBzAHQAIABmAGEAbQBvAHUAcwAgAGEAbgBkACAAcABvAHAAdQBsAGEAcgAgAHQAeQBwAGUAZgBhAGMAZQBzACAAaQBuACAAdABoAGUAIAB3AG8AcgBsAGQALgAgAEkAdAAgAGwAZQBuAGQAcwAgAGEAbgAgAGEAaQByACAAbwBmACAAbAB1AGMAaQBkACAAZQBmAGYAaQBjAGkAZQBuAGMAeQAgAHQAbwAgAGEAbgB5ACAAdAB5AHAAbwBnAHIAYQBwAGgAaQBjACAAbQBlAHMAcwBhAGcAZQAgAHcAaQB0AGgAIABpAHQAcwAgAGMAbABlAGEAbgAsACAAbgBvAC0AbgBvAG4AcwBlAG4AcwBlACAAcwBoAGEAcABlAHMALgAgAFQAaABlACAAbwByAGkAZwBpAG4AYQBsACAAdAB5AHAAZQBmAGEAYwBlACAAdwBhAHMAIABjAGEAbABsAGUAZAAgAEgAYQBhAHMAIABHAHIAbwB0AGUAcwBrACwAIABhAG4AZAAgAHcAYQBzACAAZABlAHMAaQBnAG4AZQBkACAAaQBuACAAMQA5ADUANwAgAGIAeQAgAE0AYQB4ACAATQBpAGUAZABpAG4AZwBlAHIAIABmAG8AcgAgAHQAaABlACAASABhAGEAcwAnAHMAYwBoAGUAIABTAGMAaAByAGkAZgB0AGcAaQBlAHMAcwBlAHIAZQBpACAAKABIAGEAYQBzACAAVAB5AHAAZQAgAEYAbwB1AG4AZAByAHkAKQAgAGkAbgAgAFMAdwBpAHQAegBlAHIAbABhAG4AZAAuACAASQBuACAAMQA5ADYAMAAgAHQAaABlACAAbgBhAG0AZQAgAHcAYQBzACAAYwBoAGEAbgBnAGUAZAAgAHQAbwAgAEgAZQBsAHYAZQB0AGkAYwBhACAAKABhAG4AIABhAGQAYQBwAHQAYQB0AGkAbwBuACAAbwBmACAAIgBIAGUAbAB2AGUAdABpAGEAIgAsACAAdABoAGUAIABMAGEAdABpAG4AIABuAGEAbQBlACAAZgBvAHIAIABTAHcAaQB0AHoAZQByAGwAYQBuAGQAKQAuACAATwB2AGUAcgAgAHQAaABlACAAeQBlAGEAcgBzACwAIAB0AGgAZQAgAEgAZQBsAHYAZQB0AGkAYwBhACAAZgBhAG0AaQBsAHkAIAB3AGEAcwAgAGUAeABwAGEAbgBkAGUAZAAgAHQAbwAgAGkAbgBjAGwAdQBkAGUAIABtAGEAbgB5ACAAZABpAGYAZgBlAHIAZQBuAHQAIAB3AGUAaQBnAGgAdABzACwAIABiAHUAdAAgAHQAaABlAHMAZQAgAHcAZQByAGUAIABuAG8AdAAgAGEAcwAgAHcAZQBsAGwAIABjAG8AbwByAGQAaQBuAGEAdABlAGQAIAB3AGkAdABoACAAZQBhAGMAaAAgAG8AdABoAGUAcgAgAGEAcwAgAHQAaABlAHkAIABtAGkAZwBoAHQAIABoAGEAdgBlACAAYgBlAGUAbgAuACAASQBuACAAMQA5ADgAMwAsACAARAAuACAAUwB0AGUAbQBwAGUAbAAgAEEARwAgAGEAbgBkACAATABpAG4AbwB0AHkAcABlACAAcgBlAC0AZABlAHMAaQBnAG4AZQBkACAAYQBuAGQAIABkAGkAZwBpAHQAaQB6AGUAZAAgAE4AZQB1AGUAIABIAGUAbAB2AGUAdABpAGMAYQAgAGEAbgBkACAAdQBwAGQAYQB0AGUAZAAgAGkAdAAgAGkAbgB0AG8AIABhACAAYwBvAGgAZQBzAGkAdgBlACAAZgBvAG4AdAAgAGYAYQBtAGkAbAB5AC4AIABUAG8AZABhAHkALAAgAHQAaABlACAAbwByAGkAZwBpAG4AYQBsACAASABlAGwAdgBlAHQAaQBjAGEAIABmAGEAbQBpAGwAeQAgAGMAbwBuAHMAaQBzAHQAcwAgAG8AZgAgADMANAAgAGQAaQBmAGYAZQByAGUAbgB0ACAAZgBvAG4AdAAgAHcAZQBpAGcAaAB0AHMALAAgAGEAbgBkACAAdABoAGUAIABOAGUAdQBlACAASABlAGwAdgBlAHQAaQBjAGEAIABmAGEAbQBpAGwAeQAgAGMAbwBuAHMAaQBzAHQAcwAgAG8AZgAgADUAMQAgAGYAbwBuAHQAIAB3AGUAaQBnAGgAdABzAC4AIABUAGgAZQAgAG4AdQBtAGIAZQByAGkAbgBnACAAcwB5AHMAdABlAG0AIABkAGUAcwBjAHIAaQBiAGUAcwAgAEgAZQBsAHYAZQB0AGkAYwBhACcAcwAgAGMAaABhAHIAYQBjAHQAZQByAGkAcwB0AGkAYwBzACAAYQBuAGQAIABpAHMAIABzAGkAbQBpAGwAYQByACAAdABvACAAdABoAGUAIABuAHUAbQBiAGUAcgBpAG4AZwAgAHMAeQBzAHQAZQBtACAAbwBmACAAdABoAGUAIABVAG4AaQB2AGUAcgBzACAAZgBhAG0AaQBsAHkALgAgAFQAaABlACAAYgBhAHMAaQBjACAAbwByACAAcgBlAGcAdQBsAGEAcgAgAGYAbwBuAHQALAAgACIASABlAGwAdgBlAHQAaQBjAGEAIAByAG8AbQBhAG4AIgAsACAAZgBvAHIAbQBzACAAdABoAGUAIABjAGUAbgB0AHIAYQBsACAAcABvAGkAbgB0ACAAbwBmACAAdABoAGUAIABzAHkAcwB0AGUAbQAgAHcAaQB0AGgAIAB0AGgAZQAgAGQAZQBzAGkAZwBuAGEAdABpAG8AbgAgACIANQA1ACAAcgBvAG0AYQBuACIALgAgAFQAaABlACAAZgBpAHIAcwB0ACAAZgBpAGcAdQByAGUAIABvAGYAIAB0AGgAZQAgAG4AdQBtAGIAZQByACAAZABlAHMAYwByAGkAYgBlAHMAIAB0AGgAZQAgAHcAZQBpAGcAaAB0ACAALQAgADIANQAgAHUAbAB0AHIAYQAgAGwAaQBnAGgAdAAgAHQAbwAgADkANQAgAGUAeAB0AHIAYQAgAGIAbABhAGMAawAuACAAVABoAGUAIABzAGUAYwBvAG4AZAAgAGYAaQBnAHUAcgBlACAAZwBpAHYAZQBzACAAdwBpAGQAdABoACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAALQAgAEgAZQBsAHYAZQB0AGkAYwBhACAANQAzACAAZQB4AHQAZQBuAGQAZQBkACAAdABvACAASABlAGwAdgBlAHQAaQBjAGEAIAA1ADcAIABjAG8AbgBkAGUAbgBzAGUAZAAuACAAVABoAGUAIABIAGUAbAB2AGUAdABpAGMAYQAgAGYAYQBtAGkAbAB5ACAAbgBvAHcAIABmAG8AcgBtAHMAIABhAG4AIABpAG4AdABlAGcAcgBhAGwAIABwAGEAcgB0ACAAbwBmACAAbQBhAG4AeQAgAGQAaQBnAGkAdABhAGwAIABwAHIAaQBuAHQAZQByAHMAIABhAG4AZAAgAG8AcABlAHIAYQB0AGkAbgBnACAAcwB5AHMAdABlAG0AcwAgAGEAbgBkACAAaABhAHMAIABiAGUAYwBvAG0AZQAgAGEAIABzAHQAeQBsAGkAcwB0AGkAYwAgAGEAbgBjAGgAbwByACAAaQBuACAAbwB1AHIAIAB2AGkAcwB1AGEAbAAgAGMAdQBsAHQAdQByAGUALgAgAEkAdAAgAGkAcwAgAHQAaABlACAAcQB1AGkAbgB0AGUAcwBzAGUAbgB0AGkAYQBsACAAcwBhAG4AcwAgAHMAZQByAGkAZgAgAGYAbwBuAHQALAAgAHQAaQBtAGUAbABlAHMAcwAgAGEAbgBkACAAbgBlAHUAdAByAGEAbAAsACAAYQBuAGQAIABjAGEAbgAgAGIAZQAgAHUAcwBlAGQAIABmAG8AcgAgAGEAbABsACAAdAB5AHAAZQBzACAAbwBmACAAYwBvAG0AbQB1AG4AaQBjAGEAdABpAG8AbgAuAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBsAGkAbgBvAHQAeQBwAGUALgBjAG8AbQBoAHQAdABwADoALwAvAHcAdwB3AC4AbABpAG4AbwB0AHkAcABlAC4AYwBvAG0ALwBmAG8AbgB0AGQAZQBzAGkAZwBuAGUAcgBzAE4ATwBUAEkARgBJAEMAQQBUAEkATwBOACAATwBGACAATABJAEMARQBOAFMARQAgAEEARwBSAEUARQBNAEUATgBUAA0ACgANAAoAWQBvAHUAIABoAGEAdgBlACAAbwBiAHQAYQBpAG4AZQBkACAAdABoAGkAcwAgAGYAbwBuAHQAIABzAG8AZgB0AHcAYQByAGUAIABlAGkAdABoAGUAcgAgAGQAaQByAGUAYwB0AGwAeQAgAGYAcgBvAG0AIABMAGkAbgBvAHQAeQBwAGUAIABHAG0AYgBIACAAbwByACAAdABvAGcAZQB0AGgAZQByACAAdwBpAHQAaAAgAHMAbwBmAHQAdwBhAHIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGIAeQAgAG8AbgBlACAAbwBmACAATABpAG4AbwB0AHkAcABlACcAcwAgAGwAaQBjAGUAbgBzAGUAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAAZgBvAG4AdAAgAHMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGEAIAB2AGEAbAB1AGEAYgBsAGUAIABhAHMAcwBlAHQAIABvAGYAIABMAGkAbgBvAHQAeQBwAGUAIABHAG0AYgBIAC4AIABVAG4AbABlAHMAcwAgAHkAbwB1ACAAaABhAHYAZQAgAGUAbgB0AGUAcgBlAGQAIABpAG4AdABvACAAYQAgAHMAcABlAGMAaQBmAGkAYwAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGcAcgBhAG4AdABpAG4AZwAgAHkAbwB1ACAAYQBkAGQAaQB0AGkAbwBuAGEAbAAgAHIAaQBnAGgAdABzACwAIAB5AG8AdQByACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAZgBvAG4AdAAgAHMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBtAGkAdABlAGQAIAB0AG8AIAB5AG8AdQByACAAdwBvAHIAawBzAHQAYQB0AGkAbwBuACAAZgBvAHIAIAB5AG8AdQByACAAbwB3AG4AIAB1AHMAZQAuACAAWQBvAHUAIABtAGEAeQAgAG4AbwB0ACAAYwBvAHAAeQAgAG8AcgAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAIAB0AGgAaQBzACAAZgBvAG4AdAAgAHMAbwBmAHQAdwBhAHIAZQAuACAASQBmACAAeQBvAHUAIABoAGEAdgBlACAAYQBuAHkAIABxAHUAZQBzAHQAaQBvAG4AcwAgAHIAZQBnAGEAcgBkAGkAbgBnACAAeQBvAHUAcgAgAGwAaQBjAGUAbgBzAGUAIAB0AGUAcgBtAHMALAAgAHAAbABlAGEAcwBlACAAcgBlAHYAaQBlAHcAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAHkAbwB1ACAAcgBlAGMAZQBpAHYAZQBkACAAdwBpAHQAaAAgAHQAaABlACAAcwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBHAGUAbgBlAHIAYQBsACAAbABpAGMAZQBuAHMAZQAgAHQAZQByAG0AcwAgAGEAbgBkACAAdQBzAGEAZwBlACAAcgBpAGcAaAB0AHMAIABjAGEAbgAgAGIAZQAgAHYAaQBlAHcAZQBkACAAYQB0ACAAdwB3AHcALgBsAGkAbgBvAHQAeQBwAGUALgBjAG8AbQAvAGwAaQBjAGUAbgBzAGUALgANAAoADQAKAEcAZQBuAGUAcgBlAGwAbABlACAATABpAHoAZQBuAHoAYgBlAGQAaQBuAGcAdQBuAGcAZQBuACAAdQBuAGQAIABOAHUAdAB6AHUAbgBnAHMAcgBlAGMAaAB0AGUAIABmAGkAbgBkAGUAbgAgAFMAaQBlACAAdQBuAHQAZQByACAAdwB3AHcALgBsAGkAbgBvAHQAeQBwAGUALgBjAG8AbQAvAGwAaQBjAGUAbgBzAGUALgANAAoADQAKAFAAbwB1AHIAIABwAGwAdQBzACAAZAAnAGkAbgBmAG8AcgBtAGEAdABpAG8AbgBzACAAYwBvAG4AYwBlAHIAbgBhAG4AdAAgAGwAZQAgAGMAbwBuAHQAcgBhAHQAIABkACcAdQB0AGkAbABpAHMAYQB0AGkAbwBuACAAZAB1ACAAbABvAGcAaQBjAGkAZQBsACAAZABlACAAcABvAGwAaQBjAGUAcwAsACAAdgBlAHUAaQBsAGwAZQB6ACAAYwBvAG4AcwB1AGwAdABlAHIAIABuAG8AdAByAGUAIABzAGkAdABlACAAdwBlAGIAIAB3AHcAdwAuAGwAaQBuAG8AdAB5AHAAZQAuAGMAbwBtAC8AbABpAGMAZQBuAHMAZQAuAA0ACgANAAoATABpAG4AbwB0AHkAcABlACAARwBtAGIASAAgAGMAYQBuACAAYgBlACAAYwBvAG4AdABhAGMAdABlAGQAIABhAHQAOgANAAoADQAKAFQAZQBsAC4AOgAgACsANAA5ACgAMAApADYAMQA3ADIAIAA0ADgANAAtADQAMQA4AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBsAGkAbgBvAHQAeQBwAGUALgBjAG8AbQBUAFUATQAgAE4AZQB1AGUAIABIAGUAbAB2AGUAdABpAGMAYQA3ADYAIABCAG8AbABkACAASQB0AGEAbABpAGMAAAIAAP/0AAD/tQAyAAAAAAAAAAAAAAAAAAAAAAAAAAABhgAAAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAQIAxACmAMUAqwCCAMIA2ADGAOQAvgCwAOYAtgC3ALQAtQCHALIAswDZAIwA5QC/ALEA5wC7AQMAowCEAIUAvQCWAOgAhgCOAIsAnQCpAKQBBACKAQUAgwCTAPIA8wCNAJcAiAEGAN4A8QCeAKoA9QD0APYAogCtAMkAxwCuAGIAYwCQAGQAywBlAMgAygDPAMwAzQDOAOkAZgDTANAA0QCvAGcA8ACRANYA1ADVAGgA6wDtAIkAagBpAGsAbQBsAG4AoABvAHEAcAByAHMAdQB0AHYAdwDqAHgAegB5AHsAfQB8ALgAoQB/AH4AgACBAOwA7gC6AQcBCAEJAQoBCwEMAQ0BDgEPAP0A/gEQAREBEgETAP8BAAEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjAPgA+QEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgDXATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQADiAOMBQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAPsA/AFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AOEBdwDbANwA3QDgAN8BeAF5AXoAmwC8AXsAnwF8AJgBfQCaAJkA7wF+AX8ApQCSAJwApwCPAJQAlQC5AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAMAAwQRFdXJvB3VuaTAwQTAHdW5pMDBBRAZtYWNyb24OcGVyaW9kY2VudGVyZWQFLm51bGwOY29tbWFhY2NlbnR0d28IY2Fyb250d28HQW1hY3JvbgdhbWFjcm9uBkFicmV2ZQZhYnJldmUHQW9nb25lawdhb2dvbmVrC0NjaXJjdW1mbGV4C2NjaXJjdW1mbGV4CkNkb3RhY2NlbnQKY2RvdGFjY2VudAZEY2Fyb24GZGNhcm9uBkRjcm9hdAZkY3JvYXQHRW1hY3JvbgdlbWFjcm9uBkVicmV2ZQZlYnJldmUKRWRvdGFjY2VudAplZG90YWNjZW50B0VvZ29uZWsHZW9nb25lawZFY2Fyb24GZWNhcm9uC0djaXJjdW1mbGV4C2djaXJjdW1mbGV4Ckdkb3RhY2NlbnQKZ2RvdGFjY2VudAxHY29tbWFhY2NlbnQMZ2NvbW1hYWNjZW50C0hjaXJjdW1mbGV4C2hjaXJjdW1mbGV4BEhiYXIEaGJhcgZJdGlsZGUGaXRpbGRlB0ltYWNyb24HaW1hY3JvbgdJb2dvbmVrB2lvZ29uZWsKSWRvdGFjY2VudAJJSgJpagtKY2lyY3VtZmxleAtqY2lyY3VtZmxleAxLY29tbWFhY2NlbnQMa2NvbW1hYWNjZW50BkxhY3V0ZQZsYWN1dGUMTGNvbW1hYWNjZW50DGxjb21tYWFjY2VudAZMY2Fyb24GbGNhcm9uBExkb3QEbGRvdAZOYWN1dGUGbmFjdXRlDE5jb21tYWFjY2VudAxuY29tbWFhY2NlbnQGTmNhcm9uBm5jYXJvbgtuYXBvc3Ryb3BoZQdPbWFjcm9uB29tYWNyb24GT2JyZXZlBm9icmV2ZQ1PaHVuZ2FydW1sYXV0DW9odW5nYXJ1bWxhdXQGUmFjdXRlBnJhY3V0ZQxSY29tbWFhY2NlbnQMcmNvbW1hYWNjZW50BlJjYXJvbgZyY2Fyb24GU2FjdXRlBnNhY3V0ZQtTY2lyY3VtZmxleAtzY2lyY3VtZmxleAxUY29tbWFhY2NlbnQMdGNvbW1hYWNjZW50BlRjYXJvbgZ0Y2Fyb24EVGJhcgR0YmFyBlV0aWxkZQZ1dGlsZGUHVW1hY3Jvbgd1bWFjcm9uBlVicmV2ZQZ1YnJldmUFVXJpbmcFdXJpbmcNVWh1bmdhcnVtbGF1dA11aHVuZ2FydW1sYXV0B1VvZ29uZWsHdW9nb25lawtXY2lyY3VtZmxleAt3Y2lyY3VtZmxleAtZY2lyY3VtZmxleAt5Y2lyY3VtZmxleAZaYWN1dGUGemFjdXRlClpkb3RhY2NlbnQKemRvdGFjY2VudAxTY29tbWFhY2NlbnQMc2NvbW1hYWNjZW50B3VuaTAyMUEHdW5pMDIxQghkb3RsZXNzagd1bmkwMkM5B3VuaTAzOTQHdW5pMDNBOQd1bmkwM0JDCWFmaWk2MTI4OQllc3RpbWF0ZWQFRGVsdGEHdW5pMjIxNQd1bmkyMjE5CWdyYXZlLmNhcAlhY3V0ZS5jYXAOY2lyY3VtZmxleC5jYXAJY2Fyb24uY2FwCXRpbGRlLmNhcAxkaWVyZXNpcy5jYXAKbWFjcm9uLmNhcAlicmV2ZS5jYXAIcmluZy5jYXAQaHVuZ2FydW1sYXV0LmNhcA1kb3RhY2NlbnQuY2FwCWNhcm9uLmFsdAtjb21tYWFjY2VudA9jb21tYWFjY2VudC5hbHQHdW5pRjhGRgAAuAAAKwC6AAEACAACKwG6AAkACAACKwG+AAkAJwAfABkAEwAMAAgrvgAKACQAHwAZABMADAAIK74ACwA+ADIAJwAcABEACCu+AAwANAArACEAGAAPAAgrvgANAEUAOQAsACAAEwAIK74ADgBVAEYANgAnABgACCu+AA8AagBXAEQAMQAdAAgrvgAQADAAJwAeABYADQAIKwC+AAEAVQBGADYAJwAYAAgrvgACADAAKQAgABcADQAIK74AAwA0ACkAIAAXAA0ACCu+AAQAagBXAEQAMQAdAAgrvgAFAJUAegBfAEQAKQAIK74ABgA7ADAAJgAbABAACCu+AAcAJAAdABcAEAAKAAgrvgAIAEUAOQAsACAAEwAIKwC6ABEACQAHK7gAACBFfWkYRAAAAAAAAQABAAEAAAABAAAZCgAAABQAAAAAAAAZAjCCGP4GCSqGSIb3DQEHAqCCGO8wghjrAgEBMQswCQYFKw4DAhoFADBhBgorBgEEAYI3AgEEoFMwUTAsBgorBgEEAYI3AgEcoh6AHAA8ADwAPABPAGIAcwBvAGwAZQB0AGUAPgA+AD4wITAJBgUrDgMCGgUABBTtc31XyO7UQobiheOfEeKCya+mlaCCE7MwggPEMIIDLaADAgECAhBHvxmV341SRkP3221IDTGkMA0GCSqGSIb3DQEBBQUAMIGLMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRQwEgYDVQQHEwtEdXJiYW52aWxsZTEPMA0GA1UEChMGVGhhd3RlMR0wGwYDVQQLExRUaGF3dGUgQ2VydGlmaWNhdGlvbjEfMB0GA1UEAxMWVGhhd3RlIFRpbWVzdGFtcGluZyBDQTAeFw0wMzEyMDQwMDAwMDBaFw0xMzEyMDMyMzU5NTlaMFMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjErMCkGA1UEAxMiVmVyaVNpZ24gVGltZSBTdGFtcGluZyBTZXJ2aWNlcyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKnKsqTMzSCvCn2JrId18LRO8d/BD79nYb2jZBzau/nKM6uEMIlYfozba902ng+/0ex48nemfm88v5OvDbpo9GyUyr1SLatIPfW21V1fGwKf+i9rHqT3o5qmGsgC4X9MUuMOYOxAHH65Dd4/x7Tfh71femoxLgOZgROoRyDOMXMNVy3NeDQzlRKZErneaC+q5uPCiowqw4shh2a9g1hXb3W/PKomh13KEBU8n4TqVMEKbsT+xUrduQcRlyJ82z4n0R547J8xyfHmIhnbxLNHQ5oaX6AekORe9e588X2rYgGP9U0L3tAiVqiVza6Idq7uug3z5E3ZoPtooK4UO7OHwbsCAwEAAaOB2zCB2DA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLnZlcmlzaWduLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEAMEEGA1UdHwQ6MDgwNqA0oDKGMGh0dHA6Ly9jcmwudmVyaXNpZ24uY29tL1RoYXd0ZVRpbWVzdGFtcGluZ0NBLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMCAQYwJAYDVR0RBB0wG6QZMBcxFTATBgNVBAMTDFRTQTIwNDgtMS01MzANBgkqhkiG9w0BAQUFAAOBgQBKa/nqWMJEHDGJeZkrlr+CrAHWHEzNsIpYbt8IKaNeyMqTE+cEUg3vRycvADiw5MmTTprUImIV9z83IU9wMYDxiziHs+jolwD+z1WWTiTSqSdOeq63YUHzKs7nydle3bsrhT61nbXZ4Vf/vrTFfvXPDJ7wl/4r0ztSGxs4J/c/SjCCA/8wggLnoAMCAQICEA3pK/DU2CmIGDIFCV6adogwDQYJKoZIhvcNAQEFBQAwUzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMSswKQYDVQQDEyJWZXJpU2lnbiBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBMB4XDTAzMTIwNDAwMDAwMFoXDTA4MTIwMzIzNTk1OVowVzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMS8wLQYDVQQDEyZWZXJpU2lnbiBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIFNpZ25lcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJQKEjd02h6hBhEZnVdfsS4n2Mm/z1DnHwROBAlVXPZdSdp/U65IFzTCvmgGyrtVVYhYdge2+S8M2vH792jN2WOG5MMtlMeXHxmNV8FikX+dk7fU4CigSCdrohcogj35TD57iI3TEIKzt/GH8TWVemBP7VSoyyqAXryoqqNNf6f5l1qBZ89a+O/lsD+zGD5QOcHoETrgVFupSrytooQKO2P3AaghlCae0oIDTAdyhCea/fpWK4EqUCZsijojxasPONTb0vTNZ21b2Qds5Ysuz3neettevkW5iatr++ZU7dALJW4ear+1FKrKXR+Quw5HqJqFuZZuyRo2ACAQxCHgGsCAwEAAaOByjCBxzA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLnZlcmlzaWduLmNvbTAMBgNVHRMBAf8EAjAAMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwudmVyaXNpZ24uY29tL3Rzcy1jYS5jcmwwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgbAMCQGA1UdEQQdMBukGTAXMRUwEwYDVQQDEwxUU0EyMDQ4LTEtNTQwDQYJKoZIhvcNAQEFBQADggEBAId4cNpOUgEgW+B5yYIwxP25GZa9kQDDvc3NxvQO2P/5TcAzYjARxfV0G9SS3l+cIBOxfEW+UM2D54AXg6cnk2cTRvvKuJhBA8ybUVsFi3+ob/MbUBskLvJpjWwi97vKFpXtDHTAaHfZ65lih8FzkPiJdHojq6OYe5ex948pcU0udRtIQdrwtQ0gVNZ3oJeCY2n9Cc+K8HW7CZvZ+RFVJpphMr56ArB7hr6iw4siLHjRNXa8knNc+bnmTBUKI8zk0tQ0LklAFTwPYHokxqVm75bPcOs+5/QNftzRfKN2cWnBnE9HMDUhsaKvGmI8K9mOqioHe9gYs1x74p2lb/48ia0wggS/MIIEKKADAgECAhBBkaFaOXjfz0llZjgdTHXCMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDA3MTYwMDAwMDBaFw0xNDA3MTUyMzU5NTlaMIG0MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTA0MS4wLAYDVQQDEyVWZXJpU2lnbiBDbGFzcyAzIENvZGUgU2lnbmluZyAyMDA0IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvrzuvH7vg+vgN0/7AxA4vgjSjH2d+pJ/GQzCa+5CUoze0xxIEyXqwWN6+VFl7tOqO/XwlJwr+/Jm1CTa9/Wfbhk5NrzQo3YIHiInJGw4kSfihEmuG4qh/SWCLBAw6HGrKOh3SlHx7M348FTUb8DjbQqP2dhkjWOyLU4n9oUO/m3jKZnihUd8LYZ/6FePrWfCMzKREyD8qSMUmm3ChEt2aATVcSxdIfqIDSb9Hy2RK+cBVU3ybTUogt/Za1y21tmqgf1fzYO6Y53QIvypO0Jpso46tby0ng9exOosgoso/VMIlt21ASDR+aUY58DuUXA34bYFSFJIbzjqw+hse0SEuwIDAQABo4IBoDCCAZwwEgYDVR0TAQH/BAgwBgEB/wIBADBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBxcDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMDMA4GA1UdDwEB/wQEAwIBBjARBglghkgBhvhCAQEEBAMCAAEwKQYDVR0RBCIwIKQeMBwxGjAYBgNVBAMTEUNsYXNzM0NBMjA0OC0xLTQzMB0GA1UdDgQWBBQI9VHo+/49PWQ2fGjPW3io37nFNzCBgAYDVR0jBHkwd6FjpGEwXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ghBwuuQdENkpNLY4ynsDzLq/MA0GCSqGSIb3DQEBBQUAA4GBAK46F7hKe1X6ZFXsQKTtSUGQmZyJvK8uHcp4I/kcGQ9/62i8MtmION7cP9OJtD+xgpbxpFq67S4m0958AW4ACgCkBpIRSAlA+RwYeWcjJOC71eFQrhv1Dt3gLoHNgKNsUk+RdVWKuiLy0upBdYgvY1V9HlRalVnK2TSBwF9e9nq1MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1kMIIE4TCCA8mgAwIBAgIQcZKmcvTdCdTUwMB/wikhVDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykwNDEuMCwGA1UEAxMlVmVyaVNpZ24gQ2xhc3MgMyBDb2RlIFNpZ25pbmcgMjAwNCBDQTAeFw0wNzAxMjQwMDAwMDBaFw0xMDAzMDEyMzU5NTlaMIGkMQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMRQwEgYDVQQHEwtCYWQgSG9tYnVyZzEWMBQGA1UEChQNTGlub3R5cGUgR21iSDE+MDwGA1UECxM1RGlnaXRhbCBJRCBDbGFzcyAzIC0gTWljcm9zb2Z0IFNvZnR3YXJlIFZhbGlkYXRpb24gdjIxFjAUBgNVBAMUDUxpbm90eXBlIEdtYkgwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL9sKc3JPRwlPSFhv0+WVDVNY7ZBuhveBn7edz/aIa6LcgdMCHjBlN+7xYT6C/OfZBLDIi1O3pGdG+XQveutZixuhk6iBI1/S2dOPXkV8wn1iNH8ZH9ZFOMPD6KQbcmvQS2HoE+awCDiPfeJTSG95xohMyAzqg8j0qU9xUlQdYkpAgMBAAGjggF/MIIBezAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIHgDBABgNVHR8EOTA3MDWgM6Axhi9odHRwOi8vQ1NDMy0yMDA0LWNybC52ZXJpc2lnbi5jb20vQ1NDMy0yMDA0LmNybDBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBxcDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwEwYDVR0lBAwwCgYIKwYBBQUHAwMwdQYIKwYBBQUHAQEEaTBnMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC52ZXJpc2lnbi5jb20wPwYIKwYBBQUHMAKGM2h0dHA6Ly9DU0MzLTIwMDQtYWlhLnZlcmlzaWduLmNvbS9DU0MzLTIwMDQtYWlhLmNlcjAfBgNVHSMEGDAWgBQI9VHo+/49PWQ2fGjPW3io37nFNzARBglghkgBhvhCAQEEBAMCBBAwFgYKKwYBBAGCNwIBGwQIMAYBAQABAf8wDQYJKoZIhvcNAQEFBQADggEBAK/Lg9NTiX2SoO/S9pQ27D6UMMeF9QCpNDkBZUzvd+63AZjzV5xQGR8vGbas9Qo0KPEFwBFX81L/7mBRs4681Y37POb1vgaCi8W/8mofcR+Xe+o9tO4DKiA3YqriaZHIlbf80rZDi6c5V7LiiyR0OwE8k5zM+NQ443xE/PzwbQQrEWZOGQrVuZQVszPTdOK8z1YPLjMcBGucnEvS8WoTE83XSoMdP/SnfhxVpZOBmXtctv0F/fiijvhkuKJ2kL/yveLT+kdldpNRssgvyW+ipW2lydeARSD90eZiLcCKrg50ElXAYgO9bLtdwIERS0jV4nX0omQ1OxpvHsI3TUclQOYxggS9MIIEuQIBATCByTCBtDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykwNDEuMCwGA1UEAxMlVmVyaVNpZ24gQ2xhc3MgMyBDb2RlIFNpZ25pbmcgMjAwNCBDQQIQcZKmcvTdCdTUwMB/wikhVDAJBgUrDgMCGgUAoIIBRjAUBgkrBgEEAYI3KAExBwMFAAMAAAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFOMvbjAZyrV5yfm0yGm7/HqhLjN5MIHPBgorBgEEAYI3AgEMMYHAMIG9oIGfgIGcAFQAaABpAHMAIABmAG8AbgB0ACAAdwBhAHMAIABkAGkAZwBpAHQAYQBsAGwAeQAgAHMAaQBnAG4AZQBkACAAYgB5ACAATABpAG4AbwB0AHkAcABlACAARwBtAGIASAAgAC0AIABUAGgAZQAgAHMAbwB1AHIAYwBlACAAbwBmACAAdABoAGUAIABvAHIAaQBnAGkAbgBhAGwAcwAuoRmAF2h0dHA6Ly93d3cubGlub3R5cGUuY29tMA0GCSqGSIb3DQEBAQUABIGAKyQfCLWnL0XCBCDIknC9t2PJCF7hsuqt2Y4s7R/XemYae5KxyKzN/5uK9uKBhwRZcR+1a/Ho3hgK2pBykVhxC1SH+mKE3KuIPJcznDQAvP6Sje6B0SYuMrVc91EUvSRLWxVNxJ8+pLjkkeEwJp0FWIADe12/8cCZ1JzI8QBCwxChggH/MIIB+wYJKoZIhvcNAQkGMYIB7DCCAegCAQEwZzBTMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xKzApBgNVBAMTIlZlcmlTaWduIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0ECEA3pK/DU2CmIGDIFCV6adogwDAYIKoZIhvcNAgUFAKBZMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTA3MDMwODEwMDIwMFowHwYJKoZIhvcNAQkEMRIEENTuvXYPz5/iPOxHHK9p/powDQYJKoZIhvcNAQEBBQAEggEAJQY2aqOYlpYzl31K216VA0X03FEfuIvMRxSTWnxlwy5U3K5ztTRaqmRz/f12LbVHQswxBdgCGvmQy+k+SNL9xRki4cANXAvjxxTXNkOD84cwZ2W7V1Of4Ys3a4N8cANZl2XyMLdrVJly5iCIh3kKVYkeMeo8j28QMaCqgeOj9tmaQegQRs/IfMBAuxdGR4NpxznM7g8OQwlKPzjejkd5tjudUKMM0Atx6LhpHEKZ9VeBjtWt6jZdIWzBxXbP5m6UqCoYTSA5or87yR1SC6a1GrYl/FGhHqpPbqkocBFv8kynFKDa+wo9JVMi4ZafLy28jZDYCIBuVSlsWBjOxbEz8QAA); font-style: normal; font-weight: 400; - }Commonly used response datasets316 506 (269 024)545886CTRPv2Curves Unique treatments Unique cell lines 234 437 (197 324) 354 (180) 243 (24)CTRPv111 670 (4611)24 (23) 503 (54)CCLE60 758 (35 682)378 (266)970 (394)GDSC1395 025287 (204)969 (393)GDSC2In brackets: not occurring in CTRPv2LDO generalizationLCO generalizationSimple models to avoid overfitting Unbiased evaluationTrue responsePredicted responseGlobal Pearson: 0.90Avg. Pearson per drug: 0.01Corrected metricsNaive baselinesFair hyperparameter tuning of all baseline & competitor modelsAblation studiesMore consistent data & metricsOriginal metricCurveCurator metricAUClnIC50pEC50Response agreement across datasetsApplication-aware splitsLeave-Pairs-Out (LPO): Missing value imputationLeave-Cell-Lines-Out (LCO): Personalized medicineLeave-Tissue-Out (LTO):Drug repurposingLeave-Drugs-Out (LDO): Drug designCell linesDrugsk foldsTestValidationLoad responsePreprocess response with CurveCuratorRandomization testsRobustness testsPredict CV test sets (+ cross-study datasets) with optimal hyperparametersInput optionsdrevalpyCross-validation with inner hold-outEvaluationVisualizationHTML reportCritical Difference Diagram: MSEOverall Friedman-Chi2 p-value: 2.26e-19ModelsSRMFDIPKMOLIRSuperFELTRBaselinesNaive PredictorNaive Cell Line Mean PredictorNaive Drug Mean PredictorNaive Mean Effects PredictorElasticNetGradient BoostingRandom ForestMulti-OMICs RFSVRSimple Neural NetworkMulti-OMICs Neural NetworkPackage versionsAvailable as packagePreprocessing scriptsDocumentationCode availableAvailable as pipelineEasily extendableFAIReR1 class ProteomicsRandomForest (RandomForest):2 cell_line_views = ["proteomics"]34 @classmethod5 def get_model_name(cls) -> str:6 return "ProteomicsRandomForest"7 8 def load_cell_line_features(9 self,10 data_path: str,11 dataset_name: str12 ) -> FeatureDataset:13 return load_and_select_gene_features(14 feature_type="proteomics",15 gene_list=None,16 data_path=data_path,17 dataset_name=dataset_name18 )Morgan fingerprintsMolGNet embeddingsRNAseq gene expessionMicroarray gene expressionCopy number variationRRBS methylationBeadChip methylationMutationsDIA protein expressionBIONIC gene embeddingsVariable input features \ No newline at end of file + }Commonly used response datasets316 506 (269 024)545886CTRPv2Curves Unique treatments Unique cell lines 234 437 (197 324) 354 (180) 243 (24)CTRPv111 670 (4611)24 (23) 503 (54)CCLE60 758 (35 682)378 (266)970 (394)GDSC1395 025287 (204)969 (393)GDSC2In brackets: not occurring in CTRPv2LDO generalizationLCO generalizationSimple models to avoid overfitting Unbiased evaluationTrue responsePredicted responseGlobal Pearson: 0.90Avg. Pearson per drug: 0.01Corrected metricsNaive baselinesFair hyperparameter tuning of all baseline & competitor modelsAblation studiesMore consistent data & metricsOriginal metricCurveCurator metricAUClnIC50pEC50Response agreement across datasetsApplication-aware splitsLeave-Pairs-Out (LPO): Missing value imputationLeave-Cell-Lines-Out (LCO): Personalized medicineLeave-Tissue-Out (LTO):Drug repurposingLeave-Drugs-Out (LDO): Drug designCell linesDrugsk foldsTestValidationLoad responsePreprocess response with CurveCuratorRandomization testsRobustness testsPredict CV test sets (+ cross-study datasets) with optimal hyperparametersInput optionsdrevalpyCross-validation with inner hold-outEvaluationVisualizationHTML reportCritical Difference Diagram: MSEOverall Friedman-Chi2 p-value: 2.26e-19ModelsSRMFDIPKMOLIRSuperFELTRBaselinesNaive PredictorNaive Cell Line Mean PredictorNaive Drug Mean PredictorNaive Mean Effects PredictorElasticNetGradient BoostingRandom ForestMulti-OMICs RFSVRSimple Neural NetworkMulti-OMICs Neural NetworkPackage versionsAvailable as packagePreprocessing scriptsDocumentationCode availableAvailable as pipelineEasily extendableFAIReR1 class ProteomicsRandomForest (RandomForest):2 cell_line_views = ["proteomics"]34 @classmethod5 def get_model_name(cls) -> str:6 return "ProteomicsRandomForest"7 8 def load_cell_line_features(9 self,10 data_path: str,11 dataset_name: str12 ) -> FeatureDataset:13 return load_and_select_gene_features(14 feature_type="proteomics",15 gene_list=None,16 data_path=data_path,17 dataset_name=dataset_name18 )Morgan fingerprintsMolGNet embeddingsRNAseq gene expessionMicroarray gene expressionCopy number variationRRBS methylationBeadChip methylationMutationsDIA protein expressionBIONIC gene embeddingsVariable input features diff --git a/bin/visualize_results.py b/bin/visualize_results.py index 837b088..f4dbc61 100755 --- a/bin/visualize_results.py +++ b/bin/visualize_results.py @@ -85,4 +85,3 @@ def get_parser(): test_modes=test_modes, prefix_results=f"{result_path}/{outdir_name}", ) - diff --git a/modules/nf-core/custom/dumpsoftwareversions/environment.yml b/modules/nf-core/custom/dumpsoftwareversions/environment.yml new file mode 100644 index 0000000..c3b3413 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::multiqc=1.27 diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test new file mode 100644 index 0000000..b1e1630 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test @@ -0,0 +1,43 @@ +nextflow_process { + + name "Test Process CUSTOM_DUMPSOFTWAREVERSIONS" + script "../main.nf" + process "CUSTOM_DUMPSOFTWAREVERSIONS" + tag "modules" + tag "modules_nfcore" + tag "custom" + tag "dumpsoftwareversions" + tag "custom/dumpsoftwareversions" + + test("Should run without failures") { + when { + process { + """ + def tool1_version = ''' + TOOL1: + tool1: 0.11.9 + '''.stripIndent() + + def tool2_version = ''' + TOOL2: + tool2: 1.9 + '''.stripIndent() + + input[0] = Channel.of(tool1_version, tool2_version).collectFile() + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.versions, + file(process.out.mqc_yml[0]).readLines()[0..10], + file(process.out.yml[0]).readLines()[0..7] + ).match() + } + ) + } + } +} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap new file mode 100644 index 0000000..74e42fb --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap @@ -0,0 +1,37 @@ +{ + "Should run without failures": { + "content": [ + [ + "versions.yml:md5,42bedca466554ea4ad0b586f8a18be28" + ], + [ + "data: \"\\n\\n \\n \\n \\n \\n \\n \\n \\n\\", + " \\n\\n\\n \\n \\n\\", + " \\ \\n\\n\\n\\n \\n \\", + " \\ \\n \\n\\n\\n\\n\\", + " \\n\\n \\n \\n\\", + " \\ \\n\\n\\n\\n\\n\\n \\n\\", + " \\ \\n \\n\\n\\n\\n\\", + " \\n\\n \\n \\n\\" + ], + [ + "CUSTOM_DUMPSOFTWAREVERSIONS:", + " python: 3.13.1", + " yaml: 6.0.2", + "TOOL1:", + " tool1: 0.11.9", + "TOOL2:", + " tool2: '1.9'", + "Workflow:" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-03-11T13:50:29.789124124" + } +} \ No newline at end of file From 0e3c30ab7517a59383be025e980f758cd4a77a40 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 4 Jun 2025 14:57:58 +0200 Subject: [PATCH 217/257] removed check params (is removed in the other branch anyway), temporary fix in load response (is changed in the other branch) --- bin/check_params.py | 13 ------ bin/load_response.py | 5 ++- modules/local/load_response/main.nf | 1 - modules/local/params_check/main.nf | 44 ------------------- .../local/preprocess_raw_viability/main.nf | 1 - subworkflows/local/preprocess_custom/main.nf | 3 +- subworkflows/local/run_cv/main.nf | 5 +-- workflows/drugresponseeval.nf | 27 +----------- 8 files changed, 8 insertions(+), 91 deletions(-) delete mode 100755 bin/check_params.py delete mode 100755 modules/local/params_check/main.nf diff --git a/bin/check_params.py b/bin/check_params.py deleted file mode 100755 index 990e4e3..0000000 --- a/bin/check_params.py +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python -import sys -from drevalpy.utils import get_parser, check_arguments - - -def main(argv=None): - """Coordinate argument parsing and program execution.""" - args = get_parser().parse_args(argv) - check_arguments(args) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/bin/load_response.py b/bin/load_response.py index a411d11..c61b936 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -25,8 +25,9 @@ def get_parser(): def main(args): - response_data = load_dataset(dataset_name=args.dataset_name, path_data=args.path_data, measure=args.measure) - cross_study_datasets = [load_dataset(dataset_name=ds, path_data=args.path_data, measure=args.measure) for ds in args.cross_study_datasets] + # TODO: temporary fix + response_data = load_dataset(dataset_name=args.dataset_name, path_data=args.path_data, measure=args.measure, curve_curator=False) + cross_study_datasets = [load_dataset(dataset_name=ds, path_data=args.path_data, measure=args.measure, curve_curator=False) for ds in args.cross_study_datasets] # Pickle the object to a file with open("response_dataset.pkl", "wb") as f: diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index 799e589..7c2c407 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -7,7 +7,6 @@ process LOAD_RESPONSE { path work_path val cross_study_datasets val measure - val useless_count output: path 'response_dataset.pkl', emit: response_dataset diff --git a/modules/local/params_check/main.nf b/modules/local/params_check/main.nf deleted file mode 100755 index bf947e1..0000000 --- a/modules/local/params_check/main.nf +++ /dev/null @@ -1,44 +0,0 @@ -process PARAMS_CHECK { - label 'process_single' - - input: - val run_id - val models - val baselines - val test_mode - val randomization_mode - val randomization_type - val n_trials_robustness - val dataset_name - val cross_study_datasets - val curve_curator - val optim_metric - val n_cv_splits - val response_transformation - val path_data - val measure - - output: - val path_data - - script: - def work_path = new File("${path_data}").absolutePath - """ - check_params.py \\ - --run_id $run_id \\ - --models ${models.replace(',', ' ')} \\ - --baselines ${baselines.replace(',', ' ')} \\ - --test_mode ${test_mode.replace(',', ' ')} \\ - --randomization_mode ${randomization_mode.replace(',', ' ')} \\ - --randomization_type $randomization_type \\ - --n_trials_robustness $n_trials_robustness \\ - --dataset_name $dataset_name \\ - ${cross_study_datasets != '' ? '--cross_study_datasets ' + cross_study_datasets.replace(',', ' ') : ''} \\ - ${curve_curator ? '--curve_curator --curve_curator_cores 1' : ''} \\ - --path_data $work_path \\ - --measure $measure \\ - --optim_metric $optim_metric \\ - --n_cv_splits $n_cv_splits \\ - --response_transformation $response_transformation \\ - """ -} diff --git a/modules/local/preprocess_raw_viability/main.nf b/modules/local/preprocess_raw_viability/main.nf index 6f29ca7..55b869f 100644 --- a/modules/local/preprocess_raw_viability/main.nf +++ b/modules/local/preprocess_raw_viability/main.nf @@ -4,7 +4,6 @@ process PREPROCESS_RAW_VIABILITY { input: val(dataset_name) path(work_path) - val useless_count output: path "${dataset_name}/*/config.toml", emit: path_to_toml diff --git a/subworkflows/local/preprocess_custom/main.nf b/subworkflows/local/preprocess_custom/main.nf index 7e7c0bd..e5f1a6b 100644 --- a/subworkflows/local/preprocess_custom/main.nf +++ b/subworkflows/local/preprocess_custom/main.nf @@ -7,14 +7,13 @@ workflow PREPROCESS_CUSTOM { work_path dataset_name measure - useless_count main: ch_versions = Channel.empty() File raw_file = new File("${params.path_data}/${dataset_name}/${dataset_name}_raw.csv") if (raw_file.exists()){ - PREPROCESS_RAW_VIABILITY(dataset_name, work_path, useless_count) + PREPROCESS_RAW_VIABILITY(dataset_name, work_path) ch_versions = ch_versions.mix(PREPROCESS_RAW_VIABILITY.out.versions) ch_toml_files = PREPROCESS_RAW_VIABILITY.out.path_to_toml .flatten() diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 98ccbb6..146b638 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -13,11 +13,10 @@ workflow RUN_CV { baselines // model names for comparison work_path // path to data measure - useless_count // how do I make it wait for check params to finish? main: ch_versions = Channel.empty() - LOAD_RESPONSE(params.dataset_name, work_path, params.cross_study_datasets, measure, useless_count) + LOAD_RESPONSE(params.dataset_name, work_path, params.cross_study_datasets, measure) ch_versions = ch_versions.mix(LOAD_RESPONSE.out.versions) ch_test_modes = channel.from(test_modes) @@ -87,7 +86,7 @@ workflow RUN_CV { // [model_name, test_mode, split_id, // [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], // [prediction_dataset_0.pkl, ..., prediction_dataset_n.pkl] ] - ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.groupTuple(by: [0,1,2]) + ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.pred_data.groupTuple(by: [0,1,2]) EVALUATE_FIND_MAX ( ch_combined_hpams, diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 926b329..53ddc93 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -6,8 +6,6 @@ include { paramsSummaryMap } from 'plugin/nf-schema' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_drugresponseeval_pipeline' - -include { PARAMS_CHECK } from '../modules/local/params_check' // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // @@ -15,7 +13,6 @@ include { PARAMS_CHECK } from '../modules/local/params_check' include { PREPROCESS_CUSTOM } from '../subworkflows/local/preprocess_custom' include { RUN_CV } from '../subworkflows/local/run_cv' include { MODEL_TESTING } from '../subworkflows/local/model_testing' -include { VISUALIZATION } from '../subworkflows/local/visualization' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -52,31 +49,12 @@ workflow DRUGRESPONSEEVAL { ch_baselines = channel.from(baselines) ch_models_baselines = ch_models.concat(ch_baselines) - PARAMS_CHECK ( - params.run_id, - params.models, - params.baselines, - params.test_mode, - params.randomization_mode, - params.randomization_type, - params.n_trials_robustness, - params.dataset_name, - params.cross_study_datasets, - params.curve_curator, - params.optim_metric, - params.n_cv_splits, - params.response_transformation, - params.path_data, - params.measure - ) - work_path = channel.fromPath(params.path_data) PREPROCESS_CUSTOM ( work_path, params.dataset_name, - params.measure, - PARAMS_CHECK.out.count() + params.measure ) ch_versions = ch_versions.mix(PREPROCESS_CUSTOM.out.versions) @@ -85,8 +63,7 @@ workflow DRUGRESPONSEEVAL { models, baselines, work_path, - PREPROCESS_CUSTOM.out.measure, - PARAMS_CHECK.out.count() + PREPROCESS_CUSTOM.out.measure ) ch_versions = ch_versions.mix(RUN_CV.out.versions) From c7fe294c86782296ad1d8f68879b9700d09d4ca4 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 09:59:19 +0200 Subject: [PATCH 218/257] forgot to delete vis subworkflow --- subworkflows/local/visualization/main.nf | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 subworkflows/local/visualization/main.nf diff --git a/subworkflows/local/visualization/main.nf b/subworkflows/local/visualization/main.nf deleted file mode 100644 index e69de29..0000000 From 42d1b4a552378e8f243f775c89b1e826269ab919 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 10:01:12 +0200 Subject: [PATCH 219/257] removed todo, fixed ro-crate --- nextflow.config | 2 -- ro-crate-metadata.json | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/nextflow.config b/nextflow.config index 810de93..fe74dd7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -182,7 +182,6 @@ includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !pa // Load nf-core/drugresponseeval 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 params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/drugresponseeval.config" : "/dev/null" // Set default registry for Apptainer, Docker, Podman, Charliecloud and Singularity independent of -profile @@ -241,7 +240,6 @@ manifest { name = 'nf-core/drugresponseeval' author = """Judith Bernett""" // The author field is deprecated from Nextflow version 24.10.0, use contributors instead contributors = [ - // TODO nf-core: Update the field with the details of the contributors to your pipeline. New with Nextflow version 24.10.0 [ name: 'Judith Bernett', affiliation: 'Data Science in Systems Biology, TUM School of Life Sciences, Technical University of Munich, Germany.', diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 7514ea4..0d17ae7 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "Stable", "datePublished": "2025-06-03T11:01:28+00:00", - "description": "

    \n \n \n \"nf-core/drugresponseeval\"\n \n

    \n\n[![GitHub Actions CI Status](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/drugresponseeval/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/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/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.14779984-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.14779984)\n\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![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/drugresponseeval)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23drugresponseeval-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/drugresponseeval)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![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)\n\n## Introduction\n\n# ![drevalpy_summary](assets/dreval_summary.svg)\n\n**DrEval** is a bioinformatics framework which includes a PyPI package (drevalpy) and a Nextflow\npipeline (this repo). DrEval ensures that evaluations are statistically sound, biologically\nmeaningful, and reproducible. DrEval simplifies the implementation of drug response prediction\nmodels, allowing researchers to focus on advancing their modeling innovations by automating\nstandardized evaluation protocols and preprocessing workflows. With DrEval, hyperparameter\ntuning is fair and consistent. With its flexible model interface, DrEval supports any model type,\nranging from statistical models to complex neural networks. By contributing your model to the\nDrEval catalog, you can increase your work's exposure, reusability, and transferability.\n\n1. The response data is loaded\n2. All models are trained and evaluated in a cross-validation setting\n3. For each CV split, the best hyperparameters are determined using a grid search per model\n4. The model is trained on the full training set (train & validation) with the best\n hyperparameters to predict the test set\n5. If randomization tests are enabled, the model is trained on the full training set with the best\n hyperparameters to predict the randomized test set\n6. If robustness tests are enabled, the model is trained N times on the full training set with the\n best hyperparameters\n7. Plots are created summarizing the results\n\nFor baseline models, no randomization or robustness tests are performed.\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/drugresponseeval \\\n -profile \\\n --models \\\n --baselines \\\n --dataset_name \n```\n\n> [!WARNING]\n> 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).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/drugresponseeval/usage) and the [parameter documentation](https://nf-co.re/drugresponseeval/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/drugresponseeval/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/drugresponseeval/output).\n\n## Credits\n\nnf-core/drugresponseeval was originally written by Judith Bernett (TUM) and Pascal Iversen (FU\nBerlin).\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n## Contributions and Support\n\nContributors to nf-core/drugresponseeval and the drevalpy PyPI package:\n\n- [Judith Bernett](https://github.com/JudithBernett) (TUM)\n- [Pascal Iversen](https://github.com/PascalIversen) (FU Berlin)\n- [Mario Picciani](https://github.com/picciama) (TUM)\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#drugresponseeval` channel](https://nfcore.slack.com/channels/drugresponseeval) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/drugresponseeval for your analysis, please cite it using the following doi: [10.5281/zenodo.14779984](https://doi.org/10.5281/zenodo.14779984)\n\nThe underlying data is available at doi: [10.5281/zenodo.12633909](https://doi.org/10.5281/zenodo.12633909).\n\nThe underlying python package is drevalpy, availably on [PyPI](https://pypi.org/project/drevalpy/) as standalone.\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "description": "

    \n \n \n \"nf-core/drugresponseeval\"\n \n

    \n\n[![GitHub Actions CI Status](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/drugresponseeval/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/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/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.14779984-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.14779984)\n\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![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/drugresponseeval)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23drugresponseeval-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/drugresponseeval)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![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)\n\n## Introduction\n\n# ![drevalpy_summary](assets/dreval_summary.svg)\n\n**DrEval** is a bioinformatics framework which includes a PyPI package (drevalpy) and a Nextflow\npipeline (this repo). DrEval ensures that evaluations are statistically sound, biologically\nmeaningful, and reproducible. DrEval simplifies the implementation of drug response prediction\nmodels, allowing researchers to focus on advancing their modeling innovations by automating\nstandardized evaluation protocols and preprocessing workflows. With DrEval, hyperparameter\ntuning is fair and consistent. With its flexible model interface, DrEval supports any model type,\nranging from statistical models to complex neural networks. By contributing your model to the\nDrEval catalog, you can increase your work's exposure, reusability, and transferability.\n\n1. The response data is loaded\n2. All models are trained and evaluated in a cross-validation setting\n3. For each CV split, the best hyperparameters are determined using a grid search per model\n4. The model is trained on the full training set (train & validation) with the best\n hyperparameters to predict the test set\n5. If randomization tests are enabled, the model is trained on the full training set with the best\n hyperparameters to predict the randomized test set\n6. If robustness tests are enabled, the model is trained N times on the full training set with the\n best hyperparameters\n7. Plots are created summarizing the results\n\nFor baseline models, no randomization or robustness tests are performed.\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/drugresponseeval \\\n -profile \\\n --models \\\n --baselines \\\n --dataset_name \n```\n\n> [!WARNING]\n> 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).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/drugresponseeval/usage) and the [parameter documentation](https://nf-co.re/drugresponseeval/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/drugresponseeval/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/drugresponseeval/output).\n\n## Credits\n\nnf-core/drugresponseeval was originally written by Judith Bernett (TUM) and Pascal Iversen (FU\nBerlin).\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n## Contributions and Support\n\nContributors to nf-core/drugresponseeval and the drevalpy PyPI package:\n\n- [Judith Bernett](https://github.com/JudithBernett) (TUM)\n- [Pascal Iversen](https://github.com/PascalIversen) (FU Berlin)\n- [Mario Picciani](https://github.com/picciama) (TUM)\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#drugresponseeval` channel](https://nfcore.slack.com/channels/drugresponseeval) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/drugresponseeval for your analysis, please cite it using the following doi: [10.5281/zenodo.14779984](https://doi.org/10.5281/zenodo.14779984)\n\n> Our corresponding publication is at doi [10.1101/2025.05.26.655288](doi.org/10.1101/2025.05.26.655288)\n>\n> Bernett, J., Iversen, P., Picciani, M., Wilhelm, M., Baum, K., & List, M. **From Hype to Health Check: Critical Evaluation of Drug Response Prediction Models with DrEval.**\n>\n> _bioRxiv_, 2025-05.\n\nThe underlying data is available at doi: [10.5281/zenodo.12633909](https://doi.org/10.5281/zenodo.12633909).\n\nThe underlying python package is drevalpy, availably on [PyPI](https://pypi.org/project/drevalpy/) as standalone.\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" From ae137c4d01d93641b1a70194434a4e43772e0c67 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 11:15:35 +0200 Subject: [PATCH 220/257] forgot version for unzip --- modules/local/unzip/main.nf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/local/unzip/main.nf b/modules/local/unzip/main.nf index b046430..b8095c4 100644 --- a/modules/local/unzip/main.nf +++ b/modules/local/unzip/main.nf @@ -12,10 +12,17 @@ process UNZIP { output: tuple val(dataset_name), path("${file.baseName}/"), path("${file.baseName}/${file.baseName}.csv"), emit: unzipped_archive + path("versions.yml"), emit: versions script: """ unzip ${file} + + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + unzip: \$(unzip --version 2>&1 | sed -E -n 's/^UnZip ([0-9.]+).*/\1/p') + END_VERSIONS """ } From 36f0b02174f56f1729745171b2cf2b1518f021f3 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 11:28:12 +0200 Subject: [PATCH 221/257] merged incorrectly --- subworkflows/local/model_testing/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 69110fc..46cde51 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -133,8 +133,8 @@ workflow MODEL_TESTING { ch_versions = ch_versions.mix(COLLECT_RESULTS.out.versions) // evaluation_results_per_cl and evaluation_results_per_drug are optional - evaluation_results_per_drug = COLLECT_RESULTS.out.evaluation_results_per_drug.ifEmpty(file("NONE_drug.csv")) - evaluation_results_per_cl = COLLECT_RESULTS.out.evaluation_results_per_cl.ifEmpty(file("NONE_cl.csv")) + evaluation_results_per_drug = COLLECT_RESULTS.out.evaluation_results_per_drug.ifEmpty(file("${projectDir}/assets/NO_FILE", checkIfExists: true)) + evaluation_results_per_cl = COLLECT_RESULTS.out.evaluation_results_per_cl.ifEmpty(file("${projectDir}/assets/NO_FILE", checkIfExists: true)) ch_input_vis = COLLECT_RESULTS.out.evaluation_results.concat( evaluation_results_per_drug, evaluation_results_per_cl, From 7786a74fc028e50ee0751af918ecb44225283df0 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 11:59:01 +0200 Subject: [PATCH 222/257] updated modules --- modules.json | 9 --------- 1 file changed, 9 deletions(-) diff --git a/modules.json b/modules.json index 1f7d288..c478331 100644 --- a/modules.json +++ b/modules.json @@ -3,15 +3,6 @@ "homePage": "https://github.com/nf-core/drugresponseeval", "repos": { "https://github.com/nf-core/modules.git": { - "modules": { - "nf-core": { - "custom/dumpsoftwareversions": { - "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["modules"] - } - } - }, "subworkflows": { "nf-core": { "utils_nextflow_pipeline": { From d7a37e24745e092dc50cb4f8d125a80eae83b09c Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 12:00:04 +0200 Subject: [PATCH 223/257] removed dumpsoftwareversions --- .../dumpsoftwareversions/environment.yml | 7 -- .../custom/dumpsoftwareversions/main.nf | 33 ------ .../custom/dumpsoftwareversions/meta.yml | 43 -------- .../templates/dumpsoftwareversions.py | 101 ------------------ .../dumpsoftwareversions/tests/main.nf.test | 43 -------- .../tests/main.nf.test.snap | 37 ------- 6 files changed, 264 deletions(-) delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/environment.yml delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/main.nf delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/meta.yml delete mode 100755 modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test delete mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap diff --git a/modules/nf-core/custom/dumpsoftwareversions/environment.yml b/modules/nf-core/custom/dumpsoftwareversions/environment.yml deleted file mode 100644 index c3b3413..0000000 --- a/modules/nf-core/custom/dumpsoftwareversions/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - bioconda::multiqc=1.27 diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf deleted file mode 100644 index dd6e210..0000000 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ /dev/null @@ -1,33 +0,0 @@ -def deprecation_message = """ -WARNING: This module has been deprecated. - -Reason: -This module is no longer recommended for use, as it is replaced by the function softwareVersionsToYAML -in the utils_nfcore_pipeline subworkflow that is included in the nf-core template. - -""" -process CUSTOM_DUMPSOFTWAREVERSIONS { - label 'process_single' - - // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.27--pyhdfd78af_0' : - 'biocontainers/multiqc:1.27--pyhdfd78af_0' }" - - input: - path versions - - output: - path "software_versions.yml" , emit: yml - path "software_versions_mqc.yml", emit: mqc_yml - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - assert true: deprecation_message - def args = task.ext.args ?: '' - template 'dumpsoftwareversions.py' -} diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml deleted file mode 100644 index dc1e412..0000000 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ /dev/null @@ -1,43 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json -name: custom_dumpsoftwareversions -description: Custom module used to dump software versions within the nf-core pipeline - template -keywords: - - custom - - dump - - version -tools: - - custom: - description: Custom module used to dump software versions within the nf-core pipeline - template - homepage: https://github.com/nf-core/tools - documentation: https://github.com/nf-core/tools - licence: ["MIT"] - identifier: "" -input: - - - versions: - type: file - description: YML file containing software versions - pattern: "*.yml" -output: - - yml: - - software_versions.yml: - type: file - description: Standard YML file containing software versions - pattern: "software_versions.yml" - - mqc_yml: - - software_versions_mqc.yml: - type: file - description: MultiQC custom content YML file containing software versions - pattern: "software_versions_mqc.yml" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@drpatelh" - - "@grst" -maintainers: - - "@drpatelh" - - "@grst" diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py deleted file mode 100755 index b83b32c..0000000 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python - - -"""Provide functions to merge multiple versions.yml files.""" - -import platform -from textwrap import dedent - -import yaml - - -def _make_versions_html(versions): - """Generate a tabular HTML output of all versions for MultiQC.""" - html = [ - dedent( - """\\ - -
    Process Name \\", + " \\ Software Version
    CUSTOM_DUMPSOFTWAREVERSIONSpython3.13.1
    yaml6.0.2
    TOOL1tool10.11.9
    TOOL2tool21.9
    WorkflowNextflow
    - - - - - - - - """ - ) - ] - for process, tmp_versions in sorted(versions.items()): - html.append("") - for i, (tool, version) in enumerate(sorted(tmp_versions.items())): - html.append( - dedent( - f"""\\ - - - - - - """ - ) - ) - html.append("") - html.append("
    Process Name Software Version
    {process if (i == 0) else ''}{tool}{version}
    ") - return "\\n".join(html) - - -def main(): - """Load all version files and generate merged output.""" - versions_this_module = {} - versions_this_module["${task.process}"] = { - "python": platform.python_version(), - "yaml": yaml.__version__, - } - - with open("$versions") as f: - versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module - - # aggregate versions by the module name (derived from fully-qualified process name) - versions_by_module = {} - for process, process_versions in versions_by_process.items(): - module = process.split(":")[-1] - try: - if versions_by_module[module] != process_versions: - raise AssertionError( - "We assume that software versions are the same between all modules. " - "If you see this error-message it means you discovered an edge-case " - "and should open an issue in nf-core/tools. " - ) - except KeyError: - versions_by_module[module] = process_versions - - versions_by_module["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version", - } - - versions_mqc = { - "id": "software_versions", - "section_name": "${workflow.manifest.name} Software Versions", - "section_href": "https://github.com/${workflow.manifest.name}", - "plot_type": "html", - "description": "are collected at run time from the software output.", - "data": _make_versions_html(versions_by_module), - } - - with open("software_versions.yml", "w") as f: - yaml.dump(versions_by_module, f, default_flow_style=False) - with open("software_versions_mqc.yml", "w") as f: - yaml.dump(versions_mqc, f, default_flow_style=False) - - with open("versions.yml", "w") as f: - yaml.dump(versions_this_module, f, default_flow_style=False) - - -if __name__ == "__main__": - main() diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test deleted file mode 100644 index b1e1630..0000000 --- a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test +++ /dev/null @@ -1,43 +0,0 @@ -nextflow_process { - - name "Test Process CUSTOM_DUMPSOFTWAREVERSIONS" - script "../main.nf" - process "CUSTOM_DUMPSOFTWAREVERSIONS" - tag "modules" - tag "modules_nfcore" - tag "custom" - tag "dumpsoftwareversions" - tag "custom/dumpsoftwareversions" - - test("Should run without failures") { - when { - process { - """ - def tool1_version = ''' - TOOL1: - tool1: 0.11.9 - '''.stripIndent() - - def tool2_version = ''' - TOOL2: - tool2: 1.9 - '''.stripIndent() - - input[0] = Channel.of(tool1_version, tool2_version).collectFile() - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.versions, - file(process.out.mqc_yml[0]).readLines()[0..10], - file(process.out.yml[0]).readLines()[0..7] - ).match() - } - ) - } - } -} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap deleted file mode 100644 index 74e42fb..0000000 --- a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap +++ /dev/null @@ -1,37 +0,0 @@ -{ - "Should run without failures": { - "content": [ - [ - "versions.yml:md5,42bedca466554ea4ad0b586f8a18be28" - ], - [ - "data: \"\\n\\n \\n \\n \\n \\n \\n \\n \\n\\", - " \\n\\n\\n \\n \\n\\", - " \\ \\n\\n\\n\\n \\n \\", - " \\ \\n \\n\\n\\n\\n\\", - " \\n\\n \\n \\n\\", - " \\ \\n\\n\\n\\n\\n\\n \\n\\", - " \\ \\n \\n\\n\\n\\n\\", - " \\n\\n \\n \\n\\" - ], - [ - "CUSTOM_DUMPSOFTWAREVERSIONS:", - " python: 3.13.1", - " yaml: 6.0.2", - "TOOL1:", - " tool1: 0.11.9", - "TOOL2:", - " tool2: '1.9'", - "Workflow:" - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" - }, - "timestamp": "2025-03-11T13:50:29.789124124" - } -} \ No newline at end of file From f66dfc2a609926b1f8d7d24f153c8ed09850d9ab Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 12:05:51 +0200 Subject: [PATCH 224/257] using softwareVersionsToYAML now --- workflows/drugresponseeval.nf | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 2758733..fcde004 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -34,17 +34,6 @@ workflow DRUGRESPONSEEVAL { main: ch_versions = Channel.empty() - // - // Collate and save software versions - // - //softwareVersionsToYAML(ch_versions) - // .collectFile( - // storeDir: "${params.outdir}/pipeline_info", - // name: 'nf_core_' + 'drugresponseeval_software_' + 'versions.yml', - // sort: true, - // newLine: true - // ).set { ch_collated_versions } - ch_models_baselines = models.concat(baselines) PREPROCESS_CUSTOM ( @@ -73,6 +62,17 @@ workflow DRUGRESPONSEEVAL { ) ch_versions = ch_versions.mix(MODEL_TESTING.out.versions) + // + // Collate and save software versions + // + softwareVersionsToYAML(ch_versions) + .collectFile( + storeDir: "${params.outdir}/pipeline_info", + name: 'nf_core_' + 'drugresponseeval_software_' + 'versions.yml', + sort: true, + newLine: true + ).set { ch_collated_versions } + emit: versions = ch_versions // channel: [ path(versions.yml) ] From 6fa5be6a7dba3aff358a83adc72d274ae702eac7 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 12:13:22 +0200 Subject: [PATCH 225/257] changing modules.json --- modules.json | 1 + 1 file changed, 1 insertion(+) diff --git a/modules.json b/modules.json index c478331..cdbc305 100644 --- a/modules.json +++ b/modules.json @@ -3,6 +3,7 @@ "homePage": "https://github.com/nf-core/drugresponseeval", "repos": { "https://github.com/nf-core/modules.git": { + "modules": {}, "subworkflows": { "nf-core": { "utils_nextflow_pipeline": { From 40d26d6e28eb6b561109e50e9bb070fcd0d43ac8 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 12:14:08 +0200 Subject: [PATCH 226/257] it made it empty? --- modules.json | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/modules.json b/modules.json index cdbc305..cf520c4 100644 --- a/modules.json +++ b/modules.json @@ -1,28 +1,5 @@ { "name": "nf-core/drugresponseeval", "homePage": "https://github.com/nf-core/drugresponseeval", - "repos": { - "https://github.com/nf-core/modules.git": { - "modules": {}, - "subworkflows": { - "nf-core": { - "utils_nextflow_pipeline": { - "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["subworkflows"] - }, - "utils_nfcore_pipeline": { - "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["subworkflows"] - }, - "utils_nfschema_plugin": { - "branch": "master", - "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": ["subworkflows"] - } - } - } - } - } + "repos": {} } From 609c091052e3bef03d3ba2ab85509940c525a91e Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 12:16:50 +0200 Subject: [PATCH 227/257] this is all very confusing --- modules.json | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/modules.json b/modules.json index cf520c4..c478331 100644 --- a/modules.json +++ b/modules.json @@ -1,5 +1,27 @@ { "name": "nf-core/drugresponseeval", "homePage": "https://github.com/nf-core/drugresponseeval", - "repos": {} + "repos": { + "https://github.com/nf-core/modules.git": { + "subworkflows": { + "nf-core": { + "utils_nextflow_pipeline": { + "branch": "master", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "installed_by": ["subworkflows"] + }, + "utils_nfcore_pipeline": { + "branch": "master", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "installed_by": ["subworkflows"] + }, + "utils_nfschema_plugin": { + "branch": "master", + "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", + "installed_by": ["subworkflows"] + } + } + } + } + } } From 5b64f98d570f4fd9bc72e1391fb39c641680ff6f Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 12:20:22 +0200 Subject: [PATCH 228/257] hm --- modules.json | 1 + 1 file changed, 1 insertion(+) diff --git a/modules.json b/modules.json index c478331..cdbc305 100644 --- a/modules.json +++ b/modules.json @@ -3,6 +3,7 @@ "homePage": "https://github.com/nf-core/drugresponseeval", "repos": { "https://github.com/nf-core/modules.git": { + "modules": {}, "subworkflows": { "nf-core": { "utils_nextflow_pipeline": { From 4040c16aabfc2cc47b2f15b92931943af4e3899b Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 12:23:46 +0200 Subject: [PATCH 229/257] this is so weird why do i need this module --- modules.json | 10 +- .../dumpsoftwareversions/environment.yml | 7 ++ .../custom/dumpsoftwareversions/main.nf | 33 ++++++ .../custom/dumpsoftwareversions/meta.yml | 43 ++++++++ .../templates/dumpsoftwareversions.py | 101 ++++++++++++++++++ .../dumpsoftwareversions/tests/main.nf.test | 43 ++++++++ .../tests/main.nf.test.snap | 37 +++++++ 7 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/custom/dumpsoftwareversions/environment.yml create mode 100644 modules/nf-core/custom/dumpsoftwareversions/main.nf create mode 100644 modules/nf-core/custom/dumpsoftwareversions/meta.yml create mode 100755 modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py create mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test create mode 100644 modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap diff --git a/modules.json b/modules.json index cdbc305..1f7d288 100644 --- a/modules.json +++ b/modules.json @@ -3,7 +3,15 @@ "homePage": "https://github.com/nf-core/drugresponseeval", "repos": { "https://github.com/nf-core/modules.git": { - "modules": {}, + "modules": { + "nf-core": { + "custom/dumpsoftwareversions": { + "branch": "master", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "installed_by": ["modules"] + } + } + }, "subworkflows": { "nf-core": { "utils_nextflow_pipeline": { diff --git a/modules/nf-core/custom/dumpsoftwareversions/environment.yml b/modules/nf-core/custom/dumpsoftwareversions/environment.yml new file mode 100644 index 0000000..c3b3413 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::multiqc=1.27 diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf new file mode 100644 index 0000000..dd6e210 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -0,0 +1,33 @@ +def deprecation_message = """ +WARNING: This module has been deprecated. + +Reason: +This module is no longer recommended for use, as it is replaced by the function softwareVersionsToYAML +in the utils_nfcore_pipeline subworkflow that is included in the nf-core template. + +""" +process CUSTOM_DUMPSOFTWAREVERSIONS { + label 'process_single' + + // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.27--pyhdfd78af_0' : + 'biocontainers/multiqc:1.27--pyhdfd78af_0' }" + + input: + path versions + + output: + path "software_versions.yml" , emit: yml + path "software_versions_mqc.yml", emit: mqc_yml + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + assert true: deprecation_message + def args = task.ext.args ?: '' + template 'dumpsoftwareversions.py' +} diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml new file mode 100644 index 0000000..dc1e412 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/meta.yml @@ -0,0 +1,43 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: custom_dumpsoftwareversions +description: Custom module used to dump software versions within the nf-core pipeline + template +keywords: + - custom + - dump + - version +tools: + - custom: + description: Custom module used to dump software versions within the nf-core pipeline + template + homepage: https://github.com/nf-core/tools + documentation: https://github.com/nf-core/tools + licence: ["MIT"] + identifier: "" +input: + - - versions: + type: file + description: YML file containing software versions + pattern: "*.yml" +output: + - yml: + - software_versions.yml: + type: file + description: Standard YML file containing software versions + pattern: "software_versions.yml" + - mqc_yml: + - software_versions_mqc.yml: + type: file + description: MultiQC custom content YML file containing software versions + pattern: "software_versions_mqc.yml" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" + - "@grst" +maintainers: + - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py new file mode 100755 index 0000000..b83b32c --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python + + +"""Provide functions to merge multiple versions.yml files.""" + +import platform +from textwrap import dedent + +import yaml + + +def _make_versions_html(versions): + """Generate a tabular HTML output of all versions for MultiQC.""" + html = [ + dedent( + """\\ + +
    Process Name \\", - " \\ Software Version
    CUSTOM_DUMPSOFTWAREVERSIONSpython3.13.1
    yaml6.0.2
    TOOL1tool10.11.9
    TOOL2tool21.9
    WorkflowNextflow
    + + + + + + + + """ + ) + ] + for process, tmp_versions in sorted(versions.items()): + html.append("") + for i, (tool, version) in enumerate(sorted(tmp_versions.items())): + html.append( + dedent( + f"""\\ + + + + + + """ + ) + ) + html.append("") + html.append("
    Process Name Software Version
    {process if (i == 0) else ''}{tool}{version}
    ") + return "\\n".join(html) + + +def main(): + """Load all version files and generate merged output.""" + versions_this_module = {} + versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, + } + + with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + + # aggregate versions by the module name (derived from fully-qualified process name) + versions_by_module = {} + for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + if versions_by_module[module] != process_versions: + raise AssertionError( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + + versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", + } + + versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), + } + + with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) + with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + + with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) + + +if __name__ == "__main__": + main() diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test new file mode 100644 index 0000000..b1e1630 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test @@ -0,0 +1,43 @@ +nextflow_process { + + name "Test Process CUSTOM_DUMPSOFTWAREVERSIONS" + script "../main.nf" + process "CUSTOM_DUMPSOFTWAREVERSIONS" + tag "modules" + tag "modules_nfcore" + tag "custom" + tag "dumpsoftwareversions" + tag "custom/dumpsoftwareversions" + + test("Should run without failures") { + when { + process { + """ + def tool1_version = ''' + TOOL1: + tool1: 0.11.9 + '''.stripIndent() + + def tool2_version = ''' + TOOL2: + tool2: 1.9 + '''.stripIndent() + + input[0] = Channel.of(tool1_version, tool2_version).collectFile() + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.versions, + file(process.out.mqc_yml[0]).readLines()[0..10], + file(process.out.yml[0]).readLines()[0..7] + ).match() + } + ) + } + } +} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap new file mode 100644 index 0000000..74e42fb --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap @@ -0,0 +1,37 @@ +{ + "Should run without failures": { + "content": [ + [ + "versions.yml:md5,42bedca466554ea4ad0b586f8a18be28" + ], + [ + "data: \"\\n\\n \\n \\n \\n \\n \\n \\n \\n\\", + " \\n\\n\\n \\n \\n\\", + " \\ \\n\\n\\n\\n \\n \\", + " \\ \\n \\n\\n\\n\\n\\", + " \\n\\n \\n \\n\\", + " \\ \\n\\n\\n\\n\\n\\n \\n\\", + " \\ \\n \\n\\n\\n\\n\\", + " \\n\\n \\n \\n\\" + ], + [ + "CUSTOM_DUMPSOFTWAREVERSIONS:", + " python: 3.13.1", + " yaml: 6.0.2", + "TOOL1:", + " tool1: 0.11.9", + "TOOL2:", + " tool2: '1.9'", + "Workflow:" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.5" + }, + "timestamp": "2025-03-11T13:50:29.789124124" + } +} \ No newline at end of file From 0e281e01ff7509e31bbce46921d40aaf450c9354 Mon Sep 17 00:00:00 2001 From: Judith Bernett <38618495+JudithBernett@users.noreply.github.com> Date: Thu, 5 Jun 2025 12:47:04 +0200 Subject: [PATCH 230/257] Update .github/actions/nf-test/action.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matthias Hörtenhuber --- .github/actions/nf-test/action.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index 243e782..ddfac57 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -59,8 +59,6 @@ runs: - name: Run nf-test shell: bash env: - NFT_DIFF: ${{ env.NFT_DIFF }} - NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} NFT_WORKDIR: ${{ env.NFT_WORKDIR }} run: | nf-test test \ From 2f583deb8eb4aa68dabe8ac24c99686ff22b674d Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 13:01:42 +0200 Subject: [PATCH 231/257] temporarily removing softwareVersionsToYAML to see what happens --- workflows/drugresponseeval.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index fcde004..9b5ea3a 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -65,13 +65,14 @@ workflow DRUGRESPONSEEVAL { // // Collate and save software versions // + /* softwareVersionsToYAML(ch_versions) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_' + 'drugresponseeval_software_' + 'versions.yml', sort: true, newLine: true - ).set { ch_collated_versions } + ).set { ch_collated_versions }*/ emit: versions = ch_versions // channel: [ path(versions.yml) ] From 7cab42ce2c1dff300e76ead6007cfcc79f406c93 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 13:16:57 +0200 Subject: [PATCH 232/257] I don't use MQC, so it can't find this file --- tests/default.nf.test | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/default.nf.test b/tests/default.nf.test index eefd068..023ff03 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -23,7 +23,8 @@ nextflow_pipeline { // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions - removeNextflowVersion("$outputDir/pipeline_info/nf_core_drugresponseeval_software_mqc_versions.yml"), + // Custom comment: I don't use multi-qc + //removeNextflowVersion("$outputDir/pipeline_info/nf_core_drugresponseeval_software_mqc_versions.yml"), // All stable path name, with a relative path stable_name, // All files with stable contents From 96bac72823b136ed6a1664db650264c58eb372ac Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 14:31:23 +0200 Subject: [PATCH 233/257] snapshot for nf-test --- tests/default.nf.test.snap | 90 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 tests/default.nf.test.snap diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap new file mode 100644 index 0000000..6b2b408 --- /dev/null +++ b/tests/default.nf.test.snap @@ -0,0 +1,90 @@ +{ + "-profile test": { + "content": [ + 33, + [ + "pipeline_info", + "test_run", + "test_run/LCO", + "test_run/LCO/NaiveDrugMeanPredictor", + "test_run/LCO/NaiveDrugMeanPredictor/best_hpams", + "test_run/LCO/NaiveDrugMeanPredictor/best_hpams/best_hpams_split_0.json", + "test_run/LCO/NaiveDrugMeanPredictor/best_hpams/best_hpams_split_1.json", + "test_run/LCO/NaiveDrugMeanPredictor/cross_study", + "test_run/LCO/NaiveDrugMeanPredictor/cross_study/cross_study_TOYv2_split_0.csv", + "test_run/LCO/NaiveDrugMeanPredictor/cross_study/cross_study_TOYv2_split_1.csv", + "test_run/LCO/NaiveDrugMeanPredictor/predictions", + "test_run/LCO/NaiveDrugMeanPredictor/predictions/predictions_split_0.csv", + "test_run/LCO/NaiveDrugMeanPredictor/predictions/predictions_split_1.csv", + "test_run/LCO/NaiveMeanEffectsPredictor", + "test_run/LCO/NaiveMeanEffectsPredictor/best_hpams", + "test_run/LCO/NaiveMeanEffectsPredictor/best_hpams/best_hpams_split_0.json", + "test_run/LCO/NaiveMeanEffectsPredictor/best_hpams/best_hpams_split_1.json", + "test_run/LCO/NaiveMeanEffectsPredictor/cross_study", + "test_run/LCO/NaiveMeanEffectsPredictor/cross_study/cross_study_TOYv2_split_0.csv", + "test_run/LCO/NaiveMeanEffectsPredictor/cross_study/cross_study_TOYv2_split_1.csv", + "test_run/LCO/NaiveMeanEffectsPredictor/predictions", + "test_run/LCO/NaiveMeanEffectsPredictor/predictions/predictions_split_0.csv", + "test_run/LCO/NaiveMeanEffectsPredictor/predictions/predictions_split_1.csv", + "test_run/LCO/versions.yml", + "test_run/evaluation_results.csv", + "test_run/evaluation_results_per_cl.csv", + "test_run/report", + "test_run/report/LCO.html", + "test_run/report/LCO.png", + "test_run/report/comp_scatter", + "test_run/report/comp_scatter/comp_scatter_cell_line_name_LCO.html", + "test_run/report/critical_difference_plots", + "test_run/report/favicon.png", + "test_run/report/heatmaps", + "test_run/report/heatmaps/heatmap_algorithms_LCO.html", + "test_run/report/heatmaps/heatmap_algorithms_LCO_normalized.html", + "test_run/report/html_tables", + "test_run/report/html_tables/table_cross_study_TOYv2_LCO.html", + "test_run/report/index.html", + "test_run/report/nf-core-drugresponseeval_logo_light.png", + "test_run/report/regression_plots", + "test_run/report/violin_plots", + "test_run/report/violin_plots/violin_algorithms_LCO.html", + "test_run/report/violin_plots/violin_algorithms_LCO_normalized.html", + "test_run/true_vs_pred.csv", + "test_run/versions.yml" + ], + [ + "best_hpams_split_0.json:md5,99914b932bd37a50b983c5e7c90ae93b", + "best_hpams_split_1.json:md5,99914b932bd37a50b983c5e7c90ae93b", + "cross_study_TOYv2_split_0.csv:md5,2f31b65bf35155ca049110a4b3cc27d3", + "cross_study_TOYv2_split_1.csv:md5,522cac473bd5ec36d5db8836a64d829d", + "predictions_split_0.csv:md5,2148107a0528307653d48abb57f48e81", + "predictions_split_1.csv:md5,4ab1dc7d877b4aae6762999db765fddc", + "best_hpams_split_0.json:md5,99914b932bd37a50b983c5e7c90ae93b", + "best_hpams_split_1.json:md5,99914b932bd37a50b983c5e7c90ae93b", + "cross_study_TOYv2_split_0.csv:md5,1b3bba06f808494d5e4166ebe9df677f", + "cross_study_TOYv2_split_1.csv:md5,53505da374bce4c8337d7c9173da0e40", + "predictions_split_0.csv:md5,e7f7afe25ebf76fb92bad4e35746e1c6", + "predictions_split_1.csv:md5,1a238ae5a938aa6b9de8bbcd2db80f8e", + "versions.yml:md5,e91a3c34602f6bea4a47be42b2d65e99", + "evaluation_results.csv:md5,ad05251fd23d336e81deafa647f75d35", + "evaluation_results_per_cl.csv:md5,8fc6e232cba9ff1d724283dbfbec3a85", + "LCO.html:md5,39657391f49643c51c6423805458ab76", + "LCO.png:md5,e8bd8858f8149d610c63e8f3cc36577e", + "comp_scatter_cell_line_name_LCO.html:md5,6303117e7d35b4af19bb060c7f942f94", + "favicon.png:md5,8da229af56874ca6750c5402f0b76e2a", + "heatmap_algorithms_LCO.html:md5,8cb3398f7609806ebe8f6fec9ccfd8b5", + "heatmap_algorithms_LCO_normalized.html:md5,741542a1ac8ec8c6ad50f4ddb37ebce7", + "table_cross_study_TOYv2_LCO.html:md5,e01499165318565479406a9b39c6e68d", + "index.html:md5,b0bd552d41394f52069aa4bbd1bc9af1", + "nf-core-drugresponseeval_logo_light.png:md5,4f55fb24b445a68f35c12a84e83f99c7", + "violin_algorithms_LCO.html:md5,3e75d233b3bb467d198eb8f924434a08", + "violin_algorithms_LCO_normalized.html:md5,1fdfa06255ec2b3c3dc6e03e161f9a53", + "true_vs_pred.csv:md5,49bbbd7cd7b4f87053f3781b332a5847", + "versions.yml:md5,9f48bfeabf0f3399fa1b84e03f9ec95e" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-06-05T13:22:18.353243" + } +} \ No newline at end of file From 8f98f7e070a992862936020dcf956dfac74209bb Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 15:19:30 +0200 Subject: [PATCH 234/257] snapshot for nf-test, updated with ignores for variable files --- tests/.nftignore | 7 +++++++ tests/default.nf.test.snap | 11 +---------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/tests/.nftignore b/tests/.nftignore index 73eb92f..7ca65a7 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -1,2 +1,9 @@ .DS_Store pipeline_info/*.{html,json,txt,yml} +test_run/evaluation*.{csv} +test_run/true_vs_pred.csv +test_run/report/comp_scatter/*.html +test_run/report/heatmaps/*.html +test_run/report/html_tables/*.html +test_run/report/violin_plots/*.html +test_run/report/heatmaps/*.html diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 6b2b408..ed5668c 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -64,20 +64,11 @@ "predictions_split_0.csv:md5,e7f7afe25ebf76fb92bad4e35746e1c6", "predictions_split_1.csv:md5,1a238ae5a938aa6b9de8bbcd2db80f8e", "versions.yml:md5,e91a3c34602f6bea4a47be42b2d65e99", - "evaluation_results.csv:md5,ad05251fd23d336e81deafa647f75d35", - "evaluation_results_per_cl.csv:md5,8fc6e232cba9ff1d724283dbfbec3a85", "LCO.html:md5,39657391f49643c51c6423805458ab76", "LCO.png:md5,e8bd8858f8149d610c63e8f3cc36577e", - "comp_scatter_cell_line_name_LCO.html:md5,6303117e7d35b4af19bb060c7f942f94", "favicon.png:md5,8da229af56874ca6750c5402f0b76e2a", - "heatmap_algorithms_LCO.html:md5,8cb3398f7609806ebe8f6fec9ccfd8b5", - "heatmap_algorithms_LCO_normalized.html:md5,741542a1ac8ec8c6ad50f4ddb37ebce7", - "table_cross_study_TOYv2_LCO.html:md5,e01499165318565479406a9b39c6e68d", "index.html:md5,b0bd552d41394f52069aa4bbd1bc9af1", "nf-core-drugresponseeval_logo_light.png:md5,4f55fb24b445a68f35c12a84e83f99c7", - "violin_algorithms_LCO.html:md5,3e75d233b3bb467d198eb8f924434a08", - "violin_algorithms_LCO_normalized.html:md5,1fdfa06255ec2b3c3dc6e03e161f9a53", - "true_vs_pred.csv:md5,49bbbd7cd7b4f87053f3781b332a5847", "versions.yml:md5,9f48bfeabf0f3399fa1b84e03f9ec95e" ] ], @@ -85,6 +76,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-06-05T13:22:18.353243" + "timestamp": "2025-06-05T15:15:25.723189" } } \ No newline at end of file From 81a084bf886b4570b118e984307ccf723e1392f2 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 16:34:25 +0200 Subject: [PATCH 235/257] Added versions everywhere and added softwareVersionsToYAML for export. Also removed visualization subworkflow because now, there was only one module left in it. --- conf/modules.config | 8 +++++ main.nf | 6 ++++ modules/local/collect_results/main.nf | 10 +++++- modules/local/consolidate_results/main.nf | 9 +++++- modules/local/cv_split/main.nf | 9 ++++++ modules/local/evaluate_final/main.nf | 12 +++++++ modules/local/evaluate_find_max/main.nf | 12 +++++++ modules/local/fit_curves/main.nf | 6 ++++ modules/local/hpam_split/main.nf | 7 ++++ modules/local/load_response/main.nf | 8 +++++ modules/local/make_model_channel/main.nf | 13 ++++++++ .../postprocess_curvecurator_output/main.nf | 7 ++++ modules/local/predict_full/main.nf | 15 ++++++++- .../local/preprocess_raw_viability/main.nf | 7 ++++ modules/local/randomization_split/main.nf | 14 ++++++++ modules/local/randomization_test/main.nf | 15 ++++++++- modules/local/robustness_test/main.nf | 15 ++++++++- modules/local/train_and_predict_cv/main.nf | 13 ++++++++ modules/local/unzip/main.nf | 6 ++++ modules/local/visualize_results/main.nf | 16 +++++++++- subworkflows/local/model_testing/main.nf | 30 ++++++++++++++--- subworkflows/local/preprocess_custom/main.nf | 6 +++- subworkflows/local/run_cv/main.nf | 15 +++++++-- subworkflows/local/visualization/main.nf | 27 ---------------- workflows/drugresponseeval.nf | 32 ++++++++----------- 25 files changed, 258 insertions(+), 60 deletions(-) delete mode 100644 subworkflows/local/visualization/main.nf diff --git a/conf/modules.config b/conf/modules.config index baf45e0..c36ba28 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -42,6 +42,14 @@ process { ] } + withName: 'LOAD_CS_RESPONSE' { + publishDir = [ + path: params.path_data, + mode: params.publish_dir_mode, + saveAs: { filename -> (filename != 'versions.yml' && !filename.endsWith('pkl')) ? filename : null } + ] + } + withName: 'PREPROCESS_RAW_VIABILITY' { publishDir = [ path: { params.path_data }, diff --git a/main.nf b/main.nf index 3d6725b..e9a405a 100644 --- a/main.nf +++ b/main.nf @@ -38,11 +38,17 @@ workflow NFCORE_DRUGRESPONSEEVAL { // // WORKFLOW: Run pipeline // + ch_versions = Channel.empty() DRUGRESPONSEEVAL ( models, baselines, work_path ) + + ch_versions = ch_versions.mix(DRUGRESPONSEEVAL.out.versions) + + emit: + versions = ch_versions } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/modules/local/collect_results/main.nf b/modules/local/collect_results/main.nf index f297063..d0ef6e7 100644 --- a/modules/local/collect_results/main.nf +++ b/modules/local/collect_results/main.nf @@ -1,6 +1,6 @@ process COLLECT_RESULTS { label 'process_medium' - publishDir "${params.outdir}/${params.run_id}", mode: 'copy' + publishDir "${params.outdir}/${params.run_id}", mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } input: path(outfiles) @@ -11,12 +11,20 @@ process COLLECT_RESULTS { path('evaluation_results_per_drug.csv'), emit: evaluation_results_per_drug, optional: true path('evaluation_results_per_cl.csv'), emit: evaluation_results_per_cl, optional: true path('true_vs_pred.csv'), emit: true_vs_pred + path("versions.yml"), emit: versions script: """ collect_results.py \\ --outfiles $outfiles \\ --path_data $path_data + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + END_VERSIONS """ } diff --git a/modules/local/consolidate_results/main.nf b/modules/local/consolidate_results/main.nf index 7a6220f..acbcf26 100644 --- a/modules/local/consolidate_results/main.nf +++ b/modules/local/consolidate_results/main.nf @@ -1,7 +1,7 @@ process CONSOLIDATE_RESULTS { tag "$model_name" label 'process_single' - publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' + publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } input: tuple val(test_mode), val(model_name) @@ -10,6 +10,7 @@ process CONSOLIDATE_RESULTS { output: tuple val(test_mode), val(model_name), path('**split*.csv'), emit: ch_vis, optional: true + path("versions.yml"), emit: versions script: def outdirPath = new File(params.outdir).getAbsolutePath() @@ -25,5 +26,11 @@ process CONSOLIDATE_RESULTS { --randomization_modes "${rand_modes}"\\ --n_trials_robustness ${params.n_trials_robustness} + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + END_VERSIONS """ } diff --git a/modules/local/cv_split/main.nf b/modules/local/cv_split/main.nf index 74b36d9..6ba6bbe 100644 --- a/modules/local/cv_split/main.nf +++ b/modules/local/cv_split/main.nf @@ -8,6 +8,7 @@ process CV_SPLIT { output: tuple val(test_mode), path("split*.pkl") , emit: response_cv_splits + path("versions.yml"), emit: versions script: @@ -16,6 +17,14 @@ process CV_SPLIT { --response $response \\ --n_cv_splits $n_cv_splits \\ --test_mode $test_mode + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + END_VERSIONS """ } diff --git a/modules/local/evaluate_final/main.nf b/modules/local/evaluate_final/main.nf index aa252f8..2ffda7e 100644 --- a/modules/local/evaluate_final/main.nf +++ b/modules/local/evaluate_final/main.nf @@ -7,6 +7,8 @@ process EVALUATE_FINAL { output: path('*.csv'), emit: ch_individual_results, optional: true + path("versions.yml"), emit: versions + script: """ @@ -14,6 +16,16 @@ process EVALUATE_FINAL { --test_mode $test_mode \\ --model_name "${model_name}" \\ --pred_file $pred_file + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + scipy: \$(python -c "import scipy; print(scipy.__version__)") + END_VERSIONS """ } diff --git a/modules/local/evaluate_find_max/main.nf b/modules/local/evaluate_find_max/main.nf index c2637a3..34caa1b 100644 --- a/modules/local/evaluate_find_max/main.nf +++ b/modules/local/evaluate_find_max/main.nf @@ -8,6 +8,7 @@ process EVALUATE_FIND_MAX { output: tuple val(model_name), val(split_id), val(test_mode), path('best_hpam_combi_*.yaml'), emit: best_combis + path("versions.yml"), emit: versions script: """ @@ -17,6 +18,17 @@ process EVALUATE_FIND_MAX { --hpam_yamls $hpam_yamls \\ --pred_datas $pred_datas \\ --metric $metric + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + scipy: \$(python -c "import scipy; print(scipy.__version__)") + yaml: \$(python -c "import yaml; print(yaml.__version__)") + END_VERSIONS """ } diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index 6da9267..af33ad7 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -9,9 +9,15 @@ process FIT_CURVES { output: path("curves.tsv"), emit: path_to_curvecurator_out tuple path("mad.txt"), path("dashboard.html"), path("curveCurator.log") // other output + path("versions.yml"), emit: versions script: """ CurveCurator ${toml} --mad + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + curve_curator: \$(python -c "import curve_curator; print(curve_curator.__version__)") + END_VERSIONS """ } diff --git a/modules/local/hpam_split/main.nf b/modules/local/hpam_split/main.nf index 78d0002..1d5fa7a 100644 --- a/modules/local/hpam_split/main.nf +++ b/modules/local/hpam_split/main.nf @@ -7,12 +7,19 @@ process HPAM_SPLIT { output: tuple val(model_name), path("*.yaml") , emit: hpam_combi + path("versions.yml"), emit: versions script: """ hpam_split.py \\ --model_name "${model_name}" + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + yaml: \$(python -c "import yaml; print(yaml.__version__)") """ } diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index 6b67426..45927e1 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -10,6 +10,7 @@ process LOAD_RESPONSE { output: path 'response_dataset.pkl', emit: response_dataset, optional: true path 'cross_study_*.pkl', emit: cross_study_datasets, optional: true + path("versions.yml"), emit: versions script: """ @@ -18,6 +19,13 @@ process LOAD_RESPONSE { --measure ${measure} \\ ${no_refitting ? '--no_refitting' : ''} \\ ${cross_study_dataset ? '--cross_study_dataset' : ''} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + END_VERSIONS """ } diff --git a/modules/local/make_model_channel/main.nf b/modules/local/make_model_channel/main.nf index a9373aa..be709eb 100644 --- a/modules/local/make_model_channel/main.nf +++ b/modules/local/make_model_channel/main.nf @@ -8,6 +8,7 @@ process MAKE_MODEL_CHANNEL { output: path '{models,baselines}*.txt', emit: all_models + path("versions.yml"), emit: versions script: """ @@ -15,6 +16,18 @@ process MAKE_MODEL_CHANNEL { --models "${models}" \\ --data ${response_data} \\ --file_name ${name} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)") + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS """ } diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf index b3a9971..0ad97d5 100644 --- a/modules/local/postprocess_curvecurator_output/main.nf +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -10,9 +10,16 @@ process POSTPROCESS_CURVECURATOR_DATA { output: path "${dataset_name}.csv", emit: path_to_dataset val "${measure}" + "_curvecurator", emit: measure + path("versions.yml"), emit: versions script: """ postprocess_curvecurator_output.py --dataset_name ${dataset_name} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + END_VERSIONS """ } diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 427f9ed..a130b69 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -2,7 +2,7 @@ process PREDICT_FULL { tag { "${test_mode}_${model_name}_${split_id}_gpu:${task.ext.use_gpu}" } label 'process_high' label 'process_gpu' - publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' + publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } input: tuple path(cross_study_datasets), val(model_name), val(test_mode), val(split_id), path(split_dataset), path(hpam_combi), path(path_data) @@ -13,6 +13,7 @@ process PREDICT_FULL { tuple val(test_mode), val(model_name), path('**predictions*.csv'), emit: ch_vis tuple val(test_mode), val(model_name), path('**cross_study/cross_study*.csv'), emit: ch_cross, optional: true path('**best_hpams*.json'), emit: ch_hpams + path("versions.yml"), emit: versions script: """ @@ -27,6 +28,18 @@ process PREDICT_FULL { --path_data $path_data \\ --cross_study_datasets $cross_study_datasets \\ --model_checkpoint_dir $model_checkpoint_dir \\ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)") + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS """ } diff --git a/modules/local/preprocess_raw_viability/main.nf b/modules/local/preprocess_raw_viability/main.nf index 09260a7..55b869f 100644 --- a/modules/local/preprocess_raw_viability/main.nf +++ b/modules/local/preprocess_raw_viability/main.nf @@ -8,9 +8,16 @@ process PREPROCESS_RAW_VIABILITY { output: path "${dataset_name}/*/config.toml", emit: path_to_toml path "${dataset_name}/*/curvecurator_input.tsv", emit: curvecurator_input + path("versions.yml"), emit: versions script: """ preprocess_raw_viability.py --path_data ${work_path} --dataset_name ${dataset_name} --cores ${task.cpus} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + END_VERSIONS """ } diff --git a/modules/local/randomization_split/main.nf b/modules/local/randomization_split/main.nf index 2a8ec1d..6598c3e 100644 --- a/modules/local/randomization_split/main.nf +++ b/modules/local/randomization_split/main.nf @@ -7,10 +7,24 @@ process RANDOMIZATION_SPLIT { output: tuple val(model_name), path('randomization_test_view*.yaml'), emit: randomization_test_views + path("versions.yml"), emit: versions script: """ randomization_split.py --model_name "${model_name}" --randomization_mode ${randomization_mode} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)") + platform: \$(python -c "import platform; print(platform.__version__)") + yaml: \$(python -c "import yaml; print(yaml.__version__)") + END_VERSIONS """ } diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index c21b00f..60e5e66 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -2,7 +2,7 @@ process RANDOMIZATION_TEST { tag { "${test_mode}_${model_name}_${randomization_type}_gpu:${task.ext.use_gpu}" } label 'process_high' label 'process_gpu' - publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' + publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } input: tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), path(randomization_views), path(path_data) @@ -12,6 +12,7 @@ process RANDOMIZATION_TEST { output: tuple val(test_mode), val(model_name), path('**randomization*.csv'), emit: ch_vis + path("versions.yml"), emit: versions script: """ @@ -27,6 +28,18 @@ process RANDOMIZATION_TEST { --randomization_views_path $randomization_views \\ --randomization_type $randomization_type \\ --model_checkpoint_dir $model_checkpoint_dir \\ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)") + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS """ } diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index 4e4cd84..d9e4244 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -2,7 +2,7 @@ process ROBUSTNESS_TEST { tag { "${model_name}_${robustness_iteration}_gpu:${task.ext.use_gpu}" } label 'process_high' label 'process_gpu' - publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy' + publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } input: tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), val(robustness_iteration), path(path_data) @@ -12,6 +12,7 @@ process ROBUSTNESS_TEST { output: tuple val(test_mode), val(model_name), path('**robustness*.csv'), emit: ch_vis + path("versions.yml"), emit: versions script: """ @@ -26,6 +27,18 @@ process ROBUSTNESS_TEST { --path_data $path_data \\ --robustness_trial $robustness_iteration \\ --model_checkpoint_dir $model_checkpoint_dir \\ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)") + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS """ } diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 10867e9..5bb144a 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -11,6 +11,7 @@ process TRAIN_AND_PREDICT_CV { output: tuple val(model_name), val(test_mode), val(cv_data.baseName), path(hyperparameters), path("prediction_dataset_*.pkl"), emit: pred_data + path("versions.yml"), emit: versions script: """ @@ -22,5 +23,17 @@ process TRAIN_AND_PREDICT_CV { --cv_data $cv_data \\ --response_transformation $response_transformation \\ --model_checkpoint_dir $model_checkpoint_dir + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)") + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS """ } diff --git a/modules/local/unzip/main.nf b/modules/local/unzip/main.nf index b046430..9d4a759 100644 --- a/modules/local/unzip/main.nf +++ b/modules/local/unzip/main.nf @@ -12,10 +12,16 @@ process UNZIP { output: tuple val(dataset_name), path("${file.baseName}/"), path("${file.baseName}/${file.baseName}.csv"), emit: unzipped_archive + path("versions.yml"), emit: versions script: """ unzip ${file} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + unzip: \$(unzip --version 2>&1 | sed -E -n 's/^UnZip ([0-9.]+).*/\1/p') + END_VERSIONS """ } diff --git a/modules/local/visualize_results/main.nf b/modules/local/visualize_results/main.nf index e0d4470..bd3c497 100644 --- a/modules/local/visualize_results/main.nf +++ b/modules/local/visualize_results/main.nf @@ -1,6 +1,6 @@ process VISUALIZE_RESULTS { label 'process_medium' - publishDir "${params.outdir}/${params.run_id}", mode: 'copy' + publishDir "${params.outdir}/${params.run_id}", mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } input: tuple path(eval_results), path(eval_results_per_drug), path(eval_results_per_cl), path(true_vs_predicted) @@ -8,6 +8,8 @@ process VISUALIZE_RESULTS { output: path('report/*'), emit: html_out + path("versions.yml"), emit: versions + script: """ @@ -18,6 +20,18 @@ process VISUALIZE_RESULTS { --eval_results_per_cl $eval_results_per_cl \\ --true_vs_predicted $true_vs_predicted \\ --path_data $path_data + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + matplotlib: \$(python -c "import matplotlib; print(matplotlib.__version__)") + plotly: \$(python -c "import plotly; print(plotly.__version__)") + scikit_posthocs: \$(python -c "import scikit_posthocs; print(scikit_posthocs.__version__)") + scipy: \$(python -c "import scipy; print(scipy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + END_VERSIONS """ } diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index b65b972..9cc1e58 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -5,6 +5,7 @@ include { ROBUSTNESS_TEST } from '../../../modules/local/robustnes include { CONSOLIDATE_RESULTS } from '../../../modules/local/consolidate_results' include { EVALUATE_FINAL } from '../../../modules/local/evaluate_final' include { COLLECT_RESULTS } from '../../../modules/local/collect_results' +include { VISUALIZE_RESULTS } from '../../../modules/local/visualize_results' workflow MODEL_TESTING { @@ -17,6 +18,7 @@ workflow MODEL_TESTING { work_path // from input main: + ch_versions = Channel.empty() if (params.cross_study_datasets == '') { cross_study_datasets = channel.fromPath(['./NONE.csv']) } @@ -35,6 +37,7 @@ workflow MODEL_TESTING { params.response_transformation, params.model_checkpoint_dir ) + ch_versions = ch_versions.mix(PREDICT_FULL.out.versions) ch_vis = PREDICT_FULL.out.ch_vis.concat(PREDICT_FULL.out.ch_cross) if (params.randomization_mode != 'None') { @@ -47,6 +50,7 @@ workflow MODEL_TESTING { RANDOMIZATION_SPLIT ( ch_models_rand ) + ch_versions = ch_versions.mix(RANDOMIZATION_SPLIT.out.versions) ch_rand_views = ch_models .combine(RANDOMIZATION_SPLIT.out.randomization_test_views.transpose(), by: 0) .map{ model_class, model_name, rand_file -> [model_name, rand_file] } @@ -67,6 +71,7 @@ workflow MODEL_TESTING { params.response_transformation, params.model_checkpoint_dir ) + ch_versions = ch_versions.mix(RANDOMIZATION_TEST.out.versions) ch_vis = ch_vis.concat(RANDOMIZATION_TEST.out.ch_vis) } @@ -90,6 +95,7 @@ workflow MODEL_TESTING { params.response_transformation, params.model_checkpoint_dir ) + ch_versions = ch_versions.mix(ROBUSTNESS_TEST.out.versions) ch_vis = ch_vis.concat(ROBUSTNESS_TEST.out.ch_vis) } @@ -102,7 +108,7 @@ workflow MODEL_TESTING { randomizations, ch_vis.count() // wait for ch_vis to finish ) - + ch_versions = ch_versions.mix(CONSOLIDATE_RESULTS.out.versions) ch_consolidate = CONSOLIDATE_RESULTS.out.ch_vis.transpose() // filter out SingleDrugModels that have been consolidated ch_vis = ch_vis @@ -115,6 +121,7 @@ workflow MODEL_TESTING { EVALUATE_FINAL ( ch_vis ) + ch_versions = ch_versions.mix(EVALUATE_FINAL.out.versions) ch_collapse = EVALUATE_FINAL.out.ch_individual_results.collect() @@ -122,10 +129,23 @@ workflow MODEL_TESTING { ch_collapse, work_path ) + ch_versions = ch_versions.mix(COLLECT_RESULTS.out.versions) + + // evaluation_results_per_cl and evaluation_results_per_drug are optional + evaluation_results_per_drug = COLLECT_RESULTS.out.evaluation_results_per_drug.ifEmpty(file("${projectDir}/assets/NO_FILE", checkIfExists: true)) + evaluation_results_per_cl = COLLECT_RESULTS.out.evaluation_results_per_cl.ifEmpty(file("${projectDir}/assets/NO_FILE", checkIfExists: true)) + ch_input_vis = COLLECT_RESULTS.out.evaluation_results.concat( + evaluation_results_per_drug, + evaluation_results_per_cl, + COLLECT_RESULTS.out.true_vs_pred + ).collect() + + VISUALIZE_RESULTS( + ch_input_vis, + work_path + ) + ch_versions = ch_versions.mix(VISUALIZE_RESULTS.out.versions) emit: - evaluation_results = COLLECT_RESULTS.out.evaluation_results - evaluation_results_per_drug = COLLECT_RESULTS.out.evaluation_results_per_drug - evaluation_results_per_cl = COLLECT_RESULTS.out.evaluation_results_per_cl - true_vs_predicted = COLLECT_RESULTS.out.true_vs_pred + versions = ch_versions } diff --git a/subworkflows/local/preprocess_custom/main.nf b/subworkflows/local/preprocess_custom/main.nf index c26abde..c9beea6 100644 --- a/subworkflows/local/preprocess_custom/main.nf +++ b/subworkflows/local/preprocess_custom/main.nf @@ -9,7 +9,7 @@ workflow PREPROCESS_CUSTOM { measure main: - + ch_versions = Channel.empty() def preimplemented_datasets = ['GDSC1', 'GDSC2', 'CCLE', 'CTRPv1', 'CTRPv2', 'TOYv1', 'TOYv2'] if(!params.no_refitting){ File raw_file = new File("${params.path_data}/${dataset_name}/${dataset_name}_raw.csv") @@ -24,6 +24,7 @@ workflow PREPROCESS_CUSTOM { throw new Exception("Raw data file not found: ${raw_file}. You want to refit a custom dataset with CurveCurator which requires raw viability data to be located at ${raw_file} but the file does not exist. Please provide the raw data in the correct format or set `no_refitting` to true in your parameters.") }else{ PREPROCESS_RAW_VIABILITY(dataset_name, work_path) + ch_versions = ch_versions.mix(PREPROCESS_RAW_VIABILITY.out.versions) ch_toml_files = PREPROCESS_RAW_VIABILITY.out.path_to_toml .flatten() .map { file -> [file.parent.name, file] } @@ -33,8 +34,10 @@ workflow PREPROCESS_CUSTOM { // [dose_dir_name, config.toml, curvecurator_input.tsv] ch_fit_curves = ch_toml_files.combine(ch_curvecurator_input, by: 0) FIT_CURVES(dataset_name, ch_fit_curves) + ch_versions = ch_versions.mix(FIT_CURVES.out.versions) ch_curves = FIT_CURVES.out.path_to_curvecurator_out.collect() POSTPROCESS_CURVECURATOR_DATA(dataset_name, ch_curves, measure) + ch_versions = ch_versions.mix(POSTPROCESS_CURVECURATOR_DATA.out.versions) ch_measure = POSTPROCESS_CURVECURATOR_DATA.out.measure } } @@ -50,4 +53,5 @@ workflow PREPROCESS_CUSTOM { } emit: measure = ch_measure + versions = ch_versions } diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index 374c4b8..d354839 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -18,7 +18,7 @@ workflow RUN_CV { measure main: - + ch_versions = Channel.empty() File response_path = new File("${params.path_data}/${params.dataset_name}/${params.dataset_name}.csv") if (!response_path.exists()) { log.info "Downloading response dataset ${params.dataset_name} from Zenodo: ${params.zenodo_link}${params.dataset_name}.zip" @@ -26,6 +26,7 @@ workflow RUN_CV { .fromPath("${params.zenodo_link}${params.dataset_name}.zip") .map { file -> [params.dataset_name, file] } UNZIP_RESPONSE(ch_unzip) + ch_versions = ch_versions.mix(UNZIP_RESPONSE.out.versions) ch_response = UNZIP_RESPONSE.out.unzipped_archive .map { dataset_name, path_to_dir, response_file -> file(response_file, checkIfExists: true) @@ -58,6 +59,7 @@ workflow RUN_CV { [dataset_name, "${params.zenodo_link}${dataset_path.baseName}.zip"] } UNZIP_CS_RESPONSE(ch_cs_to_be_loaded) + ch_versions = ch_versions.mix(UNZIP_CS_RESPONSE.out.versions) ch_cs_loaded = UNZIP_CS_RESPONSE.out.unzipped_archive .map { dataset_name, path_to_dir, response_file -> file(response_file, checkIfExists: true) @@ -69,7 +71,9 @@ workflow RUN_CV { ch_response = measure.combine(ch_response) ch_cross_study_datasets = measure.combine(ch_cross_study_datasets) LOAD_RESPONSE(ch_response, params.no_refitting, false) + ch_versions = ch_versions.mix(LOAD_RESPONSE.out.versions) LOAD_CS_RESPONSE(ch_cross_study_datasets, params.no_refitting, true) + ch_versions = ch_versions.mix(LOAD_CS_RESPONSE.out.versions) ch_test_modes = channel.from(test_modes) @@ -79,6 +83,7 @@ workflow RUN_CV { ch_data, params.n_cv_splits ) + ch_versions = ch_versions.mix(CV_SPLIT.out.versions) // [test_mode, [split_1.pkl, split_2.pkl, ..., split_n.pkl]] ch_cv_splits = CV_SPLIT.out.response_cv_splits @@ -96,11 +101,13 @@ workflow RUN_CV { ch_input_models, "models" ) + ch_versions = ch_versions.mix(MAKE_MODELS.out.versions) MAKE_BASELINES ( ch_input_baselines, "baselines" ) + ch_versions = ch_versions.mix(MAKE_BASELINES.out.versions) ch_models_expanded = MAKE_MODELS.out.all_models .splitCsv(strip: true) @@ -111,6 +118,7 @@ workflow RUN_CV { HPAM_SPLIT ( ch_models_baselines ) + ch_versions = ch_versions.mix(HPAM_SPLIT.out.versions) // [model_name, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml]] ch_hpam_combis = ch_models_baselines_expanded .combine(HPAM_SPLIT.out.hpam_combi, by: 0) @@ -128,16 +136,18 @@ workflow RUN_CV { ch_test_combis = ch_test_combis.combine(work_path) TRAIN_AND_PREDICT_CV(ch_test_combis, params.response_transformation, params.model_checkpoint_dir) + ch_versions = ch_versions.mix(TRAIN_AND_PREDICT_CV.out.versions) // [model_name, test_mode, split_id, // [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml], // [prediction_dataset_0.pkl, ..., prediction_dataset_n.pkl] ] - ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.groupTuple(by: [0,1,2]) + ch_combined_hpams = TRAIN_AND_PREDICT_CV.out.pred_data.groupTuple(by: [0,1,2]) EVALUATE_FIND_MAX ( ch_combined_hpams, params.optim_metric ) + ch_versions = ch_versions.mix(EVALUATE_FIND_MAX.out.versions) // [split_id, test_mode, split_dataset, model_name, best_hpam_combi_X.yaml] ch_best_hpams_per_split = ch_cv_splits @@ -149,4 +159,5 @@ workflow RUN_CV { best_hpam_per_split = ch_best_hpams_per_split cross_study_datasets = LOAD_CS_RESPONSE.out.cross_study_datasets.collect() ch_models = MAKE_MODELS.out.all_models.splitCsv(strip: true) + versions = ch_versions } diff --git a/subworkflows/local/visualization/main.nf b/subworkflows/local/visualization/main.nf deleted file mode 100644 index 45ef32a..0000000 --- a/subworkflows/local/visualization/main.nf +++ /dev/null @@ -1,27 +0,0 @@ -include { VISUALIZE_RESULTS } from '../../../modules/local/visualize_results' - - -workflow VISUALIZATION { - take: - evaluation_results // from MODEL_TESTING - evaluation_results_per_drug // from MODEL_TESTING - evaluation_results_per_cl // from MODEL_TESTING - true_vs_pred // from MODEL_TESTING - work_path // from input - - main: - // evaluation_results_per_cl and evaluation_results_per_drug are optional - evaluation_results_per_drug = evaluation_results_per_drug.ifEmpty(file("${projectDir}/assets/NO_FILE", checkIfExists: true)) - evaluation_results_per_cl = evaluation_results_per_cl.ifEmpty(file("${projectDir}/assets/NO_FILE", checkIfExists: true)) - ch_input_vis = evaluation_results.concat( - evaluation_results_per_drug, - evaluation_results_per_cl, - true_vs_pred - ).collect() - - VISUALIZE_RESULTS( - ch_input_vis, - work_path - ) - -} diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index e3b25e0..fcde004 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -14,7 +14,6 @@ include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_drug include { PREPROCESS_CUSTOM } from '../subworkflows/local/preprocess_custom' include { RUN_CV } from '../subworkflows/local/run_cv' include { MODEL_TESTING } from '../subworkflows/local/model_testing' -include { VISUALIZATION } from '../subworkflows/local/visualization' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -35,17 +34,6 @@ workflow DRUGRESPONSEEVAL { main: ch_versions = Channel.empty() - // - // Collate and save software versions - // - //softwareVersionsToYAML(ch_versions) - // .collectFile( - // storeDir: "${params.outdir}/pipeline_info", - // name: 'nf_core_' + 'drugresponseeval_software_' + 'versions.yml', - // sort: true, - // newLine: true - // ).set { ch_collated_versions } - ch_models_baselines = models.concat(baselines) PREPROCESS_CUSTOM ( @@ -53,6 +41,7 @@ workflow DRUGRESPONSEEVAL { params.dataset_name, params.measure ) + ch_versions = ch_versions.mix(PREPROCESS_CUSTOM.out.versions) RUN_CV ( test_modes, @@ -61,6 +50,7 @@ workflow DRUGRESPONSEEVAL { work_path, PREPROCESS_CUSTOM.out.measure ) + ch_versions = ch_versions.mix(RUN_CV.out.versions) MODEL_TESTING ( ch_models_baselines, @@ -70,14 +60,18 @@ workflow DRUGRESPONSEEVAL { RUN_CV.out.ch_models, work_path ) + ch_versions = ch_versions.mix(MODEL_TESTING.out.versions) - VISUALIZATION ( - MODEL_TESTING.out.evaluation_results, - MODEL_TESTING.out.evaluation_results_per_drug, - MODEL_TESTING.out.evaluation_results_per_cl, - MODEL_TESTING.out.true_vs_predicted, - work_path - ) + // + // Collate and save software versions + // + softwareVersionsToYAML(ch_versions) + .collectFile( + storeDir: "${params.outdir}/pipeline_info", + name: 'nf_core_' + 'drugresponseeval_software_' + 'versions.yml', + sort: true, + newLine: true + ).set { ch_collated_versions } emit: versions = ch_versions // channel: [ path(versions.yml) ] From a8e52842c65c1f6e037129c129ec147980d69c1c Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Thu, 5 Jun 2025 17:07:37 +0200 Subject: [PATCH 236/257] had to hardcode this --- modules/local/unzip/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/unzip/main.nf b/modules/local/unzip/main.nf index 9d4a759..ad89b98 100644 --- a/modules/local/unzip/main.nf +++ b/modules/local/unzip/main.nf @@ -20,7 +20,7 @@ process UNZIP { cat <<-END_VERSIONS > versions.yml "${task.process}": - unzip: \$(unzip --version 2>&1 | sed -E -n 's/^UnZip ([0-9.]+).*/\1/p') + unzip: 6.00 END_VERSIONS """ From 2e4b61d5a90561b60cbb869b0b742f7deec1f24b Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 6 Jun 2025 10:45:19 +0200 Subject: [PATCH 237/257] added authors and licenses to python scripts: closes #40. Moved publishDir directives to modules.config: closes #41. --- bin/collect_results.py | 3 ++ bin/consolidate_results.py | 2 + bin/cv_split.py | 2 + bin/evaluate_and_find_max.py | 3 ++ bin/evaluate_final.py | 3 ++ bin/hpam_split.py | 2 + bin/load_response.py | 3 ++ bin/make_model_channel.py | 3 ++ bin/postprocess_curvecurator_output.py | 3 ++ bin/preprocess_raw_viability.py | 5 ++ bin/randomization_split.py | 3 ++ bin/train_and_predict_cv.py | 2 + bin/train_and_predict_final.py | 3 ++ bin/visualize_results.py | 3 ++ conf/modules.config | 51 +++++++++++++++++++ modules/local/collect_results/main.nf | 1 - modules/local/consolidate_results/main.nf | 1 - .../postprocess_curvecurator_output/main.nf | 1 - modules/local/predict_full/main.nf | 1 - modules/local/randomization_test/main.nf | 1 - modules/local/robustness_test/main.nf | 1 - modules/local/visualize_results/main.nf | 1 - 22 files changed, 91 insertions(+), 7 deletions(-) diff --git a/bin/collect_results.py b/bin/collect_results.py index 3a7555f..0ef83c5 100755 --- a/bin/collect_results.py +++ b/bin/collect_results.py @@ -1,4 +1,7 @@ #!/usr/bin/env python + +# Written by Judith Bernett and released under the MIT License. + import argparse import pandas as pd import pathlib diff --git a/bin/consolidate_results.py b/bin/consolidate_results.py index 667c722..2595d11 100755 --- a/bin/consolidate_results.py +++ b/bin/consolidate_results.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +# Written by Judith Bernett and released under the MIT License. + import os import argparse from drevalpy.models import MODEL_FACTORY diff --git a/bin/cv_split.py b/bin/cv_split.py index 8e54a65..cc518a3 100755 --- a/bin/cv_split.py +++ b/bin/cv_split.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +# Written by Judith Bernett and released under the MIT License. + import argparse import pickle import sys diff --git a/bin/evaluate_and_find_max.py b/bin/evaluate_and_find_max.py index 4dae5ed..c5f15ce 100755 --- a/bin/evaluate_and_find_max.py +++ b/bin/evaluate_and_find_max.py @@ -1,11 +1,14 @@ #!/usr/bin/env python +# Written by Judith Bernett and released under the MIT License. + import argparse import pickle import yaml from drevalpy.evaluation import evaluate, MAXIMIZATION_METRICS, MINIMIZATION_METRICS + def get_parser(): parser = argparse.ArgumentParser( description="Take model name, get hyperparameters, and split into single hyperparameter combinations" diff --git a/bin/evaluate_final.py b/bin/evaluate_final.py index a70c6ad..86a8ae3 100755 --- a/bin/evaluate_final.py +++ b/bin/evaluate_final.py @@ -1,4 +1,7 @@ #!/usr/bin/env python + +# Written by Judith Bernett and released under the MIT License. + import argparse from drevalpy.visualization.utils import evaluate_file diff --git a/bin/hpam_split.py b/bin/hpam_split.py index 74fc567..f3b2e60 100755 --- a/bin/hpam_split.py +++ b/bin/hpam_split.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +# Written by Judith Bernett and released under the MIT License. + import argparse import yaml from drevalpy.models import MODEL_FACTORY, MULTI_DRUG_MODEL_FACTORY, SINGLE_DRUG_MODEL_FACTORY diff --git a/bin/load_response.py b/bin/load_response.py index 606e531..d20bc0a 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -1,4 +1,7 @@ #!/usr/bin/env python + +# Written by Judith Bernett and released under the MIT License. + import argparse import pickle import pathlib diff --git a/bin/make_model_channel.py b/bin/make_model_channel.py index b4f7081..adfee3e 100755 --- a/bin/make_model_channel.py +++ b/bin/make_model_channel.py @@ -1,11 +1,14 @@ #!/usr/bin/env python +# Written by Judith Bernett and released under the MIT License. + import argparse import pickle from drevalpy.experiment import make_model_list from drevalpy.models import MODEL_FACTORY + def get_parser(): parser = argparse.ArgumentParser(description="Split data into CV splits") parser.add_argument("--models", type=str, required=True, help="List of models") diff --git a/bin/postprocess_curvecurator_output.py b/bin/postprocess_curvecurator_output.py index 18e81f3..0d5fc2e 100755 --- a/bin/postprocess_curvecurator_output.py +++ b/bin/postprocess_curvecurator_output.py @@ -1,4 +1,7 @@ #!/usr/bin/env python + +# Written by Mario Picciani and released under the MIT License. + from drevalpy.datasets.curvecurator import postprocess import argparse diff --git a/bin/preprocess_raw_viability.py b/bin/preprocess_raw_viability.py index 833757d..b0e1804 100755 --- a/bin/preprocess_raw_viability.py +++ b/bin/preprocess_raw_viability.py @@ -1,8 +1,12 @@ #!/usr/bin/env python + +# Written by Mario Picciani with subsequent reworking by Judith Bernett. Released under the MIT License. + from drevalpy.datasets.curvecurator import preprocess from pathlib import Path import argparse + def get_parser(): parser = argparse.ArgumentParser(description="Preprocess CurveCurator viability data.") parser.add_argument("--path_data", type=str, default="", help="Path to base folder containing datasets.") @@ -20,6 +24,7 @@ def main(args): cores=args.cores ) + if __name__ == "__main__": arg_parser = get_parser() args = arg_parser.parse_args() diff --git a/bin/randomization_split.py b/bin/randomization_split.py index 054d904..d4b5c7a 100755 --- a/bin/randomization_split.py +++ b/bin/randomization_split.py @@ -1,4 +1,7 @@ #!/usr/bin/env python + +# Written by Judith Bernett and released under the MIT License. + import argparse import yaml diff --git a/bin/train_and_predict_cv.py b/bin/train_and_predict_cv.py index d2fbd1f..d2218c6 100755 --- a/bin/train_and_predict_cv.py +++ b/bin/train_and_predict_cv.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +# Written by Judith Bernett and released under the MIT License. + import argparse import sys import pickle diff --git a/bin/train_and_predict_final.py b/bin/train_and_predict_final.py index 05bd761..6e3e58b 100755 --- a/bin/train_and_predict_final.py +++ b/bin/train_and_predict_final.py @@ -1,4 +1,7 @@ #!/usr/bin/env python + +# Written by Judith Bernett and released under the MIT License. + import os import json import sys diff --git a/bin/visualize_results.py b/bin/visualize_results.py index f99ed1c..cff1349 100755 --- a/bin/visualize_results.py +++ b/bin/visualize_results.py @@ -1,4 +1,7 @@ #!/usr/bin/env python + +# Written by Judith Bernett and released under the MIT License. + import os import pathlib import argparse diff --git a/conf/modules.config b/conf/modules.config index c36ba28..ad796f6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -125,6 +125,12 @@ process { } withName: 'PREDICT_FULL' { + publishDir = [ + path: { "${params.outdir}/${params.run_id}/${test_mode}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + ext.use_gpu = { [ 'SimpleNeuralNetwork', 'MultiOmicsNeuralNetwork', @@ -143,6 +149,12 @@ process { } withName: 'RANDOMIZATION_TEST' { + publishDir = [ + path: { "${params.outdir}/${params.run_id}/${test_mode}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + ext.use_gpu = { [ 'SimpleNeuralNetwork', 'MultiOmicsNeuralNetwork', @@ -154,6 +166,12 @@ process { } withName: 'ROBUSTNESS_TEST' { + publishDir = [ + path: { "${params.outdir}/${params.run_id}/${test_mode}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + ext.use_gpu = { [ 'SimpleNeuralNetwork', 'MultiOmicsNeuralNetwork', @@ -171,4 +189,37 @@ process { saveAs: { filename -> null } ] } + + withName: 'CONSOLIDATE_RESULTS' { + publishDir = [ + path: { "${params.outdir}/${params.run_id}/${test_mode}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: 'COLLECT_RESULTS' { + publishDir = [ + path: { "${params.outdir}/${params.run_id}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + + withName: 'POSTPROCESS_CURVECURATOR_DATA' { + publishDir = [ + path: { "${params.path_data}/${dataset_name}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: 'VISUALIZE_RESULTS' { + publishDir = [ + path: { "${params.outdir}/${params.run_id}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } diff --git a/modules/local/collect_results/main.nf b/modules/local/collect_results/main.nf index d0ef6e7..59011e6 100644 --- a/modules/local/collect_results/main.nf +++ b/modules/local/collect_results/main.nf @@ -1,6 +1,5 @@ process COLLECT_RESULTS { label 'process_medium' - publishDir "${params.outdir}/${params.run_id}", mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } input: path(outfiles) diff --git a/modules/local/consolidate_results/main.nf b/modules/local/consolidate_results/main.nf index acbcf26..88b9058 100644 --- a/modules/local/consolidate_results/main.nf +++ b/modules/local/consolidate_results/main.nf @@ -1,7 +1,6 @@ process CONSOLIDATE_RESULTS { tag "$model_name" label 'process_single' - publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } input: tuple val(test_mode), val(model_name) diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf index 0ad97d5..c20a96d 100644 --- a/modules/local/postprocess_curvecurator_output/main.nf +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -1,6 +1,5 @@ process POSTPROCESS_CURVECURATOR_DATA { label 'process_single' - publishDir "${params.path_data}/${dataset_name}", mode: 'copy' input: val dataset_name diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index a130b69..7c8c283 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -2,7 +2,6 @@ process PREDICT_FULL { tag { "${test_mode}_${model_name}_${split_id}_gpu:${task.ext.use_gpu}" } label 'process_high' label 'process_gpu' - publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } input: tuple path(cross_study_datasets), val(model_name), val(test_mode), val(split_id), path(split_dataset), path(hpam_combi), path(path_data) diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index 60e5e66..d018a1b 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -2,7 +2,6 @@ process RANDOMIZATION_TEST { tag { "${test_mode}_${model_name}_${randomization_type}_gpu:${task.ext.use_gpu}" } label 'process_high' label 'process_gpu' - publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } input: tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), path(randomization_views), path(path_data) diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index d9e4244..4ff1e48 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -2,7 +2,6 @@ process ROBUSTNESS_TEST { tag { "${model_name}_${robustness_iteration}_gpu:${task.ext.use_gpu}" } label 'process_high' label 'process_gpu' - publishDir "${params.outdir}/${params.run_id}/${test_mode}", mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } input: tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), val(robustness_iteration), path(path_data) diff --git a/modules/local/visualize_results/main.nf b/modules/local/visualize_results/main.nf index bd3c497..c57b0ba 100644 --- a/modules/local/visualize_results/main.nf +++ b/modules/local/visualize_results/main.nf @@ -1,6 +1,5 @@ process VISUALIZE_RESULTS { label 'process_medium' - publishDir "${params.outdir}/${params.run_id}", mode: 'copy', saveAs: { filename -> filename.equals('versions.yml') ? null : filename } input: tuple path(eval_results), path(eval_results_per_drug), path(eval_results_per_cl), path(true_vs_predicted) From b0ca81900baa78d4dac06973feafd5f6cf1dd5ba Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 6 Jun 2025 10:49:55 +0200 Subject: [PATCH 238/257] updated CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc3efe5..2363dac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 best practices. - Simplified visualization: multiple short processes were creating overhang -> more efficient in one process. - Fixed errors that arose from the latest drevalpy version. +- Added authors and licenses to the python scripts. +- Moved all publishDir directives to modules.config. ## v1.0.0 - [date] From a4f648607397a4402648d2821c9364bc72e11971 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 6 Jun 2025 11:49:00 +0200 Subject: [PATCH 239/257] new day, new try! --- modules/local/predict_full/main.nf | 2 -- tests/.nftignore | 4 ++++ tests/default.nf.test.snap | 19 ++++--------------- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 7e03d48..a130b69 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -15,8 +15,6 @@ process PREDICT_FULL { path('**best_hpams*.json'), emit: ch_hpams path("versions.yml"), emit: versions - path("versions.yml"), emit: versions - script: """ train_and_predict_final.py \\ diff --git a/tests/.nftignore b/tests/.nftignore index 7ca65a7..65aa545 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -2,6 +2,10 @@ pipeline_info/*.{html,json,txt,yml} test_run/evaluation*.{csv} test_run/true_vs_pred.csv +test_run/LCO/NaiveDrugMeanPredictor/predictions/predictions_split*.csv +test_run/LCO/NaiveMeanEffectsPredictor/predictions/predictions_split*.csv +test_run/LCO/NaiveDrugMeanPredictor/cross_study/cross_study_TOYv2_split*.csv +test_run/LCO/NaiveMeanEffectsPredictor/cross_study/cross_study_TOYv2_split*.csv test_run/report/comp_scatter/*.html test_run/report/heatmaps/*.html test_run/report/html_tables/*.html diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index ed5668c..8d2cf99 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -4,6 +4,7 @@ 33, [ "pipeline_info", + "pipeline_info/nf_core_drugresponseeval_software_versions.yml", "test_run", "test_run/LCO", "test_run/LCO/NaiveDrugMeanPredictor", @@ -26,7 +27,6 @@ "test_run/LCO/NaiveMeanEffectsPredictor/predictions", "test_run/LCO/NaiveMeanEffectsPredictor/predictions/predictions_split_0.csv", "test_run/LCO/NaiveMeanEffectsPredictor/predictions/predictions_split_1.csv", - "test_run/LCO/versions.yml", "test_run/evaluation_results.csv", "test_run/evaluation_results_per_cl.csv", "test_run/report", @@ -47,35 +47,24 @@ "test_run/report/violin_plots", "test_run/report/violin_plots/violin_algorithms_LCO.html", "test_run/report/violin_plots/violin_algorithms_LCO_normalized.html", - "test_run/true_vs_pred.csv", - "test_run/versions.yml" + "test_run/true_vs_pred.csv" ], [ "best_hpams_split_0.json:md5,99914b932bd37a50b983c5e7c90ae93b", "best_hpams_split_1.json:md5,99914b932bd37a50b983c5e7c90ae93b", - "cross_study_TOYv2_split_0.csv:md5,2f31b65bf35155ca049110a4b3cc27d3", - "cross_study_TOYv2_split_1.csv:md5,522cac473bd5ec36d5db8836a64d829d", - "predictions_split_0.csv:md5,2148107a0528307653d48abb57f48e81", - "predictions_split_1.csv:md5,4ab1dc7d877b4aae6762999db765fddc", "best_hpams_split_0.json:md5,99914b932bd37a50b983c5e7c90ae93b", "best_hpams_split_1.json:md5,99914b932bd37a50b983c5e7c90ae93b", - "cross_study_TOYv2_split_0.csv:md5,1b3bba06f808494d5e4166ebe9df677f", - "cross_study_TOYv2_split_1.csv:md5,53505da374bce4c8337d7c9173da0e40", - "predictions_split_0.csv:md5,e7f7afe25ebf76fb92bad4e35746e1c6", - "predictions_split_1.csv:md5,1a238ae5a938aa6b9de8bbcd2db80f8e", - "versions.yml:md5,e91a3c34602f6bea4a47be42b2d65e99", "LCO.html:md5,39657391f49643c51c6423805458ab76", "LCO.png:md5,e8bd8858f8149d610c63e8f3cc36577e", "favicon.png:md5,8da229af56874ca6750c5402f0b76e2a", "index.html:md5,b0bd552d41394f52069aa4bbd1bc9af1", - "nf-core-drugresponseeval_logo_light.png:md5,4f55fb24b445a68f35c12a84e83f99c7", - "versions.yml:md5,9f48bfeabf0f3399fa1b84e03f9ec95e" + "nf-core-drugresponseeval_logo_light.png:md5,4f55fb24b445a68f35c12a84e83f99c7" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-06-05T15:15:25.723189" + "timestamp": "2025-06-06T11:47:16.432359" } } \ No newline at end of file From cf8bd693d9dac4e4ae83b7bf6326130e5e15a173 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 6 Jun 2025 12:11:46 +0200 Subject: [PATCH 240/257] I have this file now, just without mqc --- tests/default.nf.test | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/default.nf.test b/tests/default.nf.test index 023ff03..d90e530 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -23,8 +23,7 @@ nextflow_pipeline { // Number of successful tasks workflow.trace.succeeded().size(), // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions - // Custom comment: I don't use multi-qc - //removeNextflowVersion("$outputDir/pipeline_info/nf_core_drugresponseeval_software_mqc_versions.yml"), + removeNextflowVersion("$outputDir/pipeline_info/nf_core_drugresponseeval_software_versions.yml"), // All stable path name, with a relative path stable_name, // All files with stable contents From 3379a56324485295dd1c6880ce9db3f6415c2f1c Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 6 Jun 2025 12:35:29 +0200 Subject: [PATCH 241/257] snap outdated - should work now? :)))) --- tests/default.nf.test.snap | 111 ++++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 8d2cf99..cf22f28 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -2,6 +2,115 @@ "-profile test": { "content": [ 33, + { + "COLLECT_RESULTS": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "pandas": "2.2.3" + }, + "CONSOLIDATE_RESULTS": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "pandas": "2.2.3" + }, + "CV_SPLIT": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "sklearn": "1.6.1", + "numpy": "1.26.4" + }, + "EVALUATE_FINAL": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "pandas": "2.2.3", + "sklearn": "1.6.1", + "numpy": "1.26.4", + "scipy": "1.15.3" + }, + "EVALUATE_FIND_MAX": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "pandas": "2.2.3", + "sklearn": "1.6.1", + "numpy": "1.26.4", + "scipy": "1.15.3", + "yaml": "6.0.2" + }, + "HPAM_SPLIT": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "yaml": "6.0.2" + }, + "LOAD_CS_RESPONSE": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "pandas": "2.2.3" + }, + "LOAD_RESPONSE": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "pandas": "2.2.3" + }, + "MAKE_BASELINES": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "sklearn": "1.6.1", + "numpy": "1.26.4", + "pandas": "2.2.3", + "pytorch_lightning": "2.5.1.post0", + "torch": "2.7.0+cpu", + "platform": "1.0.8" + }, + "MAKE_MODELS": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "sklearn": "1.6.1", + "numpy": "1.26.4", + "pandas": "2.2.3", + "pytorch_lightning": "2.5.1.post0", + "torch": "2.7.0+cpu", + "platform": "1.0.8" + }, + "PREDICT_FULL": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "sklearn": "1.6.1", + "numpy": "1.26.4", + "pandas": "2.2.3", + "pytorch_lightning": "2.5.1.post0", + "torch": "2.7.0+cpu", + "platform": "1.0.8" + }, + "TRAIN_AND_PREDICT_CV": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "sklearn": "1.6.1", + "numpy": "1.26.4", + "pandas": "2.2.3", + "pytorch_lightning": "2.5.1.post0", + "torch": "2.7.0+cpu", + "platform": "1.0.8" + }, + "UNZIP_CS_RESPONSE": { + "unzip": 6.0 + }, + "UNZIP_RESPONSE": { + "unzip": 6.0 + }, + "VISUALIZE_RESULTS": { + "python": "3.11.4", + "drevalpy": "1.3.1", + "pandas": "2.2.3", + "matplotlib": "3.10.3", + "plotly": "6.0.1", + "scikit_posthocs": "0.11.4", + "scipy": "1.15.3", + "sklearn": "1.6.1" + }, + "Workflow": { + "nf-core/drugresponseeval": "v1.1.0" + } + }, [ "pipeline_info", "pipeline_info/nf_core_drugresponseeval_software_versions.yml", @@ -65,6 +174,6 @@ "nf-test": "0.9.2", "nextflow": "24.10.4" }, - "timestamp": "2025-06-06T11:47:16.432359" + "timestamp": "2025-06-06T12:30:34.441859" } } \ No newline at end of file From b76aab6edb96446fb73b7fe5252d366bac0dc62d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20H=C3=B6rtenhuber?= Date: Mon, 9 Jun 2025 10:46:08 +0200 Subject: [PATCH 242/257] template bug fix --- .github/workflows/nf-test.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index f03aea0..325bc15 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -99,8 +99,6 @@ jobs: - name: Run nf-test uses: ./.github/actions/nf-test env: - NFT_DIFF: ${{ env.NFT_DIFF }} - NFT_DIFF_ARGS: ${{ env.NFT_DIFF_ARGS }} NFT_WORKDIR: ${{ env.NFT_WORKDIR }} with: profile: ${{ matrix.profile }} From 18180ce3a836dda257a655c7a48b84ae869477ad Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 11 Jun 2025 09:41:11 +0200 Subject: [PATCH 243/257] trying the hacky solution --- nextflow.config | 4 ++-- tests/default.nf.test.snap | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/nextflow.config b/nextflow.config index fe74dd7..c5f63a4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -6,7 +6,7 @@ ---------------------------------------------------------------------------------------- */ -process.container = 'ghcr.io/daisybio/drevalpy:latest' +process.container = 'ghcr.io/daisybio/drevalpy:v1.3.1' process.conda = 'env.yml' // Global default params, used in configs @@ -182,7 +182,7 @@ includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !pa // Load nf-core/drugresponseeval custom profiles from different institutions. -// includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/drugresponseeval.config" : "/dev/null" +includeConfig params.custom_config_base && (!System.getenv('NXF_OFFLINE') || !params.custom_config_base.startsWith('http')) ? "${params.custom_config_base}/pipeline/drugresponseeval.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 diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index cf22f28..75844ae 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -58,7 +58,7 @@ "numpy": "1.26.4", "pandas": "2.2.3", "pytorch_lightning": "2.5.1.post0", - "torch": "2.7.0+cpu", + "torch": "2.7.0+cu126", "platform": "1.0.8" }, "MAKE_MODELS": { @@ -68,7 +68,7 @@ "numpy": "1.26.4", "pandas": "2.2.3", "pytorch_lightning": "2.5.1.post0", - "torch": "2.7.0+cpu", + "torch": "2.7.0+cu126", "platform": "1.0.8" }, "PREDICT_FULL": { @@ -78,7 +78,7 @@ "numpy": "1.26.4", "pandas": "2.2.3", "pytorch_lightning": "2.5.1.post0", - "torch": "2.7.0+cpu", + "torch": "2.7.0+cu126", "platform": "1.0.8" }, "TRAIN_AND_PREDICT_CV": { @@ -88,7 +88,7 @@ "numpy": "1.26.4", "pandas": "2.2.3", "pytorch_lightning": "2.5.1.post0", - "torch": "2.7.0+cpu", + "torch": "2.7.0+cu126", "platform": "1.0.8" }, "UNZIP_CS_RESPONSE": { From 13e8b5a91a75daa05be2f78356acc5b2b6750a83 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 17 Jun 2025 09:36:53 +0200 Subject: [PATCH 244/257] updated the drevalpy version, bumped docker to python 3.13, added unzip to the docker --- CHANGELOG.md | 3 +- env.yml | 4 +- modules/local/unzip/main.nf | 3 - nextflow.config | 2 +- tests/default.nf.test.snap | 118 ++++++++++++++++++------------------ 5 files changed, 64 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2363dac..6ca291b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added support for AWS: changed the structure of load response and parameter check to conform more to Nextflow best practices. -- Simplified visualization: multiple short processes were creating overhang -> more efficient in one process. +- Simplified visualization: multiple short processes were creating overhang → more efficient in one process. - Fixed errors that arose from the latest drevalpy version. - Added authors and licenses to the python scripts. - Moved all publishDir directives to modules.config. +- Fixed drevalpy versions in conda and docker to 1.3.3. ## v1.0.0 - [date] diff --git a/env.yml b/env.yml index 53347cd..ee4d55e 100644 --- a/env.yml +++ b/env.yml @@ -2,7 +2,7 @@ name: nf-core-drugresponseeval channels: - conda-forge dependencies: - - python=3.12 + - python=3.13 - pip - pip: - - drevalpy==1.3.1 + - drevalpy==1.3.3 diff --git a/modules/local/unzip/main.nf b/modules/local/unzip/main.nf index ad89b98..b203479 100644 --- a/modules/local/unzip/main.nf +++ b/modules/local/unzip/main.nf @@ -3,9 +3,6 @@ process UNZIP { label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'oras://community.wave.seqera.io/library/unzip:6.0--2d90c8369f967b58' : - 'community.wave.seqera.io/library/unzip:6.0--0e729f0c20458893' }" input: tuple val(dataset_name), path(file) diff --git a/nextflow.config b/nextflow.config index c5f63a4..9152c4c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -6,7 +6,7 @@ ---------------------------------------------------------------------------------------- */ -process.container = 'ghcr.io/daisybio/drevalpy:v1.3.1' +process.container = 'ghcr.io/daisybio/drevalpy:v1.3.3' process.conda = 'env.yml' // Global default params, used in configs diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 75844ae..59ca415 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -4,91 +4,91 @@ 33, { "COLLECT_RESULTS": { - "python": "3.11.4", - "drevalpy": "1.3.1", - "pandas": "2.2.3" + "python": "3.13.5", + "drevalpy": "1.3.3", + "pandas": "2.3.0" }, "CONSOLIDATE_RESULTS": { - "python": "3.11.4", - "drevalpy": "1.3.1", - "pandas": "2.2.3" + "python": "3.13.5", + "drevalpy": "1.3.3", + "pandas": "2.3.0" }, "CV_SPLIT": { - "python": "3.11.4", - "drevalpy": "1.3.1", - "sklearn": "1.6.1", - "numpy": "1.26.4" + "python": "3.13.5", + "drevalpy": "1.3.3", + "sklearn": "1.7.0", + "numpy": "2.3.0" }, "EVALUATE_FINAL": { - "python": "3.11.4", - "drevalpy": "1.3.1", - "pandas": "2.2.3", - "sklearn": "1.6.1", - "numpy": "1.26.4", + "python": "3.13.5", + "drevalpy": "1.3.3", + "pandas": "2.3.0", + "sklearn": "1.7.0", + "numpy": "2.3.0", "scipy": "1.15.3" }, "EVALUATE_FIND_MAX": { - "python": "3.11.4", - "drevalpy": "1.3.1", - "pandas": "2.2.3", - "sklearn": "1.6.1", - "numpy": "1.26.4", + "python": "3.13.5", + "drevalpy": "1.3.3", + "pandas": "2.3.0", + "sklearn": "1.7.0", + "numpy": "2.3.0", "scipy": "1.15.3", "yaml": "6.0.2" }, "HPAM_SPLIT": { - "python": "3.11.4", - "drevalpy": "1.3.1", + "python": "3.13.5", + "drevalpy": "1.3.3", "yaml": "6.0.2" }, "LOAD_CS_RESPONSE": { - "python": "3.11.4", - "drevalpy": "1.3.1", - "pandas": "2.2.3" + "python": "3.13.5", + "drevalpy": "1.3.3", + "pandas": "2.3.0" }, "LOAD_RESPONSE": { - "python": "3.11.4", - "drevalpy": "1.3.1", - "pandas": "2.2.3" + "python": "3.13.5", + "drevalpy": "1.3.3", + "pandas": "2.3.0" }, "MAKE_BASELINES": { - "python": "3.11.4", - "drevalpy": "1.3.1", - "sklearn": "1.6.1", - "numpy": "1.26.4", - "pandas": "2.2.3", + "python": "3.13.5", + "drevalpy": "1.3.3", + "sklearn": "1.7.0", + "numpy": "2.3.0", + "pandas": "2.3.0", "pytorch_lightning": "2.5.1.post0", - "torch": "2.7.0+cu126", + "torch": "2.7.1+cu126", "platform": "1.0.8" }, "MAKE_MODELS": { - "python": "3.11.4", - "drevalpy": "1.3.1", - "sklearn": "1.6.1", - "numpy": "1.26.4", - "pandas": "2.2.3", + "python": "3.13.5", + "drevalpy": "1.3.3", + "sklearn": "1.7.0", + "numpy": "2.3.0", + "pandas": "2.3.0", "pytorch_lightning": "2.5.1.post0", - "torch": "2.7.0+cu126", + "torch": "2.7.1+cu126", "platform": "1.0.8" }, "PREDICT_FULL": { - "python": "3.11.4", - "drevalpy": "1.3.1", - "sklearn": "1.6.1", - "numpy": "1.26.4", - "pandas": "2.2.3", + "python": "3.13.5", + "drevalpy": "1.3.3", + "sklearn": "1.7.0", + "numpy": "2.3.0", + "pandas": "2.3.0", "pytorch_lightning": "2.5.1.post0", - "torch": "2.7.0+cu126", + "torch": "2.7.1+cu126", "platform": "1.0.8" }, "TRAIN_AND_PREDICT_CV": { - "python": "3.11.4", - "drevalpy": "1.3.1", - "sklearn": "1.6.1", - "numpy": "1.26.4", - "pandas": "2.2.3", + "python": "3.13.5", + "drevalpy": "1.3.3", + "sklearn": "1.7.0", + "numpy": "2.3.0", + "pandas": "2.3.0", "pytorch_lightning": "2.5.1.post0", - "torch": "2.7.0+cu126", + "torch": "2.7.1+cu126", "platform": "1.0.8" }, "UNZIP_CS_RESPONSE": { @@ -98,14 +98,14 @@ "unzip": 6.0 }, "VISUALIZE_RESULTS": { - "python": "3.11.4", - "drevalpy": "1.3.1", - "pandas": "2.2.3", + "python": "3.13.5", + "drevalpy": "1.3.3", + "pandas": "2.3.0", "matplotlib": "3.10.3", - "plotly": "6.0.1", + "plotly": "6.1.2", "scikit_posthocs": "0.11.4", "scipy": "1.15.3", - "sklearn": "1.6.1" + "sklearn": "1.7.0" }, "Workflow": { "nf-core/drugresponseeval": "v1.1.0" @@ -172,8 +172,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nextflow": "25.04.3" }, - "timestamp": "2025-06-06T12:30:34.441859" + "timestamp": "2025-06-17T09:34:20.783551" } } \ No newline at end of file From f0f6954d3a37c8a25ac016a7a8a3248c3c8fcfbf Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 17 Jun 2025 11:30:07 +0200 Subject: [PATCH 245/257] local env files because nf-test doesn't like it --- modules/local/collect_results/env.yml | 8 ++++++++ modules/local/collect_results/main.nf | 2 ++ modules/local/consolidate_results/env.yml | 8 ++++++++ modules/local/consolidate_results/main.nf | 2 ++ modules/local/cv_split/env.yml | 8 ++++++++ modules/local/cv_split/main.nf | 2 ++ modules/local/evaluate_final/env.yml | 8 ++++++++ modules/local/evaluate_final/main.nf | 2 ++ modules/local/evaluate_find_max/env.yml | 8 ++++++++ modules/local/evaluate_find_max/main.nf | 2 ++ modules/local/fit_curves/env.yml | 8 ++++++++ modules/local/fit_curves/main.nf | 2 ++ modules/local/hpam_split/env.yml | 8 ++++++++ modules/local/hpam_split/main.nf | 2 ++ modules/local/load_response/env.yml | 8 ++++++++ modules/local/load_response/main.nf | 2 ++ modules/local/make_model_channel/env.yml | 8 ++++++++ modules/local/make_model_channel/main.nf | 2 ++ modules/local/postprocess_curvecurator_output/env.yml | 8 ++++++++ modules/local/postprocess_curvecurator_output/main.nf | 2 ++ modules/local/predict_full/env.yml | 8 ++++++++ modules/local/predict_full/main.nf | 2 ++ modules/local/preprocess_raw_viability/env.yml | 8 ++++++++ modules/local/preprocess_raw_viability/main.nf | 2 ++ modules/local/randomization_split/env.yml | 8 ++++++++ modules/local/randomization_split/main.nf | 2 ++ modules/local/randomization_test/env.yml | 8 ++++++++ modules/local/randomization_test/main.nf | 2 ++ modules/local/robustness_test/env.yml | 8 ++++++++ modules/local/robustness_test/main.nf | 2 ++ modules/local/train_and_predict_cv/env.yml | 8 ++++++++ modules/local/train_and_predict_cv/main.nf | 2 ++ modules/local/unzip/{environment.yml => env.yml} | 0 modules/local/unzip/main.nf | 2 +- modules/local/visualize_results/env.yml | 8 ++++++++ modules/local/visualize_results/main.nf | 2 ++ nextflow.config | 2 +- 37 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 modules/local/collect_results/env.yml create mode 100644 modules/local/consolidate_results/env.yml create mode 100644 modules/local/cv_split/env.yml create mode 100644 modules/local/evaluate_final/env.yml create mode 100644 modules/local/evaluate_find_max/env.yml create mode 100644 modules/local/fit_curves/env.yml create mode 100644 modules/local/hpam_split/env.yml create mode 100644 modules/local/load_response/env.yml create mode 100644 modules/local/make_model_channel/env.yml create mode 100644 modules/local/postprocess_curvecurator_output/env.yml create mode 100644 modules/local/predict_full/env.yml create mode 100644 modules/local/preprocess_raw_viability/env.yml create mode 100644 modules/local/randomization_split/env.yml create mode 100644 modules/local/randomization_test/env.yml create mode 100644 modules/local/robustness_test/env.yml create mode 100644 modules/local/train_and_predict_cv/env.yml rename modules/local/unzip/{environment.yml => env.yml} (100%) create mode 100644 modules/local/visualize_results/env.yml diff --git a/modules/local/collect_results/env.yml b/modules/local/collect_results/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/collect_results/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/collect_results/main.nf b/modules/local/collect_results/main.nf index 59011e6..58b0dcf 100644 --- a/modules/local/collect_results/main.nf +++ b/modules/local/collect_results/main.nf @@ -1,6 +1,8 @@ process COLLECT_RESULTS { label 'process_medium' + conda "${moduleDir}/env.yml" + input: path(outfiles) path(path_data) diff --git a/modules/local/consolidate_results/env.yml b/modules/local/consolidate_results/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/consolidate_results/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/consolidate_results/main.nf b/modules/local/consolidate_results/main.nf index 88b9058..8f14aa9 100644 --- a/modules/local/consolidate_results/main.nf +++ b/modules/local/consolidate_results/main.nf @@ -2,6 +2,8 @@ process CONSOLIDATE_RESULTS { tag "$model_name" label 'process_single' + conda "${moduleDir}/env.yml" + input: tuple val(test_mode), val(model_name) val(rand_modes) diff --git a/modules/local/cv_split/env.yml b/modules/local/cv_split/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/cv_split/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/cv_split/main.nf b/modules/local/cv_split/main.nf index 6ba6bbe..5c269f7 100644 --- a/modules/local/cv_split/main.nf +++ b/modules/local/cv_split/main.nf @@ -2,6 +2,8 @@ process CV_SPLIT { tag "$test_mode" label 'process_single' + conda "${moduleDir}/env.yml" + input: tuple val(test_mode), path(response) val n_cv_splits diff --git a/modules/local/evaluate_final/env.yml b/modules/local/evaluate_final/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/evaluate_final/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/evaluate_final/main.nf b/modules/local/evaluate_final/main.nf index 2ffda7e..408b527 100644 --- a/modules/local/evaluate_final/main.nf +++ b/modules/local/evaluate_final/main.nf @@ -2,6 +2,8 @@ process EVALUATE_FINAL { tag "${test_mode}_${model_name}_${pred_file}" label 'process_single' + conda "${moduleDir}/env.yml" + input: tuple val(test_mode), val(model_name), path(pred_file) diff --git a/modules/local/evaluate_find_max/env.yml b/modules/local/evaluate_find_max/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/evaluate_find_max/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/evaluate_find_max/main.nf b/modules/local/evaluate_find_max/main.nf index 34caa1b..f641fe4 100644 --- a/modules/local/evaluate_find_max/main.nf +++ b/modules/local/evaluate_find_max/main.nf @@ -2,6 +2,8 @@ process EVALUATE_FIND_MAX { tag "${test_mode}_${model_name}_${split_id}" label 'process_single' + conda "${moduleDir}/env.yml" + input: tuple val(model_name), val(test_mode), val(split_id), path(hpam_yamls), path(pred_datas) val metric diff --git a/modules/local/fit_curves/env.yml b/modules/local/fit_curves/env.yml new file mode 100644 index 0000000..e777796 --- /dev/null +++ b/modules/local/fit_curves/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - curve_curator==0.6.0 diff --git a/modules/local/fit_curves/main.nf b/modules/local/fit_curves/main.nf index 7f683ff..15e40a7 100644 --- a/modules/local/fit_curves/main.nf +++ b/modules/local/fit_curves/main.nf @@ -2,6 +2,8 @@ process FIT_CURVES { tag "$dir_name" label 'high_cpu_low_mem' + conda "${moduleDir}/env.yml" + input: val dataset_name tuple val(dir_name), path(toml), path(curvecurator_input) diff --git a/modules/local/hpam_split/env.yml b/modules/local/hpam_split/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/hpam_split/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/hpam_split/main.nf b/modules/local/hpam_split/main.nf index 1d5fa7a..2a67ab5 100644 --- a/modules/local/hpam_split/main.nf +++ b/modules/local/hpam_split/main.nf @@ -2,6 +2,8 @@ process HPAM_SPLIT { tag "$model_name" label 'process_single' + conda "${moduleDir}/env.yml" + input: val model_name diff --git a/modules/local/load_response/env.yml b/modules/local/load_response/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/load_response/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/load_response/main.nf b/modules/local/load_response/main.nf index 45927e1..6523a4f 100644 --- a/modules/local/load_response/main.nf +++ b/modules/local/load_response/main.nf @@ -2,6 +2,8 @@ process LOAD_RESPONSE { tag "${response.baseName}" label 'process_single' + conda "${moduleDir}/env.yml" + input: tuple val(measure), path(response) val no_refitting diff --git a/modules/local/make_model_channel/env.yml b/modules/local/make_model_channel/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/make_model_channel/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/make_model_channel/main.nf b/modules/local/make_model_channel/main.nf index be709eb..c30bd66 100644 --- a/modules/local/make_model_channel/main.nf +++ b/modules/local/make_model_channel/main.nf @@ -2,6 +2,8 @@ process MAKE_MODEL_CHANNEL { tag "Make model channel" label 'process_single' + conda "${moduleDir}/env.yml" + input: tuple val(models), path(response_data) val(name) diff --git a/modules/local/postprocess_curvecurator_output/env.yml b/modules/local/postprocess_curvecurator_output/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/postprocess_curvecurator_output/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/postprocess_curvecurator_output/main.nf b/modules/local/postprocess_curvecurator_output/main.nf index c20a96d..dc5e77f 100644 --- a/modules/local/postprocess_curvecurator_output/main.nf +++ b/modules/local/postprocess_curvecurator_output/main.nf @@ -1,6 +1,8 @@ process POSTPROCESS_CURVECURATOR_DATA { label 'process_single' + conda "${moduleDir}/env.yml" + input: val dataset_name path(curve_data, stageAs: "?/*") diff --git a/modules/local/predict_full/env.yml b/modules/local/predict_full/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/predict_full/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 7c8c283..9ad3d72 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -3,6 +3,8 @@ process PREDICT_FULL { label 'process_high' label 'process_gpu' + conda "${moduleDir}/env.yml" + input: tuple path(cross_study_datasets), val(model_name), val(test_mode), val(split_id), path(split_dataset), path(hpam_combi), path(path_data) val(response_transformation) diff --git a/modules/local/preprocess_raw_viability/env.yml b/modules/local/preprocess_raw_viability/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/preprocess_raw_viability/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/preprocess_raw_viability/main.nf b/modules/local/preprocess_raw_viability/main.nf index 55b869f..51b6c43 100644 --- a/modules/local/preprocess_raw_viability/main.nf +++ b/modules/local/preprocess_raw_viability/main.nf @@ -1,6 +1,8 @@ process PREPROCESS_RAW_VIABILITY { label 'process_low' + conda "${moduleDir}/env.yml" + input: val(dataset_name) path(work_path) diff --git a/modules/local/randomization_split/env.yml b/modules/local/randomization_split/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/randomization_split/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/randomization_split/main.nf b/modules/local/randomization_split/main.nf index 6598c3e..b671175 100644 --- a/modules/local/randomization_split/main.nf +++ b/modules/local/randomization_split/main.nf @@ -2,6 +2,8 @@ process RANDOMIZATION_SPLIT { tag "${model_name}_${randomization_mode}" label 'process_single' + conda "${moduleDir}/env.yml" + input: tuple val(model_name), val(randomization_mode) diff --git a/modules/local/randomization_test/env.yml b/modules/local/randomization_test/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/randomization_test/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/randomization_test/main.nf b/modules/local/randomization_test/main.nf index d018a1b..35d7ed8 100644 --- a/modules/local/randomization_test/main.nf +++ b/modules/local/randomization_test/main.nf @@ -3,6 +3,8 @@ process RANDOMIZATION_TEST { label 'process_high' label 'process_gpu' + conda "${moduleDir}/env.yml" + input: tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), path(randomization_views), path(path_data) val(randomization_type) diff --git a/modules/local/robustness_test/env.yml b/modules/local/robustness_test/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/robustness_test/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/robustness_test/main.nf b/modules/local/robustness_test/main.nf index 4ff1e48..7b2b7a3 100644 --- a/modules/local/robustness_test/main.nf +++ b/modules/local/robustness_test/main.nf @@ -3,6 +3,8 @@ process ROBUSTNESS_TEST { label 'process_high' label 'process_gpu' + conda "${moduleDir}/env.yml" + input: tuple val(model_name), val(test_mode), val(split_id), path(split_dataset), path(best_hpams), val(robustness_iteration), path(path_data) val(randomization_type) diff --git a/modules/local/train_and_predict_cv/env.yml b/modules/local/train_and_predict_cv/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/train_and_predict_cv/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index 5bb144a..f5fcaf4 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -3,6 +3,8 @@ process TRAIN_AND_PREDICT_CV { label 'process_high' label 'process_gpu' + conda "${moduleDir}/env.yml" + input: tuple val(model_name), val(test_mode), path(cv_data), path(hyperparameters), path(path_data) val response_transformation diff --git a/modules/local/unzip/environment.yml b/modules/local/unzip/env.yml similarity index 100% rename from modules/local/unzip/environment.yml rename to modules/local/unzip/env.yml diff --git a/modules/local/unzip/main.nf b/modules/local/unzip/main.nf index b203479..e7bfb3e 100644 --- a/modules/local/unzip/main.nf +++ b/modules/local/unzip/main.nf @@ -2,7 +2,7 @@ process UNZIP { tag "${dataset_name}" label 'process_single' - conda "${moduleDir}/environment.yml" + conda "${moduleDir}/env.yml" input: tuple val(dataset_name), path(file) diff --git a/modules/local/visualize_results/env.yml b/modules/local/visualize_results/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/visualize_results/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/visualize_results/main.nf b/modules/local/visualize_results/main.nf index c57b0ba..d7cf7df 100644 --- a/modules/local/visualize_results/main.nf +++ b/modules/local/visualize_results/main.nf @@ -1,6 +1,8 @@ process VISUALIZE_RESULTS { label 'process_medium' + conda "${moduleDir}/env.yml" + input: tuple path(eval_results), path(eval_results_per_drug), path(eval_results_per_cl), path(true_vs_predicted) val(path_data) diff --git a/nextflow.config b/nextflow.config index 9152c4c..faccea9 100644 --- a/nextflow.config +++ b/nextflow.config @@ -7,7 +7,7 @@ */ process.container = 'ghcr.io/daisybio/drevalpy:v1.3.3' -process.conda = 'env.yml' +//process.conda = 'env.yml' // Global default params, used in configs params { From d8b8dfcfc1a348ae4f9e97e33eeb3a52777cfd49 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 17 Jun 2025 12:13:20 +0200 Subject: [PATCH 246/257] removed hacky torch solution, replaced it with nice solution --- modules/local/make_model_channel/main.nf | 2 +- modules/local/predict_full/main.nf | 2 +- modules/local/train_and_predict_cv/main.nf | 2 +- tests/default.nf.test.snap | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/local/make_model_channel/main.nf b/modules/local/make_model_channel/main.nf index c30bd66..d8a6fc1 100644 --- a/modules/local/make_model_channel/main.nf +++ b/modules/local/make_model_channel/main.nf @@ -27,7 +27,7 @@ process MAKE_MODEL_CHANNEL { numpy: \$(python -c "import numpy; print(numpy.__version__)") pandas: \$(python -c "import pandas; print(pandas.__version__)") pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") - torch: \$(python -c "import torch; print(torch.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)" | sed 's/+.*//') platform: \$(python -c "import platform; print(platform.__version__)") END_VERSIONS """ diff --git a/modules/local/predict_full/main.nf b/modules/local/predict_full/main.nf index 9ad3d72..2748ce0 100644 --- a/modules/local/predict_full/main.nf +++ b/modules/local/predict_full/main.nf @@ -38,7 +38,7 @@ process PREDICT_FULL { numpy: \$(python -c "import numpy; print(numpy.__version__)") pandas: \$(python -c "import pandas; print(pandas.__version__)") pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") - torch: \$(python -c "import torch; print(torch.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)" | sed 's/+.*//') platform: \$(python -c "import platform; print(platform.__version__)") END_VERSIONS """ diff --git a/modules/local/train_and_predict_cv/main.nf b/modules/local/train_and_predict_cv/main.nf index f5fcaf4..bc711ec 100644 --- a/modules/local/train_and_predict_cv/main.nf +++ b/modules/local/train_and_predict_cv/main.nf @@ -34,7 +34,7 @@ process TRAIN_AND_PREDICT_CV { numpy: \$(python -c "import numpy; print(numpy.__version__)") pandas: \$(python -c "import pandas; print(pandas.__version__)") pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") - torch: \$(python -c "import torch; print(torch.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)" | sed 's/+.*//') platform: \$(python -c "import platform; print(platform.__version__)") END_VERSIONS """ diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 59ca415..dbea2f0 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -58,7 +58,7 @@ "numpy": "2.3.0", "pandas": "2.3.0", "pytorch_lightning": "2.5.1.post0", - "torch": "2.7.1+cu126", + "torch": "2.7.1", "platform": "1.0.8" }, "MAKE_MODELS": { @@ -68,7 +68,7 @@ "numpy": "2.3.0", "pandas": "2.3.0", "pytorch_lightning": "2.5.1.post0", - "torch": "2.7.1+cu126", + "torch": "2.7.1", "platform": "1.0.8" }, "PREDICT_FULL": { @@ -78,7 +78,7 @@ "numpy": "2.3.0", "pandas": "2.3.0", "pytorch_lightning": "2.5.1.post0", - "torch": "2.7.1+cu126", + "torch": "2.7.1", "platform": "1.0.8" }, "TRAIN_AND_PREDICT_CV": { @@ -88,7 +88,7 @@ "numpy": "2.3.0", "pandas": "2.3.0", "pytorch_lightning": "2.5.1.post0", - "torch": "2.7.1+cu126", + "torch": "2.7.1", "platform": "1.0.8" }, "UNZIP_CS_RESPONSE": { @@ -174,6 +174,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.3" }, - "timestamp": "2025-06-17T09:34:20.783551" + "timestamp": "2025-06-17T11:58:37.130763" } } \ No newline at end of file From a28625bd299a7486b51e0f13ccdb31a03920a20e Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 17 Jun 2025 16:58:49 +0200 Subject: [PATCH 247/257] added ProteomicsElasticNet, SingleDrugProteomicsRandomForest support --- CHANGELOG.md | 3 +- README.md | 4 +- docs/usage.md | 62 ++++++++++--------- .../main.nf | 5 +- 4 files changed, 41 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ca291b..16654aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,13 +5,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## v1.1.0 - [date] +- Preprint is out now! Linking it in the documentation. - Added support for AWS: changed the structure of load response and parameter check to conform more to Nextflow best practices. - Simplified visualization: multiple short processes were creating overhang → more efficient in one process. - Fixed errors that arose from the latest drevalpy version. - Added authors and licenses to the python scripts. - Moved all publishDir directives to modules.config. -- Fixed drevalpy versions in conda and docker to 1.3.3. +- Fixed drevalpy versions in conda and docker to 1.3.3: now supporting Python 3.13 ## v1.0.0 - [date] diff --git a/README.md b/README.md index b0c523a..6ad4b24 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ # ![drevalpy_summary](assets/dreval_summary.svg) -**DrEval** is a bioinformatics framework which includes a PyPI package (drevalpy) and a Nextflow +**DrEval** is a bioinformatics framework that includes a PyPI package (drevalpy) and a Nextflow pipeline (this repo). DrEval ensures that evaluations are statistically sound, biologically meaningful, and reproducible. DrEval simplifies the implementation of drug response prediction models, allowing researchers to focus on advancing their modeling innovations by automating @@ -102,7 +102,7 @@ If you use nf-core/drugresponseeval for your analysis, please cite it using the The underlying data is available at doi: [10.5281/zenodo.12633909](https://doi.org/10.5281/zenodo.12633909). -The underlying python package is drevalpy, availably on [PyPI](https://pypi.org/project/drevalpy/) as standalone. +The underlying python package is drevalpy, availably on [PyPI](https://pypi.org/project/drevalpy/) as standalone, for which we also have an extensive [ReadTheDocs Documentation](https://drevalpy.readthedocs.io/en/latest/). An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. diff --git a/docs/usage.md b/docs/usage.md index bdc0107..698c243 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -120,28 +120,30 @@ set. They can be used in all three settings. The following models are available: -| Model Name | Baseline / Published Model | Multi-Drug Model / Single-Drug Model | Description | -| ------------------------------ | -------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| NaivePredictor | Baseline Method | Multi-Drug Model | Most simple method. Predicts the mean response of all drugs in the training set. | -| NaiveCellLineMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a cell line in the training set. | -| NaiveDrugMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a drug in the training set. | -| NaiveTissueMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a tissue in the training set. | -| NaiveMeanEffectsPredictor | Baseline Method | Multi-Drug Model | Predicts the drug- and cell-line specific mean effects. | -| ElasticNet | Baseline Method | Multi-Drug Model | Fits an [Sklearn Elastic Net](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html), [Lasso](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html), or [Ridge](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html) model on gene expression data and drug fingerprints (concatenated input matrix). | -| SingleDrugElasticNet | Baseline Method | Single-Drug Model | Fits an ElasticNet model on gene expression data for each drug separately. | -| SingleDrugProteomicsElasticNet | Baseline Method | Single-Drug Model | Fits an ElasticNet model on proteomics data for each drug separately. | -| GradientBoosting | Baseline Method | Multi-Drug Model | Fits an [Sklearn Gradient Boosting Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html) gene expression data and drug fingerprints. | -| RandomForest | Baseline Method | Multi-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression data and drug fingerprints. | -| MultiOmicsRandomForest | Baseline Method | Multi-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression, methylation, mutation, copy number variation data, and drug fingerprints (concatenated matrix). The dimensionality of the methylation data is reduced with a PCA to the first 100 components before it is fed to the model. | -| ProteomicsRandomForest | Baseline Method | Multi-Drug Model | Fits Random Forest on proteomics data and drug fingerprints. | -| SingleDrugRandomForest | Baseline Method | Single-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression data for each drug separately. | -| SVR | Baseline Method | Multi-Drug Model | Fits an [Sklearn Support Vector Regressor](https://scikit-learn.org/1.5/modules/generated/sklearn.svm.SVR.html) gene expression data and drug fingerprints. | -| SimpleNeuralNetwork | Baseline Method | Multi-Drug Model | Fits a simple feedforward neural network (implemented with [Pytorch Lightning](https://lightning.ai/docs/pytorch/stable/)) on gene expression and drug fingerprints (concatenated input) with 3 layers of varying dimensions and Dropout layers. | -| MultiOmicsNeuralNetwork | Baseline Method | Multi-Drug Model | Fits a simple feedforward neural network (implemented with [Pytorch Lightning](https://lightning.ai/docs/pytorch/stable/)) on gene expression, methylation, mutation, copy number variation data, and drug fingerprints (concatenated input) with 3 layers of varying dimensions and Dropout layers. The dimensionality of the methylation data is reduced with a PCA to the first 100 components before it is fed to the model. | -| SRMF | Published Model | Multi-Drug Model | [Similarity Regularization Matrix Factorization](https://doi.org/10.1186/s12885-017-3500-5) model by Wang et al. on gene expression data and drug fingerprints. Re-implemented Matlab code into Python. The basic idea is represent each drug and each cell line by their respective similarities to all other drugs/cell lines. Those similarities are mapped into a shared latent low-dimensional space from which responses are predicted. | -| MOLIR | Published Model | Single-Drug Model | Regression extension of [MOLI: multi-omics late integration deep neural network.](https://doi.org/10.1093/bioinformatics/btz318) by Sharifi-Noghabi et al. Takes somatic mutation, copy number variation and gene expression data as input. MOLI reduces the dimensionality of each omics type with a hidden layer, concatenates them into one representation and optimizes this representation via a combined cost function consisting of a triplet loss and a binary cross-entropy loss. We implemented a regression adaption with MSE loss and an adapted triplet loss for regression. | -| SuperFELTR | Published Model | Single-Drug Model | Regression extension of [SuperFELT: supervised feature extraction learning using triplet loss for drug response](https://doi.org/10.1186/s12859-021-04146-z) by Park et al. Very similar to MOLI(R). In MOLI(R), encoders and the classifier were trained jointly. Super.FELT(R) trains them independently. MOLI(R) was trained without feature selection (except for the Variance Threshold on the gene expression). Super.FELT(R) uses feature selection for all omics data. | -| DIPK | Published Model | Multi-Drug Model | [Deep neural network Integrating Prior Knowledge](https://doi.org/10.1093/bib/bbae153) from Li et al. Uses gene interaction relationships (encoded by a graph auto-encoder), gene expression profiles (encoded by a denoising auto-encoder), and molecular topologies (encoded by MolGNet). Those features are integrated using multi-head attention layers. | +| Model Name | Baseline / Published Model | Multi-Drug Model / Single-Drug Model | Description | +| -------------------------------- | -------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| NaivePredictor | Baseline Method | Multi-Drug Model | Most simple method. Predicts the mean response of all drugs in the training set. | +| NaiveCellLineMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a cell line in the training set. | +| NaiveDrugMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a drug in the training set. | +| NaiveTissueMeanPredictor | Baseline Method | Multi-Drug Model | Predicts the mean response of a tissue in the training set. | +| NaiveMeanEffectsPredictor | Baseline Method | Multi-Drug Model | Predicts the drug- and cell-line specific mean effects. | +| ElasticNet | Baseline Method | Multi-Drug Model | Fits an [Sklearn Elastic Net](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html), [Lasso](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html), or [Ridge](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html) model on gene expression data and drug fingerprints (concatenated input matrix). | +| ProteomicsElasticNet | Baseline Method | Multi-Drug Model | Fits an [Sklearn Elastic Net](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html), [Lasso](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html), or [Ridge](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html) model on proteomics data and drug fingerprints (concatenated input matrix). | +| SingleDrugElasticNet | Baseline Method | Single-Drug Model | Fits an ElasticNet model on gene expression data for each drug separately. | +| SingleDrugProteomicsElasticNet | Baseline Method | Single-Drug Model | Fits an ElasticNet model on proteomics data for each drug separately. | +| GradientBoosting | Baseline Method | Multi-Drug Model | Fits an [Sklearn Gradient Boosting Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html) gene expression data and drug fingerprints. | +| RandomForest | Baseline Method | Multi-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression data and drug fingerprints. | +| MultiOmicsRandomForest | Baseline Method | Multi-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression, methylation, mutation, copy number variation data, and drug fingerprints (concatenated matrix). The dimensionality of the methylation data is reduced with a PCA to the first 100 components before it is fed to the model. | +| ProteomicsRandomForest | Baseline Method | Multi-Drug Model | Fits Random Forest on proteomics data and drug fingerprints. | +| SingleDrugRandomForest | Baseline Method | Single-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on gene expression data for each drug separately. | +| SingleDrugProteomicsRandomForest | Baseline Method | Single-Drug Model | Fits an [Sklearn Random Forest Regressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) on proteomics data for each drug separately. | +| SVR | Baseline Method | Multi-Drug Model | Fits an [Sklearn Support Vector Regressor](https://scikit-learn.org/1.5/modules/generated/sklearn.svm.SVR.html) gene expression data and drug fingerprints. | +| SimpleNeuralNetwork | Baseline Method | Multi-Drug Model | Fits a simple feedforward neural network (implemented with [Pytorch Lightning](https://lightning.ai/docs/pytorch/stable/)) on gene expression and drug fingerprints (concatenated input) with 3 layers of varying dimensions and Dropout layers. | +| MultiOmicsNeuralNetwork | Baseline Method | Multi-Drug Model | Fits a simple feedforward neural network (implemented with [Pytorch Lightning](https://lightning.ai/docs/pytorch/stable/)) on gene expression, methylation, mutation, copy number variation data, and drug fingerprints (concatenated input) with 3 layers of varying dimensions and Dropout layers. The dimensionality of the methylation data is reduced with a PCA to the first 100 components before it is fed to the model. | +| SRMF | Published Model | Multi-Drug Model | [Similarity Regularization Matrix Factorization](https://doi.org/10.1186/s12885-017-3500-5) model by Wang et al. on gene expression data and drug fingerprints. Re-implemented Matlab code into Python. The basic idea is represent each drug and each cell line by their respective similarities to all other drugs/cell lines. Those similarities are mapped into a shared latent low-dimensional space from which responses are predicted. | +| MOLIR | Published Model | Single-Drug Model | Regression extension of [MOLI: multi-omics late integration deep neural network.](https://doi.org/10.1093/bioinformatics/btz318) by Sharifi-Noghabi et al. Takes somatic mutation, copy number variation and gene expression data as input. MOLI reduces the dimensionality of each omics type with a hidden layer, concatenates them into one representation and optimizes this representation via a combined cost function consisting of a triplet loss and a binary cross-entropy loss. We implemented a regression adaption with MSE loss and an adapted triplet loss for regression. | +| SuperFELTR | Published Model | Single-Drug Model | Regression extension of [SuperFELT: supervised feature extraction learning using triplet loss for drug response](https://doi.org/10.1186/s12859-021-04146-z) by Park et al. Very similar to MOLI(R). In MOLI(R), encoders and the classifier were trained jointly. Super.FELT(R) trains them independently. MOLI(R) was trained without feature selection (except for the Variance Threshold on the gene expression). Super.FELT(R) uses feature selection for all omics data. | +| DIPK | Published Model | Multi-Drug Model | [Deep neural network Integrating Prior Knowledge](https://doi.org/10.1093/bib/bbae153) from Li et al. Uses gene interaction relationships (encoded by a graph auto-encoder), gene expression profiles (encoded by a denoising auto-encoder), and molecular topologies (encoded by MolGNet). Those features are integrated using multi-head attention layers. | #### Custom models @@ -163,13 +165,15 @@ If you want to use your own model, you must contribute it to drevalpy. Please fo The following datasets are available and can be supplied via `--dataset_name`: -| Dataset Name | Number of drugs | Number of Cell Lines | Description | -| ------------ | --------------- | -------------------- | -------------------------------------------------------------------- | -| CTRPv1 | 354 | 243 | The Cancer Therapeutics Response Portal (CTRP) dataset version 1. | -| CTRPv2 | 545 | 886 | The Cancer Therapeutics Response Portal (CTRP) dataset version 2. | -| CCLE | 24 | 503 | The Cancer Cell Line Encyclopedia (CCLE) dataset. | -| GDSC1 | 378 | 970 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 1. | -| GDSC2 | 287 | 969 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 2. | +| Dataset Name | Number of DRP curves | Number of drugs | Number of Cell Lines | Description | +| ------------ | -------------------- | --------------- | -------------------- | ------------------------------------------------------------------------------------------------ | +| CTRPv1 | 60,758 | 354 | 243 | The Cancer Therapeutics Response Portal (CTRP) dataset version 1. | +| CTRPv2 | 395,025 | 546 | 886 | The Cancer Therapeutics Response Portal (CTRP) dataset version 2. | +| CCLE | 11,670 | 24 | 503 | The Cancer Cell Line Encyclopedia (CCLE) dataset. | +| GDSC1 | 316,506 | 378 | 970 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 1. | +| GDSC2 | 234,437 | 287 | 969 | The Genomics of Drug Sensitivity in Cancer (GDSC) dataset version 2. | +| TOYv1 | 2,711 | 36 | 90 | A toy dataset for testing purposes subsetted from CTRPv2. | +| TOYv2 | 2,784 | 36 | 90 | A second toy dataset for cross study testing purposes. 80 cell lines and 32 drugs overlap TOYv2. | Our pipeline also supports cross-study prediction, i.e., training on one dataset and testing on another (or multiple others) to assess the generalization of the model. This dataset name can be supplied via `--cross_study_datasets`. diff --git a/subworkflows/local/utils_nfcore_drugresponseeval_pipeline/main.nf b/subworkflows/local/utils_nfcore_drugresponseeval_pipeline/main.nf index 46b6cbb..a36e2db 100644 --- a/subworkflows/local/utils_nfcore_drugresponseeval_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_drugresponseeval_pipeline/main.nf @@ -87,11 +87,14 @@ workflow PIPELINE_INITIALISATION { 'SRMF', 'DIPK', 'ProteomicsRandomForest', + 'ProteomicsElasticNet', 'SingleDrugRandomForest', 'MOLIR', 'SuperFELTR', 'SingleDrugElasticNet', - 'SingleDrugProteomicsElasticNet'] + 'SingleDrugProteomicsElasticNet', + 'SingleDrugProteomicsRandomForest', + ] ch_models = channel.from(models.split(',').collect { it.trim() }) def baseline_list = baselines.split(",") // if NaiveMeanEffectsPredictor is not in baselines, add it From c9ac09b99ecb3750d926eb04876b22d2356de7d3 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 17 Jun 2025 17:16:34 +0200 Subject: [PATCH 248/257] added no_hyperparameter_tuning flag for quick runs/debugging --- CHANGELOG.md | 1 + bin/hpam_split.py | 4 ++++ modules/local/hpam_split/main.nf | 4 +++- nextflow.config | 1 + nextflow_schema.json | 6 ++++++ subworkflows/local/run_cv/main.nf | 3 ++- 6 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16654aa..c7b7360 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added authors and licenses to the python scripts. - Moved all publishDir directives to modules.config. - Fixed drevalpy versions in conda and docker to 1.3.3: now supporting Python 3.13 +- Added no_hyperparameter_tuning option for quick runs without hyperparameter tuning. ## v1.0.0 - [date] diff --git a/bin/hpam_split.py b/bin/hpam_split.py index f3b2e60..70e4f5a 100755 --- a/bin/hpam_split.py +++ b/bin/hpam_split.py @@ -12,6 +12,8 @@ def get_parser(): description="Take model name, get hyperparameters, and split into single hyperparameter combinations" ) parser.add_argument("--model_name", type=str, help="model name") + parser.add_argument("--hyperparameter_tuning", action="store_true", default=False, + help="if set, hyperparameter tuning is performed, otherwise only the first combination is used") return parser @@ -27,6 +29,8 @@ def get_parser(): f"MULTI_DRUG_MODEL_FACTORY.") model_class = MODEL_FACTORY[model_name] hyperparameters = model_class.get_hyperparameter_set() + if not args.hyperparameter_tuning: + hyperparameters = [hyperparameters[0]] hpam_idx = 0 for hpam_combi in hyperparameters: with open(f"hpam_{hpam_idx}.yaml", "w") as yaml_file: diff --git a/modules/local/hpam_split/main.nf b/modules/local/hpam_split/main.nf index 2a67ab5..0c636c6 100644 --- a/modules/local/hpam_split/main.nf +++ b/modules/local/hpam_split/main.nf @@ -6,6 +6,7 @@ process HPAM_SPLIT { input: val model_name + val no_hyperparameter_tuning output: tuple val(model_name), path("*.yaml") , emit: hpam_combi @@ -15,7 +16,8 @@ process HPAM_SPLIT { script: """ hpam_split.py \\ - --model_name "${model_name}" + --model_name "${model_name}" \\ + ${no_hyperparameter_tuning ? '' : '--hyperparameter_tuning'} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/nextflow.config b/nextflow.config index faccea9..c533fae 100644 --- a/nextflow.config +++ b/nextflow.config @@ -29,6 +29,7 @@ params { model_checkpoint_dir = 'TEMPORARY' measure = 'LN_IC50' zenodo_link = 'https://zenodo.org/records/15533857/files/' + no_hyperparameter_tuning = false // Boilerplate options outdir = 'results' diff --git a/nextflow_schema.json b/nextflow_schema.json index a133704..13de908 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -189,6 +189,12 @@ "description": "Model checkpoint directory", "default": "TEMPORARY", "help_text": "Directory to save model checkpoints." + }, + "no_hyperparameter_tuning": { + "type": "boolean", + "description": "Disable hyperparameter tuning.", + "default": false, + "help_text": "Set this flag to disable hyperparameter tuning. If set, the pipeline will not perform hyperparameter tuning and will use the default parameters for the models (more meant for quick runs or debugging)." } } }, diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index d354839..a495665 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -116,7 +116,8 @@ workflow RUN_CV { ch_models_baselines_expanded = ch_models_expanded.concat(ch_baselines_expanded) HPAM_SPLIT ( - ch_models_baselines + ch_models_baselines, + params.no_hyperparameter_tuning ) ch_versions = ch_versions.mix(HPAM_SPLIT.out.versions) // [model_name, [hpam_0.yaml, hpam_1.yaml, ..., hpam_n.yaml]] From 1dc8785d97d0dad4934927da8d5549eb12065f17 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Tue, 17 Jun 2025 17:38:27 +0200 Subject: [PATCH 249/257] added dataset_name to DrugResponseDataset.from_csv, making tissue column optional --- bin/load_response.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bin/load_response.py b/bin/load_response.py index d20bc0a..42007e0 100755 --- a/bin/load_response.py +++ b/bin/load_response.py @@ -49,8 +49,13 @@ def main(args): dataset_name=dataset_name, ) else: + tissue_column = TISSUE_IDENTIFIER + # check whether the input file has a TISSUE_IDENTIFIER column, if not, set tissue_column to None + if TISSUE_IDENTIFIER not in pd.read_csv(input_file, nrows=1).columns: + tissue_column = None + response_data = DrugResponseDataset.from_csv( - input_file=input_file, measure=args.measure, tissue_column=TISSUE_IDENTIFIER + input_file=input_file, dataset_name=dataset_name, measure=args.measure, tissue_column=tissue_column ) outfile = f"cross_study_{dataset_name}.pkl" if args.cross_study_dataset else "response_dataset.pkl" # Pickle the object to a file From 2b382bf5d652c00e76e71fb03ac292f62b4a5a44 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 18 Jun 2025 14:31:23 +0200 Subject: [PATCH 250/257] added the possibility to train a final model --- bin/train_final_model.py | 60 ++++++++++++++++++++++++ conf/modules.config | 16 +++++++ modules/local/train_final_model/env.yml | 8 ++++ modules/local/train_final_model/main.nf | 45 ++++++++++++++++++ nextflow.config | 1 + nextflow_schema.json | 6 +++ subworkflows/local/model_testing/main.nf | 25 +++++++++- subworkflows/local/run_cv/main.nf | 1 + workflows/drugresponseeval.nf | 4 +- 9 files changed, 163 insertions(+), 3 deletions(-) create mode 100755 bin/train_final_model.py create mode 100644 modules/local/train_final_model/env.yml create mode 100644 modules/local/train_final_model/main.nf diff --git a/bin/train_final_model.py b/bin/train_final_model.py new file mode 100755 index 0000000..47b2e23 --- /dev/null +++ b/bin/train_final_model.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +# Written by Judith Bernett and released under the MIT License. + +import argparse +import pickle + +from drevalpy.experiment import generate_data_saving_path, get_model_name_and_drug_id, train_final_model +from drevalpy.models import MODEL_FACTORY +from drevalpy.utils import get_response_transformation + + +def get_parser(): + parser = argparse.ArgumentParser( + description="Train a final model on the full dataset for future predictions." + ) + parser.add_argument("--response", type=str, required=True, help="Drug response data, pickled (output of load_response).") + parser.add_argument("--model_name", type=str, required=True, help="Model name.") + parser.add_argument("--response_transformation", type=str, default="None", help="Response transformation.") + parser.add_argument("--path_data", type=str, required=True, help="Path to data.") + parser.add_argument("--model_checkpoint_dir", type=str, default="TEMPORARY", help="model checkpoint directory, if not provided: temporary directory is used") + parser.add_argument("--metric", type=str, required=True, help="Optimization , default: RMSE.") + parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LTO, LDO).") + parser.add_argument("--no_hyperparameter_tuning", action="store_true", default=False, + help="If set, no hyperparameter tuning is performed, only the first combination is used.") + return parser + + +if __name__ == "__main__": + arg_parser = get_parser() + args = arg_parser.parse_args() + + model_name, drug_id = get_model_name_and_drug_id(args.model_name) + + final_model_path = generate_data_saving_path( + model_name=model_name, + drug_id=drug_id, + result_path="", + suffix="final_model" + ) + + model_class = MODEL_FACTORY[model_name] + + response_data = pickle.load(open(args.response, "rb")) + response_data.remove_nan_responses() + + response_transform = get_response_transformation(args.response_transformation) + + train_final_model( + model_class=model_class, + full_dataset=response_data, + response_transformation=response_transform, + path_data=args.path_data, + model_checkpoint_dir=args.model_checkpoint_dir, + metric=args.metric, + result_path=final_model_path, + test_mode=args.test_mode, + val_ratio=0.1, + hyperparameter_tuning=not args.no_hyperparameter_tuning + ) diff --git a/conf/modules.config b/conf/modules.config index ad796f6..32303ed 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -182,6 +182,22 @@ process { } } + withName: 'TRAIN_FINAL_MODEL' { + publishDir = [ + path: { "${params.outdir}/${params.run_id}/${test_mode}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + + ext.use_gpu = { [ + 'SimpleNeuralNetwork', + 'MultiOmicsNeuralNetwork', + 'MOLIR', + 'SuperFELTR' + ].contains( model_name.split( '\\.' )[0] ) + } + } + withName: 'EVALUATE_FINAL' { publishDir = [ path: params.outdir, diff --git a/modules/local/train_final_model/env.yml b/modules/local/train_final_model/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/train_final_model/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/train_final_model/main.nf b/modules/local/train_final_model/main.nf new file mode 100644 index 0000000..8372bdc --- /dev/null +++ b/modules/local/train_final_model/main.nf @@ -0,0 +1,45 @@ +process TRAIN_FINAL_MODEL { + tag { "${model_name}_${test_mode}_gpu:${task.ext.use_gpu}" } + label 'process_high' + label 'process_gpu' + + conda "${moduleDir}/env.yml" + + input: + tuple val(model_name), path(response), val(test_mode), path(path_data) + val response_transformation + val model_checkpoint_dir + val metric + val no_hyperparameter_tuning + + + output: + path("**final_model/*"), emit: final_model + path("versions.yml"), emit: versions + + script: + """ + train_final_model.py \\ + --response $response \\ + --model_name "${model_name}" \\ + --response_transformation $response_transformation \\ + --path_data $path_data \\ + --model_checkpoint_dir $model_checkpoint_dir \\ + --metric $metric \\ + --test_mode $test_mode \\ + ${no_hyperparameter_tuning ? '' : '--hyperparameter_tuning'} + + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)" | sed 's/+.*//') + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS + """ +} diff --git a/nextflow.config b/nextflow.config index c533fae..03e5384 100644 --- a/nextflow.config +++ b/nextflow.config @@ -30,6 +30,7 @@ params { measure = 'LN_IC50' zenodo_link = 'https://zenodo.org/records/15533857/files/' no_hyperparameter_tuning = false + final_model_on_full_data = false // Boilerplate options outdir = 'results' diff --git a/nextflow_schema.json b/nextflow_schema.json index 13de908..e50fc4a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -195,6 +195,12 @@ "description": "Disable hyperparameter tuning.", "default": false, "help_text": "Set this flag to disable hyperparameter tuning. If set, the pipeline will not perform hyperparameter tuning and will use the default parameters for the models (more meant for quick runs or debugging)." + }, + "final_model_on_full_data": { + "type": "boolean", + "description": "Train final model on full data.", + "default": false, + "help_text": "If True, saves a final model, trained/tuned on the union of all folds after CV. This is useful if you want to use the model for predictions on new data after running the pipeline." } } }, diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 9cc1e58..7b696c8 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -2,6 +2,7 @@ include { PREDICT_FULL } from '../../../modules/local/predict_f include { RANDOMIZATION_SPLIT } from '../../../modules/local/randomization_split' include { RANDOMIZATION_TEST } from '../../../modules/local/randomization_test' include { ROBUSTNESS_TEST } from '../../../modules/local/robustness_test' +include { TRAIN_FINAL_MODEL } from '../../../modules/local/train_final_model' include { CONSOLIDATE_RESULTS } from '../../../modules/local/consolidate_results' include { EVALUATE_FINAL } from '../../../modules/local/evaluate_final' include { COLLECT_RESULTS } from '../../../modules/local/collect_results' @@ -10,12 +11,14 @@ include { VISUALIZE_RESULTS } from '../../../modules/local/visuali workflow MODEL_TESTING { take: - ch_models_baselines // from input + ch_models_baselines // from input [model_class, model_name] best_hpam_per_split // from RUN_CV: [split_id, test_mode, split_dataset, model_name, best_hpam_combi_X.yaml] randomizations // from input + response_dataset // from LOAD_RESPONSE cross_study_datasets // from LOAD_RESPONSE - ch_models // from RUN_CV + ch_models // from RUN_CV [model_class, model_name] work_path // from input + test_modes // e.g., ['LPO', 'LCO'] main: ch_versions = Channel.empty() @@ -99,6 +102,24 @@ workflow MODEL_TESTING { ch_vis = ch_vis.concat(ROBUSTNESS_TEST.out.ch_vis) } + if (params.final_model_on_full_data) { + // we only do this for models, not for baselines + ch_test_modes = channel.from(test_modes) + ch_final_model = ch_models + .map{it -> it[1]} + .combine(response_dataset) + .combine(ch_test_modes) + .combine(work_path) + TRAIN_FINAL_MODEL ( + ch_final_model, + params.response_transformation, + params.model_checkpoint_dir, + params.optim_metric, + params.no_hyperparameter_tuning + ) + ch_versions = ch_versions.mix(TRAIN_FINAL_MODEL.out.versions) + } + ch_consolidate = ch_vis .map{ test_mode, model, pred_file -> [test_mode, model.split("\\.")[0]] } .unique() diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index a495665..d991fa5 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -158,6 +158,7 @@ workflow RUN_CV { emit: best_hpam_per_split = ch_best_hpams_per_split + response_dataset = LOAD_RESPONSE.out.response_dataset.collect() cross_study_datasets = LOAD_CS_RESPONSE.out.cross_study_datasets.collect() ch_models = MAKE_MODELS.out.all_models.splitCsv(strip: true) versions = ch_versions diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index fcde004..749be65 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -56,9 +56,11 @@ workflow DRUGRESPONSEEVAL { ch_models_baselines, RUN_CV.out.best_hpam_per_split, randomizations, + RUN_CV.out.response_dataset, RUN_CV.out.cross_study_datasets, RUN_CV.out.ch_models, - work_path + work_path, + test_modes ) ch_versions = ch_versions.mix(MODEL_TESTING.out.versions) From bc700c35bb8ebebbfae6c9663a512e9de4f37d04 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Wed, 18 Jun 2025 15:02:11 +0200 Subject: [PATCH 251/257] missed new readme content for ro-crate-metadata.json --- ro-crate-metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 0d17ae7..2c65148 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "Stable", "datePublished": "2025-06-03T11:01:28+00:00", - "description": "

    \n \n \n \"nf-core/drugresponseeval\"\n \n

    \n\n[![GitHub Actions CI Status](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/drugresponseeval/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/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/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.14779984-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.14779984)\n\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![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/drugresponseeval)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23drugresponseeval-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/drugresponseeval)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![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)\n\n## Introduction\n\n# ![drevalpy_summary](assets/dreval_summary.svg)\n\n**DrEval** is a bioinformatics framework which includes a PyPI package (drevalpy) and a Nextflow\npipeline (this repo). DrEval ensures that evaluations are statistically sound, biologically\nmeaningful, and reproducible. DrEval simplifies the implementation of drug response prediction\nmodels, allowing researchers to focus on advancing their modeling innovations by automating\nstandardized evaluation protocols and preprocessing workflows. With DrEval, hyperparameter\ntuning is fair and consistent. With its flexible model interface, DrEval supports any model type,\nranging from statistical models to complex neural networks. By contributing your model to the\nDrEval catalog, you can increase your work's exposure, reusability, and transferability.\n\n1. The response data is loaded\n2. All models are trained and evaluated in a cross-validation setting\n3. For each CV split, the best hyperparameters are determined using a grid search per model\n4. The model is trained on the full training set (train & validation) with the best\n hyperparameters to predict the test set\n5. If randomization tests are enabled, the model is trained on the full training set with the best\n hyperparameters to predict the randomized test set\n6. If robustness tests are enabled, the model is trained N times on the full training set with the\n best hyperparameters\n7. Plots are created summarizing the results\n\nFor baseline models, no randomization or robustness tests are performed.\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/drugresponseeval \\\n -profile \\\n --models \\\n --baselines \\\n --dataset_name \n```\n\n> [!WARNING]\n> 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).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/drugresponseeval/usage) and the [parameter documentation](https://nf-co.re/drugresponseeval/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/drugresponseeval/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/drugresponseeval/output).\n\n## Credits\n\nnf-core/drugresponseeval was originally written by Judith Bernett (TUM) and Pascal Iversen (FU\nBerlin).\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n## Contributions and Support\n\nContributors to nf-core/drugresponseeval and the drevalpy PyPI package:\n\n- [Judith Bernett](https://github.com/JudithBernett) (TUM)\n- [Pascal Iversen](https://github.com/PascalIversen) (FU Berlin)\n- [Mario Picciani](https://github.com/picciama) (TUM)\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#drugresponseeval` channel](https://nfcore.slack.com/channels/drugresponseeval) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/drugresponseeval for your analysis, please cite it using the following doi: [10.5281/zenodo.14779984](https://doi.org/10.5281/zenodo.14779984)\n\n> Our corresponding publication is at doi [10.1101/2025.05.26.655288](doi.org/10.1101/2025.05.26.655288)\n>\n> Bernett, J., Iversen, P., Picciani, M., Wilhelm, M., Baum, K., & List, M. **From Hype to Health Check: Critical Evaluation of Drug Response Prediction Models with DrEval.**\n>\n> _bioRxiv_, 2025-05.\n\nThe underlying data is available at doi: [10.5281/zenodo.12633909](https://doi.org/10.5281/zenodo.12633909).\n\nThe underlying python package is drevalpy, availably on [PyPI](https://pypi.org/project/drevalpy/) as standalone.\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "description": "

    \n \n \n \"nf-core/drugresponseeval\"\n \n

    \n\n[![GitHub Actions CI Status](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/actions/workflows/ci.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/drugresponseeval/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/drugresponseeval/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/drugresponseeval/results)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.14779984-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.14779984)\n\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.04.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.1)\n[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/)\n[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/)\n[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/)\n[![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/drugresponseeval)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23drugresponseeval-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/drugresponseeval)[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)[![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)\n\n## Introduction\n\n# ![drevalpy_summary](assets/dreval_summary.svg)\n\n**DrEval** is a bioinformatics framework that includes a PyPI package (drevalpy) and a Nextflow\npipeline (this repo). DrEval ensures that evaluations are statistically sound, biologically\nmeaningful, and reproducible. DrEval simplifies the implementation of drug response prediction\nmodels, allowing researchers to focus on advancing their modeling innovations by automating\nstandardized evaluation protocols and preprocessing workflows. With DrEval, hyperparameter\ntuning is fair and consistent. With its flexible model interface, DrEval supports any model type,\nranging from statistical models to complex neural networks. By contributing your model to the\nDrEval catalog, you can increase your work's exposure, reusability, and transferability.\n\n1. The response data is loaded\n2. All models are trained and evaluated in a cross-validation setting\n3. For each CV split, the best hyperparameters are determined using a grid search per model\n4. The model is trained on the full training set (train & validation) with the best\n hyperparameters to predict the test set\n5. If randomization tests are enabled, the model is trained on the full training set with the best\n hyperparameters to predict the randomized test set\n6. If robustness tests are enabled, the model is trained N times on the full training set with the\n best hyperparameters\n7. Plots are created summarizing the results\n\nFor baseline models, no randomization or robustness tests are performed.\n\n## Usage\n\n> [!NOTE]\n> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/drugresponseeval \\\n -profile \\\n --models \\\n --baselines \\\n --dataset_name \n```\n\n> [!WARNING]\n> 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).\n\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/drugresponseeval/usage) and the [parameter documentation](https://nf-co.re/drugresponseeval/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/drugresponseeval/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/drugresponseeval/output).\n\n## Credits\n\nnf-core/drugresponseeval was originally written by Judith Bernett (TUM) and Pascal Iversen (FU\nBerlin).\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n## Contributions and Support\n\nContributors to nf-core/drugresponseeval and the drevalpy PyPI package:\n\n- [Judith Bernett](https://github.com/JudithBernett) (TUM)\n- [Pascal Iversen](https://github.com/PascalIversen) (FU Berlin)\n- [Mario Picciani](https://github.com/picciama) (TUM)\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#drugresponseeval` channel](https://nfcore.slack.com/channels/drugresponseeval) (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use nf-core/drugresponseeval for your analysis, please cite it using the following doi: [10.5281/zenodo.14779984](https://doi.org/10.5281/zenodo.14779984)\n\n> Our corresponding publication is at doi [10.1101/2025.05.26.655288](doi.org/10.1101/2025.05.26.655288)\n>\n> Bernett, J., Iversen, P., Picciani, M., Wilhelm, M., Baum, K., & List, M. **From Hype to Health Check: Critical Evaluation of Drug Response Prediction Models with DrEval.**\n>\n> _bioRxiv_, 2025-05.\n\nThe underlying data is available at doi: [10.5281/zenodo.12633909](https://doi.org/10.5281/zenodo.12633909).\n\nThe underlying python package is drevalpy, availably on [PyPI](https://pypi.org/project/drevalpy/) as standalone, for which we also have an extensive [ReadTheDocs Documentation](https://drevalpy.readthedocs.io/en/latest/).\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" From 2aaf38b214437e24a5a1f968738275a6005a56fa Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 20 Jun 2025 12:33:18 +0200 Subject: [PATCH 252/257] parallelized the hyperparameter tuning for the final model --- CHANGELOG.md | 1 + bin/collect_results.py | 2 + bin/final_split.py | 53 +++++++++++++++++++ bin/train_final_model.py | 51 ++++++++++--------- bin/tune_final_model.py | 56 ++++++++++++++++++++ conf/modules.config | 16 ++++++ modules/local/final_split/env.yml | 8 +++ modules/local/final_split/main.nf | 37 ++++++++++++++ modules/local/train_final_model/main.nf | 14 ++--- modules/local/tune_final_model/env.yml | 8 +++ modules/local/tune_final_model/main.nf | 44 ++++++++++++++++ subworkflows/local/model_testing/main.nf | 65 ++++++++++++++++++------ subworkflows/local/run_cv/main.nf | 1 + workflows/drugresponseeval.nf | 3 +- 14 files changed, 309 insertions(+), 50 deletions(-) create mode 100755 bin/final_split.py create mode 100755 bin/tune_final_model.py create mode 100644 modules/local/final_split/env.yml create mode 100644 modules/local/final_split/main.nf create mode 100644 modules/local/tune_final_model/env.yml create mode 100644 modules/local/tune_final_model/main.nf diff --git a/CHANGELOG.md b/CHANGELOG.md index c7b7360..9413a11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Moved all publishDir directives to modules.config. - Fixed drevalpy versions in conda and docker to 1.3.3: now supporting Python 3.13 - Added no_hyperparameter_tuning option for quick runs without hyperparameter tuning. +- Flag final_model_on_full data: if True, a final/production model is saved in the results directory. If hyperparameter_tuning is true, the final model is tuned, too. The model can later be loaded using the implemented load functions of the drevalpy models. ## v1.0.0 - [date] diff --git a/bin/collect_results.py b/bin/collect_results.py index 0ef83c5..2e9e1f9 100755 --- a/bin/collect_results.py +++ b/bin/collect_results.py @@ -35,6 +35,8 @@ def collapse_file(files): out_df = pd.read_csv(file, index_col=0) else: out_df = pd.concat([out_df, pd.read_csv(file, index_col=0)]) + if out_df is not None and "drug" in out_df.columns: + out_df["drug"] = out_df["drug"].astype(str) return out_df diff --git a/bin/final_split.py b/bin/final_split.py new file mode 100755 index 0000000..43e9263 --- /dev/null +++ b/bin/final_split.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +# Written by Judith Bernett and released under the MIT License. + +import argparse +import pickle + +from drevalpy.datasets.dataset import _split_early_stopping_data +from drevalpy.experiment import make_train_val_split +from drevalpy.models import MODEL_FACTORY + + +def get_parser(): + parser = argparse.ArgumentParser( + description="Train a final model on the full dataset for future predictions." + ) + parser.add_argument("--response", type=str, required=True, help="Drug response data, pickled (output of load_response).") + parser.add_argument("--model_name", type=str, required=True, help="Model name.") + parser.add_argument("--path_data", type=str, required=True, help="Path to data.") + parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LTO, LDO).") + return parser + + +if __name__ == "__main__": + arg_parser = get_parser() + args = arg_parser.parse_args() + + model_class = MODEL_FACTORY[args.model_name] + model = model_class() + + response_data = pickle.load(open(args.response, "rb")) + response_data.remove_nan_responses() + + cl_features = model.load_cell_line_features(data_path=args.path_data, dataset_name=response_data.dataset_name) + drug_features = model.load_drug_features(data_path=args.path_data, dataset_name=response_data.dataset_name) + cell_lines_to_keep = cl_features.identifiers + drugs_to_keep = drug_features.identifiers if drug_features is not None else None + response_data.reduce_to(cell_line_ids=cell_lines_to_keep, drug_ids=drugs_to_keep) + + train_dataset, validation_dataset = make_train_val_split(response_data, test_mode=args.test_mode, val_ratio=0.1) + + if model_class.early_stopping: + validation_dataset, early_stopping_dataset = _split_early_stopping_data(validation_dataset, args.test_mode) + else: + early_stopping_dataset = None + + # save + with open('training_dataset.pkl', 'wb') as f: + pickle.dump(train_dataset, f) + with open('validation_dataset.pkl', 'wb') as f: + pickle.dump(validation_dataset, f) + with open('early_stopping_dataset.pkl', 'wb') as f: + pickle.dump(early_stopping_dataset, f) diff --git a/bin/train_final_model.py b/bin/train_final_model.py index 47b2e23..aa45447 100755 --- a/bin/train_final_model.py +++ b/bin/train_final_model.py @@ -4,25 +4,25 @@ import argparse import pickle +import yaml +import os -from drevalpy.experiment import generate_data_saving_path, get_model_name_and_drug_id, train_final_model +from drevalpy.experiment import generate_data_saving_path, get_model_name_and_drug_id from drevalpy.models import MODEL_FACTORY -from drevalpy.utils import get_response_transformation def get_parser(): parser = argparse.ArgumentParser( description="Train a final model on the full dataset for future predictions." ) - parser.add_argument("--response", type=str, required=True, help="Drug response data, pickled (output of load_response).") + parser.add_argument("--train_data", type=str, required=True, help="Train data, pickled (output of final split).") + parser.add_argument("--val_data", type=str, required=True, help="Validation data, pickled (output of final split).") + parser.add_argument("--early_stop_data", type=str, required=True, + help="Early stopping data, pickled (output of final split).") parser.add_argument("--model_name", type=str, required=True, help="Model name.") - parser.add_argument("--response_transformation", type=str, default="None", help="Response transformation.") parser.add_argument("--path_data", type=str, required=True, help="Path to data.") parser.add_argument("--model_checkpoint_dir", type=str, default="TEMPORARY", help="model checkpoint directory, if not provided: temporary directory is used") - parser.add_argument("--metric", type=str, required=True, help="Optimization , default: RMSE.") - parser.add_argument("--test_mode", type=str, default="LPO", help="Test mode (LPO, LCO, LTO, LDO).") - parser.add_argument("--no_hyperparameter_tuning", action="store_true", default=False, - help="If set, no hyperparameter tuning is performed, only the first combination is used.") + parser.add_argument("--best_hpam_combi", type=str, required=True, help="Best hyperparameter combination file, yaml format.") return parser @@ -39,22 +39,23 @@ def get_parser(): suffix="final_model" ) - model_class = MODEL_FACTORY[model_name] - - response_data = pickle.load(open(args.response, "rb")) - response_data.remove_nan_responses() - - response_transform = get_response_transformation(args.response_transformation) - - train_final_model( - model_class=model_class, - full_dataset=response_data, - response_transformation=response_transform, - path_data=args.path_data, + train_dataset = pickle.load(open(args.train_data, "rb")) + validation_dataset = pickle.load(open(args.val_data, "rb")) + es_dataset = pickle.load(open(args.early_stop_data, "rb")) + train_dataset.add_rows(validation_dataset) + train_dataset.shuffle(random_state=42) + + best_hpam_combi = yaml.load(open(args.best_hpam_combi, "r"), Loader=yaml.FullLoader)[f'{model_name}_final']['best_hpam_combi'] + model = MODEL_FACTORY[model_name]() + cl_features = model.load_cell_line_features(data_path=args.path_data, dataset_name=train_dataset.dataset_name) + drug_features = model.load_drug_features(data_path=args.path_data, dataset_name=train_dataset.dataset_name) + model.build_model(hyperparameters=best_hpam_combi) + model.train( + output=train_dataset, + output_earlystopping=es_dataset, + cell_line_input=cl_features, + drug_input=drug_features, model_checkpoint_dir=args.model_checkpoint_dir, - metric=args.metric, - result_path=final_model_path, - test_mode=args.test_mode, - val_ratio=0.1, - hyperparameter_tuning=not args.no_hyperparameter_tuning ) + os.makedirs(final_model_path, exist_ok=True) + model.save(final_model_path) diff --git a/bin/tune_final_model.py b/bin/tune_final_model.py new file mode 100755 index 0000000..6dd9c68 --- /dev/null +++ b/bin/tune_final_model.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python + +# Written by Judith Bernett and released under the MIT License. + +import argparse +import pickle +import yaml + +from drevalpy.experiment import get_model_name_and_drug_id, train_and_predict +from drevalpy.models import MODEL_FACTORY +from drevalpy.utils import get_response_transformation + + +def get_parser(): + parser = argparse.ArgumentParser( + description="Train a final model on the full dataset for future predictions." + ) + parser.add_argument("--train_data", type=str, required=True, help="Train dataset, pickled output of final_split.py.") + parser.add_argument("--val_data", type=str, required=True, help="Validation dataset, pickled output of final_split.py.") + parser.add_argument("--early_stopping_data", type=str, required=True, help="Early stopping dataset, pickled output of final_split.py.") + parser.add_argument("--model_name", type=str, required=True, help="Model name.") + parser.add_argument("--hpam_combi", type=str, required=True, help="Hyperparameter combination file, yaml format.") + parser.add_argument("--response_transformation", type=str, default="None", help="Response transformation.") + parser.add_argument("--path_data", type=str, required=True, help="Path to data.") + parser.add_argument("--model_checkpoint_dir", type=str, default="TEMPORARY", help="model checkpoint directory, if not provided: temporary directory is used") + return parser + + +if __name__ == "__main__": + arg_parser = get_parser() + args = arg_parser.parse_args() + + train_dataset = pickle.load(open(args.train_data, "rb")) + validation_dataset = pickle.load(open(args.val_data, "rb")) + early_stopping_dataset = pickle.load(open(args.early_stopping_data, "rb")) + response_transform = get_response_transformation(args.response_transformation) + + model_name, drug_id = get_model_name_and_drug_id(args.model_name) + model_class = MODEL_FACTORY[model_name] + hpams = yaml.load(open(args.hpam_combi, "r"), Loader=yaml.FullLoader) + model = model_class() + + validation_dataset = train_and_predict( + model=model, + hpams=hpams, + path_data=args.path_data, + train_dataset=train_dataset, + prediction_dataset=validation_dataset, + early_stopping_dataset=early_stopping_dataset, + response_transformation=response_transform, + model_checkpoint_dir=args.model_checkpoint_dir, + ) + with open(f"final_prediction_dataset_{model_name}_" + f"{str(args.hpam_combi).split('.yaml')[0]}.pkl", + "wb") as f: + pickle.dump(validation_dataset, f) diff --git a/conf/modules.config b/conf/modules.config index 32303ed..2e18c68 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -182,6 +182,22 @@ process { } } + withName: 'FINAL_SPLIT' { + publishDir = [ + path: params.outdir, + mode: params.publish_dir_mode, + saveAs: { filename -> null } + ] + } + + withName: 'TUNE_FINAL_MODEL' { + publishDir = [ + path: params.outdir, + mode: params.publish_dir_mode, + saveAs: { filename -> null } + ] + } + withName: 'TRAIN_FINAL_MODEL' { publishDir = [ path: { "${params.outdir}/${params.run_id}/${test_mode}" }, diff --git a/modules/local/final_split/env.yml b/modules/local/final_split/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/final_split/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/final_split/main.nf b/modules/local/final_split/main.nf new file mode 100644 index 0000000..fba90f6 --- /dev/null +++ b/modules/local/final_split/main.nf @@ -0,0 +1,37 @@ +process FINAL_SPLIT { + tag { "${model_name}_${test_mode}_gpu:${task.ext.use_gpu}" } + label 'process_high' + label 'process_gpu' + + conda "${moduleDir}/env.yml" + + input: + tuple val(model_name), path(response), val(test_mode), path(path_data) + + + output: + tuple val(model_name), path("training_dataset.pkl"), path("validation_dataset.pkl"), path("early_stopping_dataset.pkl"), emit: final_datasets + path("versions.yml"), emit: versions + + script: + """ + final_split.py \\ + --response $response \\ + --model_name "${model_name}" \\ + --path_data $path_data \\ + --test_mode $test_mode + + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)" | sed 's/+.*//') + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS + """ +} diff --git a/modules/local/train_final_model/main.nf b/modules/local/train_final_model/main.nf index 8372bdc..11bb435 100644 --- a/modules/local/train_final_model/main.nf +++ b/modules/local/train_final_model/main.nf @@ -6,11 +6,8 @@ process TRAIN_FINAL_MODEL { conda "${moduleDir}/env.yml" input: - tuple val(model_name), path(response), val(test_mode), path(path_data) - val response_transformation + tuple val(model_name), val(test_mode), path(best_hpam_combi), path(train_data), path(val_data), path(early_stop_data), path(path_data) val model_checkpoint_dir - val metric - val no_hyperparameter_tuning output: @@ -20,14 +17,13 @@ process TRAIN_FINAL_MODEL { script: """ train_final_model.py \\ - --response $response \\ + --train_data $train_data \\ + --val_data $val_data \\ + --early_stop_data $early_stop_data \\ --model_name "${model_name}" \\ - --response_transformation $response_transformation \\ --path_data $path_data \\ --model_checkpoint_dir $model_checkpoint_dir \\ - --metric $metric \\ - --test_mode $test_mode \\ - ${no_hyperparameter_tuning ? '' : '--hyperparameter_tuning'} + --best_hpam_combi $best_hpam_combi cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/tune_final_model/env.yml b/modules/local/tune_final_model/env.yml new file mode 100644 index 0000000..ee4d55e --- /dev/null +++ b/modules/local/tune_final_model/env.yml @@ -0,0 +1,8 @@ +name: nf-core-drugresponseeval +channels: + - conda-forge +dependencies: + - python=3.13 + - pip + - pip: + - drevalpy==1.3.3 diff --git a/modules/local/tune_final_model/main.nf b/modules/local/tune_final_model/main.nf new file mode 100644 index 0000000..13456a0 --- /dev/null +++ b/modules/local/tune_final_model/main.nf @@ -0,0 +1,44 @@ +process TUNE_FINAL_MODEL { + tag { "${model_name}_${test_mode}_gpu:${task.ext.use_gpu}" } + label 'process_high' + label 'process_gpu' + + conda "${moduleDir}/env.yml" + + input: + tuple val(model_name), path(train_ds), path(val_ds), path(early_stop_ds), val(test_mode), path(path_data), path(hpam_combi) + val response_transformation + val model_checkpoint_dir + val metric + + + output: + tuple val(model_name), val(test_mode), val("final"), path(hpam_combi), path("final_prediction_dataset_*.pkl"), emit: final_prediction + path("versions.yml"), emit: versions + + script: + """ + tune_final_model.py \\ + --train_data $train_ds \\ + --val_data $val_ds \\ + --early_stopping_data $early_stop_ds \\ + --model_name "${model_name}" \\ + --hpam_combi $hpam_combi \\ + --response_transformation $response_transformation \\ + --path_data $path_data \\ + --model_checkpoint_dir $model_checkpoint_dir + + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + drevalpy: \$(python -c "import drevalpy; print(drevalpy.__version__)") + sklearn: \$(python -c "import sklearn; print(sklearn.__version__)") + numpy: \$(python -c "import numpy; print(numpy.__version__)") + pandas: \$(python -c "import pandas; print(pandas.__version__)") + pytorch_lightning: \$(python -c "import pytorch_lightning; print(pytorch_lightning.__version__)") + torch: \$(python -c "import torch; print(torch.__version__)" | sed 's/+.*//') + platform: \$(python -c "import platform; print(platform.__version__)") + END_VERSIONS + """ +} diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index 7b696c8..bc6879f 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -1,12 +1,15 @@ -include { PREDICT_FULL } from '../../../modules/local/predict_full' -include { RANDOMIZATION_SPLIT } from '../../../modules/local/randomization_split' -include { RANDOMIZATION_TEST } from '../../../modules/local/randomization_test' -include { ROBUSTNESS_TEST } from '../../../modules/local/robustness_test' -include { TRAIN_FINAL_MODEL } from '../../../modules/local/train_final_model' -include { CONSOLIDATE_RESULTS } from '../../../modules/local/consolidate_results' -include { EVALUATE_FINAL } from '../../../modules/local/evaluate_final' -include { COLLECT_RESULTS } from '../../../modules/local/collect_results' -include { VISUALIZE_RESULTS } from '../../../modules/local/visualize_results' +include { PREDICT_FULL } from '../../../modules/local/predict_full' +include { RANDOMIZATION_SPLIT } from '../../../modules/local/randomization_split' +include { RANDOMIZATION_TEST } from '../../../modules/local/randomization_test' +include { ROBUSTNESS_TEST } from '../../../modules/local/robustness_test' +include { FINAL_SPLIT } from '../../../modules/local/final_split' +include { TUNE_FINAL_MODEL } from '../../../modules/local/tune_final_model' +include { EVALUATE_FIND_MAX as EVALUATE_FIND_MAX_FINAL } from '../../../modules/local/evaluate_find_max' +include { TRAIN_FINAL_MODEL } from '../../../modules/local/train_final_model' +include { CONSOLIDATE_RESULTS } from '../../../modules/local/consolidate_results' +include { EVALUATE_FINAL } from '../../../modules/local/evaluate_final' +include { COLLECT_RESULTS } from '../../../modules/local/collect_results' +include { VISUALIZE_RESULTS } from '../../../modules/local/visualize_results' workflow MODEL_TESTING { @@ -19,6 +22,7 @@ workflow MODEL_TESTING { ch_models // from RUN_CV [model_class, model_name] work_path // from input test_modes // e.g., ['LPO', 'LCO'] + ch_hpam_combis // from RUN_CV [model_name, hpam_X.yaml] main: ch_versions = Channel.empty() @@ -105,17 +109,48 @@ workflow MODEL_TESTING { if (params.final_model_on_full_data) { // we only do this for models, not for baselines ch_test_modes = channel.from(test_modes) - ch_final_model = ch_models - .map{it -> it[1]} + ch_final_split = ch_models + .map{it -> it[0]} + .unique() .combine(response_dataset) .combine(ch_test_modes) .combine(work_path) - TRAIN_FINAL_MODEL ( - ch_final_model, + + FINAL_SPLIT( + ch_final_split + ) + ch_versions = ch_versions.mix(FINAL_SPLIT.out.versions) + + ch_tune_final_model = ch_models + .combine(FINAL_SPLIT.out.final_datasets, by: 0) + .map { model_class, model_name, train_ds, val_ds, es_ds -> + [model_name, train_ds, val_ds, es_ds] } + .combine(ch_test_modes) + .combine(work_path) + .combine(ch_hpam_combis, by: 0) + + TUNE_FINAL_MODEL( + ch_tune_final_model, params.response_transformation, params.model_checkpoint_dir, - params.optim_metric, - params.no_hyperparameter_tuning + params.optim_metric + ) + ch_versions = ch_versions.mix(TUNE_FINAL_MODEL.out.versions) + ch_combined_hpams = TUNE_FINAL_MODEL.out.final_prediction.groupTuple(by: [0,1,2]) + + EVALUATE_FIND_MAX_FINAL( + ch_combined_hpams, + params.optim_metric + ) + ch_versions = ch_versions.mix(EVALUATE_FIND_MAX_FINAL.out.versions) + ch_final_model = EVALUATE_FIND_MAX_FINAL.out.best_combis + .map{ model_name, final_constant, test_mode, best_hpam_combi -> + [model_name, test_mode, best_hpam_combi] } + .combine(FINAL_SPLIT.out.final_datasets, by: 0) + .combine(work_path) + TRAIN_FINAL_MODEL ( + ch_final_model, + params.model_checkpoint_dir ) ch_versions = ch_versions.mix(TRAIN_FINAL_MODEL.out.versions) } diff --git a/subworkflows/local/run_cv/main.nf b/subworkflows/local/run_cv/main.nf index d991fa5..2f9d0d8 100644 --- a/subworkflows/local/run_cv/main.nf +++ b/subworkflows/local/run_cv/main.nf @@ -161,5 +161,6 @@ workflow RUN_CV { response_dataset = LOAD_RESPONSE.out.response_dataset.collect() cross_study_datasets = LOAD_CS_RESPONSE.out.cross_study_datasets.collect() ch_models = MAKE_MODELS.out.all_models.splitCsv(strip: true) + ch_hpam_combis = ch_hpam_combis versions = ch_versions } diff --git a/workflows/drugresponseeval.nf b/workflows/drugresponseeval.nf index 749be65..3537738 100644 --- a/workflows/drugresponseeval.nf +++ b/workflows/drugresponseeval.nf @@ -60,7 +60,8 @@ workflow DRUGRESPONSEEVAL { RUN_CV.out.cross_study_datasets, RUN_CV.out.ch_models, work_path, - test_modes + test_modes, + RUN_CV.out.ch_hpam_combis ) ch_versions = ch_versions.mix(MODEL_TESTING.out.versions) From 5e463151e01dc157a514e39cbf23d6b70b974ddc Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 20 Jun 2025 14:07:23 +0200 Subject: [PATCH 253/257] added output and usage information --- docs/output.md | 9 +++++++-- docs/usage.md | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/docs/output.md b/docs/output.md index 179d3ab..53050be 100644 --- a/docs/output.md +++ b/docs/output.md @@ -34,13 +34,18 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d training set with the best hyperparameters to predict the randomized test set. - [Robustness test](#robustness-test): If robustness tests are enabled, the model is trained N times on the full training set with the best hyperparameters + - If `--final_model_on_full_data` is set: the model is trained on the full dataset to produce a production model. If `--no_hyperparameter_tuning` is **not** set, the model will be tuned on the full dataset, too. The model will be saved in the results directory. + - [FINAL_SPLIT](#final-split): For each model class, the full dataset is split into training, validation, and potentially early stopping sets. This is done to ensure per model and not overall to retain the maximum amount of data for training (because the data is filtered according to cell line / drug feature availability). + - [TUNE_FINAL_MODEL](#tune-final-model): The final model is tuned on the full dataset. + - [EVALUATE_FIND_MAX_FINAL](#evaluate-and-find-max-final): The best hyperparameters for the final model are determined on the validation dataset. + - [TRAIN_FINAL_MODEL](#train-final-model): The final model is trained on the full dataset (train+validation) with the best hyperparameters. The model is saved in the results directory. - [Consolidate results](#consolidate-results): The results of the model testing are consolidated into a single table for each model. - [Evaluate final](#evaluate-final): The performance of the models is calculated on the test set results. - [Collect results](#collect-results): The results of the evaluation metrics per model are collected into four overview tables. 4. `VISUALIZATION` subworkflow: Plots are created summarizing the results. -5. [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +5. [Pipeline information](#pipeline-information): Report metrics generated during the workflow execution ### Subworkflow `PREPROCESS_CUSTOM` @@ -252,4 +257,4 @@ All plots are created in the `visualization` subworkflow. They are saved in the -[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. +[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times, and resource usage. diff --git a/docs/usage.md b/docs/usage.md index 698c243..c216bef 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -145,22 +145,66 @@ The following models are available: | SuperFELTR | Published Model | Single-Drug Model | Regression extension of [SuperFELT: supervised feature extraction learning using triplet loss for drug response](https://doi.org/10.1186/s12859-021-04146-z) by Park et al. Very similar to MOLI(R). In MOLI(R), encoders and the classifier were trained jointly. Super.FELT(R) trains them independently. MOLI(R) was trained without feature selection (except for the Variance Threshold on the gene expression). Super.FELT(R) uses feature selection for all omics data. | | DIPK | Published Model | Multi-Drug Model | [Deep neural network Integrating Prior Knowledge](https://doi.org/10.1093/bib/bbae153) from Li et al. Uses gene interaction relationships (encoded by a graph auto-encoder), gene expression profiles (encoded by a denoising auto-encoder), and molecular topologies (encoded by MolGNet). Those features are integrated using multi-head attention layers. | -#### Custom models +### Custom models If you want to use your own model, you must contribute it to drevalpy. Please follow the following steps: 1. Fork the [drevalpy repository](https://github.com/daisybio/drevalpy) -2. Create a mamba environment: `mamba create -n drevalpy python=3.12` +2. Create a mamba environment: `mamba create -n drevalpy python=3.13` 3. Install the dependencies: - Run: `pip install poetry` - Then run: `poetry install` 4. Implement your model (for more information on that, check the [ReadTheDocs](https://drevalpy.readthedocs.io/en/latest/runyourmodel.html)) -5. Test your model with the tests in `tests/`. Also implement your own tests. +5. Test your model with the tests in `tests/`. Also, implement your own tests. 6. (You can then open a PR to the main repository for contributing your model) 7. Install drevalpy into your environment: `pip install -e .` 8. From your environment, try to run the pipeline: `nextflow run nf-core/drugresponseeval -r dev -profile test` 9. If everything works, try running your model: `nextflow run nf-core/drugresponseeval -r dev --models --dataset_name ` +### Saving a production model + +If you want to save a production model, you can set the `--final_model_on_full_data` flag. This will save the model trained on the full dataset in the results directory. +The model can later be loaded using the implemented load functions of the drevalpy models. +Here is an example of how to load a GradientBoosting model that was saved in the `results` directory: + +```python +from drevalpy.models import MODEL_FACTORY + +model_class = MODEL_FACTORY["GradientBoosting"] +# provide the path to the final_model directory +gb_model = model_class.load('results/test_run/LCO/GradientBoosting/final_model/') +``` + +You can then investigate the sklearn HistGradientBoostingRegressor model saved in `gb_model.model`. +You can then either use `drevalpy` functions to predict responses for new data or use the model directly with `sklearn` functions. + +With `drevalpy`: + +```python +from drevalpy.datasets.dataset import DrugResponseDataset +# first load the new data which must have the 'measure' column and the cell line and drug identifiers ('cell_line_name', 'pubchem_id'). +# The tissue column is optional. +new_dataset = DrugResponseDataset.from_csv(input_file='path/to/new_data.csv', dataset_name='my_new_data', + measure='LN_IC50', tissue_column='tissue') +# In the path_to_features directory, we expect a directory called like the dataset_name (here my_new_data), which contains the cell line and drug features. +path_to_features = 'path/to/cell_line_and_drug_features/' +cl_features = gb_model.load_cell_line_features(data_path=path_to_features, dataset_name='my_new_data') +drug_features = gb_model.load_drug_features(data_path=path_to_features, dataset_name='my_new_data') +# Now we have to filter the dataset to only contain the cell lines and drugs that are in the features. +cell_lines_to_keep = cl_features.identifiers if cl_features is not None else None +drugs_to_keep = drug_features.identifiers if drug_features is not None else None +new_dataset.reduce_to(cell_line_ids=cell_lines_to_keep, drug_ids=drugs_to_keep) +# Now we can predict the responses for the new data. +new_dataset._predictions = gb_model.predict( + cell_line_ids=new_dataset.cell_line_ids, + drug_ids=new_dataset.drug_ids, + cell_line_input=cl_features, + drug_input=drug_features, +) +# This will create a csv with 'cell_line_name', 'pubchem_id', 'response', 'predictions', 'tissue' (if provided) columns. +new_dataset.to_csv('path/to/predictions.csv') +``` + ### Available Datasets The following datasets are available and can be supplied via `--dataset_name`: From e83aeda7fdac04ce7e96d915b0ee3b529fe46866 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 20 Jun 2025 15:25:11 +0200 Subject: [PATCH 254/257] this does not need resources --- modules/local/final_split/main.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/local/final_split/main.nf b/modules/local/final_split/main.nf index fba90f6..35c16fd 100644 --- a/modules/local/final_split/main.nf +++ b/modules/local/final_split/main.nf @@ -1,7 +1,6 @@ process FINAL_SPLIT { tag { "${model_name}_${test_mode}_gpu:${task.ext.use_gpu}" } - label 'process_high' - label 'process_gpu' + label 'process_single' conda "${moduleDir}/env.yml" From 782798ee2dd03e64d83c55fe88c6859f43a9185e Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Fri, 20 Jun 2025 16:15:16 +0200 Subject: [PATCH 255/257] forgot response transformation on training final model --- bin/train_final_model.py | 8 +++++++- modules/local/train_final_model/main.nf | 2 ++ subworkflows/local/model_testing/main.nf | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/bin/train_final_model.py b/bin/train_final_model.py index aa45447..03dd34b 100755 --- a/bin/train_final_model.py +++ b/bin/train_final_model.py @@ -9,6 +9,7 @@ from drevalpy.experiment import generate_data_saving_path, get_model_name_and_drug_id from drevalpy.models import MODEL_FACTORY +from drevalpy.utils import get_response_transformation def get_parser(): @@ -19,6 +20,7 @@ def get_parser(): parser.add_argument("--val_data", type=str, required=True, help="Validation data, pickled (output of final split).") parser.add_argument("--early_stop_data", type=str, required=True, help="Early stopping data, pickled (output of final split).") + parser.add_argument("--response_transformation", type=str, default="None", help="Response transformation.") parser.add_argument("--model_name", type=str, required=True, help="Model name.") parser.add_argument("--path_data", type=str, required=True, help="Path to data.") parser.add_argument("--model_checkpoint_dir", type=str, default="TEMPORARY", help="model checkpoint directory, if not provided: temporary directory is used") @@ -38,12 +40,16 @@ def get_parser(): result_path="", suffix="final_model" ) - + response_transform = get_response_transformation(args.response_transformation) train_dataset = pickle.load(open(args.train_data, "rb")) validation_dataset = pickle.load(open(args.val_data, "rb")) es_dataset = pickle.load(open(args.early_stop_data, "rb")) train_dataset.add_rows(validation_dataset) train_dataset.shuffle(random_state=42) + if response_transform: + train_dataset.fit_transform(response_transform) + if es_dataset is not None: + es_dataset.transform(response_transform) best_hpam_combi = yaml.load(open(args.best_hpam_combi, "r"), Loader=yaml.FullLoader)[f'{model_name}_final']['best_hpam_combi'] model = MODEL_FACTORY[model_name]() diff --git a/modules/local/train_final_model/main.nf b/modules/local/train_final_model/main.nf index 11bb435..a1f28e5 100644 --- a/modules/local/train_final_model/main.nf +++ b/modules/local/train_final_model/main.nf @@ -7,6 +7,7 @@ process TRAIN_FINAL_MODEL { input: tuple val(model_name), val(test_mode), path(best_hpam_combi), path(train_data), path(val_data), path(early_stop_data), path(path_data) + val response_transformation val model_checkpoint_dir @@ -20,6 +21,7 @@ process TRAIN_FINAL_MODEL { --train_data $train_data \\ --val_data $val_data \\ --early_stop_data $early_stop_data \\ + --response_transformation "${response_transformation}" \\ --model_name "${model_name}" \\ --path_data $path_data \\ --model_checkpoint_dir $model_checkpoint_dir \\ diff --git a/subworkflows/local/model_testing/main.nf b/subworkflows/local/model_testing/main.nf index bc6879f..6e579cf 100644 --- a/subworkflows/local/model_testing/main.nf +++ b/subworkflows/local/model_testing/main.nf @@ -150,6 +150,7 @@ workflow MODEL_TESTING { .combine(work_path) TRAIN_FINAL_MODEL ( ch_final_model, + params.response_transformation, params.model_checkpoint_dir ) ch_versions = ch_versions.mix(TRAIN_FINAL_MODEL.out.versions) From 430b13cefede62822e60c4df83ed97f9ffd9ef03 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 23 Jun 2025 13:46:55 +0200 Subject: [PATCH 256/257] drevalpy v 1.3.4 --- .github/PULL_REQUEST_TEMPLATE.md | 6 +++ CHANGELOG.md | 2 +- env.yml | 8 --- modules/local/collect_results/env.yml | 2 +- modules/local/consolidate_results/env.yml | 2 +- modules/local/cv_split/env.yml | 2 +- modules/local/evaluate_final/env.yml | 2 +- modules/local/evaluate_find_max/env.yml | 2 +- modules/local/final_split/env.yml | 2 +- modules/local/hpam_split/env.yml | 2 +- modules/local/load_response/env.yml | 2 +- modules/local/make_model_channel/env.yml | 2 +- .../postprocess_curvecurator_output/env.yml | 2 +- modules/local/predict_full/env.yml | 2 +- .../local/preprocess_raw_viability/env.yml | 2 +- modules/local/randomization_split/env.yml | 2 +- modules/local/randomization_test/env.yml | 2 +- modules/local/robustness_test/env.yml | 2 +- modules/local/train_and_predict_cv/env.yml | 2 +- modules/local/train_final_model/env.yml | 2 +- modules/local/tune_final_model/env.yml | 2 +- modules/local/visualize_results/env.yml | 2 +- nextflow.config | 3 +- tests/default.nf.test.snap | 50 +++++++++---------- 24 files changed, 52 insertions(+), 55 deletions(-) delete mode 100644 env.yml diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 14c0f79..7d76335 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -24,3 +24,9 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/drug - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. - [ ] `README.md` is updated (including new tool citations and authors/contributors). + +## Checklist if the drevalpy version was updated + +- [ ] Update all `env.yml` files with the new version in the module files. +- [ ] Update the `process.container` in the nextflow.config file. +- [ ] Delete tests/default.nf.test.snap and run `./nf-test test tests/ --profile=+ --verbose` diff --git a/CHANGELOG.md b/CHANGELOG.md index 9413a11..59b1667 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 - Fixed errors that arose from the latest drevalpy version. - Added authors and licenses to the python scripts. - Moved all publishDir directives to modules.config. -- Fixed drevalpy versions in conda and docker to 1.3.3: now supporting Python 3.13 +- Fixed drevalpy versions in conda and docker to 1.3.4: now supporting Python 3.13 - Added no_hyperparameter_tuning option for quick runs without hyperparameter tuning. - Flag final_model_on_full data: if True, a final/production model is saved in the results directory. If hyperparameter_tuning is true, the final model is tuned, too. The model can later be loaded using the implemented load functions of the drevalpy models. diff --git a/env.yml b/env.yml deleted file mode 100644 index ee4d55e..0000000 --- a/env.yml +++ /dev/null @@ -1,8 +0,0 @@ -name: nf-core-drugresponseeval -channels: - - conda-forge -dependencies: - - python=3.13 - - pip - - pip: - - drevalpy==1.3.3 diff --git a/modules/local/collect_results/env.yml b/modules/local/collect_results/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/collect_results/env.yml +++ b/modules/local/collect_results/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/consolidate_results/env.yml b/modules/local/consolidate_results/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/consolidate_results/env.yml +++ b/modules/local/consolidate_results/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/cv_split/env.yml b/modules/local/cv_split/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/cv_split/env.yml +++ b/modules/local/cv_split/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/evaluate_final/env.yml b/modules/local/evaluate_final/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/evaluate_final/env.yml +++ b/modules/local/evaluate_final/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/evaluate_find_max/env.yml b/modules/local/evaluate_find_max/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/evaluate_find_max/env.yml +++ b/modules/local/evaluate_find_max/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/final_split/env.yml b/modules/local/final_split/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/final_split/env.yml +++ b/modules/local/final_split/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/hpam_split/env.yml b/modules/local/hpam_split/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/hpam_split/env.yml +++ b/modules/local/hpam_split/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/load_response/env.yml b/modules/local/load_response/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/load_response/env.yml +++ b/modules/local/load_response/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/make_model_channel/env.yml b/modules/local/make_model_channel/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/make_model_channel/env.yml +++ b/modules/local/make_model_channel/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/postprocess_curvecurator_output/env.yml b/modules/local/postprocess_curvecurator_output/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/postprocess_curvecurator_output/env.yml +++ b/modules/local/postprocess_curvecurator_output/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/predict_full/env.yml b/modules/local/predict_full/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/predict_full/env.yml +++ b/modules/local/predict_full/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/preprocess_raw_viability/env.yml b/modules/local/preprocess_raw_viability/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/preprocess_raw_viability/env.yml +++ b/modules/local/preprocess_raw_viability/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/randomization_split/env.yml b/modules/local/randomization_split/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/randomization_split/env.yml +++ b/modules/local/randomization_split/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/randomization_test/env.yml b/modules/local/randomization_test/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/randomization_test/env.yml +++ b/modules/local/randomization_test/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/robustness_test/env.yml b/modules/local/robustness_test/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/robustness_test/env.yml +++ b/modules/local/robustness_test/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/train_and_predict_cv/env.yml b/modules/local/train_and_predict_cv/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/train_and_predict_cv/env.yml +++ b/modules/local/train_and_predict_cv/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/train_final_model/env.yml b/modules/local/train_final_model/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/train_final_model/env.yml +++ b/modules/local/train_final_model/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/tune_final_model/env.yml b/modules/local/tune_final_model/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/tune_final_model/env.yml +++ b/modules/local/tune_final_model/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/modules/local/visualize_results/env.yml b/modules/local/visualize_results/env.yml index ee4d55e..c85aab7 100644 --- a/modules/local/visualize_results/env.yml +++ b/modules/local/visualize_results/env.yml @@ -5,4 +5,4 @@ dependencies: - python=3.13 - pip - pip: - - drevalpy==1.3.3 + - drevalpy==1.3.4 diff --git a/nextflow.config b/nextflow.config index 03e5384..6ee230a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -6,8 +6,7 @@ ---------------------------------------------------------------------------------------- */ -process.container = 'ghcr.io/daisybio/drevalpy:v1.3.3' -//process.conda = 'env.yml' +process.container = 'ghcr.io/daisybio/drevalpy:v1.3.4' // Global default params, used in configs params { diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index dbea2f0..6792612 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -5,89 +5,89 @@ { "COLLECT_RESULTS": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "pandas": "2.3.0" }, "CONSOLIDATE_RESULTS": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "pandas": "2.3.0" }, "CV_SPLIT": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "sklearn": "1.7.0", - "numpy": "2.3.0" + "numpy": "2.3.1" }, "EVALUATE_FINAL": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "pandas": "2.3.0", "sklearn": "1.7.0", - "numpy": "2.3.0", + "numpy": "2.3.1", "scipy": "1.15.3" }, "EVALUATE_FIND_MAX": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "pandas": "2.3.0", "sklearn": "1.7.0", - "numpy": "2.3.0", + "numpy": "2.3.1", "scipy": "1.15.3", "yaml": "6.0.2" }, "HPAM_SPLIT": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "yaml": "6.0.2" }, "LOAD_CS_RESPONSE": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "pandas": "2.3.0" }, "LOAD_RESPONSE": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "pandas": "2.3.0" }, "MAKE_BASELINES": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "sklearn": "1.7.0", - "numpy": "2.3.0", + "numpy": "2.3.1", "pandas": "2.3.0", - "pytorch_lightning": "2.5.1.post0", + "pytorch_lightning": "2.5.2", "torch": "2.7.1", "platform": "1.0.8" }, "MAKE_MODELS": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "sklearn": "1.7.0", - "numpy": "2.3.0", + "numpy": "2.3.1", "pandas": "2.3.0", - "pytorch_lightning": "2.5.1.post0", + "pytorch_lightning": "2.5.2", "torch": "2.7.1", "platform": "1.0.8" }, "PREDICT_FULL": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "sklearn": "1.7.0", - "numpy": "2.3.0", + "numpy": "2.3.1", "pandas": "2.3.0", - "pytorch_lightning": "2.5.1.post0", + "pytorch_lightning": "2.5.2", "torch": "2.7.1", "platform": "1.0.8" }, "TRAIN_AND_PREDICT_CV": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "sklearn": "1.7.0", - "numpy": "2.3.0", + "numpy": "2.3.1", "pandas": "2.3.0", - "pytorch_lightning": "2.5.1.post0", + "pytorch_lightning": "2.5.2", "torch": "2.7.1", "platform": "1.0.8" }, @@ -99,7 +99,7 @@ }, "VISUALIZE_RESULTS": { "python": "3.13.5", - "drevalpy": "1.3.3", + "drevalpy": "1.3.4", "pandas": "2.3.0", "matplotlib": "3.10.3", "plotly": "6.1.2", @@ -174,6 +174,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.3" }, - "timestamp": "2025-06-17T11:58:37.130763" + "timestamp": "2025-06-23T13:39:22.624" } } \ No newline at end of file From 668a60caceb42457ecb700ccd3386ddb87690004 Mon Sep 17 00:00:00 2001 From: Judith Bernett Date: Mon, 23 Jun 2025 13:51:46 +0200 Subject: [PATCH 257/257] removed PR TEMPLATE changes --- .github/PULL_REQUEST_TEMPLATE.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 7d76335..14c0f79 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -24,9 +24,3 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/drug - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. - [ ] `README.md` is updated (including new tool citations and authors/contributors). - -## Checklist if the drevalpy version was updated - -- [ ] Update all `env.yml` files with the new version in the module files. -- [ ] Update the `process.container` in the nextflow.config file. -- [ ] Delete tests/default.nf.test.snap and run `./nf-test test tests/ --profile=+ --verbose`
    Process Name \\", + " \\ Software Version
    CUSTOM_DUMPSOFTWAREVERSIONSpython3.13.1
    yaml6.0.2
    TOOL1tool10.11.9
    TOOL2tool21.9
    WorkflowNextflow