Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Predict B-cell and T-cell epitopes using BepiPred, IEDB tools, and structure-based methods for vaccine and antibody design. Identify immunogenic regions in antigens. Use when designing vaccines, mapping antibody binding sites, or predicting immunogenic peptides.
.claude/skills/bio-immunoinformatics-epitope-prediction/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | — | — |
| case-19 | ✗→✓ | ▲ Improved | — | — |
| case-07 | ✗→✓ | ▲ Improved | — | — |
| case-12 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
Reference examples tested with: pandas 2.2+
Before using code patterns, verify installed versions match. If versions differ:
pip show <package> then help(module.function) to check signaturesIf code throws ImportError, AttributeError, or TypeError, introspect the installed package and adapt the example to match the actual API rather than retrying.
"Predict B-cell and T-cell epitopes in my protein" → Identify immunogenic regions in antigens for vaccine design using sequence-based and structure-based prediction tools.
mhcflurry for T-cell epitope MHC binding predictionGoal: Predict linear B-cell epitopes from protein sequence using IEDB prediction tools.
Approach: Submit sequence to IEDB B-cell prediction API with selectable method (BepiPred-2.0 recommended) and parse tab-separated results.
pythonimport requests def predict_bcell_epitopes_iedb(sequence, method='bepipred2'): '''Predict B-cell epitopes using IEDB API Methods: - bepipred2: Deep learning (recommended) - bepipred: Original BepiPred - emini: Surface accessibility - kolaskar-tongaonkar: Antigenicity - parker: Hydrophilicity BepiPred-2.0 uses deep learning on crystal structures Threshold: >0.5 predicted as epitope (default) ''' url = 'http://tools-cluster-interface.iedb.org/tools_api/bcell/' params = { 'method': method, 'sequence_text': sequence } response = requests.post(url, data=params) # Parse response (tab-separated) lines = response.text.strip().split('\n') header = lines[0].split('\t') data = [line.split('\t') for line in lines[1:]] return header, data
pythonimport pandas as pd def parse_bepipred_results(header, data, threshold=0.5): '''Parse BepiPred output and identify epitope regions Output columns: - Position: Amino acid position - Residue: Amino acid - Score: BepiPred score (higher = more likely epitope) Epitope threshold: - >0.5: Default, balanced sensitivity/specificity - >0.6: More stringent, fewer false positives - >0.4: More sensitive, more candidates ''' df = pd.DataFrame(data, columns=header) df['Score'] = df['Score'].astype(float) df['Position'] = df['Position'].astype(int) # Identify epitope regions df['is_epitope'] = df['Score'] > threshold # Find continuous epitope regions epitopes = [] current_epitope = [] for _, row in df.iterrows(): if row['is_epitope']: current_epitope.append(row) else: if len(current_epitope) >= 5: # Minimum epitope length epitopes.append({ 'start': current_epitope[0]['Position'], 'end': current_epitope[-1]['Position'], 'sequence': ''.join(r['Residue'] for r in current_epitope), 'avg_score': sum(r['Score'] for r in current_epitope) / len(current_epitope) }) current_epitope = [] return df, epitopes
Goal: Predict T-cell epitopes by MHC-I binding across multiple HLA alleles.
Approach: Query IEDB MHC-I API for each allele-sequence combination and aggregate predictions.
pythondef predict_tcell_epitopes_iedb(sequence, alleles, method='recommended'): '''Predict T-cell epitopes using IEDB MHC-I methods: - recommended: Consensus of methods - netmhcpan_ba: NetMHCpan binding affinity - netmhcpan_el: NetMHCpan eluted ligand MHC-II methods: - recommended - netmhciipan ''' url = 'http://tools-cluster-interface.iedb.org/tools_api/mhci/' results = [] for allele in alleles: params = { 'method': method, 'sequence_text': sequence, 'allele': allele, 'length': '9' # Most common for MHC-I } response = requests.post(url, data=params) # Parse results... return results
Goal: Classify epitopes as linear (continuous) or conformational (discontinuous) and predict structure-based epitopes.
Approach: Distinguish by residue continuity in primary sequence; for conformational epitopes, use structure-based tools (DiscoTope, ElliPro) via web servers.
pythondef classify_epitope_type(epitope_info): '''Classify epitope as linear or conformational Linear (continuous) epitopes: - Consecutive amino acids in primary sequence - ~10% of B-cell epitopes - Easier to predict from sequence Conformational (discontinuous) epitopes: - Non-consecutive residues brought together by folding - ~90% of B-cell epitopes - Requires structure for prediction ''' pass def predict_conformational_epitopes(pdb_file, chain='A'): '''Predict conformational B-cell epitopes from structure Uses surface accessibility and protrusion index. Requires 3D structure (PDB/mmCIF). Tools: - DiscoTope 2.0 (structure-based) - ElliPro (protrusion) - SEPPA 3.0 ''' # Structure-based prediction requires specialized tools # Usually accessed via web servers print('For conformational epitopes:') print('- DiscoTope: http://tools.iedb.org/discotope/') print('- ElliPro: http://tools.iedb.org/ellipro/') pass
Goal: Improve epitope prediction reliability by combining multiple methods into a consensus score.
Approach: Run each method independently, threshold per method, then count agreements per position and assign confidence levels.
pythondef consensus_epitope_prediction(sequence, methods=['bepipred2', 'emini', 'parker']): '''Combine multiple prediction methods Consensus approach improves reliability: - Regions predicted by multiple methods more reliable - Different methods capture different properties Scoring: - 3/3 methods: High confidence - 2/3 methods: Moderate confidence - 1/3 methods: Low confidence ''' all_results = {} for method in methods: header, data = predict_bcell_epitopes_iedb(sequence, method) df = pd.DataFrame(data, columns=header) all_results[method] = df # Combine scores consensus = all_results[methods[0]][['Position', 'Residue']].copy() for method in methods: threshold = 0.5 if method == 'bepipred2' else 0 # Method-specific thresholds all_results[method]['is_epitope'] = all_results[method]['Score'].astype(float) > threshold consensus[method] = all_results[method]['is_epitope'].astype(int) consensus['consensus_score'] = consensus[methods].sum(axis=1) consensus['confidence'] = consensus['consensus_score'].map({ 3: 'high', 2: 'moderate', 1: 'low', 0: 'none' }) return consensus
Goal: Map epitope regions from overlapping peptide array binding data.
Approach: Process signal intensity values from overlapping peptide arrays and identify continuous high-signal regions as epitopes.
pythondef map_epitopes_from_peptide_array(array_results, overlap=11): '''Map epitopes from peptide array experiments Peptide arrays test binding of overlapping peptides covering the entire antigen sequence. Args: array_results: Dict mapping peptide -> signal intensity overlap: Overlap between consecutive peptides Returns: Epitope map with per-residue scores ''' # Implementation would process experimental binding data pass
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | 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 +36 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
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.