import os import sys # Add src to python path for seamless execution on Hugging Face Spaces sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "src"))) import gradio as gr import pandas as pd import numpy as np import torch try: import spaces has_spaces = True except ImportError: has_spaces = False from variantllm.inference.scorer import ZeroShotVariantScorer # Load Foundation Model scorer = ZeroShotVariantScorer(model_name="facebook/esm2_t6_8M_UR50D") PRESETS = { "TP53 p.Arg175His (Cancer Driver - Pathogenic)": ( "TP53", "p.Arg175His", "MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGPDEAPRMPEAAPPVAPAPAAPTPAAPAPAPSWPLSSSVPSQKTYQGSYGFRLGFLHSGTAKSVTCTYSPALNKMFCQLAKTCPVQLWVDSTPPPGTRVRAMAIYKQSQHMTEVVRRCPHHERCSDSD", "MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGPDEAPRMPEAAPPVAPAPAAPTPAAPAPAPSWPLSSSVPSQKTYQGSYGFRLGFLHSGTAKSVTCTYSPALNKMFCQLAKTCPVQLWVDSTPPPGTHVRAMAIYKQSQHMTEVVRRCPHHERCSDSD" ), "TP53 p.Arg273His (Hotspot Driver - Pathogenic)": ( "TP53", "p.Arg273His", "MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGPDEAPRMPEAAPPVAPAPAAPTPAAPAPAPSWPLSSSVPSQKTYQGSYGFRLGFLHSGTAKSVTCTYSPALNKMFCQLAKTCPVQLWVDSTPPPGTRVRAMAIYKQSQHMTEVVRRCPHHERCSDSD", "MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGPDEAPRMPEAAPPVAPAPAAPTPAAPAPAPSWPLSSSVPSQKTYQGSYGFRLGFLHSGTAKSVTCTYSPALNKMFCQLAKTCPVQLWVDSTPPPGTRVHAMAIYKQSQHMTEVVRRCPHHERCSDSD" ), "TP53 p.Pro47Pro (Synonymous - Benign)": ( "TP53", "p.Pro47Pro", "MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGPDEAPRMPEAAPPVAPAPAAPTPAAPAPAPSWPLSSSVPSQKTYQGSYGFRLGFLHSGTAKSVTCTYSPALNKMFCQLAKTCPVQLWVDSTPPPGTRVRAMAIYKQSQHMTEVVRRCPHHERCSDSD", "MEEPQSDPSVEPPLSQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWFTEDPGPDEAPRMPEAAPPVAPAPAAPTPAAPAPAPSWPLSSSVPSQKTYQGSYGFRLGFLHSGTAKSVTCTYSPALNKMFCQLAKTCPVQLWVDSTPPPGTRVRAMAIYKQSQHMTEVVRRCPHHERCSDSD" ), "EGFR p.Leu858Arg (NSCLC Driver - Pathogenic)": ( "EGFR", "p.Leu858Arg", "LKVLGSGAFGTVYKGLWIPEGEKVKIPVAIKELREATSPKANKEILDEAYVMASVDNPHVCRLLGICLTSTVQLITQLMPFGCLLDYVREHKDNIGSQYLLNWCVQIAKGMNYLEDRRLVHRDLAARNVLVKTPQHVKITDFGLAKLLGAEEKEYHAEGGKVPIKWMALESILHRIYTHQSDVWSY", "LKVLGSGAFGTVYKGLWIPEGEKVKIPVAIKELREATSPKANKEILDEAYVMASVDNPHVCRLLGICLTSTVQLITQLMPFGCLLDYVREHKDNIGSQYLLNWCVQIAKGMNYLEDRRLVHRDLAARNVLVKTPQHVKITDFGRAKLLGAEEKEYHAEGGKVPIKWMALESILHRIYTHQSDVWSY" ), "BRAF p.Val600Glu (Melanoma Driver - Pathogenic)": ( "BRAF", "p.Val600Glu", "LIDIWEIPDGQGQMILGKDVSSAKAVSEKGLRLIQGQTLSLKIDSTGLLLRSLSVTVFDLHRWGRDVQGDFVFYTAVVKVTKLGDFGLATVKSRWSGSHQFEQLSGSILWMAPEVIRMQDKNPYSFQSDVYAFGIVLYELMTGQLPYSNINNRDQIIFMVGRGYLSPDLSKVRSNCPKAMKRLMAECLKKKRDERPLFPQ", "LIDIWEIPDGQGQMILGKDVSSAKAVSEKGLRLIQGQTLSLKIDSTGLLLRSLSVTVFDLHRWGRDVQGDFVFYTAVVKVTKLGDFGLATEKSRWSGSHQFEQLSGSILWMAPEVIRMQDKNPYSFQSDVYAFGIVLYELMTGQLPYSNINNRDQIIFMVGRGYLSPDLSKVRSNCPKAMKRLMAECLKKKRDERPLFPQ" ), "KRAS p.Gly12Asp (Pancreatic Driver - Pathogenic)": ( "KRAS", "p.Gly12Asp", "MTEYKLVVVGAGGVGKSALTIQLIQNHFVDEYDPTIEDSYRKQVVIDGETCLLDILDTAGQEEYSAMRDQYMRTGEGFLCVFAINNTKSFEDIHHYREQIKRVKDSEDVPMVLVGNKCDLPSRTVDTKQAQDLARSYGIPFIETSAKTRQRVEDAFYTLVREIRQYRLKKISKEEKTPGCVKIKKCIIM", "MTEYKLVVVGADGVGKSALTIQLIQNHFVDEYDPTIEDSYRKQVVIDGETCLLDILDTAGQEEYSAMRDQYMRTGEGFLCVFAINNTKSFEDIHHYREQIKRVKDSEDVPMVLVGNKCDLPSRTVDTKQAQDLARSYGIPFIETSAKTRQRVEDAFYTLVREIRQYRLKKISKEEKTPGCVKIKKCIIM" ), "KRAS p.Ala59Ala (Synonymous - Benign)": ( "KRAS", "p.Ala59Ala", "MTEYKLVVVGAGGVGKSALTIQLIQNHFVDEYDPTIEDSYRKQVVIDGETCLLDILDTAGQEEYSAMRDQYMRTGEGFLCVFAINNTKSFEDIHHYREQIKRVKDSEDVPMVLVGNKCDLPSRTVDTKQAQDLARSYGIPFIETSAKTRQRVEDAFYTLVREIRQYRLKKISKEEKTPGCVKIKKCIIM", "MTEYKLVVVGAGGVGKSALTIQLIQNHFVDEYDPTIEDSYRKQVVIDGETCLLDILDTAGQEEYSAMRDQYMRTGEGFLCVFAINNTKSFEDIHHYREQIKRVKDSEDVPMVLVGNKCDLPSRTVDTKQAQDLARSYGIPFIETSAKTRQRVEDAFYTLVREIRQYRLKKISKEEKTPGCVKIKKCIIM" ), "BRCA1 p.Cys61Gly (Breast Cancer - Pathogenic)": ( "BRCA1", "p.Cys61Gly", "MDLSALRVEEVQNVINAMQKILECPICLELIKEPVSTKCDHIFCKFCMLKLLNQKKGPSQCPLCKNDITKRSLQESTRFSQLVEELLKIICAFQLDTGLEYANSYNFAKKENNSPEHLKDEVSIIQSMGYRNRAKRLLQSEPENPSLQETSLSVQLSNLGTVRTLRTKQRIQPQKTSVYIELGSDS", "MDLSALRVEEVQNVINAMQKILECPIGLELIKEPVSTKCDHIFCKFCMLKLLNQKKGPSQCPLCKNDITKRSLQESTRFSQLVEELLKIICAFQLDTGLEYANSYNFAKKENNSPEHLKDEVSIIQSMGYRNRAKRLLQSEPENPSLQETSLSVQLSNLGTVRTLRTKQRIQPQKTSVYIELGSDS" ) } def _predict_single(gene, anno, wt_seq, mut_seq): if not wt_seq or not mut_seq or len(wt_seq) < 3 or len(mut_seq) < 3: return "
Error: Please provide valid protein sequences of at least 3 residues.
", 0.0, 0.0, 0.0, pd.DataFrame() res = scorer.score_sequence_pair(wt_seq, mut_seq) summary_df = pd.DataFrame([{ "Gene Symbol": gene, "HGVS Annotation": anno, "Mutation Position": res["gene_position"], "Wildtype": res["wildtype_residue"], "Mutant": res["mutant_residue"], "LogLikelihood (WT)": res["log_likelihood_wt"], "LogLikelihood (Mut)": res["log_likelihood_mut"], "Delta LLR (Score)": res["zero_shot_llr_score"], "Pathogenicity Probability": f"{res['pathogenicity_prob']:.2%}", "Clinical Prediction": res["prediction"] }]) is_path = "Pathogenic" in res["prediction"] color = "#dc2626" if is_path else "#16a34a" bg_color = "#fee2e2" if is_path else "#dcfce7" banner = f"Pathogenicity Risk: {res['pathogenicity_prob']:.2%} | Confidence: {res['confidence_percent']}% | Evolutionary Disruption (Delta LLR): {res['zero_shot_llr_score']:+.4f}
" \ f"Prediction results will appear here after execution.
") prob_out = gr.Slider(minimum=0.0, maximum=1.0, label="Pathogenicity Probability Index", interactive=False) llr_out = gr.Number(label="Zero-Shot Log-Likelihood Ratio (Delta LLR)") entropy_out = gr.Number(label="Site Evolutionary Entropy") df_out = gr.Dataframe(label="Residue Mutation Breakdown") preset_dd.change(fn=load_preset, inputs=[preset_dd], outputs=[gene_in, anno_in, wt_in, mut_in]) predict_btn.click( fn=analyze_variant, inputs=[gene_in, anno_in, wt_in, mut_in], outputs=[pred_out, prob_out, llr_out, entropy_out, df_out] ) with gr.Tab("ClinVar Multi-Gene Benchmark Suite"): gr.Markdown("### Automated Evaluation Across Validated Human Disease Hotspots (TP53, BRCA1, EGFR, BRAF, KRAS)") eval_btn = gr.Button("Execute Live Batch Benchmark Across ClinVar", variant="secondary") batch_summary = gr.Markdown("Click button above to evaluate zero-shot foundation model performance across all ClinVar controls.") batch_df = gr.Dataframe(label="ClinVar Validation Results") eval_btn.click(fn=run_batch_benchmark, inputs=[], outputs=[batch_summary, batch_df]) with gr.Tab("Scientific & Mathematical Architecture"): gr.Markdown(r""" ### Masked-Marginal Log-Likelihood Ratio (LLR) Formulation $$\Delta \text{LLR} = \log P(x_i = \text{wt} \mid X_{-i}) - \log P(x_i = \text{mut} \mid X_{-i})$$ - **Positive ΔLLR (> 1.5)**: The wildtype amino acid is significantly more evolutionarily favored across the phylogenetic tree. The mutation disrupts biophysical stability or catalytic activity → **Pathogenic / Deleterious**. - **Neutral / Negative ΔLLR (≈ 0 or < 1.5)**: The substitution is evolutionarily tolerated → **Benign / Tolerated**. ### Foundation Architecture - **Backbone**: Meta AI's `facebook/esm2_t6_8M_UR50D` (6-layer Multi-Head Self-Attention Transformer with Rotary Positional Embeddings). - **Training Data of Backbone**: Tens of millions of non-redundant natural protein sequences from UniRef50. - **Clinical Ground Truth**: NCBI ClinVar, COSMIC somatic mutation database, and UniProtKB. """) gr.Markdown("---") gr.Markdown("Developed by **Hardik Sood** (Indian Institute of Technology (BHU), Varanasi) | Open-Source on [GitHub](https://github.com/hardiksood21/variantllm)") if __name__ == "__main__": demo.launch(ssr_mode=False)