From c6653402778f17a4544b35022acefffc1833f3c5 Mon Sep 17 00:00:00 2001 From: Tarun karthik kumar Mamidi Date: Mon, 25 Oct 2021 16:43:40 -0500 Subject: [PATCH] Ditto pipeline just after CAGI6 project --- .gitignore | 19 +- README.md | 139 ++++++- annotation_parsing/parse_annotated_vars.py | 45 ++- configs/cluster_config.json | 16 + configs/columns_config.yaml | 295 ++++++++++++++ configs/envs/environment.yaml | 26 ++ configs/envs/testing.yaml | 24 ++ configs/testing.yaml | 159 ++++++++ dag.png | Bin 0 -> 36929 bytes docs/Pipeline.txt | 65 +++ docs/Plan-for-project.txt | 85 ++++ src/Ditto/combine_scores.py | 185 +++++++++ src/Ditto/filter.py | 194 +++++++++ src/Ditto/model.job | 30 ++ src/Ditto/predict.py | 110 +++++ src/Ditto/ranks.py | 73 ++++ src/Ditto/submission.py | 29 ++ src/predict_variant_score.sh | 21 + src/slurm-launch.py | 128 ++++++ src/slurm-template.sh | 70 ++++ src/training/data-prep/extract_class.py | 35 ++ src/training/data-prep/extract_variants.py | 67 +++ src/training/data-prep/filter.py | 380 ++++++++++++++++++ src/training/data-prep/parse_clinvar.py | 26 ++ src/training/training/ML_models.py | 232 +++++++++++ src/training/training/plot_roc.py | 123 ++++++ src/training/training/stacking.py | 209 ++++++++++ ...testing_variants_hg38_vep-annotated.vcf.gz | Bin 119862 -> 118179 bytes variant_annotation/README.md | 11 +- variant_annotation/src/Snakefile | 13 +- variant_annotation/src/run_pipeline.sh | 2 +- workflow/Snakefile | 140 +++++++ 32 files changed, 2916 insertions(+), 35 deletions(-) create mode 100644 configs/cluster_config.json create mode 100644 configs/columns_config.yaml create mode 100644 configs/envs/environment.yaml create mode 100644 configs/envs/testing.yaml create mode 100644 configs/testing.yaml create mode 100644 dag.png create mode 100644 docs/Pipeline.txt create mode 100644 docs/Plan-for-project.txt create mode 100644 src/Ditto/combine_scores.py create mode 100644 src/Ditto/filter.py create mode 100644 src/Ditto/model.job create mode 100644 src/Ditto/predict.py create mode 100644 src/Ditto/ranks.py create mode 100644 src/Ditto/submission.py create mode 100755 src/predict_variant_score.sh create mode 100644 src/slurm-launch.py create mode 100644 src/slurm-template.sh create mode 100644 src/training/data-prep/extract_class.py create mode 100644 src/training/data-prep/extract_variants.py create mode 100644 src/training/data-prep/filter.py create mode 100644 src/training/data-prep/parse_clinvar.py create mode 100644 src/training/training/ML_models.py create mode 100644 src/training/training/plot_roc.py create mode 100644 src/training/training/stacking.py create mode 100644 workflow/Snakefile diff --git a/.gitignore b/.gitignore index 5df7def..a1adfcd 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ __pycache__/ # Distribution / packaging .Python +#env/ build/ develop-eggs/ dist/ @@ -18,9 +19,18 @@ lib64/ parts/ sdist/ var/ +dask-worker-space/ *.egg-info/ .installed.cfg *.egg +*.err +*.out +*.db +*.py*.sh +*.tsv +*.csv +*.gz* + # PyInstaller # Usually these files are written by a python script from a template @@ -41,6 +51,7 @@ htmlcov/ nosetests.xml coverage.xml *,cover +*.pdf # Translations *.mo @@ -72,12 +83,13 @@ target/ .ipynb_checkpoints/ # exclude data from source control by default -# data/ -variant_annotation/data/ +/data/ +cagi*/ #snakemake .snakemake/ - +# data/ +variant_annotation/data/ # exclude test data used for development to_be_deleted/test_data/data/ref @@ -92,3 +104,4 @@ logs/ # .java/fonts dir get created when creating fastqc conda env .java/ +/.vscode/settings.json diff --git a/README.md b/README.md index e4e0f10..5af6ce5 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,140 @@ # DITTO -Diagnosis prediction tool using AI \ No newline at end of file +***!!! For research purposes only !!!*** + +- [DITTO](#ditto) + - [Data](#data) + - [Usage](#usage) + - [Installation](#installation) + - [Requirements](#requirements) + - [Activate conda environment](#activate-conda-environment) + - [Steps to run DITTO predictions](#steps-to-run-ditto-predictions) + - [Run VEP annotation](#run-vep-annotation) + - [Parse VEP annotations](#parse-vep-annotations) + - [Filter variants for Ditto prediction](#filter-variants-for-ditto-prediction) + - [DITTO prediction](#ditto-prediction) + - [Combine with Exomiser scores](#combine-with-exomiser-scores) + - [Cohort level analysis](#cohort-level-analysis) + - [Contact information](#contact-information) + +**Aim:** We aim to develop a pipeline for accurate and rapid prioritization of variants using patient’s genotype (VCF) and/or phenotype (HPO) information. + +## Data + +Input for this project is a single sample VCF file. This will be annotated using VEP and given to Ditto for predictions. + +## Usage + +### Installation + +Installation simply requires fetching the source code. Following are required: + +- Git + +To fetch source code, change in to directory of your choice and run: + +```sh +git clone -b master \ + --recurse-submodules \ + git@gitlab.rc.uab.edu:center-for-computational-genomics-and-data-science/sciops/ditto.git +``` + +### Requirements + +*OS:* + +Currently works only in Linux OS. Docker versions may need to be explored later to make it useable in Mac (and +potentially Windows). + +*Tools:* + +- Anaconda3 + - Tested with version: 2020.02 + +### Activate conda environment + +Change in to root directory and run the commands below: + +```sh +# create conda environment. Needed only the first time. +conda env create --file configs/envs/testing.yaml + +# if you need to update existing environment +conda env update --file configs/envs/testing.yaml + +# activate conda environment +conda activate testing +``` + +### Steps to run DITTO predictions + +Remove variants with `*` in `ALT Allele` column. These are called "Spanning or overlapping deletions" introduced in the VCF v4.3 specification. More on this [here](https://gatk.broadinstitute.org/hc/en-us/articles/360035531912-Spanning-or-overlapping-deletions-allele-). +Current version of VEP that we're using doesn't support these variants. We will work on this in our future release. + +```sh +bcftools annotate -e'ALT="*" || type!="snp"' path/to/indexed_vcf.gz -Oz -o path/to/indexed_vcf_filtered.vcf.gz +``` + +#### Run VEP annotation + +Please look at the steps to run VEP [here](variant_annotation/README.md) + + +#### Parse VEP annotations + +Please look at the steps to parse VEP annotations [here](annotation_parsing/README.md) + + +#### Filter variants for Ditto prediction + +Filtering step includes imputation and one-hot encoding of columns. + +```sh +python src/Ditto/filter.py -i path/to/parsed_vcf_file.tsv -O path/to/output_directory +``` + +Output from this step includes - + +```directory +output_directory/ +├── data.csv <--- used for Ditto predictions +├── Nulls.csv - indicates number of Nulls in each column +├── stats_nssnv.csv - variant stats from the vcf +├── correlation_plot.pdf- Plot to check if any columns are directly correlated (cutoff >0.95) +└── columns.csv - columns before and after filtering step + +``` + +#### Ditto prediction + +```sh +python src/Ditto/predict.py -i path/to/output_directory/data.csv --sample sample_name -o path/to/output_directory/ditto_predictions.csv -o100 .path/to/output_directory/ditto_predictions_100.csv +``` + +#### Combine with Exomiser scores + +If phenotype terms are present for the sample, one could use Exomiser to rank genes and then prioritize Ditto predictions according to the phenotype. Once you have Exomiser scores, please run the following command to combine Exomiser and Ditto scores + +```sh +python src/Ditto/combine_scores.py --raw .path/to/parsed_vcf_file.tsv --sample sample_name --ditto path/to/output_directory/ditto_predictions.csv -ep path/to/exomiser_scores/directory -o .path/to/output_directory/predictions_with_exomiser.csv -o100 path/to/output_directory/predictions_with_exomiser_100.csv +``` + + +### Cohort level analysis + +Please refer to [CAGI6-RGP](https://gitlab.rc.uab.edu/center-for-computational-genomics-and-data-science/sciops/mana/mini_projects/rgp_cagi6) project for filtering and annotation of variants as done above for single sample VCF along with calculating Exomiser scores. + +For predictions, make necessary directory edits to the snakemake [workflow](workflow/Snakefile) and run the following command. + +```sh +sbatch src/predict_variant_score.sh +``` + +**Note**: The commit used for CAGI6 challenge pipeline is [be97cf5d](https://gitlab.rc.uab.edu/center-for-computational-genomics-and-data-science/sciops/ditto/-/merge_requests/3/diffs?commit_id=be97cf5dbfcb099ac82ef28d5d8b0919f28aed99). It was used along with annotated VCFs and exomiser scores obtained from [rgp_cagi6 workflow](https://gitlab.rc.uab.edu/center-for-computational-genomics-and-data-science/sciops/mana/mini_projects/rgp_cagi6). + + +## Contact information + +For issues, please send an email with clear description to + +Tarun Mamidi - tmamidi@uab.edu diff --git a/annotation_parsing/parse_annotated_vars.py b/annotation_parsing/parse_annotated_vars.py index dc94f88..3ed4147 100644 --- a/annotation_parsing/parse_annotated_vars.py +++ b/annotation_parsing/parse_annotated_vars.py @@ -17,10 +17,10 @@ def parse_n_print(vcf, outfile): output_header = ["Chromosome", "Position", "Reference Allele", "Alternate Allele"] + \ line.replace(" Allele|"," VEP_Allele_Identifier|").split("Format: ")[1].rstrip(">").rstrip('"').split("|") elif line.startswith("#CHROM"): - vcf_header = line.split("\t") + vcf_header = line.split("\t") else: break - + for idx, sample in enumerate(vcf_header): if idx > 8: output_header.append(f"{sample} allele depth") @@ -36,7 +36,8 @@ def parse_n_print(vcf, outfile): line = line.rstrip("\n") cols = line.split("\t") csq = parse_csq(next(filter(lambda info: info.startswith("CSQ="),cols[7].split(";"))).replace("CSQ=","")) - var_info = parse_var_info(vcf_header, cols) + #print(line, file=open("var_info.txt", "w")) + #var_info = parse_var_info(vcf_header, cols) alt_alleles = cols[4].split(",") alt2csq = format_alts_for_csq_lookup(cols[3], alt_alleles) for alt_allele in alt_alleles: @@ -45,14 +46,14 @@ def parse_n_print(vcf, outfile): possible_alt_allele4lookup = alt_allele try: write_parsed_variant( - out, - vcf_header, - cols[0], - cols[1], - cols[3], - alt_allele, - csq[possible_alt_allele4lookup], - var_info[alt_allele] + out, + vcf_header, + cols[0], + cols[1], + cols[3], + alt_allele, + csq[possible_alt_allele4lookup] + #,var_info[alt_allele] ) except KeyError: print("Variant annotation matching based on allele failed!") @@ -62,15 +63,15 @@ def parse_n_print(vcf, outfile): raise SystemExit(1) -def write_parsed_variant(out_fp, vcf_header, chr, pos, ref, alt, annots, var_info): +def write_parsed_variant(out_fp, vcf_header, chr, pos, ref, alt, annots):#, var_info): var_list = [chr, pos, ref, alt] for annot_info in annots: full_fmt_list = var_list + annot_info - for idx, sample in enumerate(vcf_header): - if idx > 8: - full_fmt_list.append(str(var_info[sample]["alt_depth"])) - full_fmt_list.append(str(var_info[sample]["total_depth"])) - full_fmt_list.append(str(var_info[sample]["prct_reads"])) + #for idx, sample in enumerate(vcf_header): + # if idx > 8: + # full_fmt_list.append(str(var_info[sample]["alt_depth"])) + # full_fmt_list.append(str(var_info[sample]["total_depth"])) + # full_fmt_list.append(str(var_info[sample]["prct_reads"])) out_fp.write("\t".join(full_fmt_list) + "\n") @@ -103,9 +104,9 @@ def parse_csq(csq): parsed_annot = annot.split("|") if parsed_annot[0] not in csq_allele_dict: csq_allele_dict[parsed_annot[0]] = list() - + csq_allele_dict[parsed_annot[0]].append(parsed_annot) - + return csq_allele_dict @@ -129,13 +130,13 @@ def parse_var_info(headers, cols): alt_depth = int(ad_info[alt_index + 1]) total_depth = sum([int(dp) for dp in ad_info]) prct_reads = (alt_depth / total_depth) * 100 - + allele_dict[sample] = { "alt_depth": alt_depth, "total_depth": total_depth, "prct_reads": prct_reads } - + parsed_alleles[alt_allele] = allele_dict return parsed_alleles @@ -184,5 +185,5 @@ def is_valid_file(p, arg): inputf = Path(ARGS.input_vcf) outputf = Path(ARGS.output) if ARGS.output else inputf.parent / inputf.stem.rstrip(".vcf") + ".tsv" - + parse_n_print(inputf, outputf) diff --git a/configs/cluster_config.json b/configs/cluster_config.json new file mode 100644 index 0000000..12fec63 --- /dev/null +++ b/configs/cluster_config.json @@ -0,0 +1,16 @@ +{ + "__default__": { + "ntasks": 1, + "partition": "express", + "cpus-per-task": "{threads}", + "mem-per-cpu": "4G", + "output": "logs/rule_logs/{rule}-%j.log" + }, + "ditto_filter": { + "partition": "largemem", + "mem-per-cpu": "200G" + }, + "combine_scores": { + "mem-per-cpu": "50G" + } +} diff --git a/configs/columns_config.yaml b/configs/columns_config.yaml new file mode 100644 index 0000000..d4ecc19 --- /dev/null +++ b/configs/columns_config.yaml @@ -0,0 +1,295 @@ +# columns to be needed in dataset +columns: + - Chromosome + - Position + - Reference Allele + - Alternate Allele + - Consequence + - IMPACT + - SYMBOL + - Feature + - BIOTYPE + - SIFT + - PolyPhen + - CADD_PHRED + - CADD_RAW + - DANN_score + - Eigen-PC-phred_coding + - Eigen-PC-raw_coding + - Eigen-PC-raw_coding_rankscore + - Eigen-phred_coding + - Eigen-raw_coding + - Eigen-raw_coding_rankscore + - FATHMM_score + - GERP++_RS + - GenoCanyon_score + - LRT_score + - M-CAP_score + - MetaLR_score + - MetaSVM_score + - MutationAssessor_score + - MutationTaster_score + - PROVEAN_score + - SiPhy_29way_logOdds + - VEST4_score + - fathmm-MKL_coding_score + - integrated_fitCons_score + - phastCons100way_vertebrate + - phastCons30way_mammalian + - phyloP100way_vertebrate + - phyloP30way_mammalian + - GERP + - gnomADv3_AF + - gnomADv3_AF_afr + - gnomADv3_AF_afr_female + - gnomADv3_AF_afr_male + - gnomADv3_AF_ami + - gnomADv3_AF_ami_female + - gnomADv3_AF_ami_male + - gnomADv3_AF_amr + - gnomADv3_AF_amr_female + - gnomADv3_AF_amr_male + - gnomADv3_AF_asj + - gnomADv3_AF_asj_female + - gnomADv3_AF_asj_male + - gnomADv3_AF_eas + - gnomADv3_AF_eas_female + - gnomADv3_AF_eas_male + - gnomADv3_AF_female + - gnomADv3_AF_fin + - gnomADv3_AF_fin_female + - gnomADv3_AF_fin_male + - gnomADv3_AF_male + - gnomADv3_AF_nfe + - gnomADv3_AF_nfe_female + - gnomADv3_AF_nfe_male + - gnomADv3_AF_oth + - gnomADv3_AF_oth_female + - gnomADv3_AF_oth_male + - gnomADv3_AF_raw + - gnomADv3_AF_sas + - gnomADv3_AF_sas_female + - gnomADv3_AF_sas_male + - clinvar_CLNREVSTAT + - clinvar_CLNSIG + - hgmd_class + +ClinicalSignificance: + - DP + - DFP + - FP + - DM? + - DM + - Benign + - Benign/Likely_benign + - Pathogenic/Likely_pathogenic + - Pathogenic + - Likely_pathogenic + - Likely_benign + +Clinsig_train: + - Pathogenic/Likely_pathogenic + - DM + - Benign + - Pathogenic + - Likely_benign + - Likely_pathogenic + +Clinsig_test: + + - DM? + - DP + - DFP + - FP + - Benign/Likely_benign + + +CLNREVSTAT: #https://www.ncbi.nlm.nih.gov/clinvar/docs/review_status/ + - practice_guideline + - reviewed_by_expert_panel + - criteria_provided,_multiple_submitters,_no_conflicts + - criteria_provided,_single_submitter + +col_conv: + - MutationTaster_score + - MutationAssessor_score + - PROVEAN_score + - VEST4_score + - FATHMM_score + - GERP + +ML_VAR: + - SYMBOL + - Feature + - Consequence + - clinvar_CLNREVSTAT + - clinvar_CLNSIG + - Chromosome + - Position + - Alternate Allele + - Reference Allele + - ID + +var: + - SYMBOL + - Feature + - Consequence + - clinvar_CLNREVSTAT + - clinvar_CLNSIG + - Chromosome + - Position + - Alternate Allele + - Reference Allele + +Consequence: + - missense_variant + - missense_variant&splice_region_variant + - stop_gained + - start_lost&NMD_transcript_variant + - start_lost + - stop_gained&splice_region_variant + - stop_gained&NMD_transcript_variant + - missense_variant&splice_region_variant&NMD_transcript_variant + - stop_gained&splice_region_variant&NMD_transcript_variant + - start_lost&splice_region_variant + - stop_lost&splice_region_variant + - stop_lost&splice_region_variant&NMD_transcript_variant + - splice_donor_variant&missense_variant + - start_lost&splice_region_variant&NMD_transcript_variant + +gnomad_columns: + - gnomADv3_AF + - gnomADv3_AF_afr + - gnomADv3_AF_afr_female + - gnomADv3_AF_afr_male + - gnomADv3_AF_ami + - gnomADv3_AF_ami_female + - gnomADv3_AF_ami_male + - gnomADv3_AF_amr + - gnomADv3_AF_amr_female + - gnomADv3_AF_amr_male + - gnomADv3_AF_asj + - gnomADv3_AF_asj_female + - gnomADv3_AF_asj_male + - gnomADv3_AF_eas + - gnomADv3_AF_eas_female + - gnomADv3_AF_eas_male + - gnomADv3_AF_female + - gnomADv3_AF_fin + - gnomADv3_AF_fin_female + - gnomADv3_AF_fin_male + - gnomADv3_AF_male + - gnomADv3_AF_nfe + - gnomADv3_AF_nfe_female + - gnomADv3_AF_nfe_male + - gnomADv3_AF_oth + - gnomADv3_AF_oth_female + - gnomADv3_AF_oth_male + - gnomADv3_AF_raw + - gnomADv3_AF_sas + - gnomADv3_AF_sas_female + - gnomADv3_AF_sas_male + +nssnv_columns: + SIFT: 0.5 + PolyPhen: 0.5 + CADD_PHRED: 20 + MetaSVM_score: 0.5 # range - -2 to 3 + FATHMM_score: 0 #weighted for human inherited- disease mutations with Disease Ontology (FATHMMori). Scores range from -18.09 to 11.0. This is for coding and MKL for non-coding variants + MutationAssessor_score: 0 #MutationAssessor functional impact combined score (MAori). The score ranges from -5.135 to 6.49 in dbNSFP. + PROVEAN_score: 0 # range - -14 to 13.57 + VEST4_score: 0.5 # range - 0 to 1 + GERP: 0 #ranges from -12.36 to 6.18 + MutationTaster_score: 0.5 + DANN_score: 0.5 + Eigen-PC-phred_coding: 20 + Eigen-PC-raw_coding: 0 #functional annotations. input range - -3.252 to 8.426. + Eigen-PC-raw_coding_rankscore: 0 + Eigen-phred_coding: 20 + Eigen-raw_coding: 0 + Eigen-raw_coding_rankscore: 0 + GERP++_RS: 0 + GenoCanyon_score: 0.5 + LRT_score: 0.5 #The score ranges from 0 to 1 and a larger score signifies that the codon is more constrained or a NS is more likely to be deleterious. + M-CAP_score: 0.5 # range - 0 to 1 + MetaLR_score: 0.5 # range - 0 to 1 + SiPhy_29way_logOdds: 15 # input range - 0 to 33.272. SiPhy score based on 29 mammals genomes. The larger the score, the more conserved the site. + fathmm-MKL_coding_score: 0.5 # range - 0 to 1. This is for non-coding variants - functional prediction tool + integrated_fitCons_score: 0.5 # range - 0 to 1 + phastCons100way_vertebrate: 0.5 + phastCons30way_mammalian: 0.5 + phyloP100way_vertebrate: 20 + phyloP30way_mammalian: 20 + IMPACT_HIGH: 0 + IMPACT_LOW: 0 + IMPACT_MODERATE: 0 + IMPACT_MODIFIER: 0 + BIOTYPE_RNase_MRP_RNA: 0 + BIOTYPE_RNase_P_RNA: 0 + BIOTYPE_antisense_RNA: 0 + BIOTYPE_guide_RNA: 0 + BIOTYPE_lncRNA: 0 + BIOTYPE_miRNA: 0 + BIOTYPE_misc_RNA: 0 + BIOTYPE_ncRNA_pseudogene: 0 + BIOTYPE_protein_coding: 0 + BIOTYPE_scRNA: 0 + BIOTYPE_snRNA: 0 + BIOTYPE_snoRNA: 0 + BIOTYPE_telomerase_RNA: 0 + BIOTYPE_transcribed_pseudogene: 0 + BIOTYPE_nonsense_mediated_decay: 0 + BIOTYPE_polymorphic_pseudogene: 0 + BIOTYPE_IG_C_gene: 0 + BIOTYPE_non_stop_decay: 0 + +non_nssnv_columns: + CADD_PHRED: 20 + GERP: 0 + IMPACT_HIGH: 0 + IMPACT_LOW: 0 + IMPACT_MODERATE: 0 + IMPACT_MODIFIER: 0 + BIOTYPE_RNase_MRP_RNA: 0 + BIOTYPE_RNase_P_RNA: 0 + BIOTYPE_antisense_RNA: 0 + BIOTYPE_guide_RNA: 0 + BIOTYPE_lncRNA: 0 + BIOTYPE_miRNA: 0 + BIOTYPE_misc_RNA: 0 + BIOTYPE_protein_coding: 0 + BIOTYPE_snRNA: 0 + BIOTYPE_snoRNA: 0 + BIOTYPE_transcribed_pseudogene: 0 + +nssnv_median_3_0_1: + gnomADv3_AF: 0 + SIFT: 0.02 + PolyPhen: 0.757 + CADD_PHRED: 25.3 + DANN_score: 0.995325924 + Eigen-PC-phred_coding: 4.859703 + Eigen-PC-raw_coding: 0.465540408 + FATHMM_score: -1.26 + GERP++_RS: 4.73 + GenoCanyon_score: 0.999998451 + LRT_score: 2.30E-05 + M-CAP_score: 0.226631 + MetaSVM_score: -0.1847 + MutationAssessor_score: 2.215 + MutationTaster_score: 1 + PROVEAN_score: -2.88 + SiPhy_29way_logOdds: 13.8644 + VEST4_score: 0.762 + fathmm-MKL_coding_score: 0.94206 + integrated_fitCons_score: 0.675202 + phastCons100way_vertebrate: 1 + phastCons30way_mammalian: 0.99 + phyloP100way_vertebrate: 4.564 + phyloP30way_mammalian: 1.026 + GERP: 5.67 + IMPACT_HIGH: 0 + BIOTYPE_IG_C_gene: 0 + BIOTYPE_non_stop_decay: 0 + BIOTYPE_polymorphic_pseudogene: 0 + BIOTYPE_protein_coding: 1 diff --git a/configs/envs/environment.yaml b/configs/envs/environment.yaml new file mode 100644 index 0000000..8bdfe13 --- /dev/null +++ b/configs/envs/environment.yaml @@ -0,0 +1,26 @@ +name: training + +channels: + - conda-forge + - anaconda + +dependencies: + - python=3.8.5 + - pandas=1.2.1 + - numpy=1.18.5 + - optuna=2.5.0 + - scikit-learn=0.24.1 + - imbalanced-learn=0.7.0 + - scipy=1.4.1 + - shap=0.37.0 + - pip + - gpy=1.9.9 + - scikit-optimize=0.8.1 + - hyperopt=0.2.5 + - tune-sklearn=0.2.1 + - seaborn=0.11.2 + - pip: + - ray==1.6.0 + - ray[tune] + - tensorflow-gpu==2.3 + - lz4==3.1.3 diff --git a/configs/envs/testing.yaml b/configs/envs/testing.yaml new file mode 100644 index 0000000..7e5100f --- /dev/null +++ b/configs/envs/testing.yaml @@ -0,0 +1,24 @@ +name: testing + +channels: + - conda-forge + - anaconda + - bioconda + +dependencies: + - python=3.9.7 + - pandas=1.3.3 + - numpy=1.19.5 + - scikit-learn=0.24.2 + - imbalanced-learn=0.7.0 + - scipy=1.7.1 + - shap=0.39.0 + - bcftools=1.13 + - pip=21.2.4 + - bioconda::snakefmt==0.4.0 + - bioconda::snakemake==6.0.5 + - seaborn=0.11.2 + - black=20.8b1 + - pylint=2.11.1 + - lz4=3.1.3 + - gpy=1.10.0 diff --git a/configs/testing.yaml b/configs/testing.yaml new file mode 100644 index 0000000..175c398 --- /dev/null +++ b/configs/testing.yaml @@ -0,0 +1,159 @@ +# columns to be needed in dataset +columns: + - Chromosome + - Position + - Reference Allele + - Alternate Allele + - Consequence + - Gene + - HGNC_ID + - IMPACT + - SYMBOL + - Feature + - BIOTYPE + - SIFT + - PolyPhen + - CADD_PHRED + - CADD_RAW + - DANN_score + - Eigen-PC-phred_coding + - Eigen-PC-raw_coding + - Eigen-PC-raw_coding_rankscore + - Eigen-phred_coding + - Eigen-raw_coding + - Eigen-raw_coding_rankscore + - FATHMM_score + - GERP++_RS + - GenoCanyon_score + - LRT_score + - M-CAP_score + - MetaLR_score + - MetaSVM_score + - MutationAssessor_score + - MutationTaster_score + - PROVEAN_score + - SiPhy_29way_logOdds + - VEST4_score + - fathmm-MKL_coding_score + - integrated_fitCons_score + - phastCons100way_vertebrate + - phastCons30way_mammalian + - phyloP100way_vertebrate + - phyloP30way_mammalian + - GERP + - gnomADv3_AF + - gnomADv3_AF_afr + - gnomADv3_AF_afr_female + - gnomADv3_AF_afr_male + - gnomADv3_AF_ami + - gnomADv3_AF_ami_female + - gnomADv3_AF_ami_male + - gnomADv3_AF_amr + - gnomADv3_AF_amr_female + - gnomADv3_AF_amr_male + - gnomADv3_AF_asj + - gnomADv3_AF_asj_female + - gnomADv3_AF_asj_male + - gnomADv3_AF_eas + - gnomADv3_AF_eas_female + - gnomADv3_AF_eas_male + - gnomADv3_AF_female + - gnomADv3_AF_fin + - gnomADv3_AF_fin_female + - gnomADv3_AF_fin_male + - gnomADv3_AF_male + - gnomADv3_AF_nfe + - gnomADv3_AF_nfe_female + - gnomADv3_AF_nfe_male + - gnomADv3_AF_oth + - gnomADv3_AF_oth_female + - gnomADv3_AF_oth_male + - gnomADv3_AF_raw + - gnomADv3_AF_sas + - gnomADv3_AF_sas_female + - gnomADv3_AF_sas_male + - clinvar_CLNREVSTAT + - clinvar_CLNSIG + +col_conv: + - MutationTaster_score + - MutationAssessor_score + - PROVEAN_score + - VEST4_score + - FATHMM_score + - GERP + +ML_VAR: + - SYMBOL + - Feature + - Consequence + - Gene + - HGNC_ID + - clinvar_CLNREVSTAT + - clinvar_CLNSIG + - Chromosome + - Position + - Alternate Allele + - Reference Allele + #- ID + +var: + - SYMBOL + - Feature + - Consequence + - Gene + - HGNC_ID + - clinvar_CLNREVSTAT + - clinvar_CLNSIG + - Chromosome + - Position + - Alternate Allele + - Reference Allele + +Consequence: + - missense_variant + - missense_variant&splice_region_variant + - stop_gained + - start_lost&NMD_transcript_variant + - start_lost + - stop_gained&splice_region_variant + - stop_gained&NMD_transcript_variant + - missense_variant&splice_region_variant&NMD_transcript_variant + - stop_gained&splice_region_variant&NMD_transcript_variant + - start_lost&splice_region_variant + - stop_lost&splice_region_variant + - stop_lost&splice_region_variant&NMD_transcript_variant + - splice_donor_variant&missense_variant + - start_lost&splice_region_variant&NMD_transcript_variant + +nssnv_median_3_0_1: + gnomADv3_AF: 0 + SIFT: 0.02 + PolyPhen: 0.757 + CADD_PHRED: 25.3 + DANN_score: 0.995325924 + Eigen-PC-phred_coding: 4.859703 + Eigen-PC-raw_coding: 0.465540408 + FATHMM_score: -1.26 + GERP++_RS: 4.73 + GenoCanyon_score: 0.999998451 + LRT_score: 2.30E-05 + M-CAP_score: 0.226631 + MetaSVM_score: -0.1847 + MutationAssessor_score: 2.215 + MutationTaster_score: 1 + PROVEAN_score: -2.88 + SiPhy_29way_logOdds: 13.8644 + VEST4_score: 0.762 + fathmm-MKL_coding_score: 0.94206 + integrated_fitCons_score: 0.675202 + phastCons100way_vertebrate: 1 + phastCons30way_mammalian: 0.99 + phyloP100way_vertebrate: 4.564 + phyloP30way_mammalian: 1.026 + GERP: 5.67 + IMPACT_HIGH: 0 + BIOTYPE_IG_C_gene: 0 + BIOTYPE_non_stop_decay: 0 + BIOTYPE_polymorphic_pseudogene: 0 + BIOTYPE_protein_coding: 1 diff --git a/dag.png b/dag.png new file mode 100644 index 0000000000000000000000000000000000000000..25841e4b614b67d86916489e2e7adac2dd1897cb GIT binary patch literal 36929 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 literal 0 HcmV?d00001 diff --git a/docs/Pipeline.txt b/docs/Pipeline.txt new file mode 100644 index 0000000..769fdd0 --- /dev/null +++ b/docs/Pipeline.txt @@ -0,0 +1,65 @@ +** Current workflow: ** +`module load Anaconda3/2020.02 +module load tabix +module load BCFtools` +Download Clinvar (2/21/21 ) - + `wget -P /data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/external/ https://ftp.ncbi.nlm.nih.gov/pub/clinvar/vcf_GRCh38/clinvar.vcf.gz + tabix -fp vcf clinvar.vcf.gz ` +Check chromosomes and keep note for modifications - + `zgrep -v ^# clinvar.vcf.gz | cut -f1 -d$'\t' | sort -u` +Copy HGMD VCF - + `cp /data/project/worthey_lab/manual_datasets_central/hgmd/2020q4/hgmd_pro_2020.4_hg38.vcf ./` +Check chromosomes and keep note for modifications - + `grep -v ^# hgmd_pro_2020.4_hg38.vcf | cut -f1 -d$'\t' | sort -u` +Fix the INFO column and index for merging - + `sed -E 's/(^[^#]+)(=")([^;"]+)(;)+([^;]*?)(")/\1\2\3%3B\5\6/' hgmd_pro_2020.4_hg38.vcf > hgmd_pro_2020.4_hg38_fixed_info.vcf` + bgzip -c hgmd_pro_2020.4_hg38_fixed_info.vcf > hgmd_pro_2020.4_hg38_fixed_info.vcf.gz + tabix -fp vcf hgmd_pro_2020.4_hg38_fixed_info.vcf.gz ` +Merge Clinvar and HGMD - + `bcftools merge clinvar.vcf.gz hgmd_pro_2020.4_hg38_fixed_info.vcf.gz -Ov -o ../interim/merged.vcf` +Add `chr` to chromosomes columns - + `sed -E -i 's/(^[^#]+)/chr\1/' ../interim/merged.vcf ` +Fix chromosome issues noted before - + `sed -i 's/^chrMT/chrM/g' ../interim/merged.vcf + grep -v ^chrNW ../interim/merged.vcf > ../interim/merged_chr_fix.vcf` +Check chromosomes and fix any remaining issues - + `grep -v ^# ../interim/merged_chr_fix.vcf | cut -f1 -d$'\t' | sort -u` +Normalize the variants using reference genome - + `bcftools norm -f /data/project/worthey_lab/datasets_central/human_reference_genome/processed/GRCh38/no_alt_rel20190408/GCA_000001405.15_GRCh38_no_alt_analysis_set.fna ../interim/merged_chr_fix.vcf -Oz -o ../interim/merged_norm.vcf.gz` +Filter variants by size (<30kb) and class - + `python ../../src/training/data-prep/extract_variants.py` + Clinvar variants: 305386 + HGMD variants: 156402 +bgzip and Tabix index the file - + `bgzip -c merged_sig_norm.vcf > merged_sig_norm.vcf.gz + tabix -fp vcf ../interim/merged_sig_norm.vcf.gz` +Copy paths to dataset yaml file - + ``` + cadd_snv: "/data/project/worthey_lab/temp_datasets_central/mana/cadd/raw/hg38/v1.6/whole_genome_SNVs.tsv.gz" + cadd_indel: "/data/project/worthey_lab/temp_datasets_central/mana/cadd/raw/hg38/v1.6/gnomad.genomes.r3.0.indel.tsv.gz" + gerp: "/data/project/worthey_lab/temp_datasets_central/mana/gerp/processed/hg38/v1.6/gerp_score_hg38.bg.gz" + gnomad_genomes: "/data/project/worthey_lab/temp_datasets_central/mana/gnomad/v3.0/data/gnomad.genomes.r3.0.sites.vcf.bgz" + clinvar: "/data/project/worthey_lab/temp_datasets_central/mana/clinvar/data/grch38/20210119/clinvar_20210119.vcf.gz" + dbNSFP: "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/variant_annotation/formatting/dbNSFP4.1a_variant.complete.gz" + ``` +Run variant annotation as shown in ReadMe file - + `./src/run_pipeline.sh -s -v ../data/interim/merged_sig_norm.vcf.gz -o ../data/interim -d ~/.ditto_datasets.yaml` +Parse the annotated vcf file - + `python parse_annotated_vars.py -i ../data/interim/merged_sig_norm_vep-annotated.vcf.gz -o ../data/interim/merged_sig_norm_vep-annotated.tsv` +Extract Class information for all these variants - + `python extract_class.py` +Filter, stats and prep the data - + `python filter.py` + + +For testing Ditto - +```sh + cp /data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/annotated_vcf/train/CAGI6_RGP_TRAIN_12_PROBAND_vep-annotated.vcf.gz ./data/processed/testing/ + module load BCFtools + bcftools annotate -e'ALT="*" || type!="snp"' ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND_vep-annotated.vcf.gz -Oz -o ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND_vep-annotated_filtered.vcf.gz + python annotation_parsing/parse_annotated_vars.py -i ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND_vep-annotated_filtered.vcf.gz -o ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND_vep-annotated_filtered.tsv + python src/Ditto/filter.py -i ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND_vep-annotated_filtered.tsv -O ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND + python src/Ditto/predict.py -i ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND/data.csv --sample CAGI6_RGP_TRAIN_12_PROBAND -o ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND/ditto_predictions.csv -o100 ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND/ditto_predictions_100.csv + python src/Ditto/combine_scores.py --raw ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND_vep-annotated_filtered.tsv --sample CAGI6_RGP_TRAIN_12_PROBAND --ditto ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND/ditto_predictions.csv -ep /data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/exomiser/train/CAGI6_RGP_TRAIN_12_PROBAND -o ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND/predictions_with_exomiser.csv -o100 ./data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND/predictions_with_exomiser_100.csv + +``` diff --git a/docs/Plan-for-project.txt b/docs/Plan-for-project.txt new file mode 100644 index 0000000..b7e5fdf --- /dev/null +++ b/docs/Plan-for-project.txt @@ -0,0 +1,85 @@ +Plan for Variant prioritization tool + +Objective: +Application of classification algorithms that ingest variant annotations along with phenotype information for predicting whether a variant will ultimately be clinically reported and returned to a patient. It should also predict and classify the variants based on ACMG guidelines. +Background: In the field of genomic medicine, the primary goal of diagnosing rare disease patient is to identify one or more genomic variants that may be responsible for a particular phenotype. This process is typically through annotation, filtering and ranking/prioritizing variants for manual curation. These curated variants are then clinically reported back to the patient. +Problem: Manual curation of thousands of variants even after filtering is time consuming process. Average time of curation is 100 variants per man-hour. Thus, methods/tools that can identify variants to be clinically reported, even in presence of high degree of variability in phenotype presentation, are of critical importance. +Solution: Develop a tool for accurate prioritization of variants, reduces time to review and diagnose rare disease patients. +Dataset: +Genotypes – +• SNVs – +o allele frequency, +o sequence based, structure-based predictions (ClinVarRVRD), +o sequence conservation, splice factor motifs, splice donor/acceptor sites, RNA folding energy, codon usage, CpG content (SilVa tool) +o splice donors and acceptors in pre-mRNA transcripts (SpliceAI) +• oligogenic or multilocus genetic pattern (VarCoPP) +• CNVs (CNVdigest) +• Gene expression pathway level training (MuliPLIER) – database (recount2) +• Protein-chaperon interaction (DeepNEU) +• eQTL as feature? +• Can we use polygenic risk scores? probably to identify modifier variants? +Note – population based = improved prediction? MAF filter? + +Genotype-Phenotype – +• Variant pathogenicity prediction and annotation (eDiVA) for WES datasets +• Genotypic and phenotypic features (Xrare and DeepPVP – deep phenomeNET variant predictor) +Note - HPO terms for human and orthologous genes from model organisms (mouse, zebrafish etc.,) and phenotypes from protein-protein interactions. OMIM orphaned, IMPC, string DB. Monarch +Phenotype – +• Phenotypes (HPO, upheno), diseases (Mondo), genes and pathways (HANRD - heterogeneous association network for rare diseases, Orphamizer) +• EHR data (Ada XD, Dr. Warehouse) – this is not HPO +• Image based (Face2Gene, DeepGestalt) +• IR fingerprint (artificial neural networks) +Variants – ClinVar, InterVar, CancerVar, CNVinter, HGMD, DGV (db of genomic variants), dbSNP, Varibench, HumVar, ExoVar, predictSNP, and SwissVar +Features – allele frequency, specific populations, evolutionary conservation, functional impact (SIFT), segmental duplication, simple sequence repeats, ClinVar and OMIM; local context: GC content within 10 flanking bases on the reference genome; amino acid constraint, including blosum62 and pam250; Protein structure, interaction, and modifications, including predicted secondary structures, number of protein interactions from the BioPlex 2.0 Network, whether the protein is involved in complexes formation from CORUM database, number of high-confidence interacting proteins by PrePPI , probability of a residue being located the interaction interface by PrePPI (based on PPISP, PINUP, PredU), predicted accessible surface areas were obtained from dbPTM, SUMO scores in 7-amino acids neighborhood by GPS-SUMO, phosphorylation sites predictions within 7 amino acids neighborhood by GPS3.0, and ubiquitination scores within 14- amino acids neighborhood by UbiProber ; Gene mutation intolerance, including ExAC metrics – loss of function (check mvp paper) +Algorithms – +• Machine learning – sklearn, imblearn +• Deep learning/neural networks +• Convolutional Neural networks +• AI ?? +Training and Testing +• Probably use 80:20 from all clinvar variants +Tuning parameters +• Use population based tuning for large parameter space and large train data - https://deepmind.com/blog/article/population-based-training-neural-networks +• Use Optuna for define-by-run search space and parallelize it. +• ELI5 or SHAP for feature importance +Simulation data- +• Use 1000genome project VCF and add variants with HPO terms and create multiple vcf files. Use this as test. +• Use SNV vcfs and compare to SNV prioritization tools. Same with other type of variants and tools. Finally, combine all types of variants and test the model. +• Also simulate using inheritance patterns – a bit complicated – refer to eDiVA paper +Real data – +• Use UDN phase-1 data as a test set. +Results – +Variant ranking – +• Top 1 variant predicted by tool +• In top 10 list predicted by tool +• In top 20-30% list predicted by tool +• Not predicted/ unpredictable +Things to keep in mind – +• When seeing new values in some categorical columns, look for additive smoothing, also called Laplace smoothing +• Nuclear variants vs mitochondrial variants +• Hyperparameter tuning of features and check for F1 score +• Sequencing errors +• Default features and in combination with other predictors? +• Similar phenotype – similar mutation in the same gene? +• Inheritance patterns? a) dominant de novo, (b) autosomal dominant inherited, (c) autosomal recessive homozygous, (d) autosomal recessive compound heterozygous, or (e) X‐linked. +• Xu et al. developed Dic-Att-BiLSTM-CRF (DABLC), a deep attention NN method. By incorporating dictionary-based (using disease ontology) and document-based attention mechanisms, this new method outperformed existing ones at identifying rare and complex disease names + + +Tools to look/read: +1. rvtests - https://github.com/zhanxw/rvtests +2. favor - http://favor.genohub.org/ +3. LINSIGHT - https://www.nature.com/articles/ng.3810 +4. STAAR - https://github.com/xihaoli/STAAR ; https://www.nature.com/articles/s41588-020-0676-4 +5. Methylome mappability - https://bismap.hoffmanlab.org/ +6. Linkage disequilibrium - https://www.nature.com/articles/ng.3954 +7. Assay info - Encode (https://www.encodeproject.org/report/?type=Experiment) +8. Phen2Gene - https://academic.oup.com/nargab/article/2/2/lqaa032/5843800 +9. Hyperas - Hyperparameter tuning using the treestructured Parzen estimator (TPE) algorithm (DeepPVP). +10. Miscastv1.0 - Protein surface prediction + - dbs to consider - PhyreRisk, VarMap +11. AMELIE - page-13 in https://stm.sciencemag.org/content/scitransmed/suppl/2020/05/18/12.544.eaau9113.DC1/aau9113_SM.pdf +12. Cool plots for parameter tuning using hiplot - https://medium.com/roonyx/neural-network-hyper-parameter-tuning-with-keras-tuner-and-hiplot-7637677821fa + +Bluesky/User requirements/ideas: +1. Can we give 2 scores per variant: One as driver (monogenic), one as modifier (complex diseases). +2. Can it also predict if a variant is protective? \ No newline at end of file diff --git a/src/Ditto/combine_scores.py b/src/Ditto/combine_scores.py new file mode 100644 index 0000000..79a5bd0 --- /dev/null +++ b/src/Ditto/combine_scores.py @@ -0,0 +1,185 @@ +import pandas as pd +import warnings + +warnings.simplefilter("ignore") +import argparse +import os +import glob + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--raw", type=str, required=True, help="Input raw annotated file with path." + ) + parser.add_argument( + "--ditto", type=str, required=True, help="Input Ditto file with path." + ) + parser.add_argument( + "--exomiser", + "-ep", + type=str, + # default="predictions.csv", + help="Path to Exomiser output directory", + ) + parser.add_argument( + "--sample", + type=str, + # required=True, + help="Input sample name to showup in results", + ) + parser.add_argument( + "--output", + "-o", + type=str, + default="predictions_with_exomiser.csv", + help="Output csv file with path", + ) + parser.add_argument( + "--output100", + "-o100", + type=str, + default="predictions_with_exomiser_100.csv", + help="Output csv file with path for Top 100 variants", + ) + parser.add_argument( + "--output1000", + "-o1000", + type=str, + default="predictions_with_exomiser_1000.csv", + help="Output csv file with path for Top 1000 variants", + ) + args = parser.parse_args() + # print (args) + + ditto = pd.read_csv(args.ditto) + raw = pd.read_csv( + args.raw, + sep="\t", + usecols=[ + "SYMBOL", + "Chromosome", + "Position", + "Reference Allele", + "Alternate Allele", + "SYMBOL", + "Gene", + "Feature", + "HGNC_ID", + ], + ) + # raw = raw[['Chromosome','Position','Reference Allele','Alternate Allele','SYMBOL','Gene','Feature', 'HGNC_ID']] + print("Raw file loaded!") + + overall = pd.merge( + raw, + ditto, + how="left", + on=[ + "Chromosome", + "Position", + "Alternate Allele", + "Reference Allele", + "Feature", + ], + ) + # print(overall.columns.values.tolist()) + del raw, ditto + id_map = pd.read_csv( + "/data/project/worthey_lab/temp_datasets_central/tarun/HGNC/biomart_9_23_21.txt", + sep="\t", + ) + + if args.exomiser: + print("Reading Exomiser scores...") + all_files = glob.glob(os.path.join(args.exomiser, "*.tsv")) + exo_scores = pd.concat( + (pd.read_csv(f, sep="\t") for f in all_files), ignore_index=True + ) + exo_scores = exo_scores[ + ["#GENE_SYMBOL", "ENTREZ_GENE_ID", "EXOMISER_GENE_PHENO_SCORE"] + ] + id_map = id_map.merge( + exo_scores, left_on="NCBI gene ID", right_on="ENTREZ_GENE_ID" + ) + overall = overall.merge( + id_map, how="left", left_on="HGNC_ID_x", right_on="HGNC ID" + ) + del id_map, exo_scores + # overall = overall.sort_values(by = ['Ditto_Deleterious','EXOMISER_GENE_PHENO_SCORE'], axis=0, ascending=[False,False], kind='quicksort', ignore_index=True) + # overall['Exo_norm'] = (overall['EXOMISER_GENE_PHENO_SCORE'] - overall['EXOMISER_GENE_PHENO_SCORE'].min()) / (overall['EXOMISER_GENE_PHENO_SCORE'].max() - overall['EXOMISER_GENE_PHENO_SCORE'].min()) + overall["combined"] = ( + overall["EXOMISER_GENE_PHENO_SCORE"].fillna(0) + + overall["Ditto_Deleterious"].fillna(0) + ) / 2 + overall = overall[ + [ + "SYMBOL_x", + "Chromosome", + "Position", + "Reference Allele", + "Alternate Allele", + "EXOMISER_GENE_PHENO_SCORE", + "Ditto_Deleterious", + "combined", + "SD", + "C", + ] + ] + overall.insert(0, "PROBANDID", args.sample) + overall.columns = [ + "PROBANDID", + "SYMBOL", + "CHROM", + "POS", + "REF", + "ALT", + "E", + "D", + "P", + "SD", + "C", + ] + # genes = genes[genes['EXOMISER_GENE_PHENO_SCORE'] != 0] + + # overall.sort_values('pred_Benign', ascending=False).head(500).to_csv(args.output500, index=False) + else: + # overall = overall.sort_values('Ditto_Deleterious', ascending=False) + overall = overall[ + [ + "SYMBOL_x", + "Chromosome", + "Position", + "Reference Allele", + "Alternate Allele", + "Ditto_Deleterious", + "SD", + "C", + ] + ] + overall.insert(0, "PROBANDID", args.sample) + overall.columns = [ + "PROBANDID", + "SYMBOL", + "CHROM", + "POS", + "REF", + "ALT", + "P", + "SD", + "C", + ] + + overall = overall.sort_values("P", ascending=False) + overall = overall.reset_index(drop=True) + overall["SD"] = 0 + overall["C"] = "*" + overall.to_csv(args.output, index=False) + + overall = overall.drop_duplicates( + subset=["CHROM", "POS", "REF", "ALT"], keep="first" + ).reset_index(drop=True) + overall = overall[["PROBANDID", "CHROM", "POS", "REF", "ALT", "P", "SD", "C"]] + overall.head(100).to_csv(args.output100, index=False, sep=":") + overall.head(1000).to_csv(args.output1000, index=False, sep=":") + + # del genes, overall diff --git a/src/Ditto/filter.py b/src/Ditto/filter.py new file mode 100644 index 0000000..55af4da --- /dev/null +++ b/src/Ditto/filter.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# python slurm-launch.py --exp-name testing --command "python Ditto/filter.py -i ../data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND_vep-annotated_filtered.tsv -O ../data/processed/testing/CAGI6_RGP_TRAIN_12_PROBAND" + +import pandas as pd + +pd.set_option("display.max_rows", None) +import numpy as np +from tqdm import tqdm +import seaborn as sns +import yaml +import os +import argparse +import matplotlib.pyplot as plt + +# from sklearn.linear_model import LinearRegression +# from sklearn.experimental import enable_iterative_imputer +# from sklearn.impute import IterativeImputer +# import pickle + + +def get_col_configs(config_f): + with open(config_f) as fh: + config_dict = yaml.safe_load(fh) + + # print(config_dict) + return config_dict + + +def extract_col(config_dict, df, stats): + print("Extracting columns and rows according to config file !....") + df = df[config_dict["columns"]] + if "non_snv" in stats: + # df= df.loc[df['hgmd_class'].isin(config_dict['Clinsig_train'])] + df = df[ + (df["Alternate Allele"].str.len() > 1) + | (df["Reference Allele"].str.len() > 1) + ] + print("\nData shape (non-snv) =", df.shape, file=open(stats, "a")) + else: + # df= df.loc[df['hgmd_class'].isin(config_dict['Clinsig_train'])] + df = df[ + (df["Alternate Allele"].str.len() < 2) + & (df["Reference Allele"].str.len() < 2) + ] + if "protein" in stats: + df = df[df["BIOTYPE"] == "protein_coding"] + else: + pass + print("\nData shape (snv) =", df.shape, file=open(stats, "a")) + df = df.loc[df["Consequence"].isin(config_dict["Consequence"])] + print("\nData shape (nsSNV) =", df.shape, file=open(stats, "a")) + + # print('\nhgmd_class:\n', df['hgmd_class'].value_counts(), file=open(stats, "a")) + print( + "\nclinvar_CLNSIG:\n", + df["clinvar_CLNSIG"].value_counts(), + file=open(stats, "a"), + ) + print( + "\nclinvar_CLNREVSTAT:\n", + df["clinvar_CLNREVSTAT"].value_counts(), + file=open(stats, "a"), + ) + print("\nConsequence:\n", df["Consequence"].value_counts(), file=open(stats, "a")) + print("\nIMPACT:\n", df["IMPACT"].value_counts(), file=open(stats, "a")) + print("\nBIOTYPE:\n", df["BIOTYPE"].value_counts(), file=open(stats, "a")) + # df = df.drop(['CLNVC','MC'], axis=1) + # CLNREVSTAT, CLNVC, MC + return df + + +def fill_na(df, config_dict, column_info, stats): # (config_dict,df): + + var = df[config_dict["var"]] + df = df.drop(config_dict["var"], axis=1) + print("parsing difficult columns......") + # df['GERP'] = [np.mean([float(item.replace('.', '0')) if item == '.' else float(item) for item in i]) if type(i) is list else i for i in df['GERP'].str.split('&')] + if "nssnv" in stats: + # df['MutationTaster_score'] = [np.mean([float(item.replace('.', '0')) if item == '.' else float(item) for item in i]) if type(i) is list else i for i in df['MutationTaster_score'].str.split('&')] + # df['MutationAssessor_score'] = [np.mean([float(item.replace('.', '0')) if item == '.' else float(item) for item in i]) if type(i) is list else i for i in df['MutationAssessor_score'].str.split('&')] + # df['PROVEAN_score'] = [np.mean([float(item.replace('.', '0')) if item == '.' else float(item) for item in i]) if type(i) is list else i for i in df['PROVEAN_score'].str.split('&')] + # df['VEST4_score'] = [np.mean([float(item.replace('.', '0')) if item == '.' else float(item) for item in i]) if type(i) is list else i for i in df['VEST4_score'].str.split('&')] + # df['FATHMM_score'] = [np.mean([float(item.replace('.', '0')) if item == '.' else float(item) for item in i]) if type(i) is list else i for i in df['FATHMM_score'].str.split('&')] + # else: + for col in tqdm(config_dict["col_conv"]): + df[col] = [ + np.mean( + [ + float(item.replace(".", "0")) if item == "." else float(item) + for item in i.split("&") + ] + ) + if "&" in str(i) + else i + for i in df[col] + ] + df[col] = df[col].astype("float64") + + print("One-hot encoding...") + df = pd.get_dummies(df, prefix_sep="_") + print(df.columns.values.tolist(), file=open(column_info, "w")) + + # lr = LinearRegression() + # imp= IterativeImputer(estimator=lr, verbose=2, max_iter=10, tol=1e-10, imputation_order='roman') + print("Filling NAs ....") + # df = imp.fit_transform(df) + # df = pd.DataFrame(df, columns = columns) + + df1 = pd.DataFrame() + + if "non_nssnv" in stats: + for key in tqdm(config_dict["non_nssnv_columns"]): + if key in df.columns: + df1[key] = ( + df[key] + .fillna(config_dict["non_nssnv_columns"][key]) + .astype("float64") + ) + else: + df1[key] = config_dict["non_nssnv_columns"][key] + else: + for key in tqdm(config_dict["nssnv_median_3_0_1"]): + if key in df.columns: + df1[key] = ( + df[key] + .fillna(config_dict["nssnv_median_3_0_1"][key]) + .astype("float64") + ) + else: + df1[key] = config_dict["nssnv_median_3_0_1"][key] + df = df1 + # df = df.drop(df.std()[(df.std() == 0)].index, axis=1) + del df1 + df = df.reset_index(drop=True) + print(df.columns.values.tolist(), file=open(column_info, "a")) + + fig = plt.figure(figsize=(20, 15)) + sns.heatmap(df.corr(), fmt=".2g", cmap="coolwarm") # annot = True, + plt.savefig(f"correlation_plot.pdf", format="pdf", dpi=1000, bbox_inches="tight") + + # df.dropna(axis=1, how='all', inplace=True) + # df['ID'] = [f'var_{num}' for num in range(len(df))] + print("NAs filled!") + df = pd.concat([var.reset_index(drop=True), df], axis=1) + return df + + +def main(df, config_dict, stats, column_info, null_info): + + print("\nData shape (Before filtering) =", df.shape, file=open(stats, "w")) + df = extract_col(config_dict, df, stats) + print("Columns extracted! Extracting class info....") + df.isnull().sum(axis=0).to_csv(null_info) + # df.drop_duplicates() + df.dropna(axis=1, how="all", inplace=True) + df = fill_na(df, config_dict, column_info, stats) + return df + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument( + "--out-dir", "-O", type=str, required=True, help="File path to output directory" + ) + parser.add_argument( + "--input", "-i", type=str, required=True, help="Input file with path" + ) + + args = parser.parse_args() + + config_f = "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/configs/testing.yaml" + # read QA config file + config_dict = get_col_configs(config_f) + print("Config file loaded!") + + print("Loading data...") + var_f = pd.read_csv(args.input, sep="\t", usecols=config_dict["columns"]) + print("Data Loaded !....") + + if not os.path.exists(args.out_dir): + os.makedirs(args.out_dir) + os.chdir(args.out_dir) + stats = "stats_nssnv.csv" + # print("Filtering "+var+" variants with at-least 50 percent data for each variant...") + column_info = "columns.csv" + null_info = "Nulls.csv" + df = main(var_f, config_dict, stats, column_info, null_info) + + print("\nData shape (After filtering) =", df.shape, file=open(stats, "a")) + print("writing to csv...") + df.to_csv("data.csv", index=False) + del df diff --git a/src/Ditto/model.job b/src/Ditto/model.job new file mode 100644 index 0000000..d41f5a3 --- /dev/null +++ b/src/Ditto/model.job @@ -0,0 +1,30 @@ +#!/bin/bash +# +#SBATCH --job-name=Ditto_ranks +#SBATCH --output=Ditto_ranks.out +# +# Number of tasks needed for this job. Generally, used with MPI jobs +#SBATCH --ntasks=1 +#SBATCH --partition=express +# +# Number of CPUs allocated to each task. +#SBATCH --cpus-per-task=10 +# +# Mimimum memory required per allocated CPU in MegaBytes. +#SBATCH --mem=40G +# +# Send mail to the email address when the job fails +#SBATCH --mail-type=FAIL +#SBATCH --mail-user=tmamidi@uab.edu + +#Set your environment here +module load Anaconda3/2020.02 +source activate testing + +#Run your commands here +#python ranks.py -id /data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/debugged/filter_vcf_by_DP8_AB --json /data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/metadata/train_test_metadata_original.json +#python ranks.py -id /data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/debugged/filter_vcf_by_DP6_AB --json /data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/metadata/train_test_metadata_original.json +python ranks.py -id /data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/trial/filter_vcf_by_DP8_AB_hpo_removed --json /data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/metadata/train_test_metadata_original.json +#python ranks.py -id /data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/debugged/filter_vcf_by_DP6_AB_hpo_removed --json /data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/metadata/train_test_metadata_original.json +#python ranks.py -id /data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/debugged/annotated_vcf --json /data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/metadata/train_test_metadata_original.json +#python ranks.py -id /data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/debugged/annotated_vcf_hpo_removed --json /data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/metadata/train_test_metadata_original.json diff --git a/src/Ditto/predict.py b/src/Ditto/predict.py new file mode 100644 index 0000000..6109505 --- /dev/null +++ b/src/Ditto/predict.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import pandas as pd +import yaml +import warnings + +warnings.simplefilter("ignore") +from joblib import load +import argparse +import os +import glob + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--input", + "-i", + type=str, + required=True, + help="Input csv file with path for predictions", + ) + parser.add_argument( + "--sample", + type=str, + # required=True, + help="Input sample name to showup in results", + ) + parser.add_argument( + "--output", + "-o", + type=str, + default="ditto_predictions.csv", + help="Output csv file with path", + ) + parser.add_argument( + "--output100", + "-o100", + type=str, + default="ditto_predictions_100.csv", + help="Output csv file with path for Top 100 variants", + ) + # parser.add_argument( + # "--variant", + # type=str, + # help="Check index/rank of variant of interest. Format: chrX,101412604,C,T") + args = parser.parse_args() + + # print("Loading data....") + + with open( + "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/configs/testing.yaml" + ) as fh: + config_dict = yaml.safe_load(fh) + + # with open('SL212589_genes.yaml') as fh: + # config_dict = yaml.safe_load(fh) + + X = pd.read_csv(args.input) + X_test = X + # print('Data Loaded!') + var = X_test[config_dict["ML_VAR"]] + X_test = X_test.drop(config_dict["ML_VAR"], axis=1) + X_test = X_test.values + + with open( + "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/models/F_3_0_1_nssnv/StackingClassifier_F_3_0_1_nssnv.joblib", + "rb", + ) as f: + clf = load(f) + + # print('Ditto Loaded!\nRunning predictions.....') + + y_score = clf.predict_proba(X_test) + del X_test + # print('Predictions finished!\nSorting ....') + pred = pd.DataFrame(y_score, columns=["Ditto_Benign", "Ditto_Deleterious"]) + + overall = pd.concat([var, pred], axis=1) + + # overall = overall.merge(X,on='Gene') + del X, pred, y_score, clf + overall.drop_duplicates(inplace=True) + overall.insert(0, "PROBANDID", args.sample) + overall["SD"] = 0 + overall["C"] = "*" + overall = overall.sort_values("Ditto_Deleterious", ascending=False) + # print('writing to database...') + overall.to_csv(args.output, index=False) + # print('Database storage complete!') + + overall = overall.drop_duplicates( + subset=["Chromosome", "Position", "Alternate Allele", "Reference Allele"], + keep="first", + ).reset_index(drop=True) + overall = overall[ + [ + "PROBANDID", + "Chromosome", + "Position", + "Reference Allele", + "Alternate Allele", + "Ditto_Deleterious", + "SD", + "C", + ] + ] + overall.columns = ["PROBANDID", "CHROM", "POS", "REF", "ALT", "P", "SD", "C"] + overall.head(100).to_csv(args.output100, index=False, sep=":") + del overall diff --git a/src/Ditto/ranks.py b/src/Ditto/ranks.py new file mode 100644 index 0000000..e652572 --- /dev/null +++ b/src/Ditto/ranks.py @@ -0,0 +1,73 @@ +import json +import pandas as pd +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument( + "--input-dir", + "-id", + type=str, + required=True, + help="Input raw annotated file with path.", +) +parser.add_argument( + "--json", type=str, required=True, help="Input raw annotated file with path." +) +parser.add_argument( + "--output", "-o", type=str, default="ranks.csv", help="Output csv filename only" +) +args = parser.parse_args() + +# json_file = json.load(open("/data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/metadata/train_test_metadata_original.json", 'r')) +json_file = json.load(open(args.json, "r")) + +with open(f"{args.input_dir}/{args.output}", "w") as f: + f.write(f"PROBANDID,[CHROM,POS,REF,ALT],SYMBOL,Exomiser,Ditto,Combined,Rank\n") +rank_list = [] +for samples in json_file["train"].keys(): + if "PROBAND" in samples: + # genes = pd.read_csv(f"/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/debugged/filter_vcf_by_DP6_AB/train/{samples}/combined_predictions.csv")#, sep=':') + genes = pd.read_csv( + f"{args.input_dir}/train/{samples}/combined_predictions.csv" + ) # , sep=':') + # genes = genes.sort_values(by = ['E','P'], axis=0, ascending=[False,False], kind='quicksort', ignore_index=True) + # genes = genes.drop_duplicates(subset=['Chromosome','Position','Alternate Allele','Reference Allele'], keep='first').reset_index(drop=True) + genes = genes.drop_duplicates( + subset=["CHROM", "POS", "ALT", "REF"], keep="first" + ).reset_index(drop=True) + for i in range(len(json_file["train"][samples]["solves"])): + variants = str( + "chr" + + str(json_file["train"][samples]["solves"][i]["Chrom"]).split(".")[0] + + "," + + str(json_file["train"][samples]["solves"][i]["Pos"]) + + "," + + json_file["train"][samples]["solves"][i]["Ref"] + + "," + + json_file["train"][samples]["solves"][i]["Alt"] + ).split(",") + # rank = ((genes.loc[(genes['Chromosome'] == variants[0]) & (genes['Position'] == int(variants[1])) & (genes['Alternate Allele'] == variants[3]) & (genes['Reference Allele'] == variants[2])].index)+1) + rank = ( + genes.loc[ + (genes["CHROM"] == variants[0]) + & (genes["POS"] == int(variants[1])) + & (genes["ALT"] == variants[3]) + & (genes["REF"] == variants[2]) + ].index + ) + 1 + rank_list = [*rank_list, *rank] # unpack both iterables in a list literal + with open(f"{args.input_dir}/{args.output}", "a") as f: + f.write( + f"{samples}, {variants}, {genes.loc[rank-1]['SYMBOL'].values}, {genes.loc[rank-1]['E'].values}, {genes.loc[rank-1]['D'].values}, {genes.loc[rank-1]['P'].values}, {rank.tolist()}\n" + ) + # f.write(f"{samples}, {variants}, {genes.loc[rank-1]['SYMBOL'].values}, {genes.loc[rank-1]['Ditto_Deleterious'].values}, {rank.tolist()}\n") + +with open(f"{args.input_dir}/{args.output}", "a") as f: + # f.write(f"\nList,{rank_list}\n") + f.write(f"Rank-1,{sum(i < 2 for i in rank_list)}\n") + f.write(f"Rank-5,{sum(i < 6 for i in rank_list)}\n") + f.write(f"Rank-10,{sum(i < 11 for i in rank_list)}\n") + f.write(f"Rank-20,{sum(i < 21 for i in rank_list)}\n") + f.write(f"Rank-50,{sum(i < 51 for i in rank_list)}\n") + f.write(f"Rank-100,{sum(i < 101 for i in rank_list)}\n") + f.write(f"#Predictions,{len(rank_list)}\n") diff --git a/src/Ditto/submission.py b/src/Ditto/submission.py new file mode 100644 index 0000000..f4cf87f --- /dev/null +++ b/src/Ditto/submission.py @@ -0,0 +1,29 @@ +import json +import pandas as pd + +json_file = json.load( + open( + "/data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/metadata/train_test_metadata_original.json", + "r", + ) +) + +fnames = [] +for samples in json_file["test"].keys(): + # for train_test in json_file.keys(): + # if "TEST" in train_test: + # for samples in json_file[train_test].keys(): + if "PROBAND" in samples: + # fnames.append(train_test+samples) + fnames.append( + f"/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/debugged/annotated_vcf/test/{samples}/combined_predictions_100.csv" + ) # , sep=':') +# print(fnames) +model = pd.concat((pd.read_csv(f, sep=":") for f in fnames), ignore_index=True) +model["SD"] = 0 +model["C"] = "*" +model.to_csv( + "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/debugged/ditto_model_debugged_annotated_vcf.txt", + index=False, + sep=":", +) diff --git a/src/predict_variant_score.sh b/src/predict_variant_score.sh new file mode 100755 index 0000000..97bd231 --- /dev/null +++ b/src/predict_variant_score.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +#SBATCH --job-name=predict_variant_score +#SBATCH --output=logs/predict_variant_score-%j.log +#SBATCH --cpus-per-task=1 +#SBATCH --mem-per-cpu=4G +#SBATCH --partition=short + +set -euo pipefail + +module reset +module load Anaconda3/2020.11 +conda activate testing + +mkdir -p "logs/rule_logs" + +snakemake \ + --snakefile "../workflow/Snakefile" \ + --use-conda \ + --profile '../variant_annotation/configs/snakemake_slurm_profile/{{cookiecutter.profile_name}}' \ + --cluster-config '../configs/cluster_config.json' \ + --cluster 'sbatch --ntasks {cluster.ntasks} --partition {cluster.partition} --cpus-per-task {cluster.cpus-per-task} --mem-per-cpu {cluster.mem-per-cpu} --output {cluster.output} --parsable' diff --git a/src/slurm-launch.py b/src/slurm-launch.py new file mode 100644 index 0000000..099309e --- /dev/null +++ b/src/slurm-launch.py @@ -0,0 +1,128 @@ +# slurm-launch.py +# Usage: +# for i in {0..4}; do python slurm-launch.py --exp-name Ditto_tuning --command "python optuna-tpe-stacking_training.ipy --vtype snv_protein_coding" sleep 60 ; done + +import argparse +import subprocess +import sys +import time +import os + +# template_file = "slurm-template.sh" #Path(__file__) / +JOB_NAME = "${JOB_NAME}" +NUM_NODES = "${NUM_NODES}" +NUM_GPUS_PER_NODE = "${NUM_GPUS_PER_NODE}" +NUM_CPUS_PER_NODE = "${NUM_CPUS_PER_NODE}" +TOT_MEM = "${TOT_MEM}" +PARTITION_OPTION = "${PARTITION_OPTION}" +COMMAND_PLACEHOLDER = "${COMMAND_PLACEHOLDER}" +GIVEN_NODE = "${GIVEN_NODE}" +LOAD_ENV = "${LOAD_ENV}" + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--exp-name", + type=str, + required=True, + help="The job name and path to logging file (exp_name.log).", + ) + parser.add_argument( + "--slurm-template", + "-temp", + type=str, + default="./", + help="Path to slurm template. Default: ./ (current location)", + ) + parser.add_argument( + "--num-nodes", "-n", type=int, default=1, help="Number of nodes to use." + ) + parser.add_argument( + "--node", + "-w", + type=str, + help="The specified nodes to use. Same format as the " + "return of 'sinfo'. Default: ''.", + ) + parser.add_argument( + "--num-gpus", + type=int, + default=0, + help="Number of GPUs to use in each node. (Default: 0)", + ) + parser.add_argument( + "--num-cpus", + type=int, + default=10, + help="Number of CPUs to use in each node. (Default: 10)", + ) + parser.add_argument( + "--mem", type=str, default="150G", help="Total Memory to use. (Default: 150G)" + ) + parser.add_argument( + "--partition", type=str, default="short", help="Default partition: short" + ) + parser.add_argument( + "--load-env", + type=str, + default="training", + help="Environment name to load before running script. (Default: 'training')", + ) + parser.add_argument( + "--command", + type=str, + required=True, + help="The command you wish to execute. For example: " + " --command 'python ML_models.py'. " + "Note that the command must be a string.", + ) + args = parser.parse_args() + + if args.node: + # assert args.num_nodes == 1 + node_info = "#SBATCH -w {}".format(args.node) + else: + node_info = "" + + job_name = "{}_{}".format( + args.exp_name, time.strftime("%m%d-%H%M%S", time.localtime()) + ) + + partition_option = ( + "#SBATCH --partition={}".format(args.partition) if args.partition else "" + ) + + # ===== Modified the template script ===== + with open(f"{args.slurm_template}slurm-template.sh", "r") as f: + text = f.read() + text = text.replace(JOB_NAME, job_name) + text = text.replace(NUM_NODES, str(args.num_nodes)) + text = text.replace(NUM_GPUS_PER_NODE, str(args.num_gpus)) + text = text.replace(NUM_CPUS_PER_NODE, str(args.num_cpus)) + text = text.replace(TOT_MEM, str(args.mem)) + text = text.replace(PARTITION_OPTION, str(args.partition)) + text = text.replace(COMMAND_PLACEHOLDER, str(args.command)) + text = text.replace(LOAD_ENV, str(args.load_env)) + text = text.replace(GIVEN_NODE, node_info) + text = text.replace( + "# THIS FILE IS A TEMPLATE AND IT SHOULD NOT BE DEPLOYED TO " "PRODUCTION!", + "# THIS FILE IS MODIFIED AUTOMATICALLY FROM TEMPLATE AND SHOULD BE " + "RUNNABLE!", + ) + + # ===== Save the script ===== + if not os.path.exists("./logs/"): + os.makedirs("./logs/") + script_file = "./logs/{}.sh".format(job_name) + with open(script_file, "w") as f: + f.write(text) + + # ===== Submit the job ===== + print("Starting to submit job!") + subprocess.Popen(["sbatch", script_file]) + print( + "Job submitted! Script file is at: <{}>. Log file is at: <{}>".format( + script_file, "./logs/{}.log".format(job_name) + ) + ) + sys.exit(0) diff --git a/src/slurm-template.sh b/src/slurm-template.sh new file mode 100644 index 0000000..cb08db8 --- /dev/null +++ b/src/slurm-template.sh @@ -0,0 +1,70 @@ +#!/bin/bash +# shellcheck disable=SC2206 +# THIS FILE IS GENERATED BY AUTOMATION SCRIPT! PLEASE REFER TO ORIGINAL SCRIPT! +# THIS FILE IS A TEMPLATE AND IT SHOULD NOT BE DEPLOYED TO PRODUCTION! +#SBATCH --job-name=${JOB_NAME} +#SBATCH --output=./logs/${JOB_NAME}.log +${GIVEN_NODE} +### This script works for any number of nodes, Ray will find and manage all resources +#SBATCH --nodes=${NUM_NODES} +#SBATCH --exclusive +#SBATCH --partition=${PARTITION_OPTION} +### Give all resources to a single Ray task, ray can manage the resources internally +#SBATCH --ntasks-per-node=1 +#SBATCH --cpus-per-task=${NUM_CPUS_PER_NODE} +#SBATCH --mem=${TOT_MEM} +#SBATCH --gpus-per-task=${NUM_GPUS_PER_NODE} +# Send mail to the email address when the job fails +#SBATCH --mail-type=FAIL +#SBATCH --mail-user=tmamidi@uab.edu +# Load modules or your own conda environment here +module load Anaconda3/2020.02 +# conda activate ${CONDA_ENV} +conda activate ${LOAD_ENV} +#module load CUDA/10.1.243 +#module load cuDNN/7.6.2.24-CUDA-10.1.243 + +## ===== DO NOT CHANGE THINGS HERE UNLESS YOU KNOW WHAT YOU ARE DOING ===== +## This script is a modification to the implementation suggest by gregSchwartz18 here: +## https://github.com/ray-project/ray/issues/826#issuecomment-522116599 +redis_password=$(uuidgen) +export redis_password + +nodes=$(scontrol show hostnames "$SLURM_JOB_NODELIST") # Getting the node names +nodes_array=($nodes) + +node_1=${nodes_array[0]} +ip=$(srun --nodes=1 --ntasks=1 -w "$node_1" hostname --ip-address) # making redis-address + +# if we detect a space character in the head node IP, we'll +# convert it to an ipv4 address. This step is optional. +if [[ "$ip" == *" "* ]]; then + IFS=' ' read -ra ADDR <<< "$ip" + if [[ ${#ADDR[0]} -gt 16 ]]; then + ip=${ADDR[1]} + else + ip=${ADDR[0]} + fi + echo "IPV6 address detected. We split the IPV4 address as $ip" +fi + +port=6379 +ip_head=$ip:$port +export ip_head +echo "IP Head: $ip_head" + +echo "STARTING HEAD at $node_1" +srun --nodes=1 --ntasks=1 -w "$node_1" \ + ray start --head --node-ip-address="$ip" --port=$port --redis-password="$redis_password" --temp-dir=$USER_SCRATCH --block & +sleep 30 + +worker_num=$((SLURM_JOB_NUM_NODES - 1)) #number of nodes other than the head node +for ((i = 1; i <= worker_num; i++)); do + node_i=${nodes_array[$i]} + echo "STARTING WORKER $i at $node_i" + srun --nodes=1 --ntasks=1 -w "$node_i" ray start --address "$ip_head" --redis-password="$redis_password" --block & + sleep 5 +done + +# ===== Call your code below ===== +${COMMAND_PLACEHOLDER} \ No newline at end of file diff --git a/src/training/data-prep/extract_class.py b/src/training/data-prep/extract_class.py new file mode 100644 index 0000000..4bbe418 --- /dev/null +++ b/src/training/data-prep/extract_class.py @@ -0,0 +1,35 @@ +import os +import gzip + +os.chdir( + "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/interim/" +) +vcf = "merged_sig_norm.vcf.gz" +vcf1 = "merged_sig_norm_vep-annotated.tsv" +output = "merged_sig_norm_class_vep-annotated.tsv" + +print("Collecting variant class...") +class_dict = dict() +with gzip.open(vcf, "rt") as vcffp: + for cnt, line in enumerate(vcffp): + if not line.startswith("#"): + line = line.rstrip("\n") + cols = line.split("\t") + var_info = cols[0] + "\t" + cols[1] + "\t" + cols[3] + "\t" + cols[4] + # hgmd_class = cols[7].split(";")[0].split("=")[1] + class_dict[var_info] = cols[5] + +# print(class_dict) +print("Writing variant class...") +with open(output, "w") as out: + with open(vcf1, "rt") as vcffp: + for cnt, line in enumerate(vcffp): + if not line.startswith("Chromosome"): + line = line.rstrip("\n") + cols = line.split("\t") + var_info = cols[0] + "\t" + cols[1] + "\t" + cols[2] + "\t" + cols[3] + new_line = line + "\t" + class_dict[var_info] + out.write(new_line + "\n") + # print(line+"\t"+class_dict[var_info]) + else: + out.write(line.rstrip("\n") + "\thgmd_class\n") diff --git a/src/training/data-prep/extract_variants.py b/src/training/data-prep/extract_variants.py new file mode 100644 index 0000000..466a868 --- /dev/null +++ b/src/training/data-prep/extract_variants.py @@ -0,0 +1,67 @@ +import os +import gzip +import yaml +import re + +regex = re.compile("[@_!#$%^&*()<>?/\|}{~:]") + +os.chdir( + "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/interim/" +) +vcf = "merged_norm.vcf.gz" +output = "merged_sig_norm.vcf" + +with open("../../configs/columns_config.yaml") as fh: + config_dict = yaml.safe_load(fh) + +cln = hgmd = 0 +print("Collecting variant class...") +with open(output, "w") as out: + with gzip.open(vcf, "rt") as vcffp: # gzip. + for cnt, line in enumerate(vcffp): + if not line.startswith("#"): + line = line.rstrip("\n") + cols = line.split("\t") + if ( + (len(cols[3]) < 30000) + and (len(cols[4]) < 30000) + and (regex.search(cols[3]) == None) + and (regex.search(cols[4]) == None) + ): + var_info = ( + cols[0] + + "\t" + + cols[1] + + "\t" + + cols[2] + + "\t" + + cols[3] + + "\t" + + cols[4] + ) + if "CLASS" in cols[7]: + var_class = cols[7].split(";")[0].split("=")[1] + if var_class in config_dict["ClinicalSignificance"]: + hgmd = hgmd + 1 + new_line = var_info + "\t" + var_class + out.write(new_line + "\n") + elif "CLNSIG" in line: + var_class = cols[7].split(";CLN")[5].split("=")[1] + var_sub = cols[7].split(";CLN")[4].split("=")[1] + if (var_class in config_dict["ClinicalSignificance"]) and ( + var_sub in config_dict["CLNREVSTAT"] + ): + cln = cln + 1 + new_line = var_info + "\t" + var_class + out.write(new_line + "\n") + # class_dict[var_info] = var_class + else: + pass + else: + pass + else: + pass + else: + out.write(line) + +print(f"Clinvar variants: {cln}\nHGMD variants: {hgmd}\n") diff --git a/src/training/data-prep/filter.py b/src/training/data-prep/filter.py new file mode 100644 index 0000000..0a3d346 --- /dev/null +++ b/src/training/data-prep/filter.py @@ -0,0 +1,380 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# python slurm-launch.py --exp-name no_null --command "python training/data-prep/filter.py --var-tag no_null_nssnv --cutoff 1" --mem 50G + +import pandas as pd + +pd.set_option("display.max_rows", None) +import numpy as np +from tqdm import tqdm +import seaborn as sns +import yaml +import os +import argparse +import matplotlib.pyplot as plt + +# from sklearn.linear_model import LinearRegression +# from sklearn.experimental import enable_iterative_imputer +# from sklearn.impute import IterativeImputer +# import pickle + + +def get_col_configs(config_f): + with open(config_f) as fh: + config_dict = yaml.safe_load(fh) + + # print(config_dict) + return config_dict + + +def extract_col(config_dict, df, stats, list_tag): + print("Extracting columns and rows according to config file !....") + df = df[config_dict["columns"]] + if "non_snv" in stats: + # df= df.loc[df['hgmd_class'].isin(config_dict['Clinsig_train'])] + df = df[ + (df["Alternate Allele"].str.len() > 1) + | (df["Reference Allele"].str.len() > 1) + ] + print("\nData shape (non-snv) =", df.shape, file=open(stats, "a")) + else: + # df= df.loc[df['hgmd_class'].isin(config_dict['Clinsig_train'])] + df = df[ + (df["Alternate Allele"].str.len() < 2) + & (df["Reference Allele"].str.len() < 2) + ] + if "protein" in stats: + df = df[df["BIOTYPE"] == "protein_coding"] + else: + pass + print("\nData shape (snv) =", df.shape, file=open(stats, "a")) + # df = df[config_dict['Consequence']] + df = df.loc[df["Consequence"].isin(config_dict["Consequence"])] + print("\nData shape (nsSNV) =", df.shape, file=open(stats, "a")) + if "train" in stats: + df = df.loc[df["hgmd_class"].isin(config_dict["Clinsig_train"])] + else: + df = df.loc[df["hgmd_class"].isin(config_dict["Clinsig_test"])] + + if "train" in stats: + print("Dropping empty columns and rows along with duplicate rows...") + # df.dropna(axis=1, thresh=(df.shape[1]*0.3), inplace=True) #thresh=(df.shape[0]/4) + df.dropna( + axis=0, thresh=(df.shape[1] * list_tag[1]), inplace=True + ) # thresh=(df.shape[1]*0.3), how='all', + df.drop_duplicates() + df.dropna(axis=1, how="all", inplace=True) # thresh=(df.shape[0]/4) + print("\nhgmd_class:\n", df["hgmd_class"].value_counts(), file=open(stats, "a")) + print( + "\nclinvar_CLNSIG:\n", + df["clinvar_CLNSIG"].value_counts(), + file=open(stats, "a"), + ) + print( + "\nclinvar_CLNREVSTAT:\n", + df["clinvar_CLNREVSTAT"].value_counts(), + file=open(stats, "a"), + ) + print("\nConsequence:\n", df["Consequence"].value_counts(), file=open(stats, "a")) + print("\nIMPACT:\n", df["IMPACT"].value_counts(), file=open(stats, "a")) + print("\nBIOTYPE:\n", df["BIOTYPE"].value_counts(), file=open(stats, "a")) + # df = df.drop(['CLNVC','MC'], axis=1) + # CLNREVSTAT, CLNVC, MC + return df + + +def fill_na(df, config_dict, column_info, stats, list_tag): # (config_dict,df): + + var = df[config_dict["var"]] + df = df.drop(config_dict["var"], axis=1) + print("parsing difficult columns......") + # df['GERP'] = [np.mean([float(item.replace('.', '0')) if item == '.' else float(item) for item in i]) if type(i) is list else i for i in df['GERP'].str.split('&')] + if "nssnv" in stats: + # df['MutationTaster_score'] = [np.mean([float(item.replace('.', '0')) if item == '.' else float(item) for item in i]) if type(i) is list else i for i in df['MutationTaster_score'].str.split('&')] + # else: + for col in tqdm(config_dict["col_conv"]): + df[col] = [ + np.mean( + [ + float(item.replace(".", "0")) if item == "." else float(item) + for item in i.split("&") + ] + ) + if "&" in str(i) + else i + for i in df[col] + ] + df[col] = df[col].astype("float64") + if "train" in stats: + fig = plt.figure(figsize=(20, 15)) + sns.heatmap(df.corr(), fmt=".2g", cmap="coolwarm") # annot = True, + plt.savefig( + f"train_{list_tag[0]}/correlation_filtered_raw_{list_tag[0]}.pdf", + format="pdf", + dpi=1000, + bbox_inches="tight", + ) + print("One-hot encoding...") + df = pd.get_dummies(df, prefix_sep="_") + print(df.columns.values.tolist(), file=open(column_info, "w")) + # df.head(2).to_csv(column_info, index=False) + # lr = LinearRegression() + # imp= IterativeImputer(estimator=lr, verbose=2, max_iter=10, tol=1e-10, imputation_order='roman') + print("Filling NAs ....") + # df = imp.fit_transform(df) + # df = pd.DataFrame(df, columns = columns) + + if list_tag[2] == 1: + print("Including AF columns...") + df1 = df[config_dict["gnomad_columns"]] + df1 = df1.fillna(list_tag[3]) + + if list_tag[4] == 1: + df = df.drop(config_dict["gnomad_columns"], axis=1) + df = df.fillna(df.median()) + if "train" in stats: + print("\nColumns:\t", df.columns.values.tolist(), file=open(stats, "a")) + print( + "\nMedian values:\t", + df.median().values.tolist(), + file=open(stats, "a"), + ) + else: + pass + else: + print("Excluding AF columns...") + if list_tag[4] == 1: + df = df.drop(config_dict["gnomad_columns"], axis=1) + df1 = df.fillna(df.median()) + if "train" in stats: + print("\nColumns:\t", df.columns.values.tolist(), file=open(stats, "a")) + print( + "\nMedian values:\t", + df.median().values.tolist(), + file=open(stats, "a"), + ) + else: + df1 = pd.DataFrame() + + if "non_nssnv" in stats: + for key in tqdm(config_dict["non_nssnv_columns"]): + if key in df.columns: + df1[key] = ( + df[key] + .fillna(config_dict["non_nssnv_columns"][key]) + .astype("float64") + ) + else: + df1[key] = config_dict["non_nssnv_columns"][key] + else: + for key in tqdm(config_dict["nssnv_columns"]): + if key in df.columns: + df1[key] = ( + df[key].fillna(config_dict["nssnv_columns"][key]).astype("float64") + ) + else: + df1[key] = config_dict["nssnv_columns"][key] + df = df1 + df = df.drop(df.std()[(df.std() == 0)].index, axis=1) + del df1 + df = df.reset_index(drop=True) + print(df.columns.values.tolist(), file=open(column_info, "a")) + if "train" in stats: + fig = plt.figure(figsize=(20, 15)) + sns.heatmap(df.corr(), fmt=".2g", cmap="coolwarm") # annot = True, + plt.savefig( + f"train_{list_tag[0]}/correlation_before_{list_tag[0]}.pdf", + format="pdf", + dpi=1000, + bbox_inches="tight", + ) + + # Create correlation matrix + corr_matrix = df.corr().abs() + + # Select upper triangle of correlation matrix + upper = corr_matrix.where( + np.triu(np.ones(corr_matrix.shape), k=1).astype(np.bool) + ) + + # Find features with correlation greater than 0.90 + to_drop = [column for column in upper.columns if any(upper[column] > 0.90)] + print( + f"Correlated columns being dropped: {to_drop}", file=open(column_info, "a") + ) + + # Drop features + df.drop(to_drop, axis=1, inplace=True) + df = df.reset_index(drop=True) + print(df.columns.values.tolist(), file=open(column_info, "a")) + # df.dropna(axis=1, how='all', inplace=True) + df["ID"] = [f"var_{num}" for num in range(len(df))] + print("NAs filled!") + df = pd.concat([var.reset_index(drop=True), df], axis=1) + return df + + +def main(df, config_f, stats, column_info, null_info, list_tag): + # read QA config file + config_dict = get_col_configs(config_f) + print("Config file loaded!") + # read clinvar data + + print("\nData shape (Before filtering) =", df.shape, file=open(stats, "a")) + df = extract_col(config_dict, df, stats, list_tag) + print("Columns extracted! Extracting class info....") + df.isnull().sum(axis=0).to_csv(null_info) + # print('\n Unique Impact (Class):\n', df.hgmd_class.unique(), file=open("./data/processed/stats1.csv", "a")) + df["hgmd_class"] = ( + df["hgmd_class"] + .str.replace(r"DFP", "high_impact") + .str.replace(r"DM\?", "high_impact") + .str.replace(r"DM", "high_impact") + ) + df["hgmd_class"] = ( + df["hgmd_class"] + .str.replace(r"Pathogenic/Likely_pathogenic", "high_impact") + .str.replace(r"Likely_pathogenic", "high_impact") + .str.replace(r"Pathogenic", "high_impact") + ) + df["hgmd_class"] = ( + df["hgmd_class"] + .str.replace(r"DP", "low_impact") + .str.replace(r"FP", "low_impact") + ) + df["hgmd_class"] = ( + df["hgmd_class"] + .str.replace(r"Benign/Likely_benign", "low_impact") + .str.replace(r"Likely_benign", "low_impact") + .str.replace(r"Benign", "low_impact") + ) + df.drop_duplicates() + df.dropna(axis=1, how="all", inplace=True) + y = df["hgmd_class"] + class_dummies = pd.get_dummies(df["hgmd_class"]) + # del class_dummies[class_dummies.columns[-1]] + print("\nImpact (Class):\n", y.value_counts(), file=open(stats, "a")) + # y = df.hgmd_class + df = df.drop("hgmd_class", axis=1) + df = fill_na(df, config_dict, column_info, stats, list_tag) + + if "train" in stats: + var = df[config_dict["ML_VAR"]] + df = df.drop(config_dict["ML_VAR"], axis=1) + df = pd.concat([class_dummies.reset_index(drop=True), df], axis=1) + fig = plt.figure(figsize=(20, 15)) + sns.heatmap(df.corr(), fmt=".2g", cmap="coolwarm") + plt.savefig( + f"train_{list_tag[0]}/correlation_after_{list_tag[0]}.pdf", + format="pdf", + dpi=1000, + bbox_inches="tight", + ) + df = pd.concat([var, df], axis=1) + df = df.drop(["high_impact", "low_impact"], axis=1) + return df, y + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument( + "--var-tag", + "-v", + type=str, + required=True, + default="nssnv", + help="The tag used when generating train/test data. Default:'nssnv'", + ) + parser.add_argument( + "--cutoff", + type=float, + default=0.5, + help=f"Cutoff to include at least __% of data for all rows. Default:0.5 (i.e. 50%)", + ) + parser.add_argument( + "--af-columns", + "-af", + type=int, + default=0, + help=f"To include columns with Allele frequencies or not. Default:0", + ) + parser.add_argument( + "--af-values", + "-afv", + type=float, + default=0, + help=f"value to impute nulls for allele frequency columns. Default:0", + ) + parser.add_argument( + "--other-values", + "-otv", + type=int, + default=0, + help=f"Impute other columns with either custom defined values (0) or median (1). Default:0", + ) + + args = parser.parse_args() + list_tag = [ + args.var_tag, + args.cutoff, + args.af_columns, + args.af_values, + args.other_values, + ] + print(list_tag) + var = list_tag[0] + + if not os.path.exists( + "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/train_test" + ): + os.makedirs( + "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/train_test" + ) + os.chdir( + "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/train_test" + ) + print("Loading data...") + var_f = pd.read_csv( + "../../interim/merged_sig_norm_class_vep-annotated.tsv", sep="\t" + ) + print("Data Loaded !....") + config_f = "../../../configs/columns_config.yaml" + + # variants = ['train_non_snv','train_snv','train_snv_protein_coding','test_snv','test_non_snv','test_snv_protein_coding'] + variants = ["train_" + var, "test_" + var] + # variants = ['train_'+var] + for var in variants: + if not os.path.exists(var): + os.makedirs(var) + stats = var + "/stats_" + var + ".csv" + print( + "Filtering " + + var + + " variants with at-least " + + str(list_tag[1] * 100) + + " percent data for each variant...", + file=open(stats, "w"), + ) + # print("Filtering "+var+" variants with at-least 50 percent data for each variant...") + column_info = var + "/" + var + "_columns.csv" + null_info = var + "/Nulls_" + var + ".csv" + df, y = main(var_f, config_f, stats, column_info, null_info, list_tag) + if "train" in stats: + train_columns = df.columns.values.tolist() + else: + df1 = pd.DataFrame() + for key in tqdm(train_columns): + if key in df.columns: + df1[key] = df[key] + else: + df1[key] = 0 + df = df1 + del df1 + + print("\nData shape (After filtering) =", df.shape, file=open(stats, "a")) + print("Class shape=", y.shape, file=open(stats, "a")) + print("writing to csv...") + df.to_csv(var + "/" + "merged_data-" + var + ".csv", index=False) + y.to_csv(var + "/" + "merged_data-y-" + var + ".csv", index=False) + del df, y diff --git a/src/training/data-prep/parse_clinvar.py b/src/training/data-prep/parse_clinvar.py new file mode 100644 index 0000000..779ff98 --- /dev/null +++ b/src/training/data-prep/parse_clinvar.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# module load Anaconda3/2020.02 +# source activate envi +# python /data/project/worthey_lab/projects/experimental_pipelines/annovar_vcf_annotation/Annovar_Tarun.py /data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/external/clinvar.vcf /data/scratch/tmamidi/ /data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/interim/ /data/project/worthey_lab/tools/annovar/annovar_hg19_db + +import allel + +# print(allel.__version__) + +import os + +os.chdir("/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/") +# print(os.listdir()) + +print("Converting vcf.....") +# df = allel.vcf_to_dataframe('./interim/try.vcf', fields='*') +df = allel.vcf_to_dataframe("./interim/clinvar.out.hg19_multianno.vcf", fields="*") +# df.head(2) +# df.SIFT_score.unique() +print("vcf converted to dataframe.\nWriting it to a csv file.....") +df.to_csv("./external/clinvar.out.hg19_multianno.csv", index=False) +print("vcf to csv conversion completed!") +# df.to_csv("./external/clinvar.out.hg19_multianno.csv", index=False) +# print(df.head(20)) diff --git a/src/training/training/ML_models.py b/src/training/training/ML_models.py new file mode 100644 index 0000000..892a7bd --- /dev/null +++ b/src/training/training/ML_models.py @@ -0,0 +1,232 @@ +# python slurm-launch.py --exp-name no_AF_F_50 --command "python training/training/ML_models_AF0.py --var-tag no_AF_F_50" + +import numpy as np +import pandas as pd +import time +import argparse +import ray + +# Start Ray. +ray.init(ignore_reinit_error=True) +import warnings + +warnings.simplefilter("ignore") +from joblib import dump, load +import shap + +# from sklearn.preprocessing import StandardScaler +# from sklearn.preprocessing import MinMaxScaler +from sklearn.model_selection import train_test_split, cross_validate +from sklearn.preprocessing import label_binarize +from sklearn.metrics import ( + precision_score, + roc_auc_score, + accuracy_score, + confusion_matrix, + recall_score, + plot_roc_curve, + plot_precision_recall_curve, +) +from sklearn.tree import DecisionTreeClassifier +from sklearn.ensemble import ( + RandomForestClassifier, + AdaBoostClassifier, + GradientBoostingClassifier, + ExtraTreesClassifier, +) +from sklearn.naive_bayes import GaussianNB +from imblearn.ensemble import BalancedRandomForestClassifier +from sklearn.neural_network import MLPClassifier +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +import matplotlib.pyplot as plt +import yaml +import gc +import os + +os.chdir( + "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/train_test/" +) + +TUNE_STATE_REFRESH_PERIOD = 10 # Refresh resources every 10 s + +# @ray.remote(num_returns=6) +def data_parsing(var, config_dict, output): + # Load data + # print(f'\nUsing merged_data-train_{var}..', file=open(output, "a")) + X_train = pd.read_csv(f"train_{var}/merged_data-train_{var}.csv") + # var = X_train[config_dict['ML_VAR']] + X_train = X_train.drop(config_dict["ML_VAR"], axis=1) + feature_names = X_train.columns.tolist() + X_train = X_train.values + Y_train = pd.read_csv(f"train_{var}/merged_data-y-train_{var}.csv") + Y_train = label_binarize( + Y_train.values, classes=["low_impact", "high_impact"] + ).ravel() + + X_test = pd.read_csv(f"test_{var}/merged_data-test_{var}.csv") + # var = X_test[config_dict['ML_VAR']] + X_test = X_test.drop(config_dict["ML_VAR"], axis=1) + # feature_names = X_test.columns.tolist() + X_test = X_test.values + Y_test = pd.read_csv(f"test_{var}/merged_data-y-test_{var}.csv") + print("Data Loaded!") + # Y = pd.get_dummies(y) + Y_test = label_binarize( + Y_test.values, classes=["low_impact", "high_impact"] + ).ravel() + + # scaler = StandardScaler().fit(X_train) + # X_train = scaler.transform(X_train) + # X_test = scaler.transform(X_test) + # explain all the predictions in the test set + background = shap.kmeans(X_train, 10) + return X_train, X_test, Y_train, Y_test, background, feature_names + + +@ray.remote # (num_cpus=9) +def classifier( + name, clf, var, X_train, X_test, Y_train, Y_test, background, feature_names, output +): + os.chdir( + "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/train_test/" + ) + start = time.perf_counter() + score = cross_validate( + clf, + X_train, + Y_train, + cv=10, + return_train_score=True, + return_estimator=True, + n_jobs=-1, + verbose=0, + scoring=("roc_auc", "neg_log_loss"), + ) + clf = score["estimator"][np.argmin(score["test_neg_log_loss"])] + # y_score = cross_val_predict(clf, X_train, Y_train, cv=5, n_jobs=-1, verbose=0) + # class_weights = class_weight.compute_class_weight('balanced', np.unique(Y_train), Y_train) + # clf.fit(X_train, Y_train) #, class_weight=class_weights) + # name = str(type(clf)).split("'")[1] #.split(".")[3] + with open(f"../models/{var}/{name}_{var}.joblib", "wb") as f: + dump(clf, f, compress="lz4") + # del clf + # with open(f"./models/{var}/{name}_{var}.joblib", 'rb') as f: + # clf = load(f) + y_score = clf.predict(X_test) + prc = precision_score(Y_test, y_score, average="weighted") + recall = recall_score(Y_test, y_score, average="weighted") + roc_auc = roc_auc_score(Y_test, y_score) + # roc_auc = roc_auc_score(Y_test, np.argmax(y_score, axis=1)) + accuracy = accuracy_score(Y_test, y_score) + # score = clf.score(X_train, Y_train) + # matrix = confusion_matrix(np.argmax(Y_test, axis=1), np.argmax(y_score, axis=1)) + matrix = confusion_matrix(Y_test, y_score) + + # explain all the predictions in the test set + # background = shap.kmeans(X_train, 6) + explainer = shap.KernelExplainer(clf.predict, background) + del clf, X_train + background1 = X_test[np.random.choice(X_test.shape[0], 10000, replace=False)] + shap_values = explainer.shap_values(background1) + plt.figure() + shap.summary_plot(shap_values, background1, feature_names, show=False) + # shap.plots.waterfall(shap_values[0], max_display=15) + plt.savefig( + f"../models/{var}/{name}_{var}_features.pdf", + format="pdf", + dpi=1000, + bbox_inches="tight", + ) + del shap_values, background1, explainer + finish = (time.perf_counter() - start) / 60 + with open(output, "a") as f: + f.write( + f"{name}\t{np.mean(score['train_roc_auc'])}\t{np.mean(score['test_roc_auc'])}\t{np.mean(score['train_neg_log_loss'])}\t{np.mean(score['test_neg_log_loss'])}\t{prc}\t{recall}\t{roc_auc}\t{accuracy}\t{finish}\n{matrix}\n" + ) + return None + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument( + "--var-tag", + "-v", + type=str, + required=True, + default="nssnv", + help="The tag used when generating train/test data. Default:'nssnv'", + ) + + args = parser.parse_args() + + # Classifiers I wish to use + classifiers = { + "DecisionTree": DecisionTreeClassifier(class_weight="balanced"), + "RandomForest": RandomForestClassifier(class_weight="balanced", n_jobs=-1), + "BalancedRF": BalancedRandomForestClassifier(), + "AdaBoost": AdaBoostClassifier(), + "ExtraTrees": ExtraTreesClassifier(class_weight="balanced", n_jobs=-1), + "GaussianNB": GaussianNB(), + "LDA": LinearDiscriminantAnalysis(), + "GradientBoost": GradientBoostingClassifier(), + "MLP": MLPClassifier(), + } + + with open("../../../configs/columns_config.yaml") as fh: + config_dict = yaml.safe_load(fh) + + var = args.var_tag + if not os.path.exists("../models/" + var): + os.makedirs("../models/" + var) + output = "../models/" + var + "/ML_results_" + var + "_.csv" + # print('Working with '+var+' dataset...', file=open(output, "a")) + print("Working with " + var + " dataset...") + X_train, X_test, Y_train, Y_test, background, feature_names = data_parsing( + var, config_dict, output + ) + with open(output, "a") as f: + f.write( + "Model\tCross_validate(avg_train_roc_auc)\tCross_validate(avg_test_roc_auc)\tCross_validate(avg_train_neg_log_loss)\tCross_validate(avg_test_neg_log_loss)\tPrecision(test_data)\tRecall\troc_auc\tAccuracy\tTime(min)\tConfusion_matrix[low_impact, high_impact]\n" + ) + remote_ml = [ + classifier.remote( + name, + clf, + var, + X_train, + X_test, + Y_train, + Y_test, + background, + feature_names, + output, + ) + for name, clf in classifiers.items() + ] + ray.get(remote_ml) + gc.collect() + + # prepare plots + fig, [ax_roc, ax_prc] = plt.subplots(1, 2, figsize=(20, 10)) + fig.suptitle(f"Model performances on Testing data with filters", fontsize=20) + + for name, clf in classifiers.items(): + + with open(f"../models/{var}/{name}_{var}.joblib", "rb") as f: + clf = load(f) + + plot_precision_recall_curve(clf, X_test, Y_test, ax=ax_prc, name=name) + plot_roc_curve(clf, X_test, Y_test, ax=ax_roc, name=name) + + ax_roc.set_title("Receiver Operating Characteristic (ROC) curves") + ax_prc.set_title("Precision Recall (PRC) curves") + + ax_roc.grid(linestyle="--") + ax_prc.grid(linestyle="--") + + plt.legend() + plt.savefig( + f"../models/{var}/roc_{var}.pdf", format="pdf", dpi=1000, bbox_inches="tight" + ) + gc.collect() diff --git a/src/training/training/plot_roc.py b/src/training/training/plot_roc.py new file mode 100644 index 0000000..c1439f4 --- /dev/null +++ b/src/training/training/plot_roc.py @@ -0,0 +1,123 @@ +# from numpy import mean +import numpy as np +import pandas as pd +import time +import warnings +import argparse + +warnings.simplefilter("ignore") +from joblib import dump, load + +# from sklearn.preprocessing import StandardScaler +# from sklearn.feature_selection import RFE +# from sklearn.preprocessing import MinMaxScaler +from sklearn.preprocessing import label_binarize +from sklearn.metrics import plot_roc_curve, plot_precision_recall_curve + +# from sklearn.multiclass import OneVsRestClassifier +from sklearn.tree import DecisionTreeClassifier +from sklearn.ensemble import ( + RandomForestClassifier, + AdaBoostClassifier, + GradientBoostingClassifier, + ExtraTreesClassifier, +) +from sklearn.naive_bayes import GaussianNB +from imblearn.ensemble import BalancedRandomForestClassifier +from sklearn.neural_network import MLPClassifier +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +import matplotlib.pyplot as plt +import yaml +import gc +import os + + +TUNE_STATE_REFRESH_PERIOD = 10 # Refresh resources every 10 s + + +def data_parsing(var, config_dict): + # Load data + X_test = pd.read_csv(f"test_{var}/merged_data-test_{var}.csv") + # var = X_test[config_dict['ML_VAR']] + X_test = X_test.drop(config_dict["ML_VAR"], axis=1) + # feature_names = X_test.columns.tolist() + X_test = X_test.values + Y_test = pd.read_csv(f"test_{var}/merged_data-y-test_{var}.csv") + print("Data Loaded!") + # Y = pd.get_dummies(y) + Y_test = label_binarize( + Y_test.values, classes=["low_impact", "high_impact"] + ).ravel() + + # scaler = StandardScaler().fit(X_train) + # X_train = scaler.transform(X_train) + # X_test = scaler.transform(X_test) + # explain all the predictions in the test set + # background = shap.kmeans(X_train, 10) + return X_test, Y_test + + +if __name__ == "__main__": + os.chdir( + "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/train_test/" + ) + + parser = argparse.ArgumentParser() + parser.add_argument( + "--var-tag", + "-v", + type=str, + required=True, + default="nssnv", + help="The tag used when generating train/test data. Default:'nssnv'", + ) + + args = parser.parse_args() + var = args.var_tag + + # Classifiers I wish to use + classifiers = [ + "DecisionTree", + "RandomForest", + "BalancedRF", + "AdaBoost", + "ExtraTrees", + "GaussianNB", + "LDA", + "GradientBoost", + "MLP", + "StackingClassifier", + ] + + with open("../../../configs/columns_config.yaml") as fh: + config_dict = yaml.safe_load(fh) + + if not os.path.exists("../models/" + var): + os.makedirs("../models/" + var) + + print("Working with " + var + " dataset...") + X_test, Y_test = data_parsing(var, config_dict) + + # prepare plots + fig, [ax_roc, ax_prc] = plt.subplots(1, 2, figsize=(20, 10)) + fig.suptitle(f"Model performances on Testing data", fontsize=20) + + for name in classifiers: + + with open(f"../models/{var}/{name}_{var}.joblib", "rb") as f: + clf = load(f) + + plot_precision_recall_curve(clf, X_test, Y_test, ax=ax_prc, name=name) + plot_roc_curve(clf, X_test, Y_test, ax=ax_roc, name=name) + + ax_roc.set_title("Receiver Operating Characteristic (ROC) curves") + ax_prc.set_title("Precision Recall (PRC) curves") + + ax_roc.grid(linestyle="--") + ax_prc.grid(linestyle="--") + + plt.legend() + plt.savefig( + f"../models/{var}/roc_{var}.pdf", format="pdf", dpi=1000, bbox_inches="tight" + ) + gc.collect() diff --git a/src/training/training/stacking.py b/src/training/training/stacking.py new file mode 100644 index 0000000..3656402 --- /dev/null +++ b/src/training/training/stacking.py @@ -0,0 +1,209 @@ +# from numpy import mean +import numpy as np +import pandas as pd +import time +import argparse +import ray + +# Start Ray. +ray.init(ignore_reinit_error=True) +import warnings + +warnings.simplefilter("ignore") +from joblib import dump, load +import shap + +# from sklearn.preprocessing import StandardScaler +# from sklearn.feature_selection import RFE +# from sklearn.preprocessing import MinMaxScaler +from sklearn.model_selection import train_test_split, cross_validate +from sklearn.preprocessing import label_binarize +from sklearn.metrics import ( + precision_score, + roc_auc_score, + accuracy_score, + confusion_matrix, + recall_score, +) + +# from sklearn.multiclass import OneVsRestClassifier +from sklearn.tree import DecisionTreeClassifier +from sklearn.linear_model import LogisticRegression +from sklearn.ensemble import ( + RandomForestClassifier, + AdaBoostClassifier, + GradientBoostingClassifier, + ExtraTreesClassifier, + StackingClassifier, +) +from sklearn.naive_bayes import GaussianNB +from imblearn.ensemble import BalancedRandomForestClassifier +from sklearn.neural_network import MLPClassifier +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +import matplotlib.pyplot as plt +import yaml +import functools + +print = functools.partial(print, flush=True) +import matplotlib.pyplot as plt +import warnings + +warnings.simplefilter("ignore") +import gc +import os + +os.chdir( + "/data/project/worthey_lab/projects/experimental_pipelines/tarun/ditto/data/processed/train_test" +) + +TUNE_STATE_REFRESH_PERIOD = 10 # Refresh resources every 10 s + +# @ray.remote(num_returns=6) +def data_parsing(var, config_dict, output): + # Load data + # print(f'\nUsing merged_data-train_{var}..', file=open(output, "a")) + X_train = pd.read_csv(f"train_{var}/merged_data-train_{var}.csv") + # var = X_train[config_dict['ML_VAR']] + X_train = X_train.drop(config_dict["ML_VAR"], axis=1) + feature_names = X_train.columns.tolist() + X_train = X_train.values + Y_train = pd.read_csv(f"train_{var}/merged_data-y-train_{var}.csv") + Y_train = label_binarize( + Y_train.values, classes=["low_impact", "high_impact"] + ).ravel() + + X_test = pd.read_csv(f"test_{var}/merged_data-test_{var}.csv") + # var = X_test[config_dict['ML_VAR']] + X_test = X_test.drop(config_dict["ML_VAR"], axis=1) + # feature_names = X_test.columns.tolist() + X_test = X_test.values + Y_test = pd.read_csv(f"test_{var}/merged_data-y-test_{var}.csv") + print("Data Loaded!") + # Y = pd.get_dummies(y) + Y_test = label_binarize( + Y_test.values, classes=["low_impact", "high_impact"] + ).ravel() + + # scaler = StandardScaler().fit(X_train) + # X_train = scaler.transform(X_train) + # X_test = scaler.transform(X_test) + # explain all the predictions in the test set + background = shap.kmeans(X_train, 10) + return X_train, X_test, Y_train, Y_test, background, feature_names + + +# @ray.remote #(num_cpus=9) +def classifier( + clf, var, X_train, X_test, Y_train, Y_test, background, feature_names, output +): + start = time.perf_counter() + # score = cross_validate(clf, X_train, Y_train, cv=10, return_train_score=True, return_estimator=True, n_jobs=-1, verbose=0, scoring=('roc_auc','neg_log_loss')) + # clf = score['estimator'][np.argmin(score['test_neg_log_loss'])] + # y_score = cross_val_predict(clf, X_train, Y_train, cv=5, n_jobs=-1, verbose=0) + # class_weights = class_weight.compute_class_weight('balanced', np.unique(Y_train), Y_train) + clf.fit(X_train, Y_train) # , class_weight=class_weights) + clf_name = "StackingClassifier" + with open(f"../models/{var}/{clf_name}_{var}.joblib", "wb") as f: + dump(clf, f, compress="lz4") + # del clf + # with open(f"./models/{var}/{clf_name}_{var}.joblib", 'rb') as f: + # clf = load(f) + train_score = clf.score(X_train, Y_train) + y_score = clf.predict(X_test) + prc = precision_score(Y_test, y_score, average="weighted") + recall = recall_score(Y_test, y_score, average="weighted") + roc_auc = roc_auc_score(Y_test, y_score) + # roc_auc = roc_auc_score(Y_test, np.argmax(y_score, axis=1)) + accuracy = accuracy_score(Y_test, y_score) + # score = clf.score(X_train, Y_train) + # matrix = confusion_matrix(np.argmax(Y_test, axis=1), np.argmax(y_score, axis=1)) + matrix = confusion_matrix(Y_test, y_score) + finish = (time.perf_counter() - start) / 60 + with open(output, "a") as f: + f.write( + f"{clf_name}\t{train_score}\t{prc}\t{recall}\t{roc_auc}\t{accuracy}\t{finish}\n{matrix}\n" + ) + + # explain all the predictions in the test set + # background = shap.kmeans(X_train, 6) + explainer = shap.KernelExplainer(clf.predict, background) + del clf, X_train + background = X_test[np.random.choice(X_test.shape[0], 10000, replace=False)] + shap_values = explainer.shap_values(background) + plt.figure() + shap.summary_plot(shap_values, background, feature_names, show=False) + # shap.plots.waterfall(shap_values[0], max_display=15) + plt.savefig( + f"../models/{var}/{clf_name}_{var}_features.pdf", + format="pdf", + dpi=1000, + bbox_inches="tight", + ) + return None + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--var-tag", + "-v", + type=str, + required=True, + default="nssnv", + help="The tag used when generating train/test data. Default:'nssnv'", + ) + + args = parser.parse_args() + + # Classifiers I wish to use + classifiers = StackingClassifier( + estimators=[ + ("DecisionTree", DecisionTreeClassifier(class_weight="balanced")), + ( + "RandomForest", + RandomForestClassifier(class_weight="balanced", n_jobs=-1), + ), + ("BalancedRF", BalancedRandomForestClassifier()), + ("AdaBoost", AdaBoostClassifier()), + # ("ExtraTrees", ExtraTreesClassifier(class_weight='balanced', n_jobs=-1)), + ("GaussianNB", GaussianNB()), + # ("LDA", LinearDiscriminantAnalysis()), + ("GradientBoost", GradientBoostingClassifier()), + # ("MLP", MLPClassifier()) + ], + cv=5, + stack_method="predict_proba", + n_jobs=-1, + passthrough=False, + final_estimator=LogisticRegression(n_jobs=-1), + verbose=1, + ) + + with open("../../../configs/columns_config.yaml") as fh: + config_dict = yaml.safe_load(fh) + + var = args.var_tag + if not os.path.exists("../models/" + var): + os.makedirs("../models/" + var) + output = "../models/" + var + "/ML_results_" + var + "_.csv" + # print('Working with '+var+' dataset...', file=open(output, "a")) + print("Working with " + var + " dataset...") + X_train, X_test, Y_train, Y_test, background, feature_names = data_parsing( + var, config_dict, output + ) + with open(output, "a") as f: + f.write( + "Model\ttrain_score\tPrecision\tRecall\troc_auc\tAccuracy\tTime(min)\tConfusion_matrix[low_impact, high_impact]\n" + ) + classifier( + classifiers, + var, + X_train, + X_test, + Y_train, + Y_test, + background, + feature_names, + output, + ) + gc.collect() diff --git a/variant_annotation/.test/data/processed/vep/testing_variants_hg38_vep-annotated.vcf.gz b/variant_annotation/.test/data/processed/vep/testing_variants_hg38_vep-annotated.vcf.gz index b401d041cfc06c9ac4f3cb27e80073852098d830..e4c52554b8ad0b63be18944e2a3c6fa647cc62b3 100644 GIT binary patch delta 116071 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≷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
0kFr_o#HDi>e30i&V~MhmG;k$@e>sT=Vg;)kPD( zcEQv^Y)q5RzR;teq>B~ny$^m}U4Jy`%(Ku_;nYAn;~_(U>`Zj$&TRr5bDM~KL)5_> z@y7YkycXDi-HY)6Q>C_nw?19F_bf(JYCi0a36=10Pm{$U_$j<8l{xX$NIGiqvmFu<;84!3gu>nEu`sND5f9pllHOq z-2=R#r?%0N90q1P9iRfuTi}6;^rFo;SoGc-S;7YGx%PN`_f^zhm9)IpFp^{%I!Uk%+!y!N`CJ*D(LjCAZF9#=U5Uhlwa zs85~XzdEXoO3I%d>d8w;x+iCHDaGzf{dp7BW=IUWh9&TsesN?SRK&$Ypa-2J=OX7; z_aElCz?{{aNoDYiTXMwS>vng z`>~GIN5uQ}yQUyl6{O1%$;8TF#6jA5&&S`tw(v;(>ZQ#6)ro+VTA{P((a##?oOIXgcU;>$bE7h9tCsbO(H zT{?%cxH#mt*>O(8NP7BKsXdOGGP7~03aE-pG%fE`0n{5Wb16r0lM^KH`D-S8gyA55 z+U+(t70vS0dX(~8lMr7rLjI(`wD{W@nRbl+M~iM2c`p3g+_2Z%6KzjKXZuGbQHXm5 zePE}5M4##br^|1ATo0Z(2y@1a)5Ae*_(efGL>t*XF~W<4xjb#e*!2aXMRY21*}&xW zK~xb$Q$rwOia`#}%7MO*m0V&-@NXTt7zEXVzkRB=vf}3>yb=r-9PP5Ne;=ysTdhf9 z3?Ie6&-T_n0BO9aJxu2_si7I0=6bsjMe$4##|^B2*N-k~!-}m{{qa5n+NM87M3UGO z5()b$E)TaC&(B?XvC^Y8$&nM{jXE_Mk#Lee;_jBkU>9@eIu&H(8X=V_g>L;~3SS_& zIUOB;?;#4_4Z7zi-H9Oc#0-_V2%ML>3Y^~|U4%-I#Bn9Vn@ss%&IOe33oY&z_ft-v z-d>La$38rKgfSAg))^yiJ}7@T8hS+~lfwP~_!vH}63m!y9l3eDoS?mPh7VO32>ggP z_LZaO)b1trI6BqMW3yv8CDSu_54b7QLDe3#*+?OSEY&i!+}Ro1hxExyYueQW!~Rx| z8Rloy9@B5{W2lD>-^=KY<@Ywj4aHm0_?hV)FjgZPci_0PEMXisaUg=aycZXb>&T*b zt2el!C$M!65Ki-L`^i#@@Gj)w>T9I*ReTK7(@B3GhN)>gif|sL!h;DPZ}x{HAIW9^ zG1TLp8JGdVSx+Gxt`S6c>=2u7H1Aig0vEZk+$)V@{rKB%2gY)yK$J+MO(OMhT6Q=_rf)i{HS2bUU&<$=Y?ECh^aIS(_QIy+# z-Mw`{ar~bC@QSZHv-}I3Xye)AcKt>kJgBOJkVa;Y# zpARXV9Z4vtBooD?ca;?+hP<{N5nLL z=l7dj?3$dJA&`-IjuRqZqIUbcSg?WC8ffm1CY~|Yo@PmY*kpcxI8d>SBf9isz_jbE zGk+WPhqVhC2yoZUEJb4V+tCF(yh_;=NtOJn?xSSuh1Q4_N4SAD}#Q8=7pwe4-e$r@L>#VD-w>A=~zgGO~aCfy9Eo9a3{0g z3EspiJ+pzKG$rD=t%StjPeOD4fVX`!!WH*S+%X=NSo{J6^>1rBU zj9#%T3!7YX5iqCIeU1t7BHP|RH8L-z6Uq_hm?=B1Hs`;`1SE@OTeQ&aNVf08oK)ZF z&(l2YH-`kh`$TQFjpOr@9`ByLnXWruJ+8f&x?V1~PPZ)Q1=E;^sswW)0Ia}{52ma> zU+uZ`FRKQ-G>eYN-qsjZDoFm3?5QGP#4!$%#IEsX&bco};$$>>Iaos%;ziUG#dd+I zOf)m=_j{y1V4642gMm?3k59Umd`bR?#$Y*F9#FpEqgW*Ezp;mL4zx6%N#N_H5uCnE zRw-$)1~UH#=Yd99#lUwXDsc_@@Z=P>^Y<##W4035>k6)0!p^6iebb1Nu)CiE`nj*T zy4Z~f!6Rat3455bpzJ+S;tfh!Uk#{EBf^z>gY*SGx!)=Ua-)&ZuyPb5SETe68KE@` z#4z44Hwt@FxJ3d}2V{{XIc!s{1DL;XIN;Z-q2o6V*ep^B#SC63@ zL26?_?E>^K;%ct(e`eEsRaHm+n>dH^>9?_3|Gp9N9#Qu`*u%E|-=_3Gnn2fbOrVFXFbAwsYNH~>1+uNZy@jM zqmDe8E)-_cxYVjhoJC?P;Y1La$2w-IJuz#|I6L-<=ncwo@nTM-hOjapO5$qDN7%UL z$W~whrB;Uh%hE+b@eFm4N)Ax?I=JNz@aWtsFJDu&hg)L_2MckyQMu5M^nvdXqDWF1 zKUw2J$Pq)THj zO=e3SzfcNoW4TjiO5c?Ih6;ptZml|oElWaIH(yxdy)dMFo#$`r+xHVuS6Q3DGS-J~ z<7jk3?Bw80KGTUgmdU=Mq#0X~5F{dP%LJ_zKk0qgugG$SM`7WU8=1+r|DvxW6_<}t z#A|E=TS2WP@{CtOUTT=Eou90mrC&?IwDb=eUV5}l<&ka8fQks90IX0cn*AT3n@*zG zo^{nyh{Bk{e?q<-F`B)p$Luha2I7aZh|;dJO@6|L9rQky^*_+@H7cy_3TLC4v?(bW znFABILu8NT@BeqMQ!Uh`Qx6dZ(-X{){MjA$>YrG)|6omPx6HNTn%le}w^?G4JlO)M zF#d$~eL(F{go#_sxnT8Yj2Y|ynYnAm3}bH3UH#P>cKypn*s{D1Ahvc;)L zSnMkQ35;}beGF*zf1*B+JujTSigM{{E`m7p6GiaMWn9?_`HwCXGRQ&#f&Zs0nteu< z6}(nuYk~Bxs?LlM9`ql`M=eigs`%*oYw|#}I5D2bMtFBPnnW8%KR+-P(IN7_wv#b; zBfHkwG@=HuJmDB04k-o+0*lt`7zP{;d?X%XKJug@mC@nJ+|#6ik^{@kB=&{wi^^!g zLY}Rm;WVS*kL-f#mNh9kA6pGgERK|+q2trX`_X4JkG6n7k7&X*w!&}5`AXi83q{hn z2S2!i63{=Au+nEV;p2b(63j;&+tGRx8cccf%p9NdS%+y$`B@|>L(o`XP%K2FTT8@t&$Lz=9w&bdi1XMugKfM@#NM2sSsIMmQGu*V-c~d6pQ*A zdmpmW_SfS@LaG@I46sf0|LMah^wZm_{QUI`m((Uf1+Urr$;;%KO(_NM-$PL8F^oq6 zhD*P;x>u@8LPGu=`Hz-#ebHIh8z(hl)D*MH zfkUxn^{uYv{x|UB368NkrJo^=HREOVC4eDneM%%*Oq_-y3eaJYGe8S1CQsQL6HM{@ ztdb!3r{EKMcy2gEw-_iP{Gc304 ziqnl6%gZMe{`q;iK=f_T0I+@ki%SS!`U1xP#pTzT<|O>J0DK(_H!BFk|HamOfCHy- z6PRMaI3GBqT#$*<|E_7eqMiMa{VXq!G(3F)d7Za0($9H3ND$3cElS|3@{?28 zwIRY^3*npjEZW=EyQ&I7c&DBJ5I>y+%pNi~Ud+=|hN$f9)RN^(sKEJ{zTUBD+?yjUs*bTJ{snb80Pyj>!^cac>2AQ;9yX+UXKxTP```jP^z>m zrB$upYjy9je82gmt%G1HQaxiU*>zRz_N|Q(XZQGd_0H!vegqiwX;|_8y|Q-PV@R!m z4JV%TZlR`*Iq@sd&~|;) z+4sw649d6+`F^u6zUyaH6Mkr^!Pm`l-LvE}o>sdrc4!Yr<+tkRqnB~FjkJ|H{L~Yi zxEwPFMSX4tfj9*y49*neLa=p7nbR5P<>Q$)^TbbGBf7%{=)tJT=?4{)TI^FFpXHSo z_g(n}xOpz%2c~)!%Sx6VAG;zfi#^MPvUONhk*he()%$yGpHTXxTAMEO=SXR|Wkj7g zUbru|&QBB7_6vO zDSVU=+E(yegF%@VWZ@JMX(+g8qzjc^H}eo#d^5V_42v$~L<}Xf?(Rv=d0%u0@n32e zLXXGq%wPTy6UrDSjM6(BjyoF`G0vxb@;9h`_bGgtAKCdH|Lr2Tl|83vH@6&fqv@h9^)7C-E6-kxftj?az0f2a5>=u2+*tJ>l} zD*v%a;TX4RZkhRC`xxil)9%!D54%*D{*S?VrydzSd6ybdZF0xrh20r#AaOZd@aPWw z)Z}WYTYc!rU?SZRaD>Rg_FE17U#)-9yQMCXGdZU#CdUO6-pp?9e7wGUd}n$U$gs4Q z?z5&8@j^6Jt~`7``*u@@7Ja>de31?H@iFwYM#I{LWf)!kH zM$&T$SEj?@7WzZ_kTN7hf{5DX{I+b?i6U~I*Bl0XI*9@0^&Hk*g_;#`*AiyM&Sf0( znPgrx<;KxOH5eBDZOPoxTnmvV-c2AyrkBA}o_Jpim3?JB^n5z2aW9^vQVQ9b#X5<@ z#4L`dw^+{Kde`Phy1(nX8MA)!T7lzOI7f>_!)4og0RfJ0GCWW!8gnDvGr88HBa4_y z1$n#YW5Q$N=m>8MJ=6@q4Vt2Q&`;ghecf}ReTC!1l%w6PHHm?*lfr}&2{X_jOR+Hz zd+Fu67`LH|cHy8;#r1JGEa<|;)4&~ZU7pjj>OrzyjdZDSPS2U0GRnwP9R3pl-6{C_ zzVD4qPs+RXleBTMv*Op~DX|$ERk#L+m3DNh!SEN*E=5kF@bgQ6U&=x6GD{Q9OfyWY zsMhXrpjml2*pW#lx9!omw&a4Q=CMhSt~VlU|BadX;lk;f)BA8~y$M-t2M`_br*^8| zdy!XH{S}T184+Ei7+R-=Y|22bVi&kZ(1gU1EGGNM-NM~1EUf%A z>~!Cvy}_G+V|)?-cW3sj&opGHP7TLegwl^1ggflQ!4U6&)ir8GX>z;}qst9tb_k~t zNx(m*ySzTL;oq9NLcZiYZh3Bv3M-FN$8JwuAHKt6!+3OfQg&?X$k-AvcuP4)lI(qc z-}mYKEHg6*;e92~Xt{D5ir*N@H;{pfX*uRW8K|RWVoeQ1?)K-W2GT&55u0JdO2);z zKI8;qfYZb1pf&J7R36mo1iFBO9)g)RD!*#MZ+-6^mjwk*bjEcQr-!1Qs*vd9UnMmw5d-5Wq_8On&jAx}#M{tL0 zODkNgt9AfwteKI1nB#&FU5?Qp?CLAd$vZ-|$aUIOp1b4K{lmrbLhbS@b)|U4l zhr?j-*Ud;NT;p4~`*SXr`!o!()7%2$*UeYRX3rVIVzq=UGlPC? zQKld`+60i-Egsc1rxJsHm7Z!{2DdF%vKh(4a({q2co^+xFFUnoY{#`aH(y%|49^@T zouSm#V=KN)If;T%v^S19+#=1>)eRr#&W<(alho5q-fZVDjQ^|=EuQ>X!?Ma37 zBQ7y2xn7CzkOnpgIlA|!_2bZ9)A`C|{hY&psGoo}a?!{dkscAsSc$49>CU4O~8 zAp->-9bDi^dcZ&tzopR!#v{fH6qv$^ga`|_0sWWMDc*T|p~OnvS=Evo-&|Js| zV&B&|P4*61=L9>Lde8r~A;$6bIbzG`hKVDG9$n9)a?Y!QVdjS&S^uQ8zR09{K;rj4 zVt$3>5JQ~ZEvAgTxI4J-_%OZ`WORl1ADnWzV^+{8^c%D7JSytP(7bivk4SKD18;G@>OlttViCVU#iz<4?y{SsH!ulMBhi z60Bb(H$J^b=;~c<Q1o_1g z1k=7cW7P<(4!(tb@I<)2%*qL_9MIv(0t=yoU1&8Ve(WYL->Ws8N-Rx48G7*cA*aOaQC`{ zw901bMlxo@aM1cBad)6#jsq~x;)(aE#XKVXmcHyidcTQ!m4!_*@y^#gClC|VB!;MB z{|VT=BblvJ^><9Pxk|`f`+H7dlK#eoC3?(psTlS%1kpkk#FiKiA=I&SdC4{c*Y+i& z$A|TnEU+5|P8$YQ?kj+L@em}R4jfHUqzl$hRt}@8X2WwLgG93^UjV&iJCy1#%-Zer z%Lkwy7rfOaRl{;dy4dcV1e1mbXYF`fKfh`elJFY}>P<3K&Z}r*<0{u~zd`Nyy?w4r z{eB)qOuN?gOT6BqF*{{xFSvZ_Ud||9;Tg4s#Oh*SK<6eTMeW-FO|5sNCe2QmlCtD? zJzy3vK5}41H2qveKm@KJ2YxGtLuTj8Wdtvk%Zqq#h}6eZxPr2lvm920ZK1EJ$R&+Q znHSc9svXeuvt2}kODa#(ce;tNHu17ju+IfUJl+RRl8shqW|=*-nGZP{BA=q160%#& z6Tue@Jt|m5?F0r(h>+&FqGX2a6yt_u+k>5w)Y1PSpP*0;TLQ}Ec}TN&((csmQ+Yt= z)6E9pTdh{4Xh>7=3t4oxBi}!aO>?qm&33yTl4hi=kaT{td zv#wCw{0o1Bd$&xZ1u@2&%5VKpwa+V|@!p`R*CZ#4&S(-QrI}KK$*1Dv?T}|7%^;^L zwwauaZlJY{^aARG*2(HEsadOw0uk8HiY)=QvMM?wcLOx@uioMgC;UBPqxONSE< zwD%5x%u5l+?v1o|vRP;~s1#hSt=QTyU!*?JKt?Ms3*gz0+iF#i0{J>tX6LY$C=-u0 zT#LHpJnd?l3)_A0m!Tdy#v@~^!2Ow-PP!m5{nyvsyZI$^Brw50<=@XiQA$@Kn61S7 zh8XCmvWmW&*%~{MepU+)t1v3Zf(WT9j_(1tw^MhjlfK)S5SYC@u1w36@6$+WNG$v- zpez2)KME|Yx|(9Dw0Y|O+=yu6PO9>{dh;#4P{BBkh z1MIV%F5;bf3)xpEoA1;}Q;qh)#)hK#dg!lO8}z^yXS~$3n$_x50Z&KV8xQJI(;>|+ z#;eZZSodMF^Fd>B!^Qqt8#VEUoo}?mm@k@I5v#$%7Uw+=DZYN`2&SMzS@wgR47P>7mA?hBUzRKkOGB2}=>)nRw%SB?m z0N6Nrc6c#KUay1r&DVOY&D$CxkPV+PGIpkQg^PMgvS!A-54w>IJ_14*fPM&nRq{o*9W=Kk#7xQGePPPX_P%+G_W$FTYD7ELEL5igvD{9kRBD(IV-xp<+e`9(G)haU(ahKqtiE=ZvuV=`XSc zy#8M9uz7mGU*0BLb7cf0M!C9l$Nm^Kc>w=yi!pf30gp|H)e)LS=F=88ikIE{J(G{|oCU}#JTUyh975*j!70h0<)D#PyvM9iR5P42f4LDY zpdZH*WX$E%CA!4*Bdz=I4G61YeBnnma%;gLMRd~YI8Jm!P)DWwuazrePaV1hLY24r zCv$n?B)h8vS9ESpPx{&Xdy`ILUthJ&o3(qIOkrn2GMBJ@4VwpFM^v~rVJ@Hx0ir*f zCX6s}XJh-Njq|xBZ4=(!tGQs-QP9_i_l2+J1iroV-SEObXgX-)`)4@ei!syLgJkm} z+Gb3*>= z1ExTEZx`MRNIgeO7QBtSs=f>Ttgmxq?2g@PKU)oln4wJgBAwi1`__IEZ1ELWd&4U@&~y`zu-NZ+rMe!X?Pk>dASQ9oGoy#;a2)H-*SnZM z-vUT*CI!*h?1My2%C~E0Z%?>M8l+NB8@%6|nVz}z&}YdU={gO3BK|BpM(z&pLtf8P z2TdZ%`3}5zpp7&oP4WR=Zf9T12|PaUgw#LFDr)rNm&GGG1f})kg|=*<2i-mygUWTn zr{h<3^VX=3PITmtwQJB)?(HkIK_)v3P-t8rR3p&#p{@oNgsCLl*mRx2U02=iEz zYHnbD5MB^2GemX2L7D3dWFSttP?c{-^kp2eXJBRTdfb)c-FKdIs>5A81vnXo5PgCN zdx-wnX+8R*vV(Gh$QnQ342CLHHJb&Tki(&e*C+F<;Z)=Pny3ZD7JOvsz~y4cl*jzO zXXuYS7EVP@dt`j>>9t$s4<**7hBFzf-Z*gt8&rX?i{a99-kvL=DtsJ<&A<`B`nPeg zf!l+c3``w3U=4iktxZ*RgQYo}W8}kLDVj%bJTe5ceY}de3m0aL*H7uN-bm&TlR*UrB6NBLtDcx+!uS$^_0jdyGPOUrx0H~#c=#xN z^*VC<#BUMXLnpDD>2(T|SmO9WPl2Nre=P_UOzDz`7>ujvM1g;RZ~8*Rt*AQ)VWIO;H-WJBEBGM~rZ`;-SxZ`v43un(dzF0U1!n157$dWw0beeemE1@r#56f&Bgdfh6^>%SU?qeUK zJMO+HRoGzk*K{*SdCRS~P-ypnb;J9sYJ1cS%*n<&vsl-H%*o~PG3l|(>~OP4Hf>< zjoIYHP>iYr8fKsOvG+z&u0kwi*9P#K>e<^$$Z&dNSq!bwn}V!2_H3kkg1CaM8uw-Etu;#6|7(TjruMYSurRA0qZ%o+wz^xj~;&efjN2S#WOWVlchL3%9XpHHqXLX zP|ueY9r>puw-_Kx^UR1DqmwC{uBWqh@V>QElcW7MIIs9@?siwKGr4sa$IZ?1HYu9N98*XVdYL z`RL03pkO~BJaKf`DP?*{TgC6qH&OG+4VxSoL=&xfVw##SyL(r5tIa-@sKFg>v2W$=*XrYOjZINDO-Ew{2_X)^ zISg5F&!2FjiL?tl8QhpkTh(BCq&R`s%rVdf642XE2YKqh6Y2N|+di*hZYYGFZ5T;Y zPIj^t))wwU@KKTvA`1CjOMm!#Z@qmtn4XeYixQFF*aBk=I+h<@+26N>=*DZg0g>A_ zJkt|N226Bo^7DL;lKvGZaMual(L4wsD#8mMTlVvb#5lbopGDX19>-$a%-XI+V3hLW zZicw(Jo0e1+C2~RN|v>)?EQEt(hxdU0!V%iFgqJ(cDp3zqey9Dz|bAO{0+M6zR*tU zDV5Wo3OO#bG(Psxx7coAg@Cdx0rC(aV#q8HVR_EG(J?3jk|0Ee1bwIHO9-e*{<+5) zmYw*;Qy$XQ=))H%jjwWOv^Y8&qE1M;_8We!6LKI}&2c$Di($qjZxfMQ3?V^OkwCw@ zXV!HHZFnVVnyc-?S}EI#Tqj})Q|xp;tcd|)r(BLSCdskgL9(6_idZBZ>BSGqsTl6U zeZnd{8;K+sDsKbXrUSQWZ3EC~-twogWxkIrP4y?lvbE~y0{MmGWV&JvhYKhB?QZ?> zFvjf=9@seVM!sru{y5Dd{c9|cX}0hBVa!hP@Uge?YRB3mB#m~M=UE)R15RV`0p07< z?YYBiy(Tv=AL@F=NGD>Xq!XW4H4L6)RLdTs!-XDTI|ntJb>B z(dC?Kv3%>YZQ#Gddo;xU<+cf6$VNC{<=k)K#^ymh!Svzz5KkZ*{{`)9TjeUhv9497 z!>kmosn^C@>%)P}+y!i_A6URcSjHmmj}>S&g58%$FoY_QXa~l2YHyMaMR$enz0%AZ zp=Pp*R8Yvppp`|ED*$p0BYRsD@R^6N@))YgBd9mQe8h?x5jy^#r_a`22A}aBw5Lc; zJmvIW1kpdNU_MU@MYR90_C{Gf^GE+3^N<^GqqV7%xgzl&l>!wj=M~#OI3S*!r(kn6 zvMqFwX+FQxMM}=HgHm2-24HHx&s6w~0|NzYx~WveG6^T1i&X1+BW1{pV z1*0|n@Pw}usN>fdkTT2|_Iy7Z2VU4W^?Hm!p=m{8<>fR^krW*B#7KW7d`JyqAX2KCbpBb)23d}E^qRR%X^8fQR^#|rcj{{=Ig-qVG(Jz9Z@2t)^|tzR#sdX9PjyMw5O(Et1Nd}ytBx*@lPS8C^QdVruu%W(I% zCo&h)|MV-SH?AxPD&f+aqW!#S%K zX!MvFsF;}}6C7+d5mGjh0&Od`pU60Q$T*WCq+$Q`vSRy;as7vpH_Od-vhwF+x47WM zv{|`Kwo+-Hml3WRdT#1MN&+4)u(C#{#(kSp)kXA~pqS%M( zaE;-hc->T-xojsOV;xl9sH~w&&4Qu_+GGUVWaQnsqM)TI_k$qZA1ZuE*u^VD!gBT6 z?Qy!vH!wU{>hn-N$ANbzca}g47J>?9Xw$vxF!XfB$cJ&;h4vQr2b1!5*$f|Y6n1{y zoG`zh@tFbgJn?fV^S{dc1e3wsls!3h-yC9h*{o>wN1^(3N!Ew?73+26HcZ{pbc>xV z1f48ojrB|Pd`{zhZrnZU!|iyG?R<{7NftB9?HKXi=K0mW@kq{s{(e!y*lwUQx`lf8 za{Qnj?Z=q@jBH`uCgkPqLR>Y?JJ!@3tG;!shs|1MNhVxGO15{O@S7_C`$_SR9sxf*4&PxoQfuGPRDB=7tp3Q>c*U!BSfnB!-6Od zW4TW~j2_qTT3BD9s9Cm7lCu=emhnApipM9yyYgjEv_pgDaR16Q$L}oj;L;!kWio5l zS!d1osjpjGPQ(7}PlsjJ_ubiB`*in%Y|mWBP0I77bDqzSLihJAqesJZ&;z3bXQrYx z_EYQ-JFsA5BdjWOEClu_7C5;6b!>=!CZwOlL)3^CXdG^I7B>W@3#xM+)9 z(G@7}2jBP@qpS}_ue}9cf6y;^i$JL>=j`6y%)6vc+hR?Aq!UHdAruECfo`&gK0ET9 zkx1(CX6Rw4r=%_N=zMpbaLi4e$m?KRP0q%;qCV>oH#CulL6pqaAsm3Eg&hupi-5NK#Z(GK70$yr_ASMxWwYZm z!M`XMUBbX$rD)IkM<~JmZcgGKc0qET2}>)Ej}|JGef_wcOW%=2m+~+Aj{ksQXBzrV zS&FY_7))4thKyxQ*J;;MO&tL0%H*FOyxi2|57Nx<{JgYfJ}Udt8i2u`_GMSlrP9p( z8YGC!*^|+VzAuORPPW!7f@vRfLDzT2^W;$Ad2h&i)5h61lSzRp0S@vKQa_o4h5_5& zqw;C3Vq1dM!ajZfx3*t@gqa{XX_mZ`w@7Lw)C}+IaKrSuEQs~e7@Qw^G1jP94x7i8{N$ZVsiV7*8+_1 zRprnJC_HTZoHTGeU2?Z^>C+vP86aFi0Rm3!;KfMSr_q_f8w_sv(yH_Hl|)SxQr^&MrpS@sjlAUBlvO zH+nbTkB*eHw2x!K&DdOyjo^n=x%+I@alE)hD#oC`yIG**)|h>n&CjX|x{}41SSBU^ zBBiF>!3jl1dfnyEOjGh48@&YEdP5w&M6BBn)b#TqY=I^$dWuqJ)X==1mA)YFJiU|< zPH9kIVwj2%JKPi*Pkh|swWpyUiIKjGC2XZAhMY9nu?H4JSoW zYZvMkO0jM?u`Sp=u5W9DHP$yjto&}p8a`9>dViL5t#p^y+?YYfw{##B)>L#PZ$Z(6 zt`daSbN3|o$8B8o>f9vo`1S`kdb1PRHJnEbKYxmok;JKcK1wQ>Km;)_Z05Gmoe2B$ zEP6zI*TLt-_5UQ<|C4P0Ps06|oDr3c1N8LIM1A_L-eyirqGw6-#5D71XH$;a-gWGC z1(D03s=zb@X?tC}cV1djZkvi|`5hHq$lFl#0gSc}&r`HHM>6HGlKR|*Ro~IDY|Rj| zHzYqO!PkgfK}&cA5(MP1@cP_=X9oD3Yz;p07bM?sfmi8VOl?EAsA547_#9MCAfkL= zF*mrpz4@eT*rsctjuZqrAY6zS$!fSUDMCn$h-8KU<>(`&tdUKt)XQh#a;sU(l^1P) zcz=&&dg?~o0Q2^SmrmoH-C-B>X3!Addbb}O%Nln|1Xwr@!^z;ubvwB|t~5G*-2Ds1 z=>qo^GBzhW9z*xw&EnAiY4pe$ z4*QI!&@G+MjvgXIR;RnYA~;;2t98_uMHzV3`zx>W1@L~X%i_Qi`|7cQX>9p)nRYR! zCjBrfAd=i9H6s(uKyrP>Z%U-pbC3hVonV3ujjVK4ytR9sL6%BgI}vG4korr+AS!j1 zMMq*>!DtmaDV^Wz5>`YUD1k!Hd#P5kLvVPAFI+3Lw#01A*I0Hd}L2W#Z~BNMM=5Gfb>N0zT~nYY+h{H?9qt9;-T?^iY3)SEFX zXfKHt*r`#?!ztcIGEvNWa-RASJnW7KdH5jmITX1iD!ND#yC?+BqP`{2 z*SRw3ekS!kXcQw6FAQI(jprF#D`RQXws{H}vg22EYH1?T{p^T8u|z-oEP)NgaRU2S=XrcJi~8|org`mE2q-O-~V{WFA8 zXlem53Cg0#DRs$1?s1jF*GI<>rK~nFJOE1_(6|}btpB0#6kJNxWo!^XkhL6Tm30j- z7IgAMm3qJlThXBrZ=87-uhpf;XiRa=Vo(SUHj-wg^IOH*w7hvoMtV@3X=f%^#I+dA z*Bf3fH1%k|(?^JQ5(@(S`}%GE5trghL)F806>TDM42HU=VZ;sNM_q>nf-Zr-!GLl9 zW_6lieC;EP6(1en1%em8XWu2^`!WJS1Mc+JdXPc)@&#v(>#luU_YKZploh?jiK&<` z)Ft5^))-0$`eYPTv?EXEZTSZNXj|4~7scdNa4c_=(ki>%Q?Uy-U*7cyeh&9Yx(MS^ z7BS*#Zo%k~f*yP`E?LTanFm2wf&vf}9BTrDF!2hbb6A{+5C(Q^oN8Lma((F$Rzbt? z%;Ax1!kn@2im0@CE5kuQJ1obDmJ9|IqYngd`Do#p@FUFM2hIzCKu!>b!U{Wvf3lIn zV0(b9D@X6lWErYWxI9Weq0cdZWpz?C%>u7S(^Iqc& zrd^|xSl|?RqnYhn;v%(?<19bJa56M*m6c6`G}T{jq1NfjtXhAfl8i-F-_EkhGHTpk z_pqnQVCVIoA?Cu9C(@Vh|5_}fB6-#n_V~L$oP!@meDcJiR%U?+a1rm z{7g?{w%~#K+(V1bfX#VcamEmUTMJTx_wILEtQta3jrD|*6lb6Idrn8!?(};!ZGJXX z3^WxbLGIIG=sOrC(-CK>Rn~{PO@w7=HJMuZ38JZDvQAQ)f!YTH`hL zF{L#F?KU$4`ADep0FA1nwGdH6re~v(M!r^&Zq(Ka0BK$`eioIRt#%|%OT6#-uYnw& znY^Z4zdQUey{8@MG>HsTT;*#YDW83#cz1IS;i4Wpl{VPhXM1rubmN#Dz6YuQjK##_ zlu&+gWt*gYwnF*E_fkVASW=L#e%b;{91*Li_)?rbh-Y`BQFg@D-jla<49(b@M8d=W z;qx1L4WOFL?;Sn9Ru(*m=bdAs<~MyY!2kW{$#9t%-z~2F$i?s8PR&gH@H60CRa2`V z#DMXx$w~>)8mTH~kXahcD7X z$V+K50rgMECsmP|7p^mx*X$4Ns7BAQQ+GXgvRB+gdi!6^a;F+|Cyk->u_ro~8@<5K z#q&-~!Tae=*#}jJtLjHlJ-3pB_Hw7dD1>NfdKBlsk)RAB42r}Yp0oYkLoiEPz1Rj# zb{bb;!#hvwKTNk$Us0=Jgwr!&cdjX&^r%~%J-XCZDRdkya7gq5F@F*NVZi)8th7HQ zRqOnE-9R<8pGaN#Ls!|lBJn{xdSM#KL$f*L@Ho)Z`rW_rr@AMHis1})bQaIWQ$x)< zVKPz~T$JHvHmzc8%q3Hv!qZj1$b^;2a@8kNXsgZduJwr}3zIq!qnCXM#GHes{^oH; znre8-^(V+(gPU@gu#uLlzlFQz9y`~`Md(a_*_-2CVK;ya%qQ4I=&- zKEhZdJc}bvE&*r2T;7%DD6hF@w}4!+4UV~(^`NbWyUYQn#GLxmiMi>XkZne}D(#k- z&AU#`KD@48mvlzPJE~CU?7$1a|3~mCZ*9&_{g-`vzUKKPIYoI$t(oe1zk#VZ@DfF- zf%;2~T3IH!>$}V&FT8%-*FP>eGM`g^j(mpWeeV}m`ClDohp490&!M*pzO;n@o%`8E zCf6c9hWsC;|LA@k^#q$-yFmys1O7G4>~LN>@2KNHc1<-~Ti!i!rn{xMihg?W@la*R z6eX6L(PX^nslxwDpXjpPUsW#&W=zTxUqe~TWF{6B9@{Rt=*sY!7tUc&U$?ER{t=#L zp&dJ8=vrsFc94z?t7z-On1>>45a!~={g}T98{cX1UBw3kb2L~NsM)h>QlCn5#UN6c zqGRj4oTA7#7u!$M>r_l#%5J}6vvXhEdMJ5Jqa`Wm*fln{NCxHW5XYUV8exx+PX5}t zf0@{A7IBQLlOVot?qhL%-%`BC!Si2m#U83arP3-sEu-T=OD)GDtb{otjn6|>bic(? zk%<)NC8Gg$V5?S4=$FVglSS$!ct^$cwag*KZxq=UVO-2ytNY?(8kDuOwmLOEOY0Pq zZ#C$=AuO-w;pF3j<%$V}x01MkUpVsaOe1{&tbwjQ33N>4fP5HLWDM&nKgu4O1Dj;lqjk>*yIB}gv@g)!rLnnxx zNAOrI)WIUW%t1v$ zO#+;T|NcR1!K>ABGz?P{3R>&$5!ZpO*}#f#U~C3Q8PnDZdc7=9;n8p_nET4Uw8Xud+%P#HoDEVyzZm1v;5o|7rO5+ z#hi57z-!ky=NNvnt+n!C_JuB5AnfOdW#UiNMBt5|byFTrq30M~K`jf2v|+;awwvbT z%}E_OqF^rZtImm@&vK~s~*EvCPqS+zyG1rhT<2)a8Hc?_U#rN!~ zW+s`!ONhgHETV!3>%Ue2v*N9j8W*xjU3FM7 z$hbj41aop_#l?$Nc5tLO<2})%JR@?{-r~|e`p_L1UQBkF_HG}FgM^ilsD9Qn}VZr5qE$_W;msCDw`F!5X_*o(K;HE89u}FG>eAletLR&&i zjiXQnxY@(iR+Tverp|g21~!C1J?-e!f$<7gU>*x=Zg^LQ>}3m4wmhOT zB!;4{?9ei2TPjTr-1ykYg%?~?fQ;jh2|@q4ojbR>j0v%!p-6AC!+_!t0CEI00mDxW z>j-NEWOd)hvmNvf1_KuGFRNc>VH+KwxOz&p?Mbi;Xnw7fc>k!*Dz ziVhVKo?1}u={os};~lzi07ABC&u=U?bWR1JN4-X$e{^EbPhEs=*DxcYBp&M@a&h|Wb6ValkP zhY4YZllQBVgC(mh0~g|Nnb1$@r}Z%VpU8m}tr>xmx~V7Epb)Wh0l4^czLlbLq9Nyx zUN9h9$!#S$Pn=WtXKn~ee)b68Oqa8Spf=j8!*ej_bRPenN47M1B}WCd@`F-XJKYH0 z3AW_sUERut8QPlwi%+5cnik9H34lb-E$guki!FdBWXucxa)O^G@?C{12rtW_li=<0 zE7KQSBv%r`-KE!O090r|5lD^L)5IYT!WKE&EdT*`R_{RHkdzZf_^KeP={W^`+0AFh%h=(0O&pe#cqyS^1CL=SLFVqc#XN!`R}-irVjJ46X^dB~ zuxaEtWGnr2vqjwPSzx$i-JSe%4hi^uE@a1HfH5rRg}@MF1(0xNTXkYCR0(4IYN*t3)Xvp^rx-S19z?`11bF#39`MkLsy8ttN#a?sN^6(cF3f%hEd`WCML;vD zn|N-iCZD?82}tSq>2DQ$c_5)6ckI4_FYP1v#6y&PC4i#698eaO;zU=p-@S+z`8FRW zhR?%21o{t31my62#~x<_^pEJ33l8nv3>idW1E@iTr50xZMx)R`=5HCH+guLL`;(J^;+5rHzib96E@YX?P5s9 zFknAUesFJLq;ws5O?+_1K_7RiLi1i$nD z?$ooG{hnNWH(Y!-zOE2TJh}s$LVy~0i+hfJvu5E)gCTp1zi`f;5iMEQgHOm$eu|OC zuC%|;`ZWqoDaT;e3oKFUf#DCSk495cp!o|(YB3BQ+yW~Ah~Xjt1{_lgpZYe2Kk$2P zBm!8SV!#jA1x5r#*6H?QVx(IE10&6rbda>WWL0QF@cKOnRRC6g)dn zOzKxr^k}eqD#-Z7-u3C-|CfSo z`)2A#k3NEJ60CWyx1T4x|iWQIFbdS9AOg-2yp&MNDV@51f=5h0s znd`>fo%kQx%D^eF617AayP>rH2H<@#L6|Ul=oq}HKfZ4{G$`@hWkNC~9v4rEy>b5Q}YYLWupI5dT}5Ex$6p=t0yyxB2OT8O}wrAe(CX;El9cGTU8}N zR4p^FOCYDXpn&WeMc=YvE+93mXA;G?R9RTz$jZJC=O+DEJSB(O@4x%Rm@-^{N}K$` zMt?-Hq_)-%x3VJDO`n&^!O+9fJ7)k|!6Lro>0zN{W?aN2TF}Yz2`8~}*jO5d=%VcA=KG~9K z&$ajHxbq07Q5jWpfe1QWlWD-!=Mr=Qvo;01wsB{xqhlS-Ftvx4+5 z5N8_O7%^TA>GCkEBWwBR&0C{Ua177{P9{|tixH|zYg<`+*XiYHm=mFC5+V^!eXSF5 zld6Uh`$5vrGIq15A!Uc6n0-K@M(4-QeyuUggFZKlEGG7Z=tAgD@v(iM<}pQWmw zvMN;kj)RpJ`1OV2zaz<%E0RDXOOwXP1lv!nMNY)s9V_Gfv+U+MDcO;;vYAMXS%2j% zF~6Bny*w3)P|x@SUpUD9?3EDv2>@Bpe5G;7=|)-a(f~jQ%cnKI6RKh$%1I3w7J}{3 zR1(aEkzBZ^?9+5dhLR-NG#d@gU>1~<2)3`%Wi3<(gwVfYK|=( z*bS6nY3tlqjqCS+RgYOFsW>;hh%k>7ZPmT(ZFPpw%usVuRE?F1+td;M2HaXOj-63g z)^k#hlD1ZlUcFGKbD)daJH6W_qm8^+2dU|u(i8ar!9~m)r@);pN3J^A1_^^il5H&+T8Zyc?adP)y<=_^7 ztQI{!TI_yVWrCI0kO^6~0)!ius97uIgQA+QBoSt;TKkkgWAP2@oMmn4Z{J+rx;X)< z9T-kPf)Y8XZ{r+yhed>9fO>*Ltw!vnyz=n1pqLesLcCiL~;l$K|XXxdql?@}HOtC9qbg?*N}~6$+XB4CbAB zk5?VKyrct_@}lQgKN40y)$Kw^-Z9#4h!fo|{-h;#Re?p{UB&3vA4@Qaau_I#uEd&I z1j+JCGR73vOk)z|#8M2jw1CxIL8U27!lhZusoB*VK{VHR05InIA3wJ$bR_qIDYPYz zIAf=j#BZx*JTwrCJ~F@hx-!BV>TjW`iKcha1Zs(!I zKO(_fIf@nQ$vdPbm5kp=yCtL)eoQj$L>+b_^Dh5%9ET5Xvv;w7zP-Oi7K~o~D}s`e z0Y>ZEP>2$bpw@p0PM6E=gEbzDRI5m4y!qEqurg1tF#w_!ci$!E?FMtAZ*2N#hXnt> zO@DQCJ=3HLcm4cq5L$*a;0pLa{5{ArKVl|7W}$zF-;By26fT$jZ3UJK)6kCiGih4i_6lBUzK+|`JwP?4T!__3n>a($ia>5czB zZN_TNoT-1tg==~d=3M~yThM`!op%tB@%Gf5YAeRT&URx+5w#A{a`MDFIc2r4`X^}~ zuIBTXPyfz7d*Kp*#9wcySPc?qJnoDBE~4Ix2gR&-$E-iLOu6{m&Yg!|I~B zR2G=!Q3LO|ev==vP!PDfD8+ z*2mDf;SMs5vYojc9Mr!5CY9^%bi>-yV{`5uV zq@G%hSPNz4aZKc5C>}2~O&P=1!;h_DP;=!+ybSr9+C0q)n8k(KO@W3I)cz(~Kbm{; z#npJkW~$E19?7ARLe*zs-isQWy`vmxR%V79Ay?e8&Yfk0_wGyub<5S>aFC&BSKUa9%=0n6owy-E_%h zRL3>ndnFWWR5b2O-$}~j+U})kf$vUMq)BIXN@Tw$|!8ILq-a<17*jWps^4 zKCCtNzM4DuA4$@vCG|Q1jq1q>n>3QtMwd7DCD(;I_1pva;!ER8^B;(TP1M-6xK#LOv`$Fd*XljMux; zf9mzW@}9Y@@|6Wj_QXl8h5u)qSYJoA0_0!|AmF*c;AYhL882>z`9~j@Orl z@59x4`@mQLBqzsY{!>DKASpMD zGe1mK`uytrQvYQ|xk`=RQ*nbLWnzdt3CFG(kC!t@USlll>-YOBYBze=p>(F&~JDJI^isdq%3Mw9}p zC-3fel4_+oS)1xRaegi8^&cyf`qKZuk?Ei_e48hh#7;5mElO&RgiH>3>i< z(Oo&0@C6iGvEt`j6AZf}WI&%KvCN^^39=oC>f;R!b z9v#9~Ey03!GE(aSl`Jqc^=WKj%4XSJK0ooxt3z%VC=wVS=e^$HBH0gx3GB&aJO()^rQI6b$OB5CV`CU%Mzm zd2~mhQY(|c&oZYZ2$8uFNKNRE29z6ckFyv|YQv)$O}CI02Gt6J0+#@&pGQ%LDpVI` zCVZ}{%C#`5P#kKmIO1_tw=S=A?H2%2v{d+L&&m)PTWmRZB{+)xrN&y9Tr(qZxuJcO zyQ|&bvnJ=OErBSl6V&NXsUH=Fb~;+3@=J%_^{sN!G7(eORd`EAOy-*qq%kfuf4Dar zgmObp=-R>s2j}N(tN3>2z3Mf5-a1`R19E!PyVa;Ts9tI8&I|#LW39KJ zMC7DoA0ukh51D_?VUL!AhiHEtoadW<&MYCrlSOg6bGZT3LaeBYp@!obZ+%B65}vaBxTREu#^dPQJlIzB!Fg)Tuh{*nS%lF6Pj75)jw zy}kT}NV8O}r_<@KqRaXNioHrEQWa;5DnQF!Q}l7ZFnBEu$;7$B>W0?>T_U{WDRLO< z?4;_=7FQkk2@&(Bu%@g5!{sg$Nohvh4bP`G3_hB?zYGQQZV4^Hu$pv@u*H0AEsDB- zRDS{m*baC!BtylY@WT*5QSvWe5#)f-W7xI>fAdwRi zPhvOv5M4p}#&oSj#o;PR|4f(7A~YT*8gZ(ug^AlaAq(1DGPks^y2Yrxc)x9ORave$x`O2P$T zR$bm=!!K~$GItR*Y9c0f^Fqe0EZW`DP;=LG+ZdlO8~^NfMYhm5v{$J+jeGB!Cq?6C zGxzH^U(1@_k`9esx(=y`WrNKd#SR<;q#DD{-*=!hx70^GChqv*f%elBtDPcTC;g`80R{aE!EB-`W1F4gwprbM}Fl z4_2nh9cp~pQE}Z=@H?iJ{|cDQF&)SPrvNVq`1Qtuw59PgJqUSdkD{V8=Bx4J z2s)a8^{krg8LyeRL*07k_uai5L;#{ZTVQo{A}OOsv_X)7wDmPO9i2<-dYAtoH+|U! z(@2m>xW!Y>ZP?MUy*X^Dvq&&tDm7X+_|0SY*ec-cx6y$@c^h}N>0T6TIo3C;$mOfv ziv@U(HbZ0>63RiZ8xM8!ZO8WYMn=~E;0bQ+*aM)L#~E&n!{6RFEq_si1?Rti+L;d zFxjF>{u0K3nMxl`8np5S2lgb|cXx!V$D^H3h#My8ZXqx4El|Yh(qZ&P=QMvdN|sV)$nJJv5%)Yql@5q|4Jl-ZPT^_x_8E>IR4q(hRNG$?h)E4PM>K*<9fF{H z@JUfO*#fpjG?umBI=*b34xv&@r@nVd@u4-X#r?_{na!3d|84h>A-=978!{gh_ec7` zzT{uzsOITG%^yP~Ft;<%gGt9SZVH1PlwmBLR0e_#`R=HfXo=5e0K^;v21JB-)`$EG z9nV~siBVUHo9+!EGH5#tY2HXgf!m_t?o{Q>a;5zViZ+!sXnMM~9>|ha4ZPDLDPl^D z9Fouiq>C0y$A!bPk8zdu?m}=*sk6b|XNT3r47HxvvcIwkkOkXP6-h39~CO zIMh2apf||54BJ2i(t|Tm5h-K8$UW=6YLFIZmcf=?$UQf65%SM>qH?0)V^kAGU*c7; zv|>e5#Yh@dR*NK+Pv$+;ig-%ooL3En3nbrw^`tF^L(8K;0Gq{Sw;<5Cg9xCJseeEz z$C!V43MN>{)zsduDuxl3@s(S9OB;46zXd|FAK1aB*lOyf2cxJB2`p4Ur2|(=TZkP` zFh+8voKQw9i!Kf!9`N+T4kgE$ta=!fG5<1e5_fIhK{^JyzlCJZLu%2ys2&{4!um<~ zce(HJu>Ky%3m|pnp-){3@lgJDJ~v6DL$q6?*dV5wxU_EJb9@_yzKUYOra)Rb8O#>3 zm8uc6RYpGQRxYn-4ce^$!llT>E$|ZuC1R@28~GW-k%>>7b`TZ zYey`DhqQ8Cnbp;7^;^w=>^wyC)%K@!CKxo5G3-^oc^FZ7bz%QVNBbV|PNu(yp`n^= z#U))B0Or!|`TqVhpgKmQ)%DGUpdkL0uuLwJLv!kAMdaK5-1T8(v-Ki-QY!GSy^sd# zNdOC^W!O8Uk@ zH5TB76ceYHVlq4UZi{7X76^W>ezY_zecOemL(2~x0et$W93=UlV!G0SJ#;%*IJm>? z+Xur|b+6RwH>jWIg)36^$)@y`tjNrC`g>_65abSZoStGRUH#%4^SC1JnoLu!3751BCo1^06IHyXxqSC!+4{`O zslM;Z`{>`r7b%%Znxt+FR>k-P|1`YceyGii+Be|Z`2O(N=q$^^`vhIw3$#rBtax>7%WoOsM0KjtZt5CJ`v0sb@ICUr7+3&h$gjU7jAVP3=&=LEEm zuOriOn+(*LACe_$Mn8jga@LEUP+CINgdS5b0%GnrDK!CcNoH+{_~A%=o# zLi0ErwaH@3*$B{Lnxv8c8ly(>nu&|nKsJ(katCymw2Cw+jw%g6tN7-szIyGvM+C=38cGC^iwUn83KW?_mChNt;HJh^|%A0^^$LntsN_*e-4GWef?RXQiw~LiL95BcUp6f^(w$ zaE;O(a`0*G<%5!9@1U=!Bn)S^FTI0&DW*l{5c7SNHeLqnU2}b_zy#G6|5ik!Lg~2I z@z`NULnC@CdNSN{DL9j>TaV10Tc?Qr)gXQ_zJpSAV54u_i_@HSDDH1OqGpOdcPn=) z3~%x@zV#abLoi_`A$G$+obvUYzM#MgKPaST7QxVKEXd`1_Ih6sF$toF&Gmv7)-Jw} zqISF~Q=E;7=Z5g*k96Td#xLq+3rk(SDv%cP<+t$VH}V;!x@JR9eqdfqiC^j@%`S4` znjN<-KD9))pdg<8J_u))QcB%{ml~GeZqhwjTry6^uIC?P$n6P6` zc@sb~7|Rlzod(rT({i8L0gEFtW78~Vt`f$fjmbYlR2F~oS8?oIb@E(8_?#UoXMpU; zpE93tNmPynR&=_Wd>_`X2t<_iQ8z$hw;TGq66)?*Y6% zIHbAQV{t-phn29~rS!u}P29>M!5c&`HU6I2kxWJmCxb8T|3 ze9YiY)J6?Z}%kiA=LNL=m#prp*D=SuvEEw4$p4nm$$}NCA z$M!zis7C@l5oS#>`h#dErWaWO8?LV2Q&7I^`NhaRE}5;^68`3dCAICG*V}^3T(Mf; zN@+UWR3>p;bD=j>vmbx^%8>g=$sg7dezgWmmYUHsalh?c z3wErCEbV(kq2M|dF@fJIWyyaa3)0h6#(tS#wnv)_!gicKAPH(2q`}zwNR$ZR2?%^y zTv-9uni}apTfahTfg@?+kVFpBmw--enybt`gWo3XaEn<^mwolxu=xS+AGmDhA9*VL>MFr zBKfYZ03um_^&^AGg_7kg4^%HJ-MJ}*1i@CWe_!>VtUp<{h&)3m+;br^3FOabW*>df zT>#^-&x7VAcj|ftsU9Z4YWofCX~OAF9Sw5Bpu;G2=0On0ee&+fSd@Pcen2wS4s3M(IjkbKuA$@`Y z|5aEDQ1*Q2fK^WABJt@U^2U;ZH>D%BToAKPBHEqPXxtQieH}T#dEr|raYlm%vcKZw ztDi6)eakLoB#dH{lnbm0g>%hWJ44bIryNK6D>Wnik<8o}AVB)Seo(gH$RVcK6=OHt z;3npXv{@9{q)x3dp1K^`MxghTDD`LmQf^Tk|8CWK^*G3=ho7VrP@I2<*B4HXJwxJM z4r`b9MX2B?&|)*d2#8&XDN@tA%%+G)4)}1~h`=U-cI_x5fp$b5Tu|hf>LoxWc;ioA z#X(zJ2_@Cu)Dm-u_-iSX`ZGD=2uD#UZ}*h>P(=`v~SrlNTJ-17R(_`&@b z{-2ha?WBz$Fyeb>_RKN#73r2zcN=#;JQ*9ZWs*NP16)mn`)+FS2VV9>L7}*`>vd_u z+vD@+gNJI8yE%UNwH^A*E46jP5vNv0COfC~97;D92`4(dEcSCQ`3xJ_kI<~F1SI=~ z)-%AKu7@Aq79Ee0zwVBL=(KHir>|8}@%b9d_%X z+ozv}G16+x6z8t{w=0zFQ^Pb;)Klwq`ee1|*9f0ZwMVw97&qk$FrjqsH8H8+QLrAG zTlCtQ@j;Sz z>!mVj)C)2kD#_W?c7!Sb#nuq|*h!eB)&68L+$sc6QvoSeRHjLGegk{e(|%ZHoe3bp zSwe*`JipF1A$AURzy#4J#{_dAOL+;R6c2N&$RCNrw{Ak6!~~Z^@5qR-*e-amOE%m#c&`2BBY{vMEt2)g>x1R^3m9r0-Ztc-gzu`m z6-#>PjP7owFT@ToE%Q-cCwkYCPBqcEp_Y5P{1+xwVVWuaOILcQs^@S#jH8hAv$W6a zyu%kEoR?uw8Qqz)_^fYbBK5+_C(S#9&Qw>U(maU5o?AN#du!F}!*rLTkqLqI^rmky zUp%UfY03Jbs_dzL9=oGFdNbpd^C}1?v5n}!;I8BQ?(ca(794VLRx8t~aq(FO z+(H0j9@A;c#tBcXVC(lS%WX40||IE*&zS{K=CV>7nr& zN4U#~&rJJj*yc({|zX>#+j``ySKU!;OY$k<$3|7Eu!6jnQqQax)G#JQdBuVKg!3bR6VtFTQP5FJRC#!k^bVXB`@0qMfJoT%}yM>^?O^fK2r{S9NLmS zwJr!G<@B} z%ok!tX)HFb0ApY4?TA_giiJfU0fJXAI}En#FEg4YIuC}-L((ZsB{gCy`vAlwuS}$V(Q8=QOTM2q`Z$N1nRlMC?K2Vayzz^HuTUm!206a_-oa}4JdB{)idpN_t=~88< zVGH8MK9qujKQ`?EtP)u_F<-BoPo6zGPzekStxnPIp5bCIh7!Nbh(#G^SuL;5tviie zOgm4G)_gqravc!m5_nEa;bPgOB;Yy%imin!uMB?@W11=+juQb=DR2MY$a5_+o!~(@ z`(JZ+1K^*ji$9C@UZ~%`?t=T^RhJbehu;So`(qY6bs1157uFP&U&IS(02Yh1_VenZ z?;52A>6(i~J9YfMGr}_n_D1qu&qT|Ta7JV1=ryR{JSbbO@W78($ASEc!vm`Vs{DrL z{T(UmcwPqXRN!_5TpjG2On55$>_~O1My(MuM+^;O;-ACN-*_O^?LOM@SAyNRKutq` zM>IXlNnH=z0NjuTS;-UaQGWkRH~5FfKST?wB9@dqp6@KVJPm^x{{s(_MjSXb zlj)R=Jq^T24riNtG(ZO&@`O)G_ zdCllx>gE-JBemBw8el)~xr&ciD-Bhxt%@2d{Rm(SlUCSw6prOKO+cv{PPwHvGobP@ zwX%?IO^{x8<2{hn97E%!ao;JbZo&vAE7uJw_lB6{edFT-Y<%xTe|(QY>|_ zbMgFk%*QdB2tNsa>a$m9qN}2n<7CH2x7N+p%fNjA-|$KQIoN0{?Ipdh9lI0Z31Gra z9B^WOce^><-l=|bxZml*82=kvgByE_Z#U#_>-o43 zd&|R-8T@>$b40BY5&q=d$6jfwda>d3A~(GfyBh7;64JKN_PFh5j-RBU{U{%gCNnDV z;lkR29X+w*7AoRR@ZZJ9$pY-3=efR~oy@2>qw47te%%;nY%Ex za9+8s5TZ%xK%SM;5M4zN9yC0|izoyTdA|olN_i>o3tHMF>UG^@ygNOveCrV?+UW@7 zrs`sc9ib6@Q9}LZ3s_*kZ0728xvJ~YoF{zYrxsVX z+Khz~nsPXXQOBI#w}1F_&uEA&AfIPt;AKB=$wn8VPx5*+WoHMPaXD`H?EZiiNE|TV zG<4hCC9vIRo~i+WFp8c=NaqaRN^6{auZT?^wjUccb0;{iqXuU->TuaMP=bqR-pimv zL}TO@>t&BX#HB_23qXdZ73O6b(o972pnnGA`yGxzZLFf0rc&dzyOvFX*#>c#wiczu zd2N9U;#8P&rx#b-EFdQWP|w&hb75L_x?#|p)wTw55n=$il+RLdB2hhFhl%>9muRSOwDh@4QDu& z&>}^L0UbL-wOyRiN1O|AD#PeAMpLPC;XM1ku(D5hD~4^^t)l#DOg&!)7rBF{Xp)KD zw2Br05ebdl7z!2VzN?uFqrsdLFy(Mhf_A0Q8^I_SjGZEzCj=Wr7+fk^*c#gKVQk~a0iB7Zl$yRRuO#bbVB-Lk2DoLgZ^@-zE32kh zSLQlBrm7;{;WKE`s&lEHY!gV!VPylyQ(7?g4?3p~i6dZ>N@(ZBj3@u#Fw~}P^GYy)JH9PQ{B82D z5tX!joKU1dphWUNv@aY$D`6-G(P~)I#nZ;qx>k;%l5(KHIRPvfE{QM>8E*=m=mIB+ zg=3vkziFk>sbYmS^aWB^byjB}X#Cd)*X)5LGD+7vT^}?MAFq3=6_`YlL{d6qVjg2( zO7xq72B`w60$u@ma;lXH$XKp{GsD4l?S(7XhD|YG{lYa0`{T-fRrkx@CjhJibja%v zorX@89#F5&el8VCHAfi6C_F+noY642Oe+zYgpsLc_ovaF@jQW#<3wBNBKzRB2sO-9 z;5Iw+h8!*(^5<{+!c2Rr{_5I(4JK;F#ePe(*$`811l1$I+zbb`kF3;n3mldiS3I3V zc62%f&49vm@gGp=Yf{ z+P;B{g(v=ScXu&|8)pW=a&JEu+g)$pN9*G~ec|ctG2Cz?_~;gAUln9sQlw@&)=eQB z=Uo>jEAAsV_*RzCwTYUWj6I(HMcN&gO$w>?OM#By^|t;C(`C2G8(#aL%z>(;4`ZzT zg8;{k9cD}oiHF_rh9!JUbuI+CZ3vzb9d#oS$%!kYV(p)mxzxn;+&FjD&`_mc> z#+dbgR}?+{Hxh}>m+h6N=bUKXakqe0>E90gm%%vZ$foF!qVf%&TJclT5-4GQ)$o1% zZnHsna`<@W3CdbpKx|$(!(OfT6wjW)WM}svTUPxBcek_E6ua+x(+?MrkEFTxi|U)m zBP+IPTdCuXL=*KJTABWkwo{p26xkZ%!+n>xaiT z^?==PLD}Y0x2aU-mCNKy3>|j*`D9=p8)+|ih@?sOQsHMEPBiLRcI;tN0b0h*N_hmZ z_{BijP>QLap8OS-8MjYe`Dl{r#VdoKas&(_IKKRf>+QBUO)PaW9lic6bXF9V^nn)z zX0Mwc{VdF)x1LV|^oi9dH82kcd5+ex34q7Rq4<-DYY%2U;&|JUcS@OAkyR}IIu5)E zvHE=%C-?ZMqxcp2E%pxCE?U#Oll@1_8IRk2IoRF4u!srURn|Te>!g}fY>})kBhDDA>%7Q8nF45X z4bx5dT|UgM`3nt#iL$EXM@a0?D7S{7EvR09tn+>-cfAQHhX0v=z2Dh;%kL`yxcth9 zPh;rrmRmhv`#$du!2jd&#mnB=`35w7wgmZ8X7qOegu_+x((q1Pn6rKDKpRS}0}Zj5 za5MYDLy*FR-gOS-%>$)*L}@vHn0>6Uo+z8e?Tb|n2LdHr+;Rq?Pd$4+ zy)m}a!wQO19-|sy(ymwGKWU7vrc?ztYSSnM0&}P>E$t8H2kAZ7l0qK{v34|N+gjOD zX_YV1AOgWm`2F5;O^%fT(FQctQ}X!BDB5ho#ZTKxs`Kk%3uvuii%N&~8q%#O5w@s$ z{h#tMO`?=g-loGMdw}o{hCYP&ll>uRxWs z=oK3MY1MTfT07vDZR|P5KAH5a)yNUe%Pyo3k6K<DK@ zdrn4z@uq%7&SG;+*|~T~9VXiFqEcK}gaZtKb%IF>S0SkN(Ezii*4z(G?H`pwsqX_i zWF9F)0Y#-_MJS_ohVOY?*P7##De}I^rA&;-bzJV)v#)=hCqB#wKjpAXL*ywHtzht+ zhRWC51wDuY)>D8_d_Kf95s8f#>;cpYW+nuRD0}^GH27}%(_jK%0RD9HG22@Ktk(!- z;RAli1T+Y~TfmTSykp5*>Xz6Z!^cv)D3I+PE6#7`Y+4&LyX5MV=9vLcjN%D;&wqw6aMT}vH4BPC22{9zur;TGzk4|wLHFC&MZhK#NRrQnW zOEf(kQBBGncZ8i*GHazK(4n(z5pKZ{APAcgZKXeW#sHjCGH75P-z@$u;^}mm={<;a zw|1j4%KXq1sC&@YqCa@>mo8e~tzjoZpMVOgU(?9PQ1>#xA4$8;sB>D>|$el?RzNylAMy-UB50;=b$1rrDtG>w->5!aOifAn!pvfW71St55mygP!7op8hH3 z^8>1X^H&S?@XPdhe)pnFA%~4+>Yh@WSLr?;_n%IYPp@%K2ZwTtNdM!n+iP0wl)z%8 z$fE?bGw3!ueH-}O4Ug|9rmxS`taqP=cAK6O!vl4JTuR}dMjIsr2iE;$6kelCcCY~O z9clcavDgM*-QJE#Gh4?x7Uio39{^g+?u6hlCUZLjL3P`7{|X}^1g?y&ge=E@Mx5rt z4^7zofM~NNxMVt)xJvj2bv{9a7rdxbgz9<9O&s#i7<_I@4u+Oq*+{d*k&|+ixxKI%T7bE2?{qbR+9^NfjZZzp@9`x zFOTF%y5Yu%mNqGZb)HVw5zQL43pkN|DWb6gRa7?G(1lyAC;Y2vn}=N+lSq7t_S;Fw)wFId zeqV~}{jKup<$3NZ8)B&Xw%IJ3ufy`8x+p$pF)c&L+TE1_|0ABX8Q{9a7Jp;cCf*fg zdSaKI;vpqBR;!TZ0?#B zZlyi?`B0wxCiF2hRzkCLHCicRy)G0TKt+WmRT&U2IsW}cDw>hU))^NvJj3<>#m?&? zJN|3*Qj#bwR)00p4A>d)Vx%b%uT(^|xgklz+S1W3j^}`rx9@>7jH`rQG(JzMQDY#m`DR4wGc;Pq2EbB@MHq__qC zmji+hMY081)QJDq1iBp8o9`eZ3pdac{)qpL!5yP!>7Z#YccJ+0$UfKF`pyT^q&>s$ResBsLeGc*zl=RbHu$tfW~|3~OKuAe>`W zNJkOp3=Ds{@eYR2z{cM-r739VY7p?kf(yQz*zqfD~vK75*soSX{{knOFSz#$y(f7SvlDejs=+eFmi2fNfm`Nkj-NV zHfSYkWG1aJY9tRNpL6p>$EB~Gacb!mOE|y1ke1uGhQ)P=tBUy8XI7q$X40OO?|!Ra zs3at4JXG%+ww8s@atxr58F~RWR5bnhkIy)0T zQ|3g2nQU{TU9^Oiw{5hH8kj79%UEJEN=4Udar^$Xb9ZZP_i0_XvYl{}hJta(T)nf^ z=1MUPJ60rPm1lUgW0`5nh085*nSo6e66n~EN2bPAm9S3maeeC~ z(D*|tK(bu%+f)!WX$~Ek*|$gX4QjmtvYi6;5p+*BlSs{T}lG;@=N>U4tv zGsUiKF8;>VQk2ZGx+s9$_t8%(hVQrr9@aO*J5ox=TlvDcO%!@_# zXKLzX=teXx?BRb5>;TTPSy~l)a)V(RX_9#&Q_u*uL#_U!oA5jXRipZp+*)^|a}8}N zDWmTIgIScUQ5l?(EEjWAi#q%1H@Y< zscN|P_0oT8XZPA#I&cWGJWmxd8J;YqQ~Z`QzY^uqW4e^|HuSIWt)wifyKwh)Q>qs* ze9YOlmGmh=?@?s(@J6_=vI(M}U?_B~(SvJ6u(rJs038p$s*~duVKDXo!LOb~`JHb^ zP=WYD^I3c02i*2#{|kqRLy5h;hP?-q0yz@5@g;lsOaD)aYRX@LcAJqsD_iTyJlAcoPKq4dEUab zR!*7{riA^f528s7*dfjJ^0 zeZD&LhQc7!0*D57b4?=fFwLl-bM1d1U9Oh{>j(}0TJ1gUDQG{RH;S#UhWSR=CYUFI z9CBBSc}eU+lHUW;>>T(F-r)L%Fy$*vN(ey>k{{9Lj%MvA7pcfCIo>7%76o2X%3@P9 z8+LoL3oYhACw%MbN?rV8a!#lh-ZfH5Ev0^wMB38O-)GU7pPL2%`b?~ikEl%HVMFum zXi+l}Yg7I2fCZNn#k@fomRQP!S`myRynTkMdWkq2g@KMH)^Unb95k$$yqE7`ES=@N zqV#psCW4g2z|^$AWc%za=%Fu9KWN{LaSs;Y z_5S?vKlhXT8!>w(0s5cp{>P7JFUIreT7bC&!23TPPre-c{{7F6j@e%By%k!r1Ymg3 z{bDk-slWs zSjDTx3lLV3k{Jzo$TJ;C>n32Dd_byoxZ{u zMlw8Y%w{?7I(C1e>F_FCTmz%}lq0!f z!1Lt`bhS=-;GiLQnR-lFaiw!C1%R;2{U{Pg_h!C2jkD9Kq<`66ZO4W@!sgv{ z3gHcpLdG^NE9;blGgA!TG2Xmd2ery+;!)_Fak#M8BU~en?rDNJubT~F^rpPDt+qDL z^VRp2t==-FSk`W{%?LYrsP4wWtlsyUr2pETm$%oAOvQ^-oQ@xXS5?&Wc8(^^0>C;? z{ZUgKX^g-VhT=uws_-Ucck5=m>#%1rUXr2blT>e0OP!&y6wxSZK8)}4iwPbf89s=~ zYYNkhO*x$ZAXsc_;<11ti&%Sm`mYS{mhLX<<*aRAUQT)fp3d$MdzU~}V#^&k)Pn&# z(UgDHr^ELVPDgF)54$1cQr)w&fM_v(I*4HAIdm{&`zHzd2H5U{Ws17s(*mHZ3(_@0wc7UFisr;V#acfsfV8jz_wF~B_1cj)nh zJ`?*(?>vuBq? zC!)OU&b4T6AiAKnZ6l{KI7#kD%P)+4HUxXTJZ%@ESpTyhf6P@2Znt^e1bfd0N^u($ ze@$`_pyqWzotikz@A;;`k!z`$ve|Gd#Uo@F#5p76#)MZJh194%c8DnyI|yo(9DF3y za=NtNGo8I_^5!bUP#I|z01Y-+`}hjA?!Mr14BA5@@`Yn7+PpLtk;ay~97B!A>z=%fl$Vb>%a^s&+6I`}RSFmGCEdQF z@l(N`TSUUDSj{b|=iGQ($L}&~F=jENu(^t`dk0nd85GFc%yIUXfDzJ;lo#+PvS7}W zf`BCI1BSIp^XS&K@;HX`XPhUF$yWKxCEJ{btK-;}>%GFT*GKl}8<-6|uq~Yo-#it_ zuKuc!I(Wv;<|z!BfTW!x7Gryqj>t@<4XeGXA1a9a&MYNxkJ4;8BXD5R+IcD?GDJ5q zA5?V0y@1N9SuI=%sL19S@+b&=?~@5!X2@6|#j^sQXr>h?u5j6l!)&;6%k$Qz;+K}D zVv3*Q^H1Lpn{}PfaswVD4Uh}=$QFl@ESbna&=k4}LS%E|P1q!ndz>fd;NIq>30o&~ z;S7S0!?4PvQ8s$Dwve$jss66cKmWusF8rlD%3QZHVn`AJz#G)!+gN=E@8XH8Kqe*` zA4@b0)HN)KyB6wT$`cp^>8zPMCph}N^76*z3h$&75L&XL9|J1|W6aO%^8h`1S) zC1voGJDz!&-JP}D)AI)0pYEOqZ{HsAhyICVgj@+a4rXCedF|QQEqqV9+Mv4939x$B zJj9B_ITmOW-_8SQxRO8k7o-XEjLUAU@w znziOEWLsPKU@JlFW76T++J?q^l*PiXUdX$k#_%TU>3M{M0@d z*_tLFZvR$o;JP~+N%t`&WYR(JvVUR>(;bYSSo!IK;5===yoh5Iy%1eUMVTn>fD^E!Q^Zo2*^L=r3b9cPHoz8jD z*gIBO*BqL38#`UT4y2B-1Ys6Fi-CG~6#uZ|9i`{nFQV30KR;5JKpp)aDKt4DWOt<@ zz&~KNsbvw{PX>iOym-!-pGkmXBpx#{9og)%D*Zw zo%`W0$FGY^goL;W+a8PIE9urhyzs_B0F`^|Y_x8N&x=re@+dH%XF6B3T0DRN*0&m> zJE@DKvy6&=5x`<>w_&qemglV`OS;$xBpq6TD~LD=Y-+1ODQ#l zu}*e8O&x~kS6mRSLYj$Y{DaDv(vs*W8r2EgogC33$S^V{OSmEkI`PQJwQxWIkY|kq z5g*D@DkThOPD^c)d9M_h#%~yiNX&n$4u_Q8W|AHo(^zVl2$Lm)lJuJbQ{Pg`T}dP5 z=%A5L$erKbZt!f&5JL%Ti1sj6$u0ha9{Z$DZ56#6VO@gJwA-T*OyEZ)y^t0=5h@fk z5y5LS40jsmbN$_bAuP64F7kOBKv+g2WVANp7`1I6C%E-~!-h$zd=XiVt?*ld((VHRyuu4Lc=|8ZxT^{TbT|uH+YaTpxF-8ponq4CNZqyKupWwT zdQ9B71U*5kH^I?5Qb+WpM4(`^t`dN}oX^_3iCMcl04eG2%;Q)01LaGWg}$!1e5qPMi`J5URTU;3b)r z>PQsj`2imXk(hvQj1&$#10qElHe_f$lYu6_1lB+sSVYS7+sbEJ`j;-B23UWm|~Bbu4eKjA?$^s3m_jGTG_eib_Tm( z2yLt%5BGU@8Pt~8oX#T8e3fO0a)@gwUX>Muy*i}K5eH@aR-!0~4$9V(P!qz+vJzX(7tRQ$iY6aLt}Vj7{-WJQgt3oEF5P z_7tZ)6I*}gRcNI{;Gs8Jhpj>$Yo9V^M2ja+<@(9`Ra7c8j}z_2F(tgu z$5MXCQwPraWgTZshAr<*1>Dx91<_42QdlDP&lh4Vm^H`VnH1?jNzwwUu^+ zBkNy(V&nJ9z*MFTqFj}oS+-pD4_T*^fx625spKTT8NS!oy=|Pf)r$DoH(S2=!&BhI z#>T9xEcWvGDnirz9VV2J>Kc!l+{to>l3GHMD|}2*#WyDJ?&o?qn}e-iWlF*Rkr5hp z{tV{tp=J#1^e7DrQqX+N$Q6uXhSSss)Es+;lb2dDK$S(W2ASnLnd6h?Nv%?=VNTMr z5Chgci~I2#72Xz-Fm}vn5JEI73Y#yn?7x54lefF+dNE4#9GVAjr@OkELvN?tp^x60 zAG2=mr^3XwH{dmW>wypQyhj#{*8&+XQtJ>c86*1)80zW-^0wCu@^)4HQwYDNZB2_C z`g3&60pfu4(Z-CH&Mp*b4V~sF3v8|aSF$4HWl`;Q=Q+qjrg_4Yq?Dn#x4@~Kn26*N z>t9)@_Cq-Y(<1aKdRJaVzd;)eY}WWZ-0>F}KU_Vy+mX&Z=ojXfZNQ{@4DFZW^6x|g z3S{A{1iF9pDHczlG!ZaNl1ZfDTHIO98Ec5d10$m<%v@umapc{QvO|xosZX{vm*)QP z`zi~l|G@70%3(WE{^Rc0%}Vu=S)x8bVERBUyC#yj)gI<5TnAAgrN<)?-H`>d&5W`y z8Rk;aF?0O{Ya0YaZr_Djm*UTRS>Y`)`HN&MiI6W<04bTlWOU}Py16DG zPUCUcBTna7Fsf_r7*8|$86-Q0vW%iWcPl^aXzfHiTFt@k!Rz^w++CvXG@Y-rD1M7o z)fQ*oTAZXcWqZOLi`@~vAJ5EDU+EfDqI}>~df38nwf2jvA zF6EX5o=D6+|>pkm@nK{!vobl>LU zflDUV!s=HL$f`N{(tZ*+5CEKI1TD5R-JUNkUw;c7@yvpsOsvi0Go{?`0Y4pzPEo~! zHd{2D+~keRuUwvKQD0^gC2$0nT)_kBf91_*JJgi2I^{;3mMSc;!^99tY4*pv8-6(Y zBr5&+?QA8H{-^L(%?@m>zbln{ABVx=L1tJoN>V>DPms_nN3>GO!!fYq-7!Hj%@RWx zIhsy5FDS*e`xQ(}igJMu-U(9rZ%$Wkp#6#Hy;sq;p2GfogWrbkb z@X3>Mlw5VVZa&(#Ty~Y8dKSgUpq#%Z-W8QvE|0X} z=ANVAs1Y$6b3<+K)qlvWN{9p42&rX^N9Kc8q<`m1ggFUq3D_7i`(+yOIl8t{f_D)UOW(v|33ficotbfA%R;+?o z;aDTF&& zV)WRg+LgQ=oR+MTiw*lp;}w?XIQ!1gucYCAyZRcbDY-tqds>cvLr+gvPsVP#7`mG% zl!4y#`WoPuWgwlkc|CslZEXMH3Gj5bzJaLYb);o&XUbd`ed@oXxb0XBAs&?YR;Z1tV4+zLW8Q2p8x#Th;@^u`?RS>n`{2MTn-g0UY?YdNED?3Pk23eZ<1}{;lk#H zh2auEY!@@)cT3|>tnusIS2~}(1UPMSE7eRWrl(6ZcDYo`Q$lLg?81u~OSJ3d07JPw zfr2<)<;@BdCVD$zN_)i=L@W^hJ4?$?KRg~vLzM|;TA#l>4HVvY)_O7#gcF7j_K_F- z3LBX;!nw_MyF+DUHpA8$bh3c~^|+v4!5@mmA@fLT z!gg9FO{I_h`$l6Ur&<%!)Xd5YWHynXmM+b&4=)dyPHpM-j<35r&NKg}F^{81x1@Ys z5|RUv-NwxGzZ90Q<)MN#bA7Iz`P-+)I`A{Hvhff*&2)lqJ4%3ikGR76mj@?@M7_tk z+lF^%<;e5Ai~_N+_Ii(BW-d&0<&10I44J;tW|}^HnFl6J^k;83PPf57&pB*~^-WMXF3x5%Pna{fXDlPeQPVm^i#Nq$(xva zFIFHB$SDnx9`h@L`lub7zq)(=W`~@5+knE=q51u(5O+ii_x1@Bueg-0V|x1wCd7nq z`tv)}A=5pK08vd3%C#yI_Tkt7=X8SY^d3AzLW2%xA&{~h4jpf9k@?hO5oEX~4Wq|N z&sn8m)B(e8P}13|-|?k)!W0Qp?J}`PhC!6$KAY6-I)JU|M3@`Zur|coch{p>WHR|P z2OPppawn;l{-|-n{LrxIaNgWaret89{MP;_nRKwnBOx>^y*=6Q7>4S^Bl2xCl$XZa zCAxVzFQ7?gA9lR}BWm($A)8B?jA=&rx7WTcBz-2+Z^ zv|=K36E#QM?(B2D-SCat?>XlaCG3gX?t$kk-al^3WSaC??CLh4^1*IXovUCmokUbu6S+VICXHsV^R_J-JgXpZgf@D(zgaf=HvSVot?Rm zo{=mAv0X9yD!e#h+UIx_$SvB$h9(e1W?xlX)ttN?Tourl=!A*fkm`L)w0HYaJOHI; z&r3#DUcGY~3%Y{^zK%<7t4Ac=ajoAbX|?P=uDz*W)icO@LWjRk@GWG{uZqg2inKAE@baT$5@2FiGmgpeXa z?h%Cp@+vZ|5UR-ga5^xsFm^3pvw=FW^=Vri-&$Lvj?dGN-IsCpA%Xm;T&A{yo$1NQ z#oU{)Rbz!9ilTv|z!pvihrPXl!LSHa3<`QVos2KT?WY9&KWPbobaz8|xuF>r7+q%2 z*6Vhtet3kwyNfpwN`lnIM08e`kRv@*E$*=4vd8*qS8>P$yH=%aQ(-i zmzo$+T(R+g+5X3=BQWtAPZt3Qh7Js@=UX}kuiAFti@lKFxN;y6*s)|--Hp#{k|OLK@qSlL;1Hrc(y| zki4_961=nhk(p*aTCy&_C-)w$ZH*{!M49oU$Igpqcb!!%F~wx@NQ(l7Uuf_8Ofc}e z1-KFVBkGBgNXO0E$(V|Mt7~eB48W6SXCB@k9Hjv{rHl>e z{PBpcARym8h4?$J)jpc!!Cs5N>PT~{8FJJ~HXO4mnS;9t2^X8oeeMz4}KJ1(!nhK^esPq2n|MUu0I7a?Y=mWW=r(#0Uf zxdxPGR7@(lHO0(X8bhWm@GVtOxh_i?= zpM?;U@3I|2EsR}RPCObT2EZ-P2&S@uJ6T-LBl{54L-{^dH@VGB;z=v{kRN8SQy-f} zyr7~c4#sLBZkA+J=+M-q1T6%fo!eA3N`!3K7FkVb z=qrN1zJ)63aZ&1@Z8=#Bqh1h1;=HR6X!X_GkMgxst&4=VxOc?hHO_1<<@hQ$+5Y_R zRS~`E`3Ru;IOq7fb6>gzGm;Ut9XfPfhu+HB7ba)#ZT%~d7iUs_-jO9jV}+*2?5op_ zFU%MI)!f|UcxnBD%9@0xV*0}EvWnqPX_+s)UnaU!i0HQ`FEx4MeBd4g6Y}`Ygv=aI z&YC%)8J-4*DhTh0{1@tRo;ys#My3E{_RYRHmP{*=k#Hhaa#de&)h+DMN2XV73fX9O zXhR8Y*AOog(WM4tO#~-c15G%Z;(h}Fle}LFU{13}XcPG!pb!?J13J#L2Ug_%L*Qw} zUbg1>1-jC&X0MF$0&Mx>7V73^WXigL6n-BBvCn*H$R7Xp&DDr=22#di=m@ZdavDmH z+O1I|zYw93QHj!k-JjBDN>$dlAnGwl65)&XfW2jf?_HxSu^hle5Fx$* zhlz!M@vb)>V{4!Hmt|WYHXvp^I;^rIz*w#!+O3%@mje0jULS+IWC2SXh8pJ#dk%hr zSr)CmX7GruBWao2v_c}EY6e(FxTBxUT_G7LR>s+I;rawy95VF$?xj6+g-nxx&X2$- zpQ_mz82B5Cw>vJZ-`<}eD%?odur@Gc;xEgii=s}{5c~VD(Z5Dt$RIGfj*U)uD9C2@ z0t-cX0Zy*uTngNVo02l*m7y@dxIf*;c z);=(6*$E0J{sTR|R5~h_FWg^Cr0SXJSR^!g^lG;wWo*vD{+ z`oi|W{1>|T{d^K7AHhc5-vfm&YaRF~Q&kJ*3+C-g=JANE`rDQfx_w60)^@nqj|NJx z{vxh-8w2bccgYisb;ct4jEV?Bp!@UMGSCi}njN`l=23$S-)CYtF>7(Ctwk0mBH#49 z%$nyV|A_9M`ylJN2p!5FPHzyojXzkrVl!>cPM{0_iot=!hA<@~6?pfK(}W7F)is5i zrVAJ-XzokzK(rX*0a%*ZuAW>%NS)-FBxt3#@M zED3cN_Lu7qsKPZ#s#kb4Z)e#DP$U*M7OGPcAbp|(B{<%B9xK%IEs7D;C>~^n%@YSi zlpdJc0MBu4W8t*+k};c=Z@Pa0H^{TP>kQklF1hbyV%_0CGCI(LKWodJrt%4eT4Dz| z(FR$#oT+i?6H>Ro$?ork3p`5&df(Pf zRKE^H6SNLJN5QWGWR(VF_58{+B(Z(#Y4B~Vqa4$N=}w*XZgG8QO4!fJ7{{9t6An7? zUyT6n!*WtrsYdS0{p*9_ga{wOIJj=8H$Ql_JtsAc|3Bw)%i4YXx z`hbf$c%j_jFEK^M_41k=d{l+)d{HX9xEvy{tn0`_BfNuH6k~6Cvg%OF1CqQ1@;K)p zRG0|6AMvpeme<4^NP*vZAdx}jECJ_2C+=PHSK0x>M)8+II;4f(f^$m)LKM_AXE?7A z!WyqlMNrW~8!tJqz9fH=M)4@+%j33N*)D>X$R{wQtSO?r3<4{R;|shziS(HLEKn&K zuZhI76@1hQ?(Ki#I6IoISN%n!N<<*w=8xCwpGHv{M1@^bU751ewsKWd!VY2+zN5ROTlN8U}`P4MmEHtCFq*73LM5S)2Gr zdM6LDA9+rWa*#=z5t8zo0$Pr{yr92D6==AYpRj>!uR09>R3sF+jDHvy>Q{$bESZu- zMo>mSloO;s3^3B>3VnenWjUfkVF4)D-^mzrRC^)dsS8I2jdE1u=m0g8J8GrlZ!%~p zl#I9gy#r3N`0T0Qi1`N??}?~tWd4h|T&^Kj z*~E-icwvkxQ!r(45dO~!0+`YjMQR%Grx3UJE$IFKx`WSQ&`<9;^rruLE7|$(M8C33 zy6YxkDnx004L05YXc8fF&P&`|_jD2Ah;u`dA6qisE#V+`j``n#i8vXhHMU;yIIW(k zM$|v1d&xyi-!8)qs*f9J29VCY)>JFEy1d1cjkr-uORo|ra&=FKni^>GkKGHNa0AON z96&k4Ywx)V5!2~vP&%oL4_hVCNqKNGwxb4ca z?o4%B&(6*d;Z;g3UL7L~GorequH=f`)c513p{+F4*kpcv>K`eJ5$KNBF>5i@R(LPS zy2GO^cFIOX>CYRIKJk{Wcn#$d!Y_zR3yV2iuBT^6AMGX|e-567FQS*98@n{CbENd0 z4u;hTB~vT{0>HmQz2zxo3i=%9V}jKkCRntrV)?%VFU@iGkp#bt{RYunGY1#KOFMa# zwFwfje-y{xET-i+w~%*RtkmO~xx*bM3xS!Lrx|lhT(*h z`A@PAH*GM3JV?Sx4%OnjyknXMAw(3IFz-xmsV}*LvGLVtfWKoUSKckgBFcgFcd?U0 zkHe!=0F3$3!6JG>)_s0Tp6*45{`rCH6jFNFd!q5V&oxW=9+#=EjR#I4Sg!G2uS)yA z=IANV`n;ne~#d3A>vhvP}v!@r|72cMvu3S&a z?cl0~9lFNjFW5l@JBE>T&R6auBa55gFCQ<5z`<2+Q>2)6hnnD>n^XGCF0a8ppHT#2IpGWvm1+B}9a>o*&KsEiHQ%jDLa{UA@}EeI zMP3_`P07v~aYYCgdaoK!CUo)mNvTZj?Ke5R{j-PEW8Oo@u?e_m8>Ywp@s5qL)UV1r zAd@<}inDF+Bs`zyKV*}qE$Y6P5G#iPUD)^5duEqh#5F#oepbItfZKgZ7UB76MOJAR z$NYO-XVqWb*8rtKYtPi+PWIpv8UHg*-rJuSDA=rYd5MX5WEz-ydt@Jh$r;_=tPyf^i%GyEii4k!1Q*u+ZLbv6w^)i|?Dz^O`lS$bIc9X5 z&`|w_RjIm|rUTN`<^z(%il3<`O(mxvNyEWW>P>>l-iW_B3OL2gvL6;C&YFB%*5XUd zxybb?)}hU~pTZu9?6+Gx{kxT$`IThw2u2yV61&$&!x!BA1uWSKst6E%QOyAKFiJ=T zgd;qHv5&}b59zqQaKToFDZ9N>DL=@;V{NQWR-f3mRAsv3h@I=V{{nA5?5TMhY`iJ_ z<(r9mvGpsw#8Cqk43B>*mln(o%0;8X20%rMEl1B5lFI>fE z9ZZdC`Q&z*xd=}NEn2TnkjP*}0X{W(h5_YOsxmbxI~x$oZ!6}ie``M$@m*V?jIWQv zvxzR|M^}yJeOK4~C!?2%7>AfSc0mp1`C*u_E}tm!8*>FJbG3}7g3$q+A8fMo!S5%n zVQSc5ds0PTnv}A%*~GWOE2$<<_{>a>b48>bL$AM8E0s4U14zQZGMlgrCvLeY{3Rxd zTWkC=M0|y1OQjd1kGMxInA;_-9@x?IBJ123)rXx=OvAZNW3Qy*!(1OX`3PP@oCRS= z#GB&;u+6FN%*f+^-yex1)};|lSoblfN{(7KZqp@o9@cK6R?d0y&_=XY;HeUcQnBF` z&pBLv1q1YTj-8|lnC;Ge5!pN>I-fWbq;d(Q{vu)4bHp7Wh0I8 zqq2=!iS>(3n26C*HVLS^o0J!(6y=cEbP*;Vx|3$B8R)2}5kxzZv_q$RLvYT6;{!8kc^gPFYxCCR5UPD5~gq z^n$6E0){divCv6}k+)U71 zd7g_ZoWLKYz=C0mwAT$kX!YO8E8Z-}sZp^g0rj1a$E8XW=^9%F8#IN6YlSi+f7@iD zT;?w5;)i0Xy1Efs6r;(hirVXl(zj&IZGMz{cH!zJ51KSm4{OLLH=8IVYDkrD*AN|*J33|kQJdqaopzj<@U@ytT z3E=$F!G)99j<`mc?n=IBpBXo6WEefq?=IKfNju~6KL zInlGAiAuvWH^yxM6O$7L{);~dLoS>{J*X%*SURPDT-7Vz8N`&THz*%{2)9{}F7HMK zyZpimNzCa~>tJUC6M3F^(B{rHigL^R>02twK&?O?%oLohm6MeIniQh%%O_aUKR~Z6 zd;Cp#AlmvpN^r<`~;Xyo7Kb@FoT87pgN+(=7{h zsa;sbJ8q+7`ycn0L|6&HGO&i1r@|~UP(jw9YInY}ql4lEz@P_PtFdYun1NUHu0SW@ zQH@`P;=LrgBuR^PLbTsgF-O%$AgD1vsR#b>gckA)c&;k0;B*<1iW0s-#i1_*ar;tHPf}K{xnrwe0fKSSHEZf``lIg_`&j1K4 zx9QI59UE=5j_$O-IL+_(LjdQ7dv?UUiR6L+2SX+Yb)pm)0qTn{b7@8A-5*Qa$~a_2 z>rX=NXJerQL)6+q41cR5P7+_e5o@{F_jn^_8VU7>p6o*KjDo@Vo@IaV$$WhQMk%$V zI-zgoa6vF2`gkvh?s;1<(PqkAP(Y7vUag>BE80p}}aUN+M*F`RK7 zXO+Y9LqfS@pa7*>1f5>{7=ymHi7uRZ{}LOvIcAFFuA$^ynYS#;|9yJB50luj^%K+4 zsv_zMsi>egAVoImu%(K85MtCZRsXhv{4lSIUv0h&ihClSK*3NIqu#MAC0d#Qm1*)g@FJU8XVdc3no-b#y)D>$+pzP5W9#Vky{$%T!otNa{oO&ga1k<%BV2qz zn{G_XMHN)Ucg1`=o578{20Yfn(b+3-qF$biS#oz?lP`O!`Wi~Y44k>Aw`)2%S8Vza zfnVtcNCUm5kA?~v5qI|l_tmio>3QUfJcJ2_fe3nxfXAvLU>%6m<_JPbvjfF1fm1P8 zz>0+C6R=V-92IQVH4b4QT>^vu^?gp;KgDIKi4kx$*pXY+&5^ivh2-9CuISIKwYS$U zqSxQFlF`xAS1GpJ#=#r4|z#d!#(R7Fyg-R z8DOF}UV(V?HLrs{yP5yv57~17gMU=ZNA>jRExUB<@GFdRmy8|1OD=mi^U(C}pcw<` z#>mJSw9pJG@B1S0yk<9>rKCZrLH3VnM)(iq`r8 z*rK9AlALINZm2WN5~KejuZwU&#TW9-NF8#k{jks9e+YfUHE39g@RR%8P*ji*!h>`{ zTlf!|R*D69;V`IR5HHH#Flo52% z*vMa&F!Xy$hm^|kIXTQZMs~h%$WyO;JZZu(Ut`(%1#Hz3qen{U)!5a9VpOWM;j-s% ziUp?D*=GZ1Es~x1LvyzRe|aPNSqtu>kfe<@=MQ=95~E6s{7p*~IHIY2=0N5J|Infd zDfa`M5Ll-x4atpc`Donm`zuu}M$@@erGon_8Tl);2&S|`ZN{=@^^eUdQhazrx2r!! z>r5N=%`P0~&3U+%mJO@#y*6|48~4O7jdMH;q~t{6*f?5RM{(HhO@j|K^J$s0wvQJ6 zRm~rILpkf&HCZx5Q;2#!RW%1MmAwzs{h9|hZKulgkvCadw*FF6vP*E)wY8ku;D_;> zIJ;PtYioChG%m^x*b@KaC*S)C-BhyzQI#NbfqF?P z{v4G=PF9NF#jO%Y+#AEky6jSB6ObLPpcp9xRUo}q5{6x=a>2P!QY0p<{a#^v&|nCV z*-;M_nY-QV8d>6RXUAM&64{2%Gd$f`(=H1f8*>atnUMK7&Nd$Y|m*t2X|s8jkwHO714p z(g&YCv_bt-S6%*A8C8U|x`RpqZ)iWkqw)rsmR6j}g3)OGw=}H2i|IH4NHpJA^PgV7J!VCHzt;`Y=SUE!`3xS|?XQO=J90W1O@* zM-c|{)8g8zuH2|_*Tn5L~c7bhKWM{gOE75FI*XCR8 z#-TZDUU)t8R@z4#JhIBMzw5B1jNf%kBuUdrhn4^v&F|-g& z&R&F=a0_IWl2kP)F)bc|Q*|0Cn53*@gbvC}L3A`oFWZkJjefyV7FBC=7n>$_$eYb=asDt7y$kM;l4m@u= li9yzG4UJ1j%+@#nSL|-A21pV#DEi6~ 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 delta 117735 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 z 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 diff --git a/variant_annotation/README.md b/variant_annotation/README.md index 950ead4..105f9ad 100644 --- a/variant_annotation/README.md +++ b/variant_annotation/README.md @@ -6,14 +6,21 @@ Script [`src/run_pipeline.sh`](src/run_pipeline.sh) runs the snakemake workflow, ## Setup -1. Create necessary directories to store log files +1. Download submodules + +```sh +git submodule update --init +``` + + +2. Create necessary directories to store log files ```sh cd variant_annotation mkdir -p logs/rule_logs ``` -2. Create dataset config YAML and populate with paths +3. Create dataset config YAML and populate with paths ```sh touch ~/.ditto_datasets.yaml diff --git a/variant_annotation/src/Snakefile b/variant_annotation/src/Snakefile index 8f43a87..ba0980c 100644 --- a/variant_annotation/src/Snakefile +++ b/variant_annotation/src/Snakefile @@ -11,7 +11,7 @@ configfile: config["datasets"] #### VEP parameters #### -VEP_CACHE = 'homo_sapiens_refseq' +VEP_CACHE = 'homo_sapiens_merged' #'homo_sapiens_refseq' SPECIES = 'homo_sapiens' REF_BUILD = "GRCh38" ENSEMBL_DATASET_VERSION = "102" @@ -23,12 +23,12 @@ INPUT_VCF = config["vcf"] PROCESSED_DIR = Path(config["outdir"]) EXTERNAL_DIR = Path("data/external") -if not (INPUT_VCF.endswith('vcf') or INPUT_VCF.endswith('vcf.gz')): - print (f"Error: Input file extension not in expected format: found {INPUT_VCF}, expecting *.vcf or *.vcf.gz") +if not (INPUT_VCF.endswith('vcf') or INPUT_VCF.endswith('vcf.gz') or INPUT_VCF.endswith('vcf.bgz')): + print (f"Error: Input file extension not in expected format: found {INPUT_VCF}, expecting *.vcf, *.vcf.gz or *.vcf.bgz") raise SystemExit(1) INPUT_VCF = Path(INPUT_VCF) -OUTPUT_VCF = PROCESSED_DIR / ((INPUT_VCF.name).rstrip(".gz").rstrip(".vcf") + "_vep-annotated.vcf.gz") +OUTPUT_VCF = PROCESSED_DIR / ((INPUT_VCF.name).rstrip(".bgz").rstrip(".gz").rstrip(".vcf") + "_vep-annotated.vcf.gz") rule all: @@ -92,14 +92,15 @@ rule annotate_variants: release = ENSEMBL_DATASET_VERSION, species = SPECIES, build = REF_BUILD, - refseq_flag = "--refseq" if 'refseq' in VEP_CACHE else "", + #refseq_flag = "--refseq" if 'refseq' in VEP_CACHE else "", + refseq_flag = "--merged" if 'merged' in VEP_CACHE else "", hgvs_flag = "--hgvs" if HGVS else "", stats_flag = lambda wildcards, output: f"--stats_file {output.stats}" if STATS else "--no_stats", gnomad_fields = "AC,AN,AF,AF_afr,AF_afr_female,AF_afr_male,AF_ami,AF_ami_female,AF_ami_male,AF_amr,AF_amr_female,AF_amr_male,AF_asj,AF_asj_female," \ "AF_asj_male,AF_eas,AF_eas_female,AF_eas_male,AF_female,AF_fin,AF_fin_female,AF_fin_male,AF_male,AF_nfe,AF_nfe_female,AF_nfe_male," \ "AF_oth,AF_oth_female,AF_oth_male,AF_raw,AF_sas,AF_sas_female,AF_sas_male", clinvar_fields = "AF_ESP,AF_EXAC,AF_TGP,ALLELEID,CLNDN,CLNDNINCL,CLNDISDB,CLNDISDBINCL,CLNREVSTAT,CLNSIG,CLNSIGCONF,CLNSIGINCL,CLNVC,GENEINFO,MC,ORIGIN,RS,SSR", - dbNSFP_fields = "LRT_score,MutationTaster_score,MutationAssessor_score,FATHMM_score,PROVEAN_score,VEST4_score,MetaSVM_score,MetaLR_score,M-CAP_score," \ + dbNSFP_fields = "Ensembl_transcriptid,LRT_score,MutationTaster_score,MutationAssessor_score,FATHMM_score,PROVEAN_score,VEST4_score,MetaSVM_score,MetaLR_score,M-CAP_score," \ "CADD_phred,DANN_score,fathmm-MKL_coding_score,GenoCanyon_score,integrated_fitCons_score,GERP++_RS,phyloP100way_vertebrate,phyloP30way_mammalian," \ "phastCons100way_vertebrate,phastCons30way_mammalian,SiPhy_29way_logOdds,Eigen-raw_coding,Eigen-raw_coding_rankscore,Eigen-phred_coding," \ "Eigen-PC-raw_coding,Eigen-PC-raw_coding_rankscore,Eigen-PC-phred_coding", diff --git a/variant_annotation/src/run_pipeline.sh b/variant_annotation/src/run_pipeline.sh index 7661770..0a8a81e 100755 --- a/variant_annotation/src/run_pipeline.sh +++ b/variant_annotation/src/run_pipeline.sh @@ -5,7 +5,7 @@ #SBATCH --mem-per-cpu=4G #SBATCH --partition=medium -set -euo pipefail +set -eo pipefail usage() { echo "usage: $0" diff --git a/workflow/Snakefile b/workflow/Snakefile new file mode 100644 index 0000000..bd1dcd0 --- /dev/null +++ b/workflow/Snakefile @@ -0,0 +1,140 @@ +from pathlib import Path + +WORKFLOW_PATH = Path(workflow.basedir).parent + +configfile: "/data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/metadata/train_test_metadata_original.json" +PROCESSED_DIR = Path("data/processed/trial/filter_vcf_by_DP8_AB_hpo_removed") +EXOMISER_DIR = Path("/data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/exomiser/hpo_nonGeneticHPOsRemoved") +ANNOTATED_VCF_DIR = Path("/data/project/worthey_lab/projects/experimental_pipelines/mana/small_tasks/cagi6/rgp/data/processed/filter_vcf_by_DP8_AB") + +TRAIN_TEST = list(config.keys()) +SAMPLES = {} +SAMPLES['train'] = list(config['train'].keys()) +SAMPLES['test'] = list(config['test'].keys()) + +wildcard_constraints: + #sample="|".join(SAMPLE_LIST) #"TRAIN_12|TRAIN_13" + train_test = '|'.join(TRAIN_TEST), + sample = '|'.join(SAMPLES['train'] + SAMPLES['test']), + + +rule all: + input: + #TODO: specify all important output files here + #[PROCESSED_DIR / dataset_type / f"{sample}_vep-annotated_filtered.vcf.gz" for dataset_type in TRAIN_TEST for sample in SAMPLES[dataset_type] if config[dataset_type][sample]["affected_status"]=="Affected"], + [PROCESSED_DIR / dataset_type / sample / "ditto_predictions.csv" for dataset_type in TRAIN_TEST for sample in SAMPLES[dataset_type] if "PROBAND" in sample], + [PROCESSED_DIR / dataset_type / sample / "ditto_predictions_100.csv" for dataset_type in TRAIN_TEST for sample in SAMPLES[dataset_type] if "PROBAND" in sample], + [PROCESSED_DIR / dataset_type / sample / "combined_predictions.csv" for dataset_type in TRAIN_TEST for sample in SAMPLES[dataset_type] if "PROBAND" in sample], + [PROCESSED_DIR / dataset_type / sample / "combined_predictions_100.csv" for dataset_type in TRAIN_TEST for sample in SAMPLES[dataset_type] if "PROBAND" in sample], + [PROCESSED_DIR / dataset_type / sample / "combined_predictions_1000.csv" for dataset_type in TRAIN_TEST for sample in SAMPLES[dataset_type] if "PROBAND" in sample], + #expand(str(PROCESSED_DIR / "train/CAGI6_RGP_{sample}_PROBAND/predictions.csv"), sample=SAMPLE_LIST), + + +rule filter_variants: + input: + ANNOTATED_VCF_DIR / "{train_test}" / "{sample}_vep-annotated.vcf.gz" + output: + PROCESSED_DIR / "{train_test}" / "{sample}_vep-annotated_filtered.vcf.gz" + message: + "Filter variants from vcf using BCFTools: {wildcards.sample}" + conda: + str(WORKFLOW_PATH / "configs/envs/testing.yaml") + # threads: 2 + shell: + r""" + bcftools annotate \ + -e'ALT="*"' \ + {input} \ + -Oz \ + -o {output} + """ + + +rule parse_annotated_vars: + input: + PROCESSED_DIR / "{train_test}" / "{sample}_vep-annotated_filtered.vcf.gz" + output: + PROCESSED_DIR / "{train_test}" / "{sample}_vep-annotated_filtered.tsv" + message: + "Parse variants from annotated vcf to tsv: {wildcards.sample}" + conda: + str(WORKFLOW_PATH / "configs/envs/testing.yaml") + shell: + r""" + python annotation_parsing/parse_annotated_vars.py \ + -i {input} \ + -o {output} + """ + +rule ditto_filter: + input: + PROCESSED_DIR / "{train_test}" / "{sample}_vep-annotated_filtered.tsv" + output: + col = PROCESSED_DIR / "{train_test}" / "{sample}/columns.csv", + data = PROCESSED_DIR / "{train_test}" / "{sample}" / "data.csv", + nulls = PROCESSED_DIR / "{train_test}" / "{sample}/Nulls.csv", + stats = PROCESSED_DIR / "{train_test}" / "{sample}/stats_nssnv.csv", + plot = PROCESSED_DIR / "{train_test}" / "{sample}/correlation_plot.pdf", + message: + "Filter variants from annotated tsv for predictions: {wildcards.sample}" + conda: + str(WORKFLOW_PATH / "configs/envs/testing.yaml") + params: + outdir = lambda wildcards, output: Path(output['data']).parent + shell: + r""" + python src/Ditto/filter.py \ + -i {input} \ + -O {params.outdir} + """ + + +rule ditto_predict: + input: + data = PROCESSED_DIR / "{train_test}" / "{sample}/data.csv", + output: + pred = PROCESSED_DIR / "{train_test}" / "{sample}" / "ditto_predictions.csv", + pred_100 = PROCESSED_DIR / "{train_test}" / "{sample}" / "ditto_predictions_100.csv" + message: + "Run Ditto predictions: {wildcards.sample}" + params: + sample_name = lambda wildcards: f"{wildcards.sample}", + conda: + str(WORKFLOW_PATH / "configs/envs/testing.yaml") + shell: + r""" + python src/Ditto/predict.py \ + -i {input.data} \ + --sample {params.sample_name} \ + -o {output.pred} \ + -o100 {output.pred_100} \ + """ + +rule combine_scores: + input: + raw = PROCESSED_DIR / "{train_test}" / "{sample}_vep-annotated_filtered.tsv", + ditto = PROCESSED_DIR / "{train_test}" / "{sample}" / "ditto_predictions.csv", + exomiser = EXOMISER_DIR / "{train_test}" / "{sample}", + output: + pred = PROCESSED_DIR / "{train_test}" / "{sample}" / "combined_predictions.csv", + pred_100 = PROCESSED_DIR / "{train_test}" / "{sample}" / "combined_predictions_100.csv", + pred_1000 = PROCESSED_DIR / "{train_test}" / "{sample}" / "combined_predictions_1000.csv" + message: + "Combine Ditto predictions with Exomiser: {wildcards.sample}" + params: + sample_name = lambda wildcards: f"{wildcards.sample}", + conda: + str(WORKFLOW_PATH / "configs/envs/testing.yaml") + #params: + # variant= lambda wildcards: --variant str('Chr' + str(config[f"{wildcards.train_test}"][f"{wildcards.sample}"]["solves"][0]["Chrom"]) + ',' + str(config[f"{wildcards.train_test}"][f"{wildcards.sample}"]["solves"][0]["Pos"]) + ',' + config[f"{wildcards.train_test}"][f"{wildcards.sample}"]["solves"][0]["Ref"] + ',' + config[f"{wildcards.train_test}"][f"{wildcards.sample}"]["solves"][0]["Alt"]) if 'TRAIN' in {wildcards.sample} + shell: + r""" + python src/Ditto/combine_scores.py \ + --raw {input.raw} \ + --ditto {input.ditto} \ + -ep {input.exomiser} \ + --sample {params.sample_name} \ + -o {output.pred} \ + -o100 {output.pred_100} \ + -o1000 {output.pred_1000} \ + """