Install any skill in seconds. Free to start, no credit card required.
Get Started Free →**Note**: This skill uses the RCSB PDB web API directly. No Modal deployment needed - all operations run locally via HTTP requests.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-15 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-11 | ✗→✓ | ▲ Improved | — | — |
| case-16 | ✗→✓ | ▲ Improved | — | — |
| case-09 | ✓→✓ | = Same ✓ | — | — |
Note: This skill uses the RCSB PDB web API directly. No Modal deployment needed - all operations run locally via HTTP requests.
bash# Download PDB file curl -o 1alu.pdb "https://files.rcsb.org/download/1ALU.pdb" # Download mmCIF curl -o 1alu.cif "https://files.rcsb.org/download/1ALU.cif"
pythonfrom Bio.PDB import PDBList pdbl = PDBList() pdbl.retrieve_pdb_file("1ABC", pdir="structures/", file_format="pdb")
pythonimport requests def fetch_pdb(pdb_id: str, format: str = "pdb") -> str: """Fetch structure from RCSB PDB.""" url = f"https://files.rcsb.org/download/{pdb_id}.{format}" response = requests.get(url) response.raise_for_status() return response.text def fetch_fasta(pdb_id: str) -> str: """Fetch sequence in FASTA format.""" url = f"https://www.rcsb.org/fasta/entry/{pdb_id}" return requests.get(url).text # Example usage pdb_content = fetch_pdb("1ALU") with open("1ALU.pdb", "w") as f: f.write(pdb_content)
pythonfrom Bio.PDB import PDBParser, PDBIO, Select class ChainSelect(Select): def __init__(self, chain_id): self.chain_id = chain_id def accept_chain(self, chain): return chain.id == self.chain_id # Extract chain A parser = PDBParser() structure = parser.get_structure("protein", "1abc.pdb") io = PDBIO() io.set_structure(structure) io.save("chain_A.pdb", ChainSelect("A"))
pythondef trim_around_residues(pdb_file, center_residues, buffer=10.0): """Trim structure to region around specified residues.""" parser = PDBParser() structure = parser.get_structure("protein", pdb_file) # Get center coordinates center_coords = [] for res in structure.get_residues(): if res.id[1] in center_residues: center_coords.extend([a.coord for a in res.get_atoms()]) center = np.mean(center_coords, axis=0) # Keep residues within buffer class RegionSelect(Select): def accept_residue(self, res): for atom in res.get_atoms(): if np.linalg.norm(atom.coord - center) < buffer: return True return False io = PDBIO() io.set_structure(structure) io.save("trimmed.pdb", RegionSelect())
pythonimport requests query = { "query": { "type": "terminal", "service": "full_text", "parameters": { "value": "EGFR kinase domain" } }, "return_type": "entry" } response = requests.post( "https://search.rcsb.org/rcsbsearch/v2/query", json=query ) results = response.json()
pythonquery = { "query": { "type": "terminal", "service": "sequence", "parameters": { "value": "MKTAYIAKQRQISFVK...", "evalue_cutoff": 1e-10, "identity_cutoff": 0.9 } } }
pythondef get_structure_info(pdb_file): parser = PDBParser(QUIET=True) structure = parser.get_structure("protein", pdb_file) info = { "chains": [], "total_residues": 0 } for model in structure: for chain in model: residues = list(chain.get_residues()) info["chains"].append({ "id": chain.id, "length": len(residues), "first_res": residues[0].id[1], "last_res": residues[-1].id[1] }) info["total_residues"] += len(residues) return info
pythondef find_interface_residues(pdb_file, chain_a, chain_b, distance=4.0): """Find residues at interface between two chains.""" parser = PDBParser(QUIET=True) structure = parser.get_structure("complex", pdb_file) interface_a = set() interface_b = set() for res_a in structure[0][chain_a].get_residues(): for res_b in structure[0][chain_b].get_residues(): for atom_a in res_a.get_atoms(): for atom_b in res_b.get_atoms(): if atom_a - atom_b < distance: interface_a.add(res_a.id[1]) interface_b.add(res_b.id[1]) return interface_a, interface_b
curl -o target.pdb "https://files.rcsb.org/download/XXXX.pdb"Structure not found: Check PDB ID format (4 characters) Multiple models: Select first model for design Missing residues: Check for gaps in structure
Next: Use structure with boltzgen (recommended) or rfdiffusion for design.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | 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. 23 cases were attempted. The headline lift of +17 percentage points is the difference between those two pass rates over the 23 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.