Variant Analysis using AlphaGenome
Prerequisites
uv: Read the uv skill and follow its Setup instructions to ensure
uv is installed and on PATH.
User Notification: If LICENSE_NOTIFICATION.txt does not already exist in
this skill directory then (1) prominently notify the user to check the terms
at https://deepmind.google.com/science/alphagenome/, then (2) create the
file recording the notification text and timestamp.
.env file: Make sure the .env file exists in your home directory.
Create one if it does not exist.
ALPHAGENOME_API_KEY: This skill requires an API key to function.
You must ask the user for an API key if this skill looks relevant to their
request and you do not have one in .env. The user can sign up at
https://deepmind.google.com/science/alphagenome/. Do NOT ask the user to
paste their key into the chat (this would leak the key into the agent's
context). Instead, explain that a key is necessary to use AlphaGenome and
give the user this command substituting ENV_FILE with the resolved
literal path to the .env file:
printf "Enter AlphaGenome API key (typing hidden): " && read -s key && echo && echo "ALPHAGENOME_API_KEY=$key" >> "ENV_FILE" && echo "Saved."
The scripts load credentials automatically via dotenv. NEVER read,
print, or inspect the .env file or its variables (e.g. no cat, grep,
echo, printenv, or os.environ.get on keys). Credentials must stay out
of the agent's context.
When running in sandbox, dotenv.load_dotenv() will be a no-op, and instead
the sandbox will read credentials and inject them directly.
Core Rules
- NEVER run
python3 or python3 -c directly. The system Python does not
necessarily have pandas, numpy, and other key dependencies. ALWAYS use uv run to run ALL Python code — including scripts, ad-hoc analysis files, and
one-liners. Do not attempt to pip install or create new venvs — uv
manages an isolated environment automatically.
- Offline Only: NEVER use external APIs (e.g., MyGene.info, Ensembl REST)
for gene/transcript lookup. Use
lookup_gene_info.py with the local GTF. If
it fails, fix the environment/paths, do not switch to external APIs.
- API Key is required:
ALPHAGENOME_API_KEY must be set before running
any script (in sandbox, credentials are injected automatically).
- Notification: If this skill is used, ensure this is mentioned in the
output.
- Report Format: Always use the templates in
docs/report-templates.md
for generating analysis reports, and ensure to include the table of top hits
from the discovery scan.
Environment Setup & Troubleshooting
Python Environment
All scripts must be executed using uv run, which manages an isolated virtual
environment with the correct dependencies via uv.
uv run <script_name> [args...]
For ad-hoc scripts (e.g., inline analysis code saved to a temp file), pass the
full path instead of a short name:
uv run --project $SKILL_DIR /tmp/my_analysis.py --arg1 val1
[!NOTE] The first invocation resolves and installs dependencies (10s).
Subsequent runs use the cached environment and start instantly. The cache
lives in `/.cache/uv/`.
Common Issues
- Column Names:
tidy_scores and metadata often use gene_name (not
gene_symbol) and output_type (not modality). Always inspect
df.columns before filtering.
- Large Genes: Genes > 500kb (e.g.,
USH2A) break the whole_gene view.
Use --view detail or manual regional windows instead.
- Sashimi Strand Error:
plot_components.Sashimi does NOT accept a
strand argument directly. Filter input tracks instead.
- KeyError: 'ontology_curie': Not all tracks have
ontology_curie. Check
track.metadata.columns before filtering.
- Python Path: If
exec: "python": executable file not found occurs,
ensure you are using uv run instead of bare python/python3.
- NotImplementedError (pandas): "iLocation based boolean indexing on an
integer type is not available". This occurs when using boolean masks with
.iloc on integer-indexed DataFrames in newer pandas versions. Fix:
Convert boolean masks to integer indices using np.flatnonzero(mask).
- GTF Feather Case Sensitivity: The AlphaGenome GTF Feather file uses
Capitalized column names (
Feature, Start, End, Strand) unlike
standard GTF files. Always check df.columns if getting KeyErrors.
score_variant ontology filtering: score_variant does NOT accept
ontology_terms as an argument. You must filter the returned AnnData
objects manually by inspecting adata.var columns. In contrast,
predict_variant DOES accept ontology_terms directly.
- Sashimi Zoom Logic: To ensure "skipping" arcs are visible, expand the
zoom to include the flanking exons rather than relying on junction
overlap alone.
- Junction Scores: Raw
Junction objects from prediction may be simple
Intervals. Use junction_data.get_junctions_to_plot(predictions=..., name=...) to retrieve objects with the .k (abundance/score) attribute.
uv Not Found: If exec: uv: not found, follow the installation
instructions in Prerequisites.
- Registry Authentication Error (401): If
uv fails with 401 Unauthorized
for a private registry, set UV_INDEX_URL=https://pypi.org/simple before
running the script.
References
- alphagenome-api.md — API reference and code
patterns
- interpretation-guide.md — Interpretation
guide, score magnitude rules, ISM, and checklist.
- report-templates.md — Full report templates
scripts/visualize_variant_effects.py
— Single-variant visualization template (Ref/Alt comparisons, Splicing).
- Splicing Zoom Strategy: Uses a Hybrid Approach for optimal
visibility:
- Base Interval: Variant +/- 1 downstream and upstream exon
(Structural Context).
- Junction Expansion: Expands to include the full span of any
significant splicing junction (e.g., exon skipping events that
span multiple exons).
- Anchor Enforcement: Ensures the exons anchoring these long
junctions are fully visible. Lesson: Simple fixed windows (e.g.,
2kb) or nearest-exon logic often fail for skipping events. Always
use the observed junction data to drive zoom levels.
examples/splicing/ — Splicing analysis examples
examples/model_limitation_RNU4ATAC/
— ncRNA structure limitation case study
examples/polyadenylation_HBA2/ — 3'
UTR / Polyadenylation case study
examples/regulatory/ — Regulatory variant
examples
examples/negative_result_GATA4/ —
Negative results (mathematical artefact)
examples/negative_result_TGFB3/ —
Negative results (proxies)
scripts/lookup_gene_info.py — Gene &
transcript lookup
scripts/resolve_ontology_terms.py —
Ontology term resolution (UBERON/CL IDs)
Code Patterns
Broad Discovery Scan
Use score_variant across differential scorers only to discover unexpected
tissue effects.
from alphagenome.models import dna_client
from alphagenome.models import variant_scorers
from alphagenome.data import genome
import os
import pandas as pd
# Setup API Key and Client
dna_model = dna_client.create(api_key=os.environ.get('ALPHAGENOME_API_KEY'),
address='dns:///gdmscience.googleapis.com:443')
# Define Variant (example)
variant_str = "chr2:1234:A>C"
chrom, pos_str, ref_alt = variant_str.split(':')
ref, alt = ref_alt.split('>')
pos = int(pos_str)
# Use supported sequence length (e.g., 2**20 for optimal performance)
SEQ_LENGTH = 2**20
interval = genome.Interval(chrom, pos - SEQ_LENGTH // 2, pos + SEQ_LENGTH // 2)
variant = genome.Variant(chrom, pos, ref, alt)
scorers = [
variant_scorers.RECOMMENDED_VARIANT_SCORERS[m]
for m in variant_scorers.RECOMMENDED_VARIANT_SCORERS
if "ACTIVE" not in m and "CAGE" not in m and "PROCAP" not in m
]
print(f"Scoring variant {variant_str}...")
scores_list = dna_model.score_variant(interval=interval, variant=variant, variant_scorers=scorers)
# Process and Display Results
all_dfs = []
for score_adata in scores_list:
df = variant_scorers.tidy_scores([score_adata], match_gene_strand=True)
if df is not None:
all_dfs.append(df)
if all_dfs:
df = pd.concat(all_dfs)
significant = df[df['quantile_score'].abs() > 0.995]
ranked = significant.sort_values('raw_score', key=abs, ascending=False)
print("Top Significant Hits:")
print(ranked[['biosample_name', 'gene_name', 'output_type', 'quantile_score', 'raw_score']])
Extended Search for Disease-Relevant Tissues
# Define keywords based on disease context
disease_keywords = ["liver", "hepatocyte"]
# Filter for any match
mask = df['biosample_name'].str.contains('|'.join(disease_keywords), case=False, na=False)
relevant_hits = df[mask].sort_values('raw_score', key=abs, ascending=False)
print(f"\n--- Extended Analysis (Keywords: {disease_keywords}) ---")
print(relevant_hits.head(20)[['biosample_name', 'output_type', 'raw_score', 'quantile_score']])
Workflow Checklist
Variant Analysis Progress:
- [ ] Step 0: Review Golden Examples (MANDATORY)
- [ ] Step 1: Create Output Folder and Setup
- [ ] Step 2: Parse User Query & Research
- [ ] Step 3: Resolve Tissues & Modalities
- [ ] Step 4: Visualize & Save Plots
- [ ] Step 5: Analyze Predictions (view plots, no code). MANDATORY: Read [interpretation-guide.md](docs/interpretation-guide.md) before interpreting results.
- [ ] Step 6: Write Report, save it as `report.md` (MANDATORY)
- [ ] Step 7: Self-Critique (view `report.md` to verify links & claims)
- [ ] Step 8: Make artifact out of `report.md`
Multi-Variant Workflow
If multiple variants are specified, spawn sub-agents to run each variant
analysis and then synthesize each report.md into a single report.
Script Reference
| Script |
Purpose |
lookup_gene_info |
Comprehensive gene and transcript lookup using |
| : : GTF data : |
|
resolve_ontology_terms |
Biological terms → UBERON/CL/EFO IDs |
visualize_variant_effects |
REF/ALT visualization (expression, regulatory, |
| : : splicing) : |
|
analyze_ism |
In-Silico Mutagenesis SeqLogo generation |
interpret_splicing |
Quantitative splicing analysis (delta scores, |
| : : junctions) : |
|
visualize_genome_tracks |
Genomic track visualization for a region |
1---2name: alphagenome-single-variant-analysis3description: Analyzes genetic variant effects on gene expression (RNA-seq), chromatin accessibility (DNASE), histone marks (ChIP), and transcription factors using the AlphaGenome API. Use when the user asks about non-coding variant effects, pathogenicity, clinical significance, disease associations, functional effects, gene expression changes, splicing disruption, or regulatory effects in promoters and enhancers. Also use for resolving biological terms to tissue/cell-type ontologies (UBERON/CL) or analyzing variants in chr:pos:ref>alt format.4---56# Variant Analysis using AlphaGenome78## Prerequisites9101. **`uv`**: Read the `uv` skill and follow its Setup instructions to ensure11 `uv` is installed and on PATH.122. **User Notification**: If LICENSE_NOTIFICATION.txt does not already exist in13 this skill directory then (1) prominently notify the user to check the terms14 at https://deepmind.google.com/science/alphagenome/, then (2) create the15 file recording the notification text and timestamp.163. **`.env` file**: Make sure the `.env` file exists in your home directory.17 Create one if it does not exist.184. **`ALPHAGENOME_API_KEY`**: This skill requires an API key to function.19 You must ask the user for an API key if this skill looks relevant to their20 request and you do not have one in .env. The user can sign up at21 https://deepmind.google.com/science/alphagenome/. Do NOT ask the user to22 paste their key into the chat (this would leak the key into the agent's23 context). Instead, explain that a key is necessary to use AlphaGenome and24 give the user this command **substituting `ENV_FILE` with the resolved25 literal path to the `.env` file**:2627 ```bash28 printf "Enter AlphaGenome API key (typing hidden): " && read -s key && echo && echo "ALPHAGENOME_API_KEY=$key" >> "ENV_FILE" && echo "Saved."29 ```3031 The scripts load credentials automatically via `dotenv`. **NEVER** read,32 print, or inspect the `.env` file or its variables (e.g. no `cat`, `grep`,33 `echo`, `printenv`, or `os.environ.get` on keys). Credentials must stay out34 of the agent's context.3536 When running in sandbox, `dotenv.load_dotenv()` will be a no-op, and instead37 the sandbox will read credentials and inject them directly.3839## Core Rules4041- **NEVER run `python3` or `python3 -c` directly.** The system Python does not42 necessarily have pandas, numpy, and other key dependencies. ALWAYS use `uv43 run` to run ALL Python code — including scripts, ad-hoc analysis files, and44 one-liners. Do not attempt to `pip install` or create new venvs — `uv`45 manages an isolated environment automatically.46- **Offline Only**: NEVER use external APIs (e.g., MyGene.info, Ensembl REST)47 for gene/transcript lookup. Use `lookup_gene_info.py` with the local GTF. If48 it fails, fix the environment/paths, do not switch to external APIs.49- **API Key is required**: `ALPHAGENOME_API_KEY` must be set before running50 any script (in sandbox, credentials are injected automatically).51- **Notification**: If this skill is used, ensure this is mentioned in the52 output.53- **Report Format**: Always use the templates in `docs/report-templates.md`54 for generating analysis reports, and ensure to include the table of top hits55 from the discovery scan.5657## Environment Setup & Troubleshooting5859### Python Environment6061All scripts must be executed using `uv run`, which manages an isolated virtual62environment with the correct dependencies via `uv`.6364```bash65uv run <script_name> [args...]66```6768For ad-hoc scripts (e.g., inline analysis code saved to a temp file), pass the69full path instead of a short name:7071```bash72uv run --project $SKILL_DIR /tmp/my_analysis.py --arg1 val173```7475> [!NOTE] The first invocation resolves and installs dependencies (~10s).76> Subsequent runs use the cached environment and start instantly. The cache77> lives in `~/.cache/uv/`.7879### Common Issues8081- **Column Names**: `tidy_scores` and metadata often use `gene_name` (not82 `gene_symbol`) and `output_type` (not `modality`). Always inspect83 `df.columns` before filtering.84- **Large Genes**: Genes > 500kb (e.g., `USH2A`) break the `whole_gene` view.85 Use `--view detail` or manual regional windows instead.86- **Sashimi Strand Error**: `plot_components.Sashimi` does NOT accept a87 `strand` argument directly. Filter input tracks instead.88- **KeyError: 'ontology_curie'**: Not all tracks have `ontology_curie`. Check89 `track.metadata.columns` before filtering.90- **Python Path**: If `exec: "python": executable file not found` occurs,91 ensure you are using `uv run` instead of bare `python`/`python3`.92- **NotImplementedError (pandas)**: "iLocation based boolean indexing on an93 integer type is not available". This occurs when using boolean masks with94 `.iloc` on integer-indexed DataFrames in newer pandas versions. **Fix**:95 Convert boolean masks to integer indices using `np.flatnonzero(mask)`.96- **GTF Feather Case Sensitivity**: The AlphaGenome GTF Feather file uses97 **Capitalized** column names (`Feature`, `Start`, `End`, `Strand`) unlike98 standard GTF files. Always check `df.columns` if getting KeyErrors.99- **`score_variant` ontology filtering**: `score_variant` does NOT accept100 `ontology_terms` as an argument. You must filter the returned AnnData101 objects manually by inspecting `adata.var` columns. In contrast,102 `predict_variant` DOES accept `ontology_terms` directly.103- **Sashimi Zoom Logic**: To ensure "skipping" arcs are visible, expand the104 zoom to include the **flanking exons** rather than relying on junction105 overlap alone.106- **Junction Scores**: Raw `Junction` objects from `prediction` may be simple107 Intervals. Use `junction_data.get_junctions_to_plot(predictions=...,108 name=...)` to retrieve objects with the `.k` (abundance/score) attribute.109- **`uv` Not Found**: If `exec: uv: not found`, follow the installation110 instructions in [Prerequisites](#prerequisites).111- **Registry Authentication Error (401)**: If `uv` fails with 401 Unauthorized112 for a private registry, set `UV_INDEX_URL=https://pypi.org/simple` before113 running the script.114115## References116117- [alphagenome-api.md](docs/alphagenome-api.md) — API reference and code118 patterns119- [interpretation-guide.md](docs/interpretation-guide.md) — Interpretation120 guide, score magnitude rules, ISM, and checklist.121- [report-templates.md](docs/report-templates.md) — Full report templates122- [`scripts/visualize_variant_effects.py`](scripts/visualize_variant_effects.py)123 — Single-variant visualization template (Ref/Alt comparisons, Splicing).124 - **Splicing Zoom Strategy**: Uses a **Hybrid Approach** for optimal125 visibility:126 1. **Base Interval**: Variant +/- 1 downstream and upstream exon127 (Structural Context).128 2. **Junction Expansion**: Expands to include the full span of any129 **significant splicing junction** (e.g., exon skipping events that130 span multiple exons).131 3. **Anchor Enforcement**: Ensures the exons *anchoring* these long132 junctions are fully visible. *Lesson*: Simple fixed windows (e.g.,133 2kb) or nearest-exon logic often fail for skipping events. Always134 use the *observed junction data* to drive zoom levels.135- [`examples/splicing/`](docs/examples/splicing/) — Splicing analysis examples136- [`examples/model_limitation_RNU4ATAC/`](docs/examples/model_limitation_RNU4ATAC/)137 — ncRNA structure limitation case study138- [`examples/polyadenylation_HBA2/`](docs/examples/polyadenylation_HBA2/) — 3'139 UTR / Polyadenylation case study140- [`examples/regulatory/`](docs/examples/regulatory/) — Regulatory variant141 examples142- [`examples/negative_result_GATA4/`](docs/examples/negative_result_GATA4/) —143 Negative results (mathematical artefact)144- [`examples/negative_result_TGFB3/`](docs/examples/negative_result_TGFB3/) —145 Negative results (proxies)146- [`scripts/lookup_gene_info.py`](scripts/lookup_gene_info.py) — Gene &147 transcript lookup148- [`scripts/resolve_ontology_terms.py`](scripts/resolve_ontology_terms.py) —149 Ontology term resolution (UBERON/CL IDs)150151--------------------------------------------------------------------------------152153## Code Patterns154155### Broad Discovery Scan156157Use `score_variant` across **differential scorers only** to discover unexpected158tissue effects.159160```python161from alphagenome.models import dna_client162from alphagenome.models import variant_scorers163from alphagenome.data import genome164import os165import pandas as pd166167# Setup API Key and Client168dna_model = dna_client.create(api_key=os.environ.get('ALPHAGENOME_API_KEY'),169 address='dns:///gdmscience.googleapis.com:443')170171# Define Variant (example)172variant_str = "chr2:1234:A>C"173chrom, pos_str, ref_alt = variant_str.split(':')174ref, alt = ref_alt.split('>')175pos = int(pos_str)176177# Use supported sequence length (e.g., 2**20 for optimal performance)178SEQ_LENGTH = 2**20179interval = genome.Interval(chrom, pos - SEQ_LENGTH // 2, pos + SEQ_LENGTH // 2)180variant = genome.Variant(chrom, pos, ref, alt)181182scorers = [183 variant_scorers.RECOMMENDED_VARIANT_SCORERS[m]184 for m in variant_scorers.RECOMMENDED_VARIANT_SCORERS185 if "ACTIVE" not in m and "CAGE" not in m and "PROCAP" not in m186]187188print(f"Scoring variant {variant_str}...")189scores_list = dna_model.score_variant(interval=interval, variant=variant, variant_scorers=scorers)190191# Process and Display Results192all_dfs = []193for score_adata in scores_list:194 df = variant_scorers.tidy_scores([score_adata], match_gene_strand=True)195 if df is not None:196 all_dfs.append(df)197198if all_dfs:199 df = pd.concat(all_dfs)200 significant = df[df['quantile_score'].abs() > 0.995]201 ranked = significant.sort_values('raw_score', key=abs, ascending=False)202 print("Top Significant Hits:")203 print(ranked[['biosample_name', 'gene_name', 'output_type', 'quantile_score', 'raw_score']])204```205206### Extended Search for Disease-Relevant Tissues207208```python209# Define keywords based on disease context210disease_keywords = ["liver", "hepatocyte"]211212# Filter for any match213mask = df['biosample_name'].str.contains('|'.join(disease_keywords), case=False, na=False)214215relevant_hits = df[mask].sort_values('raw_score', key=abs, ascending=False)216print(f"\n--- Extended Analysis (Keywords: {disease_keywords}) ---")217print(relevant_hits.head(20)[['biosample_name', 'output_type', 'raw_score', 'quantile_score']])218```219220## Workflow Checklist221222```223Variant Analysis Progress:224- [ ] Step 0: Review Golden Examples (MANDATORY)225- [ ] Step 1: Create Output Folder and Setup226- [ ] Step 2: Parse User Query & Research227- [ ] Step 3: Resolve Tissues & Modalities228- [ ] Step 4: Visualize & Save Plots229- [ ] Step 5: Analyze Predictions (view plots, no code). MANDATORY: Read [interpretation-guide.md](docs/interpretation-guide.md) before interpreting results.230- [ ] Step 6: Write Report, save it as `report.md` (MANDATORY)231- [ ] Step 7: Self-Critique (view `report.md` to verify links & claims)232- [ ] Step 8: Make artifact out of `report.md`233```234235--------------------------------------------------------------------------------236237## Multi-Variant Workflow238239If multiple variants are specified, spawn sub-agents to run each variant240analysis and then synthesize each `report.md` into a single report.241242### Script Reference243244| Script | Purpose |245| --------------------------- | ---------------------------------------------- |246| `lookup_gene_info` | Comprehensive gene and transcript lookup using |247: : GTF data :248| `resolve_ontology_terms` | Biological terms → UBERON/CL/EFO IDs |249| `visualize_variant_effects` | REF/ALT visualization (expression, regulatory, |250: : splicing) :251| `analyze_ism` | In-Silico Mutagenesis SeqLogo generation |252| `interpret_splicing` | Quantitative splicing analysis (delta scores, |253: : junctions) :254| `visualize_genome_tracks` | Genomic track visualization for a region |