Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Identify tumor neoantigens from somatic mutations using pVACtools for personalized cancer immunotherapy. Predict mutant peptides that bind patient HLA and may elicit T-cell responses. Use when identifying vaccine targets or checkpoint inhibitor response biomarkers from tumor sequencing data.
.claude/skills/bio-immunoinformatics-neoantigen-prediction/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | — | — |
| case-10 | ✗→✓ | ▲ Improved | — | — |
| case-15 | ✗→✓ | ▲ Improved | — | — |
| case-04 | ✗→✓ | ▲ Improved | — | — |
| case-03 | ✓→✓ | = Same ✓ | — | — |
Reference examples tested with: Ensembl VEP 111+, MHCflurry 2.1+, pVACtools 4.1+, pandas 2.2+
Before using code patterns, verify installed versions match. If versions differ:
pip show <package> then help(module.function) to check signatures<tool> --version then <tool> --help to confirm flagsIf code throws ImportError, AttributeError, or TypeError, introspect the installed package and adapt the example to match the actual API rather than retrying.
"Identify neoantigens from my tumor mutations" → Predict mutant peptides from somatic variants that bind patient HLA alleles and may elicit T-cell responses for personalized cancer immunotherapy.
pvacseq run with VEP-annotated VCF and patient HLA types (pVACtools)Goal: Install pVACtools and its IEDB prediction engine dependencies.
Approach: Install via pip (optionally in a dedicated conda environment) and download IEDB tools for binding prediction.
bash# Install pVACtools pip install pvactools # Or use conda for dependencies conda create -n pvactools python=3.8 conda activate pvactools pip install pvactools # Download IEDB tools pvactools download_iedb_tools
Goal: Run the full pVACseq neoantigen prediction pipeline on a VEP-annotated VCF.
Approach: Provide annotated VCF with patient HLA alleles and select binding prediction algorithms; pVACseq generates mutant peptides and predicts MHC binding.
bash# Run pVACseq on annotated VCF pvacseq run \ annotated.vcf \ sample_name \ "HLA-A*02:01,HLA-A*24:02,HLA-B*07:02,HLA-B*44:02" \ MHCflurry MHCnuggetsI \ output_dir \ -e1 8,9,10,11 \ --iedb-install-directory /path/to/iedb # Key parameters: # -e1: Epitope lengths for MHC-I (8-11) # -e2: Epitope lengths for MHC-II (15) # --binding-threshold: IC50 cutoff (default 500) # --percentile-threshold: Alternative cutoff
Goal: Annotate somatic VCF with transcript consequences and amino acid changes required by pVACseq.
Approach: Run Ensembl VEP with Downstream and Wildtype plugins to produce a VCF containing protein-level mutation annotations.
bash# pVACseq requires VEP-annotated VCF # Must include transcript and amino acid changes # Run VEP first vep -i somatic.vcf -o annotated.vcf \ --cache --offline \ --format vcf --vcf \ --plugin Downstream \ --plugin Wildtype \ --terms SO \ --symbol
Goal: Parse pVACseq output and calculate the differential agretopicity index (DAI) for candidate neoantigens.
Approach: Load TSV results, filter by binding threshold, and compute WT/MT binding ratio to identify mutations that create new epitopes.
pythonimport pandas as pd def parse_pvacseq_results(results_file): '''Parse pVACseq output Key columns: - Mutation: Gene and amino acid change - HLA Allele: Patient HLA presenting this peptide - MT Epitope Seq: Mutant peptide sequence - WT Epitope Seq: Wild-type peptide sequence - Median MT Score: Binding affinity (nM) - Median WT Score: WT binding (for agretopicity) - Tumor DNA VAF: Variant allele frequency - Gene Expression: If RNA-seq available ''' df = pd.read_csv(results_file, sep='\t') # Filter by binding threshold strong_binders = df[df['Median MT Score'] < 500] return strong_binders def calculate_agretopicity(df): '''Calculate agretopicity (DAI) score Agretopicity = ratio of WT to MT binding Higher agretopicity means MT binds better than WT indicating mutation creates new epitope DAI (Differential Agretopicity Index): - >1: Mutant binds better (favorable) - ~1: Similar binding (less likely immunogenic) - <1: WT binds better (unfavorable) ''' df = df.copy() df['agretopicity'] = df['Median WT Score'] / df['Median MT Score'] # High agretopicity = mutation improves binding df['dai_favorable'] = df['agretopicity'] > 1 return df
Goal: Rank neoantigen candidates for vaccine design by combining binding, clonality, and expression evidence.
Approach: Apply sequential filters (binding affinity, VAF, expression) and compute a composite priority score weighting inverse IC50, VAF, and agretopicity.
pythondef prioritize_neoantigens(df, vaf_threshold=0.1, expression_threshold=1.0): '''Prioritize neoantigens for vaccine design Criteria for good neoantigen candidates: 1. Strong MHC binding (IC50 < 500nM, ideally < 50nM) 2. High agretopicity (MT binds better than WT) 3. High tumor VAF (clonal, present in most tumor cells) 4. Expressed in tumor (if RNA-seq available) 5. Not in tolerogenic region (self-similarity check) Typical pipeline returns 10-50 candidates per patient ''' candidates = df.copy() # Filter by binding candidates = candidates[candidates['Median MT Score'] < 500] # Filter by VAF (clonal mutations preferred) if 'Tumor DNA VAF' in candidates.columns: candidates = candidates[candidates['Tumor DNA VAF'] >= vaf_threshold] # Filter by expression if 'Gene Expression' in candidates.columns: candidates = candidates[candidates['Gene Expression'] >= expression_threshold] # Calculate priority score # Lower binding affinity = better # Higher VAF = better # Higher agretopicity = better candidates['priority_score'] = ( (1 / candidates['Median MT Score']) * candidates.get('Tumor DNA VAF', 1) * candidates.get('agretopicity', 1) ) return candidates.sort_values('priority_score', ascending=False)
Goal: Predict neoantigens without pVACtools by directly extracting mutant peptides from an annotated VCF and predicting MHC binding.
Approach: Parse VEP annotations from VCF via cyvcf2, generate mutant peptides around each coding mutation, and predict binding with MHCflurry.
pythondef manual_neoantigen_pipeline(vcf_file, hla_alleles, reference_fasta): '''Simplified neoantigen prediction without pVACtools Steps: 1. Extract coding mutations from VCF 2. Generate mutant protein sequences 3. Extract peptides around mutation 4. Predict MHC binding ''' from cyvcf2 import VCF from mhcflurry import Class1PresentationPredictor vcf = VCF(vcf_file) predictor = Class1PresentationPredictor.load() neoantigens = [] for variant in vcf: # Get amino acid change from VEP annotation if 'CSQ' not in variant.INFO: continue # Parse consequence and extract mutant peptides # ... (implementation depends on annotation format) # For each mutant peptide, predict binding for peptide in mutant_peptides: for allele in hla_alleles: pred = predictor.predict(peptides=[peptide], alleles=[allele]) if pred['mhcflurry_affinity'].values[0] < 500: neoantigens.append({ 'variant': f'{variant.CHROM}:{variant.POS}', 'peptide': peptide, 'allele': allele, 'affinity': pred['mhcflurry_affinity'].values[0] }) return neoantigens
Goal: Assess neoantigen quality across multiple dimensions and produce a composite confidence score.
Approach: Normalize binding affinity, agretopicity, clonality, and expression to 0-1 scales and combine with domain-informed weights.
pythondef assess_neoantigen_quality(neoantigen): '''Assess multiple quality metrics for neoantigen Returns composite quality score considering: - Binding affinity - Agretopicity - Clonality (VAF) - Expression - Self-similarity ''' scores = {} # Binding (0-1, lower IC50 = higher score) ic50 = neoantigen.get('Median MT Score', 500) scores['binding'] = 1 - min(ic50 / 5000, 1) # Agretopicity (0-1) dai = neoantigen.get('agretopicity', 1) scores['agretopicity'] = min(dai / 10, 1) # Clonality (0-1) vaf = neoantigen.get('Tumor DNA VAF', 0.5) scores['clonality'] = vaf # Expression (0-1, log scale) import math expr = neoantigen.get('Gene Expression', 1) scores['expression'] = min(math.log10(expr + 1) / 3, 1) # Composite score weights = {'binding': 0.3, 'agretopicity': 0.3, 'clonality': 0.2, 'expression': 0.2} composite = sum(scores[k] * weights[k] for k in weights) return composite, scores
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +18 percentage points is the difference between those two pass rates over the 21 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.