From bbf4b509d28e70bdb71c229bce95ba10cabbe8c4 Mon Sep 17 00:00:00 2001 From: Brian Clarke Date: Mon, 6 May 2024 10:58:13 +0200 Subject: [PATCH 1/4] save beta in results --- deeprvat/deeprvat/evaluate.py | 1 + 1 file changed, 1 insertion(+) diff --git a/deeprvat/deeprvat/evaluate.py b/deeprvat/deeprvat/evaluate.py index 77188be4..15644503 100644 --- a/deeprvat/deeprvat/evaluate.py +++ b/deeprvat/deeprvat/evaluate.py @@ -189,6 +189,7 @@ def get_pvals(results, method_mapping=None, phenotype_mapping={}): "gene", "experiment_group", "Discovery type", + "beta", "pval", "-log10pval", "pval_corrected", From 92ea94d5e81b6e6d878bb9623257f3136c0c06b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=BCck?= Date: Thu, 16 May 2024 16:24:25 +0200 Subject: [PATCH 2/4] Add plof column anno df (#90) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add --chromosomes flag to add_variants_id * fixup! Format Python code with psf/black pull_request * Revert "Change actions to us ubuntu-latest" This reverts commit 2f821a8effa644fe5060e48f41ee6b1d672b91d0. * Add logging * added compute_plof function, added it to pipeline, created tests * plof cast to int values, tests reflect expected change * added plof column to annotation_colnames_filling_values.yaml file, added test for select_rename_fill function with input containing plof column * reset snakefile to main version * fixup! Format Python code with psf/black pull_request * Update github-actions.yml * Update autoblack_pull_request.yml * Update docs-tests.yml * Update test-runner.yml * Update .readthedocs.yaml * added plof rule to snakefile, updated rulegraph in docs * added test that actually contains plof row --------- Co-authored-by: Magnus Wahlberg Co-authored-by: PMBio Co-authored-by: Mück --- deeprvat/annotations/annotations.py | 30 + docs/_static/annotations_rulegraph.svg | 576 ++++++++---------- pipelines/annotations.snakefile | 18 +- .../annotation_colnames_filling_values.yaml | 2 + .../absplice_splicing_pred_RNA.snakefile | 116 ---- tests/annotations/test_annotations.py | 43 ++ .../expected/expected.parquet | Bin 0 -> 45955 bytes .../input/annotations.parquet | Bin 0 -> 45306 bytes .../expected/expected.parquet | Bin 0 -> 42329 bytes .../annotation_colnames_filling_values.yaml | 65 ++ .../input/annotations.parquet | Bin 0 -> 45955 bytes .../expected/expected.parquet | Bin 0 -> 29370 bytes .../annotation_colnames_filling_values.yaml | 65 ++ .../input/annotations.parquet | Bin 0 -> 31387 bytes 14 files changed, 477 insertions(+), 438 deletions(-) delete mode 100644 pipelines/resources/absplice_splicing_pred_RNA.snakefile create mode 100644 tests/annotations/test_data/compute_plof/compute_plof_small/expected/expected.parquet create mode 100644 tests/annotations/test_data/compute_plof/compute_plof_small/input/annotations.parquet create mode 100644 tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof/expected/expected.parquet create mode 100644 tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof/input/annotation_colnames_filling_values.yaml create mode 100644 tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof/input/annotations.parquet create mode 100644 tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof2/expected/expected.parquet create mode 100644 tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof2/input/annotation_colnames_filling_values.yaml create mode 100644 tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof2/input/annotations.parquet diff --git a/deeprvat/annotations/annotations.py b/deeprvat/annotations/annotations.py index 2ca4f2f8..0206f9a9 100644 --- a/deeprvat/annotations/annotations.py +++ b/deeprvat/annotations/annotations.py @@ -1898,6 +1898,36 @@ def process_vep( return vep_file +@cli.command() +@click.argument("anno_df_in", type=click.Path(exists=True)) +@click.argument("anno_df_out", type=click.Path()) +def compute_plof(anno_df_in, anno_df_out): + """ + Cumputes and adds plof column based on plof function. + + Parameters: + - anno_df_in(str): File path of annotation file to read in + - anno_df_out(str): File path of output file + + Returns: + None + + Example: deeprvat_annotations compute_plof annotations.parquet annotations_plof.parquet + """ + anno_df = pd.read_parquet(anno_df_in) + PLOF_COLS = [ + "Consequence_stop_gained", + "Consequence_frameshift_variant", + "Consequence_stop_lost", + "Consequence_start_lost", + "Consequence_splice_acceptor_variant", + "Consequence_splice_donor_variant", + ] + + anno_df["is_plof"] = anno_df[PLOF_COLS].eq(1).any(axis=1).astype(int) + anno_df.to_parquet(anno_df_out) + + @cli.command() @click.argument("filenames", type=str) @click.argument("out_file", type=click.Path()) diff --git a/docs/_static/annotations_rulegraph.svg b/docs/_static/annotations_rulegraph.svg index e5d4750c..5315a14b 100644 --- a/docs/_static/annotations_rulegraph.svg +++ b/docs/_static/annotations_rulegraph.svg @@ -1,421 +1,363 @@ - - - + + snakemake_dag - + - -0 - -all +0 + +all - -1 - -select_rename_fill_columns +1 + +select_rename_fill_columns - -1->0 - - +1->0 + + - -2 - -filter_by_exon_distance +2 + +compute_plof_column - -2->1 - - +2->1 + + - -3 - -add_gene_ids +3 + +filter_by_exon_distance - -3->2 - - +3->2 + + - -4 - -create_gene_id_file - - - -4->2 - - +4 + +add_gene_ids - -4->3 - - +4->3 + + - -5 - -calculate_MAF +5 + +create_gene_id_file - -5->3 - - +5->3 + + + + +5->4 + + - -6 - -merge_allele_frequency +6 + +calculate_MAF - - -6->5 - - + +6->4 + + - -7 - -calculate_allele_frequency +7 + +merge_allele_frequency - -7->6 - - +7->6 + + - -8 - -merge_absplice_scores +8 + +calculate_allele_frequency - - -8->6 - - + +8->7 + + - -9 - -aggregate_absplice_scores +9 + +merge_absplice_scores - - -9->8 - - + +9->7 + + - -10 - -absplice_dna +10 + +aggregate_absplice_scores - -10->9 - - +10->9 + + - -11 - -mmsplice_splicemap +11 + +absplice_dna - -11->10 - - +11->10 + + - -12 - -extract_with_header +12 + +mmsplice_splicemap - -12->11 - - +12->11 + + - - -15 - -spliceai + +13 + +extract_with_header - - -12->15 - - + +13->12 + + - - -29 - -deepSea + +16 + +spliceai - - -12->29 - - + +13->16 + + - - -13 - -download_human_fasta - - - -13->11 - - - - - -13->15 - - + +30 + +deepSea + + +13->30 + + - -14 - -download_splicemaps - - - -14->11 - - - - - -15->10 - - +14 + +download_human_fasta - - -16 - -download_rocksdb + +14->12 + + - - -16->15 - - + +14->16 + + + + +15 + +download_splicemaps + + +15->12 + + + + +16->11 + + - -17 - -merge_deepsea_pcas - - - -17->8 - - - - - -17->9 - - +17 + +download_rocksdb + + +17->16 + + - -18 - -concat_annotations +18 + +merge_deepsea_pcas - - -18->17 - - + +18->9 + + + + +18->10 + + - -19 - -merge_annotations +19 + +concat_annotations - -19->18 - - +19->18 + + - -20 - -vep +20 + +merge_annotations - -20->19 - - +20->19 + + - -21 - -strip_chr_name +21 + +vep - -21->20 - - +21->20 + + - -22 - -extract_variants - - - -22->19 - - +22 + +strip_chr_name - -22->21 - - +22->21 + + - -23 - -deepRiPe_parclip +23 + +extract_variants - - -22->23 - - + +23->20 + + + + +23->22 + + - -24 - -deepRiPe_eclip_k5 +24 + +deepRiPe_parclip - - -22->24 - - + +23->24 + + - -25 - -deepRiPe_eclip_hg2 - - - -22->25 - - - - - -23->19 - - - - - -24->19 - - - - - -25->19 - - +25 + +deepRiPe_eclip_k5 - - -26 - -add_ids_deepSea + +23->25 + + - - -26->17 - - + +26 + +deepRiPe_eclip_hg2 + + +23->26 + + + + +24->20 + + + + +25->20 + + + + +26->20 + + - -27 - -deepSea_PCA +27 + +add_ids_deepSea - - -27->26 - - + +27->18 + + - -28 - -concat_deepSea +28 + +deepSea_PCA - -28->27 - - +28->27 + + + + +29 + +concat_deepSea - -29->28 - - +29->28 + + + + +30->29 + + diff --git a/pipelines/annotations.snakefile b/pipelines/annotations.snakefile index 96c4b63b..0451557e 100644 --- a/pipelines/annotations.snakefile +++ b/pipelines/annotations.snakefile @@ -132,7 +132,7 @@ ncores_agg_absplice = int(config.get("ncores_agg_absplice") or 4) source_variant_file_pattern_complete = ( source_variant_file_pattern + "." + source_variant_file_type ) -print(f"{included_chromosomes=}") + file_paths = [ glob( str( @@ -187,7 +187,7 @@ with open(absplice_main_conf_path, "r") as fd: rule all: input: - anno_dir / "vep_deepripe_deepsea_absplice_maf_pIDs_filtered_filled.parquet", + anno_dir / "complete_annotations.parquet", if not gene_id_file: @@ -629,13 +629,21 @@ rule filter_by_exon_distance: ] ) +rule compute_plof_column: + input: rules.filter_by_exon_distance.output, + output: anno_dir / "vep_deepripe_deepsea_absplice_maf_pIDs_filtered_plof.parquet", + resources: mem_mb=lambda wildcards, attempt: 15_000 * (attempt + 1), + shell: 'deeprvat_annotations compute-plof {input} {output}' + + + rule select_rename_fill_columns: input: yaml_file=annotation_columns_yaml_file, - annotations_path=rules.filter_by_exon_distance.output, + annotations_path=rules.compute_plof_column.output, output: - anno_dir / "vep_deepripe_deepsea_absplice_maf_pIDs_filtered_filled.parquet", + anno_dir / "complete_annotations.parquet", resources: mem_mb=lambda wildcards, attempt: 15_000 * (attempt + 1), shell: @@ -647,4 +655,4 @@ rule select_rename_fill_columns: "{input.annotations_path}", "{output}", ] - ) + ) \ No newline at end of file diff --git a/pipelines/config/annotation_colnames_filling_values.yaml b/pipelines/config/annotation_colnames_filling_values.yaml index a8ee68fd..9f7c78ee 100644 --- a/pipelines/config/annotation_colnames_filling_values.yaml +++ b/pipelines/config/annotation_colnames_filling_values.yaml @@ -75,3 +75,5 @@ annotation_column_names: 'DeepSEA_PC_6' : 0 'AF' : 'AF' : 0 + 'is_plof': + 'is_plof' : 0 \ No newline at end of file diff --git a/pipelines/resources/absplice_splicing_pred_RNA.snakefile b/pipelines/resources/absplice_splicing_pred_RNA.snakefile deleted file mode 100644 index 0952d343..00000000 --- a/pipelines/resources/absplice_splicing_pred_RNA.snakefile +++ /dev/null @@ -1,116 +0,0 @@ -import os -from os import listdir -from pathlib import Path - - -include: "../DNA/rare_variants/Snakefile" -include: "./count_table/Snakefile" -include: "./outliers/Snakefile" - - -genome = absplice_main_conf["genome"] -vcf_dir = os.path.dirname(absplice_main_conf["vcf"]) -vcf_ids = [file for file in listdir(vcf_dir) if ".tbi" not in file] - - -def splicemap5(wildcards): - path = Path(config_download["splicemap_dir"]) - splicemaps = [ - path / f"{tissue}_splicemap_psi5_method=kn_event_filter=median_cutoff.csv.gz" - for tissue in absplice_main_conf["splicemap_tissues"] - ] - splicemaps = [str(x) for x in splicemaps] - return splicemaps - - -def splicemap3(wildcards): - path = Path(config_download["splicemap_dir"]) - splicemaps = [ - path / f"{tissue}_splicemap_psi3_method=kn_event_filter=median_cutoff.csv.gz" - for tissue in absplice_main_conf["splicemap_tissues"] - ] - splicemaps = [str(x) for x in splicemaps] - return splicemaps - - -def splicemap_cat5(wildcards): - path = Path(config_download["splicemap_dir"]) - return ( - path - / f"{wildcards.tissue_cat}_splicemap_psi5_method=kn_event_filter=median_cutoff.csv.gz" - ) - - -def splicemap_cat3(wildcards): - path = Path(config_download["splicemap_dir"]) - return ( - path - / f"{wildcards.tissue_cat}_splicemap_psi3_method=kn_event_filter=median_cutoff.csv.gz" - ) - - -rule infer_delta_psi_from_cat: - input: - mmsplice_splicemap=config_pred["splicing_pred"]["mmsplice_splicemap"], - splicemap_5=splicemap5, - splicemap_3=splicemap3, - splicemap_cat5=splicemap_cat5, - splicemap_cat3=splicemap_cat3, - var_samples_df=config_cat["variant_sample_map"], - cat_count_table=config_cat["cat_count_table"]["updated"], - params: - tissue_cat="{tissue_cat}", - resources: - mem_mb=lambda wildcards, attempt: attempt * 64000, - threads=1, - output: - result=config_pred["splicing_pred"]["delta_psi_inferred_from_cat"], - script: - "./infer_delta_psi_from_cat.py" - - -rule absplice_rna: - input: - df_mmsplice=config_pred["splicing_pred"]["mmsplice_splicemap"], - df_spliceai=config_pred["splicing_pred"]["spliceai"], - df_mmsplice_cat=config_pred["splicing_pred"]["delta_psi_inferred_from_cat"], - df_outliers_cat=config_pred["splicing_pred"]["cat_outliers"], - var_samples_df=config_cat["variant_sample_map"], - params: - extra_info=absplice_main_conf["extra_info_rna"], - output: - absplice_rna=config_pred["splicing_pred"]["absplice_rna"], - script: - "./absplice_rna.py" - - -rule absplice: - input: - absplice_dna=config_pred["splicing_pred"]["absplice_dna"], - absplice_rna=config_pred["splicing_pred"]["absplice_rna"], - output: - absplice=config_pred["splicing_pred"]["absplice_rna_with_dna_info"], - script: - "./absplice_all_info.py" - - -rule all_predict_rna: - input: - expand( - config_pred["splicing_pred"]["delta_psi_inferred_from_cat"], - genome=absplice_main_conf["genome"], - vcf_id=vcf_ids, - tissue_cat=absplice_main_conf["DROP"]["DROP_group"], - ), - expand( - config_pred["splicing_pred"]["absplice_rna"], - genome=absplice_main_conf["genome"], - vcf_id=vcf_ids, - tissue_cat=absplice_main_conf["DROP"]["DROP_group"], - ), - expand( - config_pred["splicing_pred"]["absplice_rna_with_dna_info"], - genome=absplice_main_conf["genome"], - vcf_id=vcf_ids, - tissue_cat=absplice_main_conf["DROP"]["DROP_group"], - ), diff --git a/tests/annotations/test_annotations.py b/tests/annotations/test_annotations.py index 4056eed4..6dbd96e3 100644 --- a/tests/annotations/test_annotations.py +++ b/tests/annotations/test_annotations.py @@ -623,6 +623,18 @@ def test_filter_by_exon_distance( "annotations.parquet", "expected.parquet", ), + ( + "select_rename_fill_columns_plof", + "annotation_colnames_filling_values.yaml", + "annotations.parquet", + "expected.parquet", + ), + ( + "select_rename_fill_columns_plof2", + "annotation_colnames_filling_values.yaml", + "annotations.parquet", + "expected.parquet", + ), ], ) def test_select_rename_fill_annotations( @@ -650,3 +662,34 @@ def test_select_rename_fill_annotations( assert_frame_equal( written_results, expected_results[written_results.columns], check_exact=False ) + + +@pytest.mark.parametrize( + "test_data_name_dir, annotations_in, expected", + [ + ( + "compute_plof_small", + "annotations.parquet", + "expected.parquet", + ), + ], +) +def test_compute_plof(test_data_name_dir, annotations_in, expected, tmp_path): + current_test_data_dir = tests_data_dir / "compute_plof" / test_data_name_dir + annotations_in_path = current_test_data_dir / "input" / annotations_in + expected_path = current_test_data_dir / "expected" / expected + output_path = tmp_path / "out.parquet" + cli_runner = CliRunner() + cli_parameters = [ + "compute-plof", + annotations_in_path.as_posix(), + output_path.as_posix(), + ] + result = cli_runner.invoke(annotations_cli, cli_parameters, catch_exceptions=False) + assert result.exit_code == 0 + written_results = pd.read_parquet(output_path) + expected_results = pd.read_parquet(expected_path) + assert written_results.shape == expected_results.shape + assert_frame_equal( + written_results, expected_results[written_results.columns], check_exact=False + ) diff --git a/tests/annotations/test_data/compute_plof/compute_plof_small/expected/expected.parquet b/tests/annotations/test_data/compute_plof/compute_plof_small/expected/expected.parquet new file mode 100644 index 0000000000000000000000000000000000000000..e4919c004ae2638d8f601fb84e18c72651b84210 GIT binary patch literal 45955 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 literal 0 HcmV?d00001 diff --git a/tests/annotations/test_data/compute_plof/compute_plof_small/input/annotations.parquet b/tests/annotations/test_data/compute_plof/compute_plof_small/input/annotations.parquet new file mode 100644 index 0000000000000000000000000000000000000000..5ae7b676344d083ce415c600b0de4cb6c63c617f GIT binary patch literal 45306 zcmdRX2V4`)7H<+-Xo56RPjbRel`%WKmWd6GK~Jf=Cx$qzW%mgD0tzi2qgTlNFHCIAH<~1^noM!=dXs z9^nT(X2Lc2Ash$UJEpU=MzS^PG_8iByYK58NFIV~TMxH>hrP**0&bcSCzb*L@I%yezWFl1Pg+Ax9EX-k!(nKUa>EG z>P*PdOFFq)TLw4?=EzZ;ZvdHfS-39CbU0`EoOJheD)3xn&NppNCU|}_9jC{V1>Cr& z3~0@2p!rq3J>9nYQ{}BItIX!Uumar<6LGW)6JfV4u$-D51}SHVg!yK>KxkGZuAaUW zmNcF8^z~N*EtJDpbfYjF>}*|~x z?;rr~{kKx>uM2}`k`%BmDGV$qHeTNR;ceya5`OLaIwDXy*{(lb(;oiD8<6B0Af4#_R&{I03z)qBZZrLWdA<+dK=&3U7nF}890jH;^PfcZ`gn4>sk!BJ5I8<(q;hN^aE9`eY%jx z*oPITp#p%g5?iJO8L(UDr=`f<1-AODFWSqxK-7%d@xq_+V;cKNB2nUqx*|AvA~P4Y zzPQ#{7If&s<2j^KQrzj1LOdM$x2?Pe7gRgiHE#3 zcUd0H4!r1j)cNov1=7~*{;CgobFRLQKI?j;n}t1H&-13gw)94m7aPihG=gU{;!-w|5t3x>*p?l+8vanqmc&uz}YCu{ASE=c+nB1bntp%6b%icx6 z?AQgcNr)AH@tzM*T_!qOb&lu3f-kdr1UQ$2H;YRLcehx;bB?O#wkhrb zRu}p39Gzisoecll$8(Ay`BTwV`~h2NRiW0qL%I6zX%rUl)v6TcnVJ4 zT$)s!y&V=TIgiIhvw`p@I?o?E?g96BV8*KUB#^c0Cd;WEc~IhwSX*}3N@y#$%S|e~ z3Z~Q&VEx>!u-#00%Prv`kfC#%qaa5P_7hZjL$WBK%(7*!eOVyzHrG$gE6RqimCF-m z?@t9?@d-FdkFB75hYSAI-ea)();qkjxDlu27oqCj}`fq*&1XO6QBB~XBDv1mBoiY%z{E*9cq17BEZSUHn(GoHi1P_QoWWn z+rUlEgUcxo9H6XQj`<_*bzt?`yF|6mYhmmg2bb9yyTRF@^xgwLC%`hL-9?Tc9Dwm` zZNj`rS6IGmLZZ~HRd8F=!%~8|A*94B(F9e(A$zUYlaAOk;8I?x#XW-zaJ9Ro|AF0c zsGJl3_H?u@;7xec{9x&F#z=|TeU2EfC~>6P8Lg3-i(2hpb)U=RzdM}?24*_;W=d{h z9^qa=0b!$EXr>%#y(n@r%m97@>sOsj+nK@%jc2Kl|Kn*gWndLdU9ntFEY|_d&L}VA z`62@(Hg(h<-m4DIbv6g2o}Ud*x(9G{k~(OYsauwd-6(;LeR8^SLThO~cip#y1-4gS zx}Q7HZ%zj)MY*`r>Qd0e8j0T$CIaS2#n8fT%!APNN!K>P`7raHv-fFXEl{@RK5kxu zGmN;;-Cw&`5^U2`9n5;(P4l=HHg}1_W@yIkqBls<0z0Q@S8|lNz*Bs_=Q~_2for~E zf)S4j9L$+?eyK=mGIgKJf-&Zcq?r^F`r!Kkd@`h9#bSB+&ffJ&xvV3jKW9mUpgkfd{XgZ7n<# z16P{t;&SU#1YfkKVw}=xaK_T~KJCf&aN+zHeQqB#VNJ``bJ9_VfZ!6U#HPR$xbjoA z=wz}u$k`_|_4EuAuu}5D<(Eqr!VQOGO!j$Nz;%vuVqH0>g3K68!+BAiG_TFcax@`h z=(=z)F1vUJd@dH8Vj>a^4l9(W(ehM5)owhUcJe4NxtN_cU#b+Gnx|6uc7hd{{8_6# z{maWrS)RvwpK6q0!IM(Sx`JuoUg(Y;Xl+ z@9m(>vap1u@>JdhZ{E`E?26`YynYa>2i}Z1Cz}m=>x<96R^I@K@v^EC+af^R?V>)r zFWS&9i|_Wn+ZG^uP@*w9vlOsPZ``Lr+63Ar4V->aG#6$RCbyWlIl-$U7t>~I=fQ|L z&i=uQPqbw#F)m9>7I^VO0c&=sEI9EvBQai48S+>X=tfe z% z4Ay(*?(pHPt_kl{1wl{$T{O860VdWb5^Smi;ls(KKD8b-Xu}3u0?s6ZG-<`!Ol@OW z>f1B-o~r|-=Wb3o{nQTF9?cn?6K4Q9qH@ zmlRMJo7#LJEg0@IvY19|)q_QMKut=X1Kdzq+ka1w3a0TE)$Whhf!%B`&acW;1RG=> z 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 literal 0 HcmV?d00001 diff --git a/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof/expected/expected.parquet b/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof/expected/expected.parquet new file mode 100644 index 0000000000000000000000000000000000000000..066beb490ff9872a86cd2a29f7f273d484c77cbc GIT binary patch literal 42329 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 R;rIL_WLXgiR#Y36{{y71_?`d& literal 0 HcmV?d00001 diff --git a/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof/input/annotation_colnames_filling_values.yaml b/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof/input/annotation_colnames_filling_values.yaml new file mode 100644 index 00000000..b18e0473 --- /dev/null +++ b/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof/input/annotation_colnames_filling_values.yaml @@ -0,0 +1,65 @@ +annotation_column_names: + 'af' : + 'combined_UKB_NFE_AF' : 0 + 'maf_mb' : + 'combined_UKB_NFE_AF_MB' : 10000 + 'maf' : + 'combined_UKB_NFE_MAF' : 0 + 'PolyPhen' : + 'polyphen_score' : 0 + 'SIFT' : + 'sift_score' : 1 + 'QKI_hg2' : + 'DeepRipe_plus_QKI_lip_hg2' : 0 + 'QKI_k5' : + 'DeepRipe_plus_QKI_clip_k5' : 0 + 'KHDRBS1_k5' : + 'DeepRipe_plus_KHDRBS1_clip_k5' : 0 + 'ELAVL1_parclip' : + 'DeepRipe_plus_ELAVL1_parclip' : 0 + 'TARDBP_parclip' : + 'DeepRipe_plus_TARDBP_parclip' : 0 + 'HNRNPD_parclip' : + 'DeepRipe_plus_HNRNPD_parclip' : 0 + 'MBNL1_parclip' : + 'DeepRipe_plus_MBNL1_parclip' : 0 + 'QKI_parclip' : + 'DeepRipe_plus_QKI_parclip' : 0 + 'Consequence_splice_acceptor_variant' : + 'Consequence_splice_acceptor_variant' : 0 + 'Consequence_splice_donor_variant' : + 'Consequence_splice_donor_variant' : 0 + 'Consequence_stop_gained' : + 'Consequence_stop_gained' : 0 + 'Consequence_frameshift_variant' : + 'Consequence_frameshift_variant' : 0 + 'Consequence_stop_lost' : + 'Consequence_stop_lost' : 0 + 'Consequence_start_lost' : + 'Consequence_start_lost' : 0 + 'Consequence_inframe_insertion' : + 'Consequence_inframe_insertion' : 0 + 'Consequence_inframe_deletion' : + 'Consequence_inframe_deletion' : 0 + 'Consequence_missense_variant' : + 'Consequence_missense_variant' : 0 + 'Consequence_protein_altering_variant' : + 'Consequence_protein_altering_variant' : 0 + 'Consequence_splice_region_variant' : + 'Consequence_splice_region_variant' : 0 + 'DeepSEA_PC_1' : + 'DeepSEA_PC_1' : 0 + 'DeepSEA_PC_2' : + 'DeepSEA_PC_2' : 0 + 'DeepSEA_PC_3' : + 'DeepSEA_PC_3' : 0 + 'DeepSEA_PC_4' : + 'DeepSEA_PC_4' : 0 + 'DeepSEA_PC_5' : + 'DeepSEA_PC_5' : 0 + 'DeepSEA_PC_6' : + 'DeepSEA_PC_6' : 0 + 'AF' : + 'AF' : 0 + 'is_plof': + 'is_plof' : 0 \ No newline at end of file diff --git a/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof/input/annotations.parquet b/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof/input/annotations.parquet new file mode 100644 index 0000000000000000000000000000000000000000..e4919c004ae2638d8f601fb84e18c72651b84210 GIT binary patch literal 45955 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 literal 0 HcmV?d00001 diff --git a/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof2/expected/expected.parquet b/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof2/expected/expected.parquet new file mode 100644 index 0000000000000000000000000000000000000000..2d4082cc86d431a553ad0fc71df561c4cb66d526 GIT binary patch literal 29370 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 literal 0 HcmV?d00001 diff --git a/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof2/input/annotation_colnames_filling_values.yaml b/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof2/input/annotation_colnames_filling_values.yaml new file mode 100644 index 00000000..b18e0473 --- /dev/null +++ b/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof2/input/annotation_colnames_filling_values.yaml @@ -0,0 +1,65 @@ +annotation_column_names: + 'af' : + 'combined_UKB_NFE_AF' : 0 + 'maf_mb' : + 'combined_UKB_NFE_AF_MB' : 10000 + 'maf' : + 'combined_UKB_NFE_MAF' : 0 + 'PolyPhen' : + 'polyphen_score' : 0 + 'SIFT' : + 'sift_score' : 1 + 'QKI_hg2' : + 'DeepRipe_plus_QKI_lip_hg2' : 0 + 'QKI_k5' : + 'DeepRipe_plus_QKI_clip_k5' : 0 + 'KHDRBS1_k5' : + 'DeepRipe_plus_KHDRBS1_clip_k5' : 0 + 'ELAVL1_parclip' : + 'DeepRipe_plus_ELAVL1_parclip' : 0 + 'TARDBP_parclip' : + 'DeepRipe_plus_TARDBP_parclip' : 0 + 'HNRNPD_parclip' : + 'DeepRipe_plus_HNRNPD_parclip' : 0 + 'MBNL1_parclip' : + 'DeepRipe_plus_MBNL1_parclip' : 0 + 'QKI_parclip' : + 'DeepRipe_plus_QKI_parclip' : 0 + 'Consequence_splice_acceptor_variant' : + 'Consequence_splice_acceptor_variant' : 0 + 'Consequence_splice_donor_variant' : + 'Consequence_splice_donor_variant' : 0 + 'Consequence_stop_gained' : + 'Consequence_stop_gained' : 0 + 'Consequence_frameshift_variant' : + 'Consequence_frameshift_variant' : 0 + 'Consequence_stop_lost' : + 'Consequence_stop_lost' : 0 + 'Consequence_start_lost' : + 'Consequence_start_lost' : 0 + 'Consequence_inframe_insertion' : + 'Consequence_inframe_insertion' : 0 + 'Consequence_inframe_deletion' : + 'Consequence_inframe_deletion' : 0 + 'Consequence_missense_variant' : + 'Consequence_missense_variant' : 0 + 'Consequence_protein_altering_variant' : + 'Consequence_protein_altering_variant' : 0 + 'Consequence_splice_region_variant' : + 'Consequence_splice_region_variant' : 0 + 'DeepSEA_PC_1' : + 'DeepSEA_PC_1' : 0 + 'DeepSEA_PC_2' : + 'DeepSEA_PC_2' : 0 + 'DeepSEA_PC_3' : + 'DeepSEA_PC_3' : 0 + 'DeepSEA_PC_4' : + 'DeepSEA_PC_4' : 0 + 'DeepSEA_PC_5' : + 'DeepSEA_PC_5' : 0 + 'DeepSEA_PC_6' : + 'DeepSEA_PC_6' : 0 + 'AF' : + 'AF' : 0 + 'is_plof': + 'is_plof' : 0 \ No newline at end of file diff --git a/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof2/input/annotations.parquet b/tests/annotations/test_data/select_rename_fill_columns/select_rename_fill_columns_plof2/input/annotations.parquet new file mode 100644 index 0000000000000000000000000000000000000000..0763fbd2ce1507a4bffcd64570fc9f1ebfd2e83e GIT binary patch literal 31387 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 literal 0 HcmV?d00001 From b7a10ee57d4d98085b1dd65350e1a0292e86896f Mon Sep 17 00:00:00 2001 From: Eva Holtkamp <59055511+HolEv@users.noreply.github.com> Date: Thu, 16 May 2024 16:42:34 +0200 Subject: [PATCH 3/4] Restructure docs (#88) * move installation into own section * restructure docs * remove separate config section * corrections * add skeleton for UK Biobank analysis * populating deeprvat read-the-docs * update deeprvat docs * update config * fix references * adding missing ukbiobank.md * Fix missing cross-reference targets * typo * various updates * commit missing files --------- Co-authored-by: Brian Clarke Co-authored-by: Kayla Meyer Co-authored-by: Magnus Wahlberg --- docs/annotations.md | 4 +- docs/cluster.md | 17 +++ docs/deeprvat.md | 281 ++++++++++++++++++++++++++++++++++++ docs/index.rst | 45 +++++- docs/installation.md | 21 +++ docs/practical.md | 48 ++++++ docs/preprocessing.md | 6 +- docs/quickstart.md | 70 +++++++++ docs/seed_gene_discovery.md | 59 ++++++-- docs/ukbiobank.md | 9 ++ docs/usage.md | 85 ----------- ukbiobank.md | 9 ++ 12 files changed, 548 insertions(+), 106 deletions(-) create mode 100644 docs/cluster.md create mode 100644 docs/deeprvat.md create mode 100644 docs/installation.md create mode 100644 docs/practical.md create mode 100644 docs/quickstart.md create mode 100644 docs/ukbiobank.md delete mode 100644 docs/usage.md create mode 100644 ukbiobank.md diff --git a/docs/annotations.md b/docs/annotations.md index c906f8f3..b2eb22fa 100644 --- a/docs/annotations.md +++ b/docs/annotations.md @@ -1,6 +1,6 @@ # DeepRVAT Annotation pipeline -This pipeline is based on [snakemake](https://snakemake.readthedocs.io/en/stable/). It uses [bcftools + samstools](https://www.htslib.org/), as well as [perl](https://www.perl.org/), [deepRiPe](https://ohlerlab.mdc-berlin.de/software/DeepRiPe_140/) and [deepSEA](http://deepsea.princeton.edu/) as well as [VEP](http://www.ensembl.org/info/docs/tools/vep/index.html), including plugins for [primateAI](https://github.com/Illumina/PrimateAI) and [spliceAI](https://github.com/Illumina/SpliceAI). DeepRiPe annotations were acquired using [faatpipe repository by HealthML](https://github.com/HealthML/faatpipe)[[1]](#reference-1-target) and DeepSea annotations were calculated using [kipoi-veff2](https://github.com/kipoi/kipoi-veff2)[[2]](#reference-2-target), abSplice scores were computet using [abSplice](https://github.com/gagneurlab/absplice/)[[3]](#reference-3-target) +This pipeline is based on [snakemake](https://snakemake.readthedocs.io/en/stable/). It uses [bcftools + samstools](https://www.htslib.org/), as well as [perl](https://www.perl.org/), [deepRiPe](https://ohlerlab.mdc-berlin.de/software/DeepRiPe_140/) and [deepSEA](http://deepsea.princeton.edu/) as well as [VEP](http://www.ensembl.org/info/docs/tools/vep/index.html), including plugins for [primateAI](https://github.com/Illumina/PrimateAI) and [spliceAI](https://github.com/Illumina/SpliceAI). DeepRiPe annotations were acquired using [faatpipe repository by HealthML](https://github.com/HealthML/faatpipe)[[1]](#reference-1-target) and DeepSea annotations were calculated using [kipoi-veff2](https://github.com/kipoi/kipoi-veff2)[[2]](#reference-2-target), abSplice scores were computed using [abSplice](https://github.com/gagneurlab/absplice/)[[3]](#reference-3-target) ![dag](_static/annotations_rulegraph.svg) @@ -30,7 +30,7 @@ BCFtools as well as HTSlib should be installed on the machine, should be installed for running the pipeline, together with the [plugins](https://www.ensembl.org/info/docs/tools/vep/script/vep_plugins.html) for primateAI and spliceAI. Annotation data for CADD, spliceAI and primateAI should be downloaded. The path to the data may be specified in the corresponding [config file](https://github.com/PMBio/deeprvat/blob/main/pipelines/config/deeprvat_annotation_config.yaml). Download paths: -- [CADD](https://cadd.bihealth.org/download): "All possible SNVs of GRCh38/hg38" and "gnomad.genomes.r3.0.indel.tsv.gz" incl. their Tabix Indices +- [CADD](https://cadd.bihealth.org/download): "All possible SNVs of GRCh38/hg38" and "gnomad.genomes.r3.0.indel.tsv.gz" incl. their Tabix Indices - [SpliceAI](https://basespace.illumina.com/s/otSPW8hnhaZR): "genome_scores_v1.3"/"spliceai_scores.raw.snv.hg38.vcf.gz" and "spliceai_scores.raw.indel.hg38.vcf.gz" - [PrimateAI](https://basespace.illumina.com/s/yYGFdGih1rXL) PrimateAI supplementary data/"PrimateAI_scores_v0.2_GRCh38_sorted.tsv.bgz" - [AlphaMissense](https://storage.googleapis.com/dm_alphamissense/AlphaMissense_hg38.tsv.gz) diff --git a/docs/cluster.md b/docs/cluster.md new file mode 100644 index 00000000..9b60a105 --- /dev/null +++ b/docs/cluster.md @@ -0,0 +1,17 @@ +# Cluster execution + +## Pipeline resource requirements + +For cluster exectution, resource requirements are expected under `resources:` in all rules. All pipelines have some suggested resource requirements, but they may need to be adjusted for your data or cluster. + + +## Cluster execution + +If you are running on a computing cluster, you will need a [profile](https://github.com/snakemake-profiles). We have tested execution on LSF. If you run into issues running on other clusters, please [let us know](https://github.com/PMBio/deeprvat/issues). + + +## Execution on GPU vs. CPU + +Two steps in the pipelines use GPU by default: Training (rule `train` from [train.snakefile](https://github.com/PMBio/deeprvat/blob/main/pipelines/training/train.snakefile)) and burden computation (rule `compute_burdens` from [burdens.snakefile](https://github.com/PMBio/deeprvat/blob/main/pipelines/association_testing/burdens.snakefile)). To run on CPU on a computing cluster, you may need to remove the line `gpus = 1` from the `resources:` of those rules. + +Bear in mind that this will make burden computation substantially slower, but still feasible for most datasets. Training without GPU is not practical on large datasets such as UK Biobank. diff --git a/docs/deeprvat.md b/docs/deeprvat.md new file mode 100644 index 00000000..476563bf --- /dev/null +++ b/docs/deeprvat.md @@ -0,0 +1,281 @@ +# Training and association testing with DeepRVAT + +We have developed multiple modes of running DeepRVAT to suit your needs. Below are listed various running setups that entail just training DeepRVAT, using pretrained DeepRVAT models for association testing, using precomputed burdens for association testing, including REGENIE in training and association testing and also combinations of these scenarios. The general procedure is to have the relevant input data for a given setup appropriately prepared, which may include having already completed the [preprocessing pipeline](https://deeprvat.readthedocs.io/en/latest/preprocessing.html) and [annotation pipeline](https://deeprvat.readthedocs.io/en/latest/annotations.html). + + +(common requirements for input data)= +## Input data: Common requirements for all pipelines + +An example overview of what your `experiment` directory should contain can be seen here: +`[path_to_deeprvat]/example/` + +Replace `[path_to_deeprvat]` with the path to your clone of the repository. +Note that the example data contained within the example directory is randomly generated, and is only suited for testing. + +- `genotypes.h5` +contains the genotypes for all samples in a custom sparse format. The sample ids in the `samples` dataset are the same as in the VCF files the `genotypes.h5` has been read from. +This is output by the preprocessing pipeline. Instructions [here](https://deeprvat.readthedocs.io/en/latest/preprocessing.html). + +- `variants.parquet` +contains variant characteristics (`chrom`, `pos`, `ref`, `alt`) and the assigned variant `id` for all unique variants in `genotypes.h5`. This +is output from the input VCF files using the preprocessing pipeline. Instructions [here](https://deeprvat.readthedocs.io/en/latest/preprocessing.html). + +- `annotations.parquet` +contains the variant annotations for all variants in `variants.parquet`, which is an output from the annotation pipeline. Each variant is identified by its `id`. Instructions [here](https://deeprvat.readthedocs.io/en/latest/annotations.html). + +- `protein_coding_genes.parquet` +Maps the integer `gene_id` used in `annotations.parquet` to standard gene IDs (EnsemblID and HGNC gene name). This is an output from the annotation pipeline. Instructions [here](https://deeprvat.readthedocs.io/en/latest/annotations.html). + +- `config.yaml` +contains the configuration parameters for setting phenotypes, training data, model, training, and association data variables. + +- `phenotypes.parquet` contains the measured phenotypes for all samples (see `[path_to_deeprvat]/example/`). The row index must be the sample id as strings (same ids as used in the VCF file) and the column names the phenotype name. Phenotypes can be quantitative or binary (0,1). Use `NA` for missing values. +Samples missing in `phenotypes.parquet` won't be used in DeepRVAT training/testing. The user must generate this file as it's not output by the preprocessing/annotation pipeline. +This file must also contain all covariates that should be used during training/association testing (e.g., genetic sex, age, genetic principal components). + +- `baseline_results` +directory containing the results of the seed gene discovery pipline. Insturctions [here](seed_gene_discovery.md) + + +(common configuration parameters)= +## Configuration file: Common parameters + +The `config.yaml` file located in your `experiment` directory contains the configuration parameters of key sections: phenotypes, baseline_results, training_data, and data. It also allows to set many other configurations detailed below. + +`config['training_data']` contains the relevant specifications for the training dataset creation. + +`config['data']` contains the relevant specifications for the association dataset creation. + +### Baseline results +`config['baseline_results']` specifies paths to results from the seed gene discovery pipeline (Burden/SKAT test with pLoF and missense variants). When using the seed gene discovery pipeline provided with this package, simply link the directory as 'baseline_results' in the experiment directory without any further changes. + +If you want to provide custom baseline results (already combined across tests), store them like `baseline_results/{phenotype}/combined_baseline/eval/burden_associations.parquet` and set the `baseline_results` in the config to +``` +- base: baseline_results + type: combined_baseline +``` +Baseline files have to be provided for each `{phenotype}` in `config['training']['phenotypes']`. The `burden_associations.parquet` must have the columns `gene` (gene id as assigned in `protein_coding_genes.parquet`) and `pval` (see `[path_to_deeprvat]/example/baseline_results`). + + + + +### Phenotypes +`config['phenotypes]` should consist of a complete list of phenotypes. To change phenotypes used during training, use `config['training']['phenotypes']`. The phenotypes that are not listed under `config['training']['phenotypes']`, but are listed under +`config['phenotypes]` will subsequently be used only for association testing. +All phenotypes listed either in `config['phenotypes']` or `config['training']['phenotypes']` have to be in the column names of `phenotypes.parquet`. + + +### Customizing the input data via the config file + +#### Data transformation + +The pipeline supports z-score standardization (`standardize`) and quantile transformation (`quantile_transform`) as transformation to of the target phenotypes. It has to be set in `config[key]['dataset_config']['y_transformation]`, where `key` is `training_data` or `data` to transform the training data and association testing data, respectively. + +For the annotations and the covariates, we allow standardization via `config[key]['dataset_config']['standardize_xpheno'] = True` (default = True) and `config[key]['dataset_config']['standardize_anno'] = True` (default = False). + +If custom transformations are whished, we recommend to replace the respective columns in `phenotypes.parquet` or `annotations.parquet` with the transformed values. + +#### Variant annotations +All variant anntations that should be included in DeepRVAT's variant annotation vectors have to be listed in `config[key]['dataset_config']['annotations']` and `config[key]['dataset_config']['rare_embedding']['config']['annotations']` (this will be simplified in future). Any annotation that is used for variant filtering `config[key]['dataset_config']['rare_embedding']['config']['thresholds']` also has to be included in `config[key]['dataset_config']['annotations']`. + +#### Variant minor allele frequency filter + +To filter for variants with a MAF below a certain value (e.g., UKB_MAF < 0.1%), use: +`config[key]['dataset_config']['rare_embedding']['config']['thresholds']['UKB_MAF'] = "UKB_MAF < 1e-3"`. In this example, `UKB_MAF` represents the MAF column from `annotations.parquet` here denoting MAF in the UK Biobank. + +#### Additional variant filters +Additional variant filters can be added via `config[key]['dataset_config']['rare_embedding']['config']['thresholds'][{anno}] = "{anno} > X"`. For example, `config['data]['dataset_config']['rare_embedding']['config']['thresholds']['CADD_PHRED'] = "CADD_PHRED > 5"` will only include variants with a CADD score > 5 during association testing. Mind that all annotations used in the `threshold` section also have to be listed in `config[key]['dataset_config']['annotations']`. + +#### Subsetting samples +To specify a sample file for training or association testing, use: `config[key]['dataset_config']['sample_file']`. +Only `.pkl` files containing a list of sample IDs (string) are supported at the moment. +For example, if DeepRVAT training and association testing should be done on two separate data sets, you can provide two sample files `training_samples.pkl` and `test_samples.pkl` via `config['training_data']['dataset_config']['sample_file] = training_samples.pkl` and `config['data']['dataset_config']['sample_file] = test_samples.pkl`. + +## Association testing using precomputed burdens + +_Coming soon_ + + + +(Association_testing)= +## Association testing using pretrained models + +If you already have a pretrained DeepRVAT model, we have setup pipelines for running only the association testing stage. This includes creating the association dataset files, computing burdens, regression, and evaluation. + + +### Input data +The following files should be contained within your `experiment` directory: +- `config.yaml` +- `genotypes.h5` +- `variants.parquet` +- `annotations.parquet` +- `phenotypes.parquet` +- `protein_coding_genes.parquet` + +### Configuration file +The annotations in `config['data']['dataset_config']['rare_embedding']['config']['annotations']` must be the same (and in the same order) as in `config['data']['dataset_config']['rare_embedding']['config']['annotations']` from the pre-trained model. +If you use the pre-trained DeepRVAT model provided with this package, use `config['data']['dataset_config']['rare_embedding']['config']['annotations']` from the `[path_to_deeprvat]/example/config.yaml` to ensure the ordering of annotations is correct. + +### Running the association testing pipeline with REGENIE + +_Coming soon_ + + + +## Training +To run only the training stage of DeepRVAT, comprised of training data creation and running the DeepRVAT model, we have set up a training pipeline. + +### Input data +The following files should be contained within your `experiment` directory: +- `config.yaml` +- `genotypes.h5` +- `variants.parquet` +- `annotations.parquet` +- `phenotypes.parquet` +- `protein_coding_genes.parquet` +- `baseline_results` directory where `[path_to_deeprvat]/pipelines/seed_gene_discovery.snakefile` has been run + +### Configuration file +Changes to the model architecture and training parameters can be made via `config['training']`, `config['pl_trainer']`, `config['early_stopping']`, `config['model']`. +Per default, DeepRVAT scores are ensembled from 6 models. This can be changed via `config['n_repeats']`. + + +### Running the training pipeline +```shell +cd experiment +snakemake -j 1 --snakefile [path_to_deeprvat]/pipelines/run_training.snakefile +``` + + +## Training and association testing using cross-validation + +DeepRVAT offers a CV scheme, where it's trained on all samples except those in the held-out fold. Then, it computes gene impairment scores for the held-out samples using models that excluded them. This is repeated for all folds, yielding DeepRVAT scores for all samples. + +### Input data and configuration file +The following files should be contained within your `experiment` directory: +- `config.yaml` +- `genotypes.h5` +- `variants.parquet` +- `annotations.parquet` +- `phenotypes.parquet` +- `protein_coding_genes.parquet` +- `baseline_results` directory +- `sample_files` provides training and test samples for each cross-validation fold as pickle files. + +### Config and sample files +For running 5-fold cross-validation include the following configuration in the config: +``` +cv_path: sample_files +n_folds: 5 +``` +Provide sample files structured as `sample_files/5_fold/samples_{split}{fold}.pkl`, where `{split}` represents train/test and `{fold}` is a number from `0 to 4`. + +### Run the pipeline +```shell +cd experiment +snakemake -j 1 --snakefile [path_to_deeprvat]/pipelines/cv_training/cv_training_association_testing.snakefile +``` + + + +## Running only a portion of any pipeline +The snakemake pipelines outlined above are compromised of integrated common workflows. These smaller snakefiles which breakdown specific pipelines sections are in the following directories: +- `[path_to_deeprvat]/pipeline/association_testing` contains snakefiles breaking down stages of the association testing. +- `[path_to_deeprvat]/pipeline/cv_training` contains snakefiles used to run training in a cross-validation setup. +- `[path_to_deeprvat]/pipeline/training` contains snakefiles used in setting up deepRVAT training. diff --git a/docs/index.rst b/docs/index.rst index fcabaffc..81a226ce 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -4,19 +4,60 @@ contain the root `toctree` directive. Welcome to DeepRVAT's documentation! +====================================== + +Rare variant association testing using deep learning and data-driven burden scores. + + +How to use this documentation +=================================== + +A good place to start is in :doc:`Basic usage `, to install the package and make sure it runs correctly. + +To run DeepRVAT on your data, first consult *Modes of usage* :doc:`here `, then proceed based on which mode is right for your use case. + +For all modes, you'll want to consult *Input data: Common requirements for all pipelines* and *Configuration file: Common parameters* :doc:`here `. + +For all modes of usage other than association testing with precomputed burdens, you'll need to :doc:`preprocess ` your genotype data, followed by :doc:`annotating ` your variants. + +To train custom DeepRVAT models, rather than using precomputed burdens or our provided pretrained models, you'll need to additionally run :doc:`seed gene discovery `. + +Finally, consult the relevant section for your use case :doc:`here `. + +If running DeepRVAT on a cluster (recommended), some helpful tips are :doc:`here `. + + +Citation ==================================== -Rare variant association testing using deep learning and data-driven burden scores +If you use this package, please cite: + +Clarke, Holtkamp et al., “Integration of Variant Annotations Using Deep Set Networks Boosts Rare Variant Association Genetics.” bioRxiv. https://dx.doi.org/10.1101/2023.07.12.548506 + + +Contact +==================================== + +To report a bug or make a feature request, please create an `issue `_ on GitHub. + +| For general inquiries, please contact: +| brian.clarke@dkfz.de +| eva.holtkamp@cit.tum.de .. toctree:: :maxdepth: 2 :caption: Contents: - usage.md + installation.md + quickstart.md preprocessing.md annotations.md seed_gene_discovery.md + deeprvat.md + cluster.md + practical.md + ukbiobank.md apidocs/index diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 00000000..66c2f91c --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,21 @@ +# Installation + +1. Clone this repository: +```shell +git clone git@github.com:PMBio/deeprvat.git +``` +1. Change directory to the repository: `cd deeprvat` +1. Install the conda environment. We recommend using [mamba](https://mamba.readthedocs.io/en/latest/index.html), though you may also replace `mamba` with `conda` + + *Note: [the current deeprvat env does not support cuda when installed with conda](https://github.com/PMBio/deeprvat/issues/16). Install using mamba for cuda support.* +```shell +mamba env create -n deeprvat -f deeprvat_env.yaml +``` +1. Activate the environment: `mamba activate deeprvat` +1. Install the `deeprvat` package: `pip install -e .` + +If you don't want to install the GPU-related requirements, use the `deeprvat_env_no_gpu.yml` environment instead. +```shell +mamba env create -n deeprvat -f deeprvat_env_no_gpu.yaml +``` + diff --git a/docs/practical.md b/docs/practical.md new file mode 100644 index 00000000..0f827970 --- /dev/null +++ b/docs/practical.md @@ -0,0 +1,48 @@ +# Practical recommendations for users + + +## Modes of usage + +DeepRVAT can be applied in various modes, presented here in increasing levels of complexity. For each of these scenarios, we provide a corresponding Snakemake pipeline. + +### Precomputed burden scores + +_Note: Precomputed burden scores are not yet available. They will be made available upon publication of the DeepRVAT manuscript._ + +For users running association testing on UKBB WES data, we provide precomputed burden scores for all protein-coding genes with a qualifying variant within 300 bp of an exon. In this scenario, users are freed from processing of large WES data and may carry out highly computationally efficient association tests with the default DeepRVAT pipeline or the DeepRVAT+REGENIE integration. + +Note that DeepRVAT scores are on a scale between 0 and 1, with a score closer to 0 indicating that the aggregate effect of variants in the gene is protective, and a score closer to 1 when the aggregate effect is deleterious. + +### Pretrained models + +Some users may wish to select variants or make variant-to-gene assignments differently from our methods, or to work on datasets other than UKBB. For this, we provide an ensemble of pretrained DeepRVAT gene impairment modules, which can be used for scoring individual-gene pairs for subsequent association testing. We also provide a pipeline for functional annotation of variants for compatibility with the pretrained modules. + +### Model training + +Other users may wish to exert full control over DeepRVAT scores, for example, to modify the model architecture, the set of annotations, or the set of training traits. For this, we provide pipelines for gene impairment module training, both in our CV and in a standard training/validation setup, with subsequent gene impairment score computation and association testing. + + +## Gene impairment module training + +For users wishing to train a custom DeepRVAT model, we provide here some practical suggestions based on our experiences. + +### Model architecture + +We found no benefit to using architectures larger than that used in this work, though we conjecture that larger architectures may provide some benefit with larger training data and more annotations. We performed limited experimentation with the aggregation function used and found the maximum to give better results than the sum. However, exploring other choices or a learned aggregation remains open. + +### Training traits and seed genes + +We found that multiphenotype training improved performance, however, on our dataset, adding traits with fewer than three seed genes provided modest to no benefit. We also saw poor performance when including seed genes based on prior knowledge, e.g., known GWAS or RVAS associations, rather than the seed gene discovery methods. We hypothesize that this is because an informative seed gene must have driver rare variants in the training dataset itself, which may not be the case for associations known from other cohorts. + +### Variant selection + +While association testing was carried out on variants with MAF < 0.1%, we saw improved results when including a greater number of variants (we used MAF < 1%) for training. + +### Variant annotations + +We found that the best performance was achieved when including the full set of annotations, including correlated annotations. We thus recommend including annotations fairly liberally. However, we did find limits, for example, increasing the number of DeepSEA PCs from the 6 we used provided no benefit and eventually degraded model performance. + +### Model ensembling + +We found little to no benefit, but also no harm, from using more than 6 DeepRVAT gene impairment modules per CV fold in our ensemble. Therefore, we chose this number as the most computationally efficient to achieve optimal results. + diff --git a/docs/preprocessing.md b/docs/preprocessing.md index c9c3bc79..0457d9f8 100644 --- a/docs/preprocessing.md +++ b/docs/preprocessing.md @@ -1,7 +1,7 @@ -# DeepRVAT Preprocessing pipeline +# DeepRVAT preprocessing pipeline -The DeepRVAT preprocessing pipeline is based on [snakemake](https://snakemake.readthedocs.io/en/stable/) it uses -[bcftools+samstools](https://www.htslib.org/) and a [python script](https://github.com/PMBio/deeprvat/blob/main/deeprvat/preprocessing/preprocess.py) preprocessing.py. +The DeepRVAT preprocessing pipeline is based on [snakemake](https://snakemake.readthedocs.io/en/stable/). It uses +[bcftools+samtools](https://www.htslib.org/) and a [python script](https://github.com/PMBio/deeprvat/blob/main/deeprvat/preprocessing/preprocess.py) preprocessing.py. ![DeepRVAT preprocessing pipeline](_static/preprocess_no_qc_rulegraph.svg) diff --git a/docs/quickstart.md b/docs/quickstart.md new file mode 100644 index 00000000..cbc798f1 --- /dev/null +++ b/docs/quickstart.md @@ -0,0 +1,70 @@ +# Basic usage + +## Install the package + +Instructions [here](installation.md) + +## Customize pipelines + +Before running any of the snakefiles, you may want to adjust the number of threads used by different steps in the pipeline. To do this, modify the `threads:` property of a given rule. + +If you are running on a computing cluster, you will need a [profile](https://github.com/snakemake-profiles) and may need to add `resources:` directives to the snakefiles. + + +## Run the preprocessing pipeline on your VCF files + +Instructions [here](preprocessing.md) + + +## Annotate variants + +Instructions [here](annotations.md) + + +## Example DeepRVAT runs + +In each case, replace `[path_to_deeprvat]` with the path to your clone of the repository. + +Note that the example data used here is randomly generated, and so is only suited for testing whether the `deeprvat` package has been correctly installed. + + +### Run the association testing pipeline with pretrained models + +```shell +mkdir deeprvat_associate +cd deeprvat_associate +ln -s [path_to_deeprvat]/example/* . +ln -s [path_to_deeprvat]/pretrained_models +snakemake -j 1 --snakefile [path_to_deeprvat]/pipelines/association_testing_pretrained.snakefile +``` + + +### Run association testing using REGENIE on precomputed burdens + +```shell +mkdir deeprvat_associate_regenie +cd deeprvat_associate_regenie +ln -s [path_to_deeprvat]/example/* . +ln -s precomputed_burdens/burdens.zarr . +snakemake -j 1 --snakefile [path_to_deeprvat]/pipelines/association_testing_pretrained_regenie.snakefile +``` + + +### Run the training pipeline on some example data + +```shell +mkdir deeprvat_train +cd deeprvat_train +ln -s [path_to_deeprvat]/example/* . +snakemake -j 1 --snakefile [path_to_deeprvat]/pipelines/run_training.snakefile +``` + + +### Run the full training and association testing pipeline on some example data + +```shell +mkdir deeprvat_train_associate +cd deeprvat_train_associate +ln -s [path_to_deeprvat]/example/* . +snakemake -j 1 --snakefile [path_to_deeprvat]/pipelines/training_association_testing.snakefile +``` diff --git a/docs/seed_gene_discovery.md b/docs/seed_gene_discovery.md index c58183ab..3fb8ca97 100644 --- a/docs/seed_gene_discovery.md +++ b/docs/seed_gene_discovery.md @@ -4,34 +4,65 @@ This pipeline discovers *seed genes* for DeepRVAT training. The pipeline runs SK To run the pipeline, an experiment directory with the `config.yaml` has to be created. +(input-data)= ## Input data -The experiment directory in addition requires to have the same input data as specified for [DeepRVAT](usage.md), including +The experiment directory in addition requires to have the same input data as specified for [DeepRVAT](deeprvat.md), including - `annotations.parquet` - `protein_coding_genes.parquet` - `genotypes.h5` - `variants.parquet` - `phenotypes.parquet` +- `config.yaml` (use [this](https://github.com/PMBio/deeprvat/blob/main/deeprvat/seed_gene_discovery/config.yaml) as a template) -The `annotations.parquet` data frame should have the following columns: +The `annotations.parquet` dataframe, generated by the annotation pipeline, can be utilized. To indicate if a variant is a loss of function (pLoF) variant, a column `is_plof` has to be added with values 0 or 1. We recommend to set this to `1` if the variant has been classified as any of these VEP consequences: `["splice_acceptor_variant", "splice_donor_variant", "frameshift_variant", "stop_gained", "stop_lost", "start_lost"]`. -- id (variant id, **should be the index column**) -- gene_ids (list) gene(s) the variant is assigned to -- is_plof (binary, indicating if the variant is loss of function) -- Consequence_missense_variant: -- MAF: Maximum of the MAF in the UK Biobank cohort and in gnomAD release 3.0 (non-Finnish European population) can also be changed by using the --maf-column {maf_col_name} flag for the rule config and replacing MAF in the config.yaml with the {maf_col_name} but it must contain the string '_AF', '_MAF' OR '^MAF' +(configuration-file)= +## Configuration file -### Run the seed gene discovery pipeline with example data +You can restrict to only missense variants (identified by the `Consequence_missense_variant` column in `annotations.parquet` ) or pLoF variants (`is_plof` column) via +``` +variant_types: + - missense + - plof +``` +and specify the test types that will be run via +``` +test_types: + - skat + - burden +``` + +The minor allele frequency threshold is set via + +``` +rare_maf: 0.001 +``` + +You can specify further test details in the test config using the following parameters: + +- `center_genotype` center the genotype matrix (True or False) +- `neglect_homozygous` Should the genotype value for homozyoogus variants be 1 (True) or 2 (False) +- `collapse_method` Burden test collapsing method. Supported are `sum` and `max` +- `var_weight` Variant weighting function. Supported are `beta_maf` (Beta(MAF, 1, 25)) or `sift_polpyen` (mean of 1-SIFT and Polyphen2 score) +- `min_mac` minimum expected allele count for genes to be included. This is the cumulative allele frequency of variants in the burden mask (e.g., pLoF variants) for a given gene (e.g. pLoF variants) multiplied by the cohort size or number of cases for quantitative and binary traits, respectively. + +``` +test_config: + center_genotype: True + neglect_homozygous: False + collapse_method: sum #collapsing method for burden, + var_weight_function: beta_maf + min_mac: 50 # minimum expected allel count + +``` -Create the conda environment and activate it, (instructions can be found here [DeepRVAT instructions](usage.md) ) +## Running the seed gene discovery pipeline +In a directory with all the [input data](#input-data) required and your [configuration file](#configuration-file) set up, run: ``` -mkdir example -cd example -ln -s [path_to_deeprvat]/example/* . -cp [path_to_deeprvat]/deeprvat/seed_gene_discovery/config.yaml . -snakemake -j 1 --snakefile [path_to_deeprvat]/pipelines/seed_gene_discovery.snakefile +[path_to_deeprvat]/pipelines/seed_gene_discovery.snakefile ``` Replace `[path_to_deeprvat]` with the path to your clone of the repository. diff --git a/docs/ukbiobank.md b/docs/ukbiobank.md new file mode 100644 index 00000000..7c4987f3 --- /dev/null +++ b/docs/ukbiobank.md @@ -0,0 +1,9 @@ +# Applying DeepRVAT to UK Biobank data + +_Note: This section is coming soon!_ + +## First steps + +## Basic analysis: Using precomputed burdens + +## Advanced analysis: Custom-trained DeepRVAT model diff --git a/docs/usage.md b/docs/usage.md deleted file mode 100644 index 5d7c9170..00000000 --- a/docs/usage.md +++ /dev/null @@ -1,85 +0,0 @@ -# Using DeepRVAT - -## Installation - -1. Clone this repository: -```shell -git clone git@github.com:PMBio/deeprvat.git -``` -1. Change directory to the repository: `cd deeprvat` -1. Install the conda environment. We recommend using [mamba](https://mamba.readthedocs.io/en/latest/index.html), though you may also replace `mamba` with `conda` - - *note: [the current deeprvat env does not support cuda when installed with conda](https://github.com/PMBio/deeprvat/issues/16), install using mamba for cuda support.* -```shell -mamba env create -n deeprvat -f deeprvat_env.yaml -``` -1. Activate the environment: `mamba activate deeprvat` -1. Install the `deeprvat` package: `pip install -e .` - -If you don't want to install the gpu related requirements use the `deeprvat_env_no_gpu.yml` environment instead. -```shell -mamba env create -n deeprvat -f deeprvat_env_no_gpu.yaml -``` - - -## Basic usage - -### Customize pipelines - -Before running any of the snakefiles, you may want to adjust the number of threads used by different steps in the pipeline. To do this, modify the `threads:` property of a given rule. - -If you are running on a computing cluster, you will need a [profile](https://github.com/snakemake-profiles) and may need to add `resources:` directives to the snakefiles. - - -### Run the preprocessing pipeline on VCF files - -Instructions [here](preprocessing.md) - - -### Annotate variants - -Instructions [here](annotations.md) - - - -### Try the full training and association testing pipeline on some example data - -```shell -mkdir example -cd example -ln -s [path_to_deeprvat]/example/* . -snakemake -j 1 --snakefile [path_to_deeprvat]/pipelines/training_association_testing.snakefile -``` - -Replace `[path_to_deeprvat]` with the path to your clone of the repository. - -Note that the example data is randomly generated, and so is only suited for testing whether the `deeprvat` package has been correctly installed. - - -### Run the training pipeline on some example data - -```shell -mkdir example -cd example -ln -s [path_to_deeprvat]/example/* . -snakemake -j 1 --snakefile [path_to_deeprvat]/pipelines/run_training.snakefile -``` - -Replace `[path_to_deeprvat]` with the path to your clone of the repository. - -Note that the example data is randomly generated, and so is only suited for testing whether the `deeprvat` package has been correctly installed. - - -### Run the association testing pipeline with pretrained models - -```shell -mkdir example -cd example -ln -s [path_to_deeprvat]/example/* . -ln -s [path_to_deeprvat]/pretrained_models -snakemake -j 1 --snakefile [path_to_deeprvat]/pipelines/association_testing_pretrained.snakefile -``` - -Replace `[path_to_deeprvat]` with the path to your clone of the repository. - -Again, note that the example data is randomly generated, and so is only suited for testing whether the `deeprvat` package has been correctly installed. diff --git a/ukbiobank.md b/ukbiobank.md new file mode 100644 index 00000000..07333e8d --- /dev/null +++ b/ukbiobank.md @@ -0,0 +1,9 @@ +# UK Biobank analysis + +This section will be filled with content soon! + +## First steps + +## Basic analysis: Using precomputed burdens + +## Advanced analysis: Custom-trained DeepRVAT model From 82cc76f2adf1b68222d90f3c67fcd8f30ed200c8 Mon Sep 17 00:00:00 2001 From: Brian Clarke Date: Fri, 17 May 2024 10:17:58 +0200 Subject: [PATCH 4/4] Update README to point to documentation --- README.md | 68 ++++--------------------------------------------------- 1 file changed, 5 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 6ee68736..1d852c83 100644 --- a/README.md +++ b/README.md @@ -4,75 +4,17 @@ Rare variant association testing using deep learning and data-driven burden scor [![Documentation Status](https://readthedocs.org/projects/deeprvat/badge/?version=latest)](https://deeprvat.readthedocs.io/en/latest/?badge=latest) -## Installation -1. Clone this repository: -``` -git clone git@github.com:PMBio/deeprvat.git -``` -1. Change directory to the repository: `cd deeprvat` -1. Install the conda environment. We recommend using [mamba](https://mamba.readthedocs.io/en/latest/index.html), though you may also replace `mamba` with `conda` - - *note: [the current deeprvat env does not support cuda when installed with conda](https://github.com/PMBio/deeprvat/issues/16), install using mamba for cuda support.* -``` -mamba env create -n deeprvat -f deeprvat_env.yaml -``` -1. Activate the environment: `mamba activate deeprvat` -1. Install the `deeprvat` package: `pip install -e .` +## Installation and usage -If you don't want to install the gpu related requirements use the `deeprvat_env_no_gpu.yml` environment instead. -``` -mamba env create -n deeprvat -f deeprvat_env_no_gpu.yaml -``` +Please consult our [documentation](https://deeprvat.readthedocs.io/en/latest/) -## Basic usage +## Citation -### Customize pipelines +If you use this package, please cite: -Before running any of the snakefiles, you may want to adjust the number of threads used by different steps in the pipeline. To do this, modify the `threads:` property of a given rule. - -If you are running on an computing cluster, you will need a [profile](https://github.com/snakemake-profiles) and may need to add `resources:` directives to the snakefiles. - - -### Run the preprocessing pipeline on VCF files - -Instructions [here](https://deeprvat.readthedocs.io/en/latest/preprocessing.html) - - -### Annotate variants - -Instructions [here](https://deeprvat.readthedocs.io/en/latest/annotations.html) - - - -### Try the full training and association testing pipeline on some example data - -``` -mkdir example -cd example -ln -s [path_to_deeprvat]/example/* . -snakemake -j 1 --snakefile [path_to_deeprvat]/pipelines/training_association_testing.snakefile -``` - -Replace `[path_to_deeprvat]` with the path to your clone of the repository. - -Note that the example data is randomly generated, and so is only suited for testing whether the `deeprvat` package has been correctly installed. - - -### Run the association testing pipeline with pretrained models - -``` -mkdir example -cd example -ln -s [path_to_deeprvat]/example/* . -ln -s [path_to_deeprvat]/pretrained_models -snakemake -j 1 --snakefile [path_to_deeprvat]/pipelines/association_testing_pretrained.snakefile -``` - -Replace `[path_to_deeprvat]` with the path to your clone of the repository. - -Again, note that the example data is randomly generated, and so is only suited for testing whether the `deeprvat` package has been correctly installed. +Clarke, Holtkamp et al., “Integration of Variant Annotations Using Deep Set Networks Boosts Rare Variant Association Genetics.” bioRxiv. https://dx.doi.org/10.1101/2023.07.12.548506 ## Credits