Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Find restriction enzyme cut sites in DNA sequences using Biopython Bio.Restriction. Search with single enzymes, batches of enzymes, or commercially available enzyme sets. Returns cut positions for linear or circular DNA. Use when finding restriction enzyme cut sites in sequences.
.claude/skills/bio-restriction-sites/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 113% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -60% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 60% | 0% |
| case-14 | ✗→✓ | ▲ Improved | -43% | 0% |
<!--
#
#
-->
pythonfrom Bio import SeqIO from Bio.Restriction import EcoRI, BamHI, HindIII, RestrictionBatch, Analysis record = SeqIO.read('sequence.fasta', 'fasta') seq = record.seq # Single enzyme sites = EcoRI.search(seq) # Returns list of cut positions
pythonfrom Bio.Restriction import EcoRI sites = EcoRI.search(seq) print(f'EcoRI cuts at positions: {sites}') print(f'Number of sites: {len(sites)}') # Check if enzyme cuts if EcoRI.search(seq): print('EcoRI cuts this sequence') else: print('EcoRI does not cut')
pythonfrom Bio.Restriction import RestrictionBatch, EcoRI, BamHI, HindIII, XhoI batch = RestrictionBatch([EcoRI, BamHI, HindIII, XhoI]) # Method 1: batch.search() results = batch.search(seq) for enzyme, sites in results.items(): if sites: print(f'{enzyme}: {sites}') # Method 2: Analysis class analysis = Analysis(batch, seq) results = analysis.full()
pythonfrom Bio.Restriction import AllEnzymes, CommOnly # All known enzymes (800+) analysis = Analysis(AllEnzymes, seq) # Commercially available only analysis = Analysis(CommOnly, seq) # Get results results = analysis.full() for enzyme, sites in results.items(): if sites: print(f'{enzyme}: {sites}')
pythonfrom Bio.Restriction import EcoRI, Analysis, RestrictionBatch # Linear DNA (default) sites_linear = EcoRI.search(seq, linear=True) # Circular DNA (plasmid) sites_circular = EcoRI.search(seq, linear=False) # With Analysis class batch = RestrictionBatch([EcoRI, BamHI]) analysis = Analysis(batch, seq, linear=False) # Circular
pythonfrom Bio.Restriction import Analysis, CommOnly analysis = Analysis(CommOnly, seq) # Only enzymes that cut analysis.print_that_cut() # Only enzymes that don't cut (non-cutters) analysis.print_that_dont_cut() # Enzymes that cut once analysis.print_once_cutters() # Enzymes that cut twice analysis.print_twice_cutters() # Get as dictionary cutters = analysis.only_cut() non_cutters = analysis.only_dont_cut() once_cutters = analysis.once_cutters() twice_cutters = analysis.twice_cutters()
pythonfrom Bio.Restriction import EcoRI # Recognition sequence print(f'Site: {EcoRI.site}') # GAATTC print(f'Esite: {EcoRI.esite}') # Recognition with cut position # Cut characteristics print(f'Overhang: {EcoRI.ovhg}') # 4 (positive = 5' overhang) print(f'Blunt: {EcoRI.is_blunt()}') # False print(f'5\' overhang: {EcoRI.is_5overhang()}') # True print(f'3\' overhang: {EcoRI.is_3overhang()}') # False # Overhang sequence print(f'Overhang seq: {EcoRI.ovhgseq}') # AATT # Isoschizomers (same recognition, different cut) print(f'Isoschizomers: {EcoRI.isoschizomers()}') # Compatible enzymes (same overhang) print(f'Compatible: {EcoRI.compatible_end()}')
pythonfrom Bio.Restriction import ( EcoRI, BamHI, HindIII, XhoI, SalI, NotI, XbaI, SpeI, NcoI, NdeI, BglII, PstI, KpnI, SacI, EcoRV, SmaI ) common_enzymes = RestrictionBatch([ EcoRI, BamHI, HindIII, XhoI, SalI, NotI, XbaI, NcoI, NdeI, BglII, PstI, KpnI, SacI, EcoRV, SmaI ]) analysis = Analysis(common_enzymes, seq) results = analysis.full()
pythonfrom Bio.Restriction import AllEnzymes # Get enzyme by string name ecori = AllEnzymes.get('EcoRI') sites = ecori.search(seq) # Check if enzyme exists if 'EcoRI' in AllEnzymes: print('EcoRI is in database')
pythonfrom Bio import SeqIO from Bio.Restriction import RestrictionBatch, EcoRI, BamHI batch = RestrictionBatch([EcoRI, BamHI]) for record in SeqIO.parse('sequences.fasta', 'fasta'): analysis = Analysis(batch, record.seq) results = analysis.full() print(f'{record.id}:') for enzyme, sites in results.items(): if sites: print(f' {enzyme}: {sites}')
linear=False for circular DNA<!-- AUTHOR_SIGNATURE: 9a7f3c2e-MD-BABU-MIA-2026-MSSM-SECURE -->
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 5,566 | 3,621 | -35% | 1 | 1 | 0% | 1,063 | 2,167 | +104% | 0 | 0 | — |
case-02 | pass→pass | 15,033 | 5,325 | -65% | 1 | 1 | 0% | 2,636 | 2,491 | -6% | 0 | 0 | — |
case-03 | pass→pass | 13,692 | 5,255 | -62% | 1 | 1 | 0% | 2,600 | 2,506 | -4% | 0 | 0 | — |
case-04 | pass→pass | 8,022 | 3,092 | -61% | 1 | 1 | 0% | 1,433 | 2,105 | +47% | 0 | 0 | — |
case-05 | pass→pass | 4,268 | 1,883 | -56% | 1 | 1 | 0% | 722 | 1,794 | +148% | 0 | 0 | — |
case-06 | pass→pass | 10,959 | 3,490 | -68% | 1 | 1 | 0% | 2,018 | 2,186 | +8% | 0 | 0 | — |
case-07 | fail→pass | 5,350 | 2,941 | -45% | 1 | 1 | 0% | 956 | 2,037 | +113% | 0 | 0 | — |
case-08 | fail→pass | 8,105 | 4,745 | -41% | 1 | 1 | 0% | 1,646 | 2,061 | +25% | 0 | 0 | — |
case-09 | fail→pass | 25,683 | 3,071 | -88% | 1 | 1 | 0% | 5,183 | 2,081 | -60% | 0 | 0 | — |
case-10 | fail→pass | 8,660 | 4,911 | -43% | 1 | 1 | 0% | 1,515 | 2,423 | +60% | 0 | 0 | — |
case-11 | pass→pass | 8,656 | 4,831 | -44% | 1 | 1 | 0% | 1,804 | 2,410 | +34% | 0 | 0 | — |
case-12 | pass→pass | 12,971 | 4,715 | -64% | 1 | 1 | 0% | 1,793 | 2,321 | +29% | 0 | 0 | — |
case-13 | pass→pass | 2,881 | 1,800 | -38% | 1 | 1 | 0% | 492 | 1,803 | +266% | 0 | 0 | — |
case-14 | fail→pass | 22,520 | 4,649 | -79% | 1 | 1 | 0% | 4,380 | 2,504 | -43% | 0 | 0 | — |
case-15 | pass→pass | 12,072 | 6,335 | -48% | 1 | 1 | 0% | 2,158 | 2,739 | +27% | 0 | 0 | — |
case-16 | pass→pass | 5,851 | 2,205 | -62% | 1 | 1 | 0% | 1,060 | 1,803 | +70% | 0 | 0 | — |
case-17 | fail→pass | 12,026 | 4,457 | -63% | 1 | 1 | 0% | 2,254 | 2,311 | +3% | 0 | 0 | — |
case-18 | pass→pass | 13,631 | 7,333 | -46% | 1 | 1 | 0% | 2,724 | 2,776 | +2% | 0 | 0 | — |
case-19 | pass→pass | 6,971 | 3,608 | -48% | 1 | 1 | 0% | 1,287 | 2,067 | +61% | 0 | 0 | — |
case-20 | pass→pass | 15,516 | 12,842 | -17% | 1 | 1 | 0% | 3,187 | 4,307 | +35% | 0 | 0 | — |
case-21 | pass→pass | 10,185 | 10,262 | +1% | 1 | 1 | 0% | 1,974 | 3,424 | +73% | 0 | 0 | — |
case-22 | pass→pass | 5,090 | 4,823 | -5% | 1 | 1 | 0% | 1,122 | 2,599 | +132% | 0 | 0 | — |
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. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 7/26/2026 | +27% |
Other measured skills in the registry, with their headline benchmark lift.