<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Jiecong Lin on Genomics x AI</title><link>https://genomicsxai.github.io/authors/jiecong-lin/</link><description>Recent content in Jiecong Lin on Genomics x AI</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Fri, 17 Jul 2026 13:13:14 -0400</lastBuildDate><atom:link href="https://genomicsxai.github.io/authors/jiecong-lin/index.xml" rel="self" type="application/rss+xml"/><item><title>Chorus: chatting with genomic oracles</title><link>https://genomicsxai.github.io/blogs/2026-010/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><guid>https://genomicsxai.github.io/blogs/2026-010/</guid><description>&lt;img src="https://genomicsxai.github.io/" alt="Featured image of post Chorus: chatting with genomic oracles" /&gt;&lt;aside class="summary-box"&gt;
 &lt;h2 class="summary-box__title"&gt;Summary&lt;/h2&gt;
 &lt;div class="summary-box__body"&gt;
 &lt;p&gt;Sequence-to-function models have become one of the most exciting developments in regulatory genomics: models like Enformer, Borzoi, ChromBPNet, and AlphaGenome can now predict chromatin accessibility, transcription factor binding, gene expression, histone modifications, and splicing directly from DNA sequence across hundreds of cell types. Using them together, however, has remained surprisingly difficult — each ships with its own repository, dependencies, input formats, track conventions, output resolutions, and hardware requirements, which puts comparative analysis out of reach for most clinicians and GWAS interpreters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chorus&lt;/strong&gt; provides a unified framework that turns seven state-of-the-art models (ChromBPNet/BPNet, LegNet, Sei, Enformer, Borzoi, EPInformer-seq, and AlphaGenome) into interchangeable &amp;ldquo;oracles&amp;rdquo; with harmonised, cross-comparable outputs, and exposes every capability over the &lt;a class="link" href="https://modelcontextprotocol.io/" target="_blank" rel="noopener"
 &gt;Model Context Protocol&lt;/a&gt; so an AI agent can run them from plain language — a shift from computational to &lt;strong&gt;conversational genomics&lt;/strong&gt;. Two worked examples show what that enables: in the first, an agent reconstructs the mechanism of a textbook regulatory variant (rs12740374 at &lt;em&gt;SORT1&lt;/em&gt;) through conversation alone; in the second, it prioritises a likely causal variant inside a tight GWAS linkage block (rs9504151), recovering the same disrupted transcription factor an independent fine-mapping study reported.&lt;/p&gt;
&lt;p&gt;We are also honest about where the predictions fall short: effect sizes come out too small, and a variant can only be assessed in the cell types the models actually cover.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt; &lt;a class="link" href="https://github.com/pinellolab/chorus" target="_blank" rel="noopener"
 &gt;github.com/pinellolab/chorus&lt;/a&gt;&lt;/p&gt;

 &lt;/div&gt;
&lt;/aside&gt;

&lt;hr&gt;
&lt;h2 id="motivation"&gt;Motivation
&lt;/h2&gt;&lt;p&gt;Interpreting noncoding variants is one of the central problems in human genetics: most GWAS associations and a large share of disease-relevant variants lie outside coding regions, making it difficult to understand how they influence biology.&lt;/p&gt;
&lt;p&gt;One important link between theoretical biology and personalized medicine is predicting the effects of regulatory variants. Unfortunately, this task cannot be addressed directly because only a small number of regulatory variant effects have been measured in a consistent and reliable way.
Therefore, the field has largely adopted a zero-shot approach. A sequence-to-function (seq2func) model is trained to predict molecular readouts directly from DNA sequence, such as chromatin accessibility, transcription factor binding, gene expression, or splicing. After that, to estimate the effect of a genetic variant, the model is run twice: once on the reference sequence and once on the sequence containing the variant. The difference between the two predictions is used as the predicted variant effect. In other words, it estimates how much the mutation changes regulatory activity of the region.&lt;/p&gt;
&lt;p&gt;Models like &lt;a class="link" href="https://www.nature.com/articles/s41592-021-01252-x" target="_blank" rel="noopener"
 &gt;Enformer&lt;/a&gt;, &lt;a class="link" href="https://github.com/calico/borzoi" target="_blank" rel="noopener"
 &gt;Borzoi&lt;/a&gt;, &lt;a class="link" href="https://github.com/kundajelab/chrombpnet" target="_blank" rel="noopener"
 &gt;ChromBPNet/BPNet&lt;/a&gt;, &lt;a class="link" href="https://github.com/FunctionLab/sei-framework" target="_blank" rel="noopener"
 &gt;Sei&lt;/a&gt;, &lt;a class="link" href="https://github.com/autosome-ru/LegNet" target="_blank" rel="noopener"
 &gt;LegNet&lt;/a&gt;, &lt;a class="link" href="https://www.nature.com/articles/s41467-026-70535-8" target="_blank" rel="noopener"
 &gt;EPInformer&lt;/a&gt; and &lt;a class="link" href="https://www.nature.com/articles/s41586-025-10014-0" target="_blank" rel="noopener"
 &gt;AlphaGenome&lt;/a&gt; can now predict chromatin accessibility, transcription factor binding, gene expression, histone modifications, and splicing directly from DNA sequence across hundreds of cell types. Using them together, however, has remained surprisingly difficult.&lt;/p&gt;
&lt;!-- &gt; *Side note:* a seq2func model learns a direct mapping from DNA sequence to one or more measured molecular readouts (accessibility, binding, expression, and so on). Train it on the genome and you can then ask it about sequences the genome never contained, which is exactly what variant interpretation needs. --&gt;
&lt;p&gt;Every model comes with its own ecosystem: a separate repository, dependency stack (TensorFlow, PyTorch, or JAX), input window (anywhere from 200b to 1 Mb), various sequence preprocessing and prediction postprocessing steps, track-naming convention, output resolution, and hardware requirements. Running a comparative analysis across models often means days of plumbing before you can even ask a biological question. That overhead is real even for computational biologists; for clinicians and GWAS interpreters, who want to examine a patient&amp;rsquo;s variant or a credible set from a study, it is usually a hard stop. A standardized collection of models that is easy to install and run — paired with tools that run them efficiently and generate comprehensive reports highlighting the most probable explanations and the weak points that still need experimental validation — could greatly accelerate progress. This is the motivation behind Chorus.&lt;/p&gt;
&lt;p&gt;Several prior efforts have sought to standardize access to sequence-to-function models, through each addresses a different piece of the puzzle. &lt;a class="link" href="https://www.nature.com/articles/s41587-019-0140-0" target="_blank" rel="noopener"
 &gt;Kipoi&lt;/a&gt; established a model repository and exchange format for genomics, making trained models findable and reusable. &lt;a class="link" href="https://www.nature.com/articles/s41587-024-02414-w" target="_blank" rel="noopener"
 &gt;PrixFixe&lt;/a&gt; address the problem of designing novel and effective deep-learning models. &lt;a class="link" href="https://www.biorxiv.org/content/10.1101/2025.08.08.669296v1" target="_blank" rel="noopener"
 &gt;tangermeme&lt;/a&gt; focuses on providing built-in, highly optimized atomic methods for
interpreting model predictions. &lt;a class="link" href="https://www.nature.com/articles/s41592-025-02868-z" target="_blank" rel="noopener"
 &gt;gRELU&lt;/a&gt; provides a library for training, interpreting, and deploying sequence-to-function models, streamlining the development side of the workflow. &lt;a class="link" href="https://doi.org/10.1101/2025.07.04.663250" target="_blank" rel="noopener"
 &gt;GAME&lt;/a&gt; (Genomics API for Model Evaluation) standardizes benchmarking through Predictors and Evaluators that communicate over a common API, with an LLM Matcher for cell-type and species alignment. Where these efforts focus on exchange, development, and evaluation, Chorus tackles a different problem: harmonized, cross-comparable variant interpretation through a conversational interface.&lt;/p&gt;
&lt;p&gt;Chorus turns genomic sequence-to-function models into interchangeable &lt;em&gt;oracles&lt;/em&gt;. You describe a biological question in plain language, and Chorus selects the appropriate model, handles all preprocessing and dependency management, and returns results in a consistent format. Analyses that previously required stitching together multiple pipelines across days can now be completed in an afternoon, through conversation alone.&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://genomicsxai.github.io/blogs/2026-010/fig_architecture.png" class="image-link" data-pswp-width="3333" data-pswp-height="2250"&gt;
		&lt;img src="https://genomicsxai.github.io/blogs/2026-010/fig_architecture.png" width="3333" height="2250"loading="lazy"
			alt="Chorus turns seven sequence-to-function models into interchangeable oracles and lets an AI agent orchestrate them from natural language."
			title="Figure 1. Chorus exposes seven seq2func oracles behind one interface and an agentic layer. The same analysis can be driven programmatically through a unified Python API or conversationally through an MCP server." data-title-escaped="Figure 1. Chorus exposes seven seq2func oracles behind one interface and an agentic layer. The same analysis can be driven programmatically through a unified Python API or conversationally through an MCP server." class="gallery-image" data-flex-grow="148" data-flex-basis="355px"&gt;
		&lt;/a&gt;&lt;/figure&gt;&lt;hr&gt;
&lt;h2 id="chorus-framework"&gt;Chorus Framework
&lt;/h2&gt;&lt;p&gt;Chorus provides a unified framework for sequence-to-function models through a standardized &lt;strong&gt;oracle&lt;/strong&gt; abstraction. Every model becomes an interchangeable genomic oracle: you hand it a genomic region or a DNA sequence and a set of tracks, and it returns predictions across the modalities it supports. Switching models is a single argument. Under the hood, Chorus handles dependency isolation, environment management, and the model-specific preprocessing each one demands; from the outside, all of that disappears behind one small Python API.&lt;/p&gt;
&lt;p&gt;Three concepts carry the design:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Oracle.&lt;/strong&gt; A common interface implemented by every model. &lt;code&gt;oracle.predict(interval, tracks)&lt;/code&gt; is the primitive that everything else is built on. Each oracle runs in its own isolated conda environment, so the TensorFlow, PyTorch, and JAX models never fight over dependencies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interval.&lt;/strong&gt; A unified handle on genomic coordinates and the reference sequence, with an edit history. An interval tracks the substitutions, insertions, and deletions you apply alongside the predictions they produce, which is what makes in silico perturbation reproducible rather than a pile of ad hoc FASTA files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Track.&lt;/strong&gt; A named genomic signal (DNase, ATAC, ChIP, CAGE, RNA-seq, and so on). A track is implicitly an (assay x cell type/tissue) pair, such as &amp;ldquo;DNase in HepG2&amp;rdquo; or &amp;ldquo;CAGE in lung fibroblasts&amp;rdquo;. Track identifiers differ across oracles, so Chorus provides metadata search to find the right ones. The Track class supports several common and useful operations, such as changing the track resolution to compare predictions from different models.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These seven oracles span a wide range of context windows and resolutions, which is exactly why having them under one roof is useful: you can pick the right tool for the layer you care about without rewriting your analysis.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Oracle&lt;/th&gt;
					&lt;th&gt;Input window&lt;/th&gt;
					&lt;th&gt;Resolution&lt;/th&gt;
					&lt;th&gt;What it is good at&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;ChromBPNet / BPNet&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2,114 bp&lt;/td&gt;
					&lt;td&gt;1 bp&lt;/td&gt;
					&lt;td&gt;Chromatin accessibility (ChromBPNet) and TF binding (BPNet) at base-pair resolution&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;LegNet&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;200 bp&lt;/td&gt;
					&lt;td&gt;element-level&lt;/td&gt;
					&lt;td&gt;MPRA / reporter activity of short regulatory elements&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;EPInformer (EPInformer-seq implementation)&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2,114 bp*&lt;/td&gt;
					&lt;td&gt;1 bp (DNase/H3K27ac); element-level (DNase–H3K27ac composite)&lt;/td&gt;
					&lt;td&gt;Compact per-cell enhancer activity (DNase cut-sites + H3K27ac) across 11 Roadmap cell types&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Sei&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;4,096 bp&lt;/td&gt;
					&lt;td&gt;region-level&lt;/td&gt;
					&lt;td&gt;Regulatory effect across 21,907 chromatin profiles&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Enformer&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;196,608 bp&lt;/td&gt;
					&lt;td&gt;128 bp&lt;/td&gt;
					&lt;td&gt;Expression (CAGE), accessibility, histone marks across long context&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Borzoi&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;524,288 bp&lt;/td&gt;
					&lt;td&gt;32 bp&lt;/td&gt;
					&lt;td&gt;Enformer-style outputs plus RNA-seq coverage&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;AlphaGenome&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;1,048,576 bp&lt;/td&gt;
					&lt;td&gt;1 bp&lt;/td&gt;
					&lt;td&gt;Generalist: ATAC, DNase, CAGE, RNA-seq, splicing, PRO-CAP, and ChIP for histones and TFs (5,731 tracks)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;*Chorus uses the &lt;a class="link" href="https://github.com/pinellolab/EPInformer/blob/main/EPInformer/epinformer_seq_v2.py" target="_blank" rel="noopener"
 &gt;EPInformer-seq implementation&lt;/a&gt;, which accepts a single 2,114-bp sequence as input and predicts DNase and H3K27ac profiles over the central 1,024 bp. This differs from the original EPInformer architecture, which predicts gene-expression taking a promoter together with candidate enhancers spanning a broader (~100 kb) regulatory context.&lt;/p&gt;
&lt;p&gt;There is one more piece that makes cross-model work honest. Raw model outputs are not comparable: a &amp;ldquo;+1.3&amp;rdquo; from one track means something different from a &amp;ldquo;+1.3&amp;rdquo; from another. Chorus scores every prediction against a per-track genome-wide background (built from thousands of random variants and genomic sites), turning a raw log2 fold-change into two interpretable numbers: an &lt;strong&gt;effect percentile&lt;/strong&gt; (how unusual this variant&amp;rsquo;s effect is relative to random SNPs, an approac inspired by the one used in AlphaGenome paper) and an &lt;strong&gt;activity percentile&lt;/strong&gt; (how active the site is to begin with). For the genome-browser view, the same backgrounds rescale every track onto one shared display axis, where 1.0 marks roughly the top one percent of bins genome-wide and 0 sits at a per-layer activity floor. After this normalisation, effects and signals become comparable across cell types, variants, tracks, and oracles, and the browser can show every oracle&amp;rsquo;s reference and alternate signal on a single axis.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="from-computational-to-conversational-genomics"&gt;From computational to conversational genomics
&lt;/h2&gt;&lt;p&gt;Chorus also adopts an approach that fundamentally changes how these models get used and makes them even easier to reach: a conversational layer. It ships an &lt;a class="link" href="https://modelcontextprotocol.io/" target="_blank" rel="noopener"
 &gt;MCP&lt;/a&gt; (Model Context Protocol) server that exposes every capability as a tool an AI agent can call. Once it is connected, you can ask the genome what a variant would do in plain language, and the agent picks the oracle, selects tracks, runs the prediction, and explains the result.&lt;/p&gt;
&lt;p&gt;The MCP server exposes 24 tools, grouped by what they do. The low-level set handles discovery (&lt;code&gt;list_oracles&lt;/code&gt;, &lt;code&gt;list_tracks&lt;/code&gt;, &lt;code&gt;list_genomes&lt;/code&gt;, &lt;code&gt;get_genes_in_region&lt;/code&gt;, &lt;code&gt;get_gene_tss&lt;/code&gt;), oracle lifecycle (&lt;code&gt;load_oracle&lt;/code&gt;, &lt;code&gt;unload_oracle&lt;/code&gt;, &lt;code&gt;oracle_status&lt;/code&gt;), raw prediction (&lt;code&gt;predict&lt;/code&gt;, &lt;code&gt;predict_variant_effect&lt;/code&gt;, &lt;code&gt;predict_region_replacement&lt;/code&gt;, &lt;code&gt;predict_region_insertion&lt;/code&gt;), scoring primitives (&lt;code&gt;score_prediction_region&lt;/code&gt;, &lt;code&gt;score_variant_effect_at_region&lt;/code&gt;, &lt;code&gt;predict_variant_effect_on_gene&lt;/code&gt;, &lt;code&gt;score_ism&lt;/code&gt; for in-silico saturation mutagenesis), and a backend helper (&lt;code&gt;recommend_alphagenome_backend&lt;/code&gt;, which suggests the JAX vs PyTorch AlphaGenome backend for a given window size).&lt;/p&gt;
&lt;p&gt;Above these are the high-level analysis tools that power the worked examples below, the ones most users actually call:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;analyze_variant_multilayer&lt;/code&gt; — score a variant across chromatin, TF, histone, CAGE, RNA, and splicing in a single call&lt;/li&gt;
&lt;li&gt;&lt;code&gt;discover_variant&lt;/code&gt; and &lt;code&gt;discover_variant_cell_types&lt;/code&gt; — find the top tracks, or screen hundreds of cell types, for a variant without pre-selecting assays&lt;/li&gt;
&lt;li&gt;&lt;code&gt;score_variant_batch&lt;/code&gt; — rank a whole VCF, GWAS set, or credible set by effect&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fine_map_causal_variant&lt;/code&gt; — prioritise the causal SNP in a GWAS locus using multi-layer convergence (this is the tool behind the second worked example below)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;analyze_region_swap&lt;/code&gt; and &lt;code&gt;simulate_integration&lt;/code&gt; — score sequence-engineering edits such as promoter swaps and construct insertions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means an analyst can ask: which cell type&amp;rsquo;s accessibility changes most for this variant, which transcription factor is gaining or losing a site, which nearby gene moves, does this edited enhancer behave like the wild type. No code, and the same questions map onto whichever oracle is best suited to answer them.&lt;/p&gt;
&lt;p&gt;The two sections below are worked examples of exactly that.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="reproducing-a-nature-paper-in-an-afternoon"&gt;Reproducing a Nature paper in an afternoon
&lt;/h2&gt;&lt;p&gt;We started from a simple question: could an agent equipped with Chorus reconstruct the mechanism behind a classic regulatory variant through conversation alone?&lt;/p&gt;
&lt;p&gt;The test case is &lt;strong&gt;rs12740374&lt;/strong&gt; at the 1p13 locus, the subject of a &lt;a class="link" href="https://doi.org/10.1038/nature09266" target="_blank" rel="noopener"
 &gt;2010 Nature paper&lt;/a&gt; by Musunuru and colleagues. The original work showed that this noncoding SNP creates a liver-specific C/EBP (C/EBPα) binding site, raises &lt;em&gt;SORT1&lt;/em&gt; expression in hepatocytes, and ultimately shifts LDL cholesterol and myocardial infarction risk. The SNP sits in a roughly 6 kb noncoding stretch between CELSR2 and PSRC1; SORT1, the gene it ultimately controls, is a more distal neighbour in the same cluster, a detail that matters below. Establishing the mechanism took a battery of experiments: eQTL analysis, reporter assays, chromatin immunoprecipitation (ChIP), electrophoretic mobility shift assays (EMSA), and overexpression and knockdown studies in mouse liver.&lt;/p&gt;
&lt;p&gt;We reproduced the core of it in an afternoon, in a chat. Working in Claude Code with the Chorus MCP server connected, the analysis unfolded one question at a time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1, which cell type opens up?&lt;/strong&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; Score chr1:109274968 G&amp;gt;T using ChromBPNet. Which cell types change chromatin accessibility the most?&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;The agent loaded ChromBPNet on its own and reported that the variant strongly increases predicted accessibility, with a large effect in &lt;strong&gt;HepG2&lt;/strong&gt;, a liver-derived line — among the strongest of the cell types it covers. That matches the paper&amp;rsquo;s central claim that the mechanism is liver-relevant. (Across the human ChromBPNet DNase models, HepG2 is co-highest by effect-percentile; the fibroblast line IMR-90 shows a comparable-to-larger raw effect, so we avoid claiming HepG2 is uniquely the largest.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2, which factor binds?&lt;/strong&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; HepG2 looks interesting. Which transcription factor&amp;rsquo;s predicted binding changes most at the variant?&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;The strongest signal came from the &lt;strong&gt;C/EBP&lt;/strong&gt; family. We gave no prior about which factor to look for: AlphaGenome scores its whole panel of TF-ChIP tracks, so it can surface C/EBP straight from sequence (CEBPB and CEBPA top the HepG2 TF panel), and a C/EBP-specific BPNet head then confirms the gain. In the 2010 study, nailing this down required EMSA and ChIP to show that C/EBP binds the site created by the minor allele.&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://genomicsxai.github.io/blogs/2026-010/fig_sort1_tf_scan.png" class="image-link" data-pswp-width="1494" data-pswp-height="1013"&gt;
		&lt;img src="https://genomicsxai.github.io/blogs/2026-010/fig_sort1_tf_scan.png" width="1494" height="1013"loading="lazy"
			alt="AlphaGenome TF-ChIP scan for rs12740374 in HepG2, with no prior."
			title="Figure 2. AlphaGenome&amp;#39;s HepG2 TF-ChIP scan for rs12740374, given no prior about which factor to look for. The C/EBP family tops the ranking (CEBPB &amp;#43;3.1, CEBPA &amp;#43;2.8, CEBPG &amp;#43;2.3, CEBPD &amp;#43;1.9) — the binding site the minor allele creates." data-title-escaped="Figure 2. AlphaGenome&amp;amp;#39;s HepG2 TF-ChIP scan for rs12740374, given no prior about which factor to look for. The C/EBP family tops the ranking (CEBPB &amp;#43;3.1, CEBPA &amp;#43;2.8, CEBPG &amp;#43;2.3, CEBPD &amp;#43;1.9) — the binding site the minor allele creates." class="gallery-image" data-flex-grow="147" data-flex-basis="353px"&gt;
		&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Step 3, which gene is affected the most, and why only a long-context oracle can answer&lt;/strong&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; Which nearby gene&amp;rsquo;s expression is most affected? Use a long-context oracle with CAGE and RNA-seq.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;This step is worth pausing on, because it is the one place where the choice of oracle is not optional. As noted above, rs12740374 sits between CELSR2 and PSRC1, and the SORT1 promoter is roughly 100 kb away (≈118 kb to the nearest SORT1 TSS in hg38). Linking the variant to &lt;em&gt;SORT1&lt;/em&gt; therefore requires two capabilities:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The model must predict gene-expression-related outputs such as CAGE or RNA-seq.&lt;/li&gt;
&lt;li&gt;The relevant promoter must fall within the model&amp;rsquo;s output window.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Many powerful sequence-to-function models fail one of these criteria.
ChromBPNet and LegNet do not model gene expression at all: they are designed to measure local chromatin accessibility and short-sequence reporter activity, respectively.
Even among expression models, genomic context matters. Enformer&amp;rsquo;s input window can accommodate both the variant and the SORT1 promoter. Placing the variant near the start of the 196,608 bp input puts the SORT1 TSS (roughly 118 kb away) within the central 114 kb output crop, so the model could in principle report an effect on the promoter. In practice, however, Enformer struggle to reliably capture regulatory effects spanning such long distances (see &lt;strong&gt;Distal targets need long context&lt;/strong&gt; in &lt;strong&gt;Limitations&lt;/strong&gt; section or &lt;a class="link" href="https://doi.org/10.1186/s13059-023-02899-9" target="_blank" rel="noopener"
 &gt;Karollus et al., 2023&lt;/a&gt;); in our tests Enformer predicts essentially no change in liver CAGE signal at the SORT1 promoter for this variant.&lt;/p&gt;
&lt;p&gt;Chorus handles this decision automatically. During oracle selection, Chorus checks whether the genomic feature required by the user&amp;rsquo;s question falls within the candidate model&amp;rsquo;s effective output region. If the target gene lies outside that range, Chorus recommends switching to an oracle with a sufficiently large output window. This is why, for this analysis, the gene-level prediction was obtained from AlphaGenome.&lt;/p&gt;
&lt;p&gt;The top hit was &lt;strong&gt;SORT1&lt;/strong&gt;, with increased predicted promoter and transcript signal in HepG2.&lt;/p&gt;
&lt;p&gt;At that point the mechanistic story had assembled itself through conversation: the minor allele opens chromatin in liver cells, creates a C/EBP site, and upregulates &lt;em&gt;SORT1&lt;/em&gt;. AlphaGenome alone could have recovered essentially this entire chain of evidence. But relying on a single model leaves open the question of whether the result is a genuine biological signal or a model-specific artefact. The power of Chorus is that it lets us ask the same question across multiple oracles with different inductive biases. To make the result robust rather than a single model&amp;rsquo;s opinion, we then scored the variant across three independent oracles, each contributing only the layers it can actually measure: ChromBPNet for local accessibility, LegNet for MPRA reporter activity, and AlphaGenome as a generalist covering ChIP, histones, CAGE, and, thanks to its 1 Mb window, the distal &lt;em&gt;SORT1&lt;/em&gt; promoter. This multi-model convergence is exactly the kind of cross-validation that is typically expensive and time-consuming to set up; Chorus makes it conversational.&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://genomicsxai.github.io/blogs/2026-010/fig_sort1_comparison.png" class="image-link" data-pswp-width="2400" data-pswp-height="1660"&gt;
		&lt;img src="https://genomicsxai.github.io/blogs/2026-010/fig_sort1_comparison.png" width="2400" height="1660"loading="lazy"
			alt="Multi-oracle readout for rs12740374 next to the 2010 experimental ground truth."
			title="Figure 3. The per-layer multi-oracle readout for rs12740374, placed next to the experimental ground truth from Musunuru et al. (2010). The models recover the direction and the mechanism at every layer; the one place they fall short is magnitude." data-title-escaped="Figure 3. The per-layer multi-oracle readout for rs12740374, placed next to the experimental ground truth from Musunuru et al. (2010). The models recover the direction and the mechanism at every layer; the one place they fall short is magnitude." class="gallery-image" data-flex-grow="144" data-flex-basis="346px"&gt;
		&lt;/a&gt;&lt;/figure&gt;&lt;figure&gt;&lt;a href="https://genomicsxai.github.io/blogs/2026-010/fig_sort1_browser.png" class="image-link" data-pswp-width="3200" data-pswp-height="1394"&gt;
		&lt;img src="https://genomicsxai.github.io/blogs/2026-010/fig_sort1_browser.png" width="3200" height="1394"loading="lazy"
			alt="Every oracle’s signal on a single genome-browser axis across the SORT1 locus."
			title="Figure 4. Every oracle&amp;#39;s signal on one normalised genome-browser axis across the SORT1 locus (chr1:109.15–109.45 Mb): ChromBPNet DNase, LegNet MPRA, and AlphaGenome H3K27ac / CAGE / CEBPA / DNase, with the G&amp;gt;T variant marked (red). After per-track quantile normalisation the tracks are directly comparable; the signal concentrates at the variant and the CELSR2/PSRC1 enhancer, while SORT1 (~100 kb away) is reached only by AlphaGenome&amp;#39;s long window." data-title-escaped="Figure 4. Every oracle&amp;amp;#39;s signal on one normalised genome-browser axis across the SORT1 locus (chr1:109.15–109.45 Mb): ChromBPNet DNase, LegNet MPRA, and AlphaGenome H3K27ac / CAGE / CEBPA / DNase, with the G&amp;amp;gt;T variant marked (red). After per-track quantile normalisation the tracks are directly comparable; the signal concentrates at the variant and the CELSR2/PSRC1 enhancer, while SORT1 (~100 kb away) is reached only by AlphaGenome&amp;amp;#39;s long window." class="gallery-image" data-flex-grow="229" data-flex-basis="550px"&gt;
		&lt;/a&gt;&lt;/figure&gt;&lt;h3 id="predictions-next-to-ground-truth"&gt;Predictions next to ground truth
&lt;/h3&gt;&lt;p&gt;Figure 3 places prediction and ground truth side by side: what Chorus predicted in silico against what the original study measured at the bench. Read top to bottom, the agreement is striking. Without any prior assumptions, the oracles recover the cell type, the transcription factor, the chromatin and histone changes, the reporter direction, and the target gene, all of which originally took dedicated assays to establish.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Reproducibility note.&lt;/strong&gt; ChromBPNet&amp;rsquo;s accessibility number is scored on its native 2,114 bp window: the article reports &lt;strong&gt;+1.24&lt;/strong&gt;, and a fresh re-run on current chorus gives &lt;strong&gt;+1.37&lt;/strong&gt; (~10% relative drift, within tolerance). We expect this range of variation from floating-point arithmetic differences across GPU/CPU runs, and numerical precision in window positioning. The direction and approximate magnitude are stable. On chorus &lt;code&gt;main&lt;/code&gt; the conversational path does this automatically — just ask for the variant, no manual window needed. The underlying commit/PR detail lives in the linked reproduction report.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;The honest caveat is the magnitude of the &lt;em&gt;SORT1&lt;/em&gt; effect itself. The models get its &lt;strong&gt;direction&lt;/strong&gt; right at every layer, but &lt;strong&gt;underestimate the size&lt;/strong&gt; badly: a small predicted increase, well under 2-fold, against the more than 12-fold higher SORT1 mRNA expression observed in human liver samples (Musunuru et al., 2010, Figure 1d). That 12-fold increase comes from qPCR measurement of endogenous SORT1 expression in primary human liver tissue, which is the kind of quantitative expression difference the long-range expression models aim to predict. Here, the oracle captured the direction and the regulatory mechanism, but the predicted effect falls far short of the measured biological magnitude, and this gap is exactly the kind of thing you would still take to a reporter assay.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="variant-prioritisation-a-worked-example"&gt;Variant prioritisation: a worked example
&lt;/h2&gt;&lt;p&gt;Genome-wide association studies (GWAS) often identify a region of the genome rather than a single causal mutation, because nearby variants are inherited together through &lt;strong&gt;linkage disequilibrium (LD)&lt;/strong&gt;. Statistical fine-mapping assigns probabilities to those correlated variants, producing a &lt;strong&gt;credible set&lt;/strong&gt;: a small group of candidates that together are likely to contain the true causal variant. Functional prediction can then help rank the variants within that set according to which are most likely to alter gene regulation.&lt;/p&gt;
&lt;p&gt;This is exactly the problem addressed in our second worked example. Given a GWAS hit sitting in tight linkage with many neighbours, which variant is actually causal?&lt;/p&gt;
&lt;p&gt;A useful anchor here is a recent preprint, &lt;a class="link" href="https://www.biorxiv.org/content/10.1101/2025.07.09.663936v1" target="_blank" rel="noopener"
 &gt;Borzoi-informed fine mapping&lt;/a&gt; (the &amp;ldquo;Sniff&amp;rdquo; framework), which feeds Borzoi variant-effect predictions into Bayesian fine-mapping with PolyFun and SuSiE. For a sub-significant FEV1/FVC ratio association, Sniff resolves the locus — which neither SuSiE nor PolyFun-Baseline could resolve — to a single variant, &lt;strong&gt;rs9504151&lt;/strong&gt; (posterior inclusion probability 0.51), and nominates &lt;strong&gt;CDYL&lt;/strong&gt; as the likely target gene. Reading Borzoi&amp;rsquo;s attributions, the authors find that the variant disrupts a putative &lt;strong&gt;ATF4&lt;/strong&gt; binding motif, with decreased predicted chromatin accessibility and H3K27ac, and the effect localised to &lt;strong&gt;lung fibroblasts&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We used this locus to ask a different question: driving several oracles by conversation, would Chorus land on the same variant and the same factor? What follows is the team&amp;rsquo;s own re-analysis with Chorus, reported as a demonstration of the prioritisation workflow, not as a result taken from the preprint.&lt;/p&gt;
&lt;h3 id="step-1-initial-scoring-with-alphagenome"&gt;Step 1, initial scoring with AlphaGenome
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; Fine-map the rs9504151 credible set with AlphaGenome. Which variant ranks first?&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;rs9504151 sits in a tightly correlated LD block: a Chorus LDlink query (r² ≥ 0.8, 1000G CEU) returned 54 SNV proxies, many of them are in near-perfect LD (r² ≈ 1.0) with the lead, so LD alone cannot distinguish the causal candidate. For the analysis below, Chorus scored the full 56-variant credible set — the lead variant, all linked SNVs, and the few associated indels not counted among the SNVs. This is exactly the kind of locus the Sniff framework is designed to resolve.&lt;/p&gt;
&lt;p&gt;We asked Chorus to score this credible set with AlphaGenome. In our run it ranked rs9504151 at the top, predicting that it sits in an active cis-regulatory element in lung fibroblasts whose accessibility and active histone marks drop on the alternate allele. Its RNA tracks predicted no significant expression change at the locus. On that basis Chorus flagged the variant for functional follow-up.&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://genomicsxai.github.io/blogs/2026-010/fig_rs9504151_finemap.png" class="image-link" data-pswp-width="1514" data-pswp-height="687"&gt;
		&lt;img src="https://genomicsxai.github.io/blogs/2026-010/fig_rs9504151_finemap.png" width="1514" height="687"loading="lazy"
			alt="AlphaGenome fine-mapping of the rs9504151 credible set."
			title="Figure 5. AlphaGenome fine-maps the 56-variant credible set around rs9504151. rs9504151 ranks #1 by composite functional score; the high-LD neighbour rs62384944 (r²≈0.93) — which raw LD cannot separate from the lead — is demoted to rank 4. Functional prediction resolves what LD alone cannot." data-title-escaped="Figure 5. AlphaGenome fine-maps the 56-variant credible set around rs9504151. rs9504151 ranks #1 by composite functional score; the high-LD neighbour rs62384944 (r²≈0.93) — which raw LD cannot separate from the lead — is demoted to rank 4. Functional prediction resolves what LD alone cannot." class="gallery-image" data-flex-grow="220" data-flex-basis="528px"&gt;
		&lt;/a&gt;&lt;/figure&gt;&lt;h3 id="step-2-cross-checking-with-other-oracles-and-an-honest-cell-type-caveat"&gt;Step 2, cross-checking with other oracles, and an honest cell-type caveat
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; Re-score the credible set with a ChromBPNet lung-fibroblast (IMR-90) DNase model and LegNet model trained on HepG2 cell-line. Does rs9504151 stay #1?&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;This is where having several oracles helps, and also where a real limitation surfaces. We re-scored the set of variants with a LegNet MPRA oracle trained on HepG2 cell line and with a ChromBPNet model trained on lung-fibroblast DNase (IMR-90). In our run, rs9504151 stayed at rank 1 with ChromBPNet on the lung-fibroblast model, and it also ranked second under the HepG2-trained LegNet model.&lt;/p&gt;
&lt;p&gt;However, the caveat is important. Only the ChromBPNet model here was matched to the relevant cell type, lung fibroblast. The MPRA reporter panels available to LegNet do not include a lung fibroblast (the available lines are K562, HepG2, and WTC11), so that line of evidence is cell-type-mismatched and should be weighted accordingly. This is particularly relevant for the HepG2-trained LegNet signal, which reflects regulatory activity in a liver cancer context rather than lung fibroblasts.&lt;/p&gt;
&lt;p&gt;You can only assess a variant in the cell types and assays your models actually cover, which is the central limitation of this entire approach, and one the Sniff authors stress as well: if the trait-relevant cell type is missing from a model&amp;rsquo;s training data, the effect can be missed entirely.&lt;/p&gt;
&lt;h3 id="step-3-identifying-the-disrupted-factor"&gt;Step 3, identifying the disrupted factor
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; Which TF motif does rs9504151 disrupt? Scan AlphaGenome&amp;rsquo;s TF tracks and run saturation mutagenesis.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;Which factor is disrupted could not be read straight off lung-fibroblast TF ChIP-seq data, because such tracks are sparse. So we used two indirect routes: scoring rs9504151 against all of AlphaGenome&amp;rsquo;s ChIP-seq TF tracks (ATF4 and CEBPB came out at the top, with binding &lt;em&gt;lost&lt;/em&gt; on the alternate allele), and in-silico saturation mutagenesis (Chorus&amp;rsquo;s &lt;code&gt;score_ism&lt;/code&gt;), which converged on an ATF4-family motif.&lt;/p&gt;
&lt;p&gt;Both routes point to ATF4, matching the Sniff preprint&amp;rsquo;s conclusion. The value is not the single answer but that it held up across models trained on different assays, even while the cell-type coverage stayed imperfect.&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://genomicsxai.github.io/blogs/2026-010/fig_rs9504151_ism.png" class="image-link" data-pswp-width="1853" data-pswp-height="1147"&gt;
		&lt;img src="https://genomicsxai.github.io/blogs/2026-010/fig_rs9504151_ism.png" width="1853" height="1147"loading="lazy"
			alt="In-silico saturation mutagenesis around rs9504151 in three oracles."
			title="Figure 6. In-silico saturation mutagenesis (score_ism) around rs9504151 in three independent oracles — LegNet (HepG2), AlphaGenome (lung fibroblast), and ChromBPNet (IMR-90). Each letter&amp;#39;s height is how much mutating that reference base changes the prediction; all three converge on the same ATF4 motif (TGATGCAA) centred on the variant (dashed line)." data-title-escaped="Figure 6. In-silico saturation mutagenesis (score_ism) around rs9504151 in three independent oracles — LegNet (HepG2), AlphaGenome (lung fibroblast), and ChromBPNet (IMR-90). Each letter&amp;amp;#39;s height is how much mutating that reference base changes the prediction; all three converge on the same ATF4 motif (TGATGCAA) centred on the variant (dashed line)." class="gallery-image" data-flex-grow="161" data-flex-basis="387px"&gt;
		&lt;/a&gt;&lt;/figure&gt;&lt;hr&gt;
&lt;h2 id="why-this-helps"&gt;Why this helps
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No pipeline overhead.&lt;/strong&gt; Dependency isolation and environment management are handled automatically, so researchers can focus on biology, not infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-model cross-validation.&lt;/strong&gt; Running a variant through ChromBPNet, Enformer, AlphaGenome, and LegNet takes a single prompt, making convergent evidence easy to obtain — keeping in mind that convergence means agreement among the oracles that can actually see a given layer, not a blind vote across all of them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessible to non-engineers.&lt;/strong&gt; Clinicians and scientists can query foundation models without writing a line of code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reproducible and auditable.&lt;/strong&gt; Standardised inputs and outputs, plus interval-tracked edits, make analyses easy to share, review, and build on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faster hypothesis generation.&lt;/strong&gt; Mechanistic stories that once required weeks of wet-lab experiments can be sketched computationally in hours, as a starting point for validation rather than a replacement for it.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="limitations-and-open-questions"&gt;Limitations and open questions
&lt;/h2&gt;&lt;p&gt;Chorus is an orchestration and interpretation layer, not an oracle of truth. A few caveats are worth stating plainly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Magnitude is unreliable.&lt;/strong&gt; As the &lt;em&gt;SORT1&lt;/em&gt; example shows, the models recover direction and mechanism far better than effect size. Treat predicted fold changes as ordinal, not quantitative.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You can only test what the models cover.&lt;/strong&gt; A variant can be assessed only in the cell types and assays present in the oracles. In the rs9504151 example the matched evidence came from a lung-fibroblast accessibility model, while the MPRA support came from non-matching lines, so it counts for less. Missing the relevant cell type can mean missing the effect entirely. This is the single most important limitation to keep in mind.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distal targets need long context.&lt;/strong&gt; Linking a variant to a gene requires an oracle whose window spans both. Short-range models such as ChromBPNet and LegNet cannot answer gene-level questions, by design rather than by failure, as the 100 kb gap to &lt;em&gt;SORT1&lt;/em&gt; illustrates. However, even when a model&amp;rsquo;s window does span the target, long-range predictions should be treated with healthy skepticism: current seq2func models still &lt;a class="link" href="https://genomicsxai.github.io/blogs/2026-007/" target="_blank" rel="noopener"
 &gt;struggle with distal perturbations&lt;/a&gt;, and distal eQTLs remain challenging to recover accurately.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single-oracle layers need care.&lt;/strong&gt; When only one model scores a layer, that layer is a hypothesis, not a consensus. Convergence across the oracles that can see it is what earns confidence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LD is not always resolvable in silico.&lt;/strong&gt; Functional prediction narrows a credible set, but very high LD with parallel signatures can still leave residual ambiguity, and MPRA or other assays remain the arbiter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Predictions are a starting point.&lt;/strong&gt; The right mental model is design, then score, then validate, not score then conclude.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Open directions we are interested in: calibrating predicted effect sizes against measured ones, learning when oracles disagree for informative reasons rather than noise, and tightening the agent&amp;rsquo;s track-selection so the conversational path matches an expert&amp;rsquo;s by default.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="try-it-yourself"&gt;Try it yourself
&lt;/h2&gt;&lt;p&gt;Chorus is on GitHub at &lt;a class="link" href="https://github.com/pinellolab/chorus" target="_blank" rel="noopener"
 &gt;github.com/pinellolab/chorus&lt;/a&gt; under an MIT license. Here is the short path from clone to conversation.&lt;/p&gt;
&lt;h3 id="install"&gt;Install
&lt;/h3&gt;&lt;div class="code-block" data-lang="bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. Clone and create the base environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/pinellolab/chorus.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; chorus
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mamba env create -f environment.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mamba activate chorus
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python -m pip install -e .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. Set up the oracles you need, each in its own isolated env&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chorus setup --oracle alphagenome &lt;span class="c1"&gt;# JAX, recommended primary oracle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chorus setup --oracle chrombpnet &lt;span class="c1"&gt;# TensorFlow (includes BPNet)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chorus setup --oracle legnet &lt;span class="c1"&gt;# PyTorch (MPRA)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. Grab a reference genome and check health&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chorus genome download hg38
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chorus health --timeout &lt;span class="m"&gt;300&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The per-oracle commands above install only what you need for these examples. If you would rather grab everything in one shot, a bare &lt;code&gt;chorus setup&lt;/code&gt; (no flags) builds all seven oracle environments, downloads their weights and backgrounds, and pulls hg38 in a single unattended run.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;AlphaGenome weights live in a gated HuggingFace repository. Accept the license at the &lt;code&gt;google/alphagenome-all-folds&lt;/code&gt; model page, then &lt;code&gt;export HF_TOKEN=&amp;quot;hf_...&amp;quot;&lt;/code&gt; before first use. The &lt;code&gt;fine_map_causal_variant&lt;/code&gt; tool additionally needs a free &lt;code&gt;LDLINK_TOKEN&lt;/code&gt; (or you can pass LD variants manually).&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;To drive Chorus conversationally — the way both worked examples above were run — connect the MCP server from any project folder:&lt;/p&gt;
&lt;div class="code-block" data-lang="bash"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sL https://raw.githubusercontent.com/pinellolab/chorus/main/.mcp.json -o .mcp.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude &lt;span class="c1"&gt;# Claude Code reads .mcp.json on startup and launches the server&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The same &lt;code&gt;.mcp.json&lt;/code&gt; block works in Claude Desktop. Three example notebooks in the repo (&lt;code&gt;single_oracle_quickstart&lt;/code&gt;, &lt;code&gt;comprehensive_oracle_showcase&lt;/code&gt;, &lt;code&gt;advanced_multi_oracle_analysis&lt;/code&gt;) cover the Python side from first prediction to cross-oracle comparison.&lt;/p&gt;
&lt;h3 id="a-minimal-variant-effect-call-in-python"&gt;A minimal variant-effect call in Python
&lt;/h3&gt;&lt;p&gt;This scores the &lt;em&gt;local&lt;/em&gt; effect of the SORT1 variant, the chromatin question from Step 1. Note the explicit window equal to ChromBPNet&amp;rsquo;s input size (2,114 bp) centered on the variant — scoring fixed-input oracles on their full input window is what yields the calibrated effect:&lt;/p&gt;
&lt;div class="code-block" data-lang="python"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;chorus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;chorus.utils&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_genome&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;genome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_genome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;hg38&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# auto-downloads if needed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;oracle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chorus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_oracle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;chrombpnet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;use_environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;reference_fasta&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;genome&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;oracle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_pretrained_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;DNASE&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cell_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;HepG2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# rs12740374 (chr1:109274968 G&amp;gt;T): local accessibility effect in liver,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# scored on ChromBPNet&amp;#39;s full 2,114 bp input window centered on the variant.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;variant_effects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;oracle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;predict_variant_effect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;chr1:109273911-109276025&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# variant ± 1057 bp = 2114 bp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;chr1:109274968&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# variant position&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;G&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;T&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;# reference allele first, then alternate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# score the loaded track&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The gene-level question (does &lt;em&gt;SORT1&lt;/em&gt; itself move?) is different: the promoter is about 100 kb away, so it needs a model whose window reaches that far. The cleanest way to ask it is conversationally, letting the agent load AlphaGenome and center its 1 Mb window on the variant.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="references"&gt;References
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Musunuru, K. et al. From noncoding variant to phenotype via SORT1 at the 1p13 cholesterol locus. &lt;em&gt;Nature&lt;/em&gt; &lt;strong&gt;466&lt;/strong&gt;, 714 (2010). &lt;a class="link" href="https://doi.org/10.1038/nature09266" target="_blank" rel="noopener"
 &gt;https://doi.org/10.1038/nature09266&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Avsec, Ž. et al. Effective gene expression prediction from sequence by integrating long-range interactions (Enformer). &lt;em&gt;Nature Methods&lt;/em&gt; &lt;strong&gt;18&lt;/strong&gt; (2021). &lt;a class="link" href="https://www.nature.com/articles/s41592-021-01252-x" target="_blank" rel="noopener"
 &gt;https://www.nature.com/articles/s41592-021-01252-x&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Avsec, Ž. et al. Advancing regulatory variant effect prediction with AlphaGenome. &lt;em&gt;Nature&lt;/em&gt; &lt;strong&gt;649&lt;/strong&gt; (2026). &lt;a class="link" href="https://www.nature.com/articles/s41586-025-10014-0" target="_blank" rel="noopener"
 &gt;https://www.nature.com/articles/s41586-025-10014-0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Linder, J., Srivastava, D., Yuan, H. et al. Predicting RNA-seq coverage from DNA sequence as a unifying model of gene regulation. Nat Genet 57, 949–961 (2025). &lt;a class="link" href="https://doi.org/10.1038/s41588-024-02053-6" target="_blank" rel="noopener"
 &gt;https://doi.org/10.1038/s41588-024-02053-6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ChromBPNet / BPNet: base-resolution models of chromatin accessibility and TF binding. &lt;a class="link" href="https://github.com/kundajelab/chrombpnet" target="_blank" rel="noopener"
 &gt;https://github.com/kundajelab/chrombpnet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chen, K. M. et al. Sei: sequence-based prediction of regulatory effects (2022). &lt;a class="link" href="https://github.com/FunctionLab/sei-framework" target="_blank" rel="noopener"
 &gt;https://github.com/FunctionLab/sei-framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Penzar, D. et al. LegNet: a fully convolutional network for short regulatory sequences (2023). &lt;a class="link" href="https://github.com/autosome-ru/LegNet" target="_blank" rel="noopener"
 &gt;https://github.com/autosome-ru/LegNet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lin, J. et al. EPInformer: scalable and integrative prediction of gene expression from promoter-enhancer sequences with multimodal epigenomic profiles. &lt;em&gt;Nature Communications&lt;/em&gt; &lt;strong&gt;17&lt;/strong&gt;, 3975 (2026). &lt;a class="link" href="https://www.nature.com/articles/s41467-026-70535-8" target="_blank" rel="noopener"
 &gt;https://www.nature.com/articles/s41467-026-70535-8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Karollus, A., Mauermeier, T. &amp;amp; Gagneur, J. Current sequence-based models capture gene expression determinants in promoters but mostly ignore distal enhancers. Genome Biol 24, 56 (2023). &lt;a class="link" href="https://doi.org/10.1186/s13059-023-02899-9" target="_blank" rel="noopener"
 &gt;https://doi.org/10.1186/s13059-023-02899-9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Borzoi-informed fine mapping improves causal variant prioritization in complex trait GWAS (the &amp;ldquo;Sniff&amp;rdquo; framework). &lt;em&gt;bioRxiv&lt;/em&gt; 2025.07.09.663936 (2025). &lt;a class="link" href="https://www.biorxiv.org/content/10.1101/2025.07.09.663936v1" target="_blank" rel="noopener"
 &gt;https://www.biorxiv.org/content/10.1101/2025.07.09.663936v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Model Context Protocol specification. &lt;a class="link" href="https://modelcontextprotocol.io/" target="_blank" rel="noopener"
 &gt;https://modelcontextprotocol.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Murphy, A. &amp;amp; Koo, P. K. &amp;ldquo;Benchmarking seq2func models on distal enhancer effects with CRISPRi screens&amp;rdquo; &lt;em&gt;Genomics × AI Blog&lt;/em&gt;, 25 June 2026. &lt;a class="link" href="https://genomicsxai.github.io/blogs/2026-007/" target="_blank" rel="noopener"
 &gt;https://genomicsxai.github.io/blogs/2026-007/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chorus source code. &lt;a class="link" href="https://github.com/pinellolab/chorus" target="_blank" rel="noopener"
 &gt;https://github.com/pinellolab/chorus&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>