install
source · Clone the upstream repo
git clone https://github.com/FreedomIntelligence/OpenClaw-Medical-Skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/FreedomIntelligence/OpenClaw-Medical-Skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/bio-restriction-sites" ~/.claude/skills/freedomintelligence-openclaw-medical-skills-bio-restriction-sites && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/FreedomIntelligence/OpenClaw-Medical-Skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/bio-restriction-sites" ~/.openclaw/skills/freedomintelligence-openclaw-medical-skills-bio-restriction-sites && rm -rf "$T"
manifest:
skills/bio-restriction-sites/SKILL.mdsource content
<!--
# COPYRIGHT NOTICE
# This file is part of the "Universal Biomedical Skills" project.
# Copyright (c) 2026 MD BABU MIA, PhD <md.babu.mia@mssm.edu>
# All Rights Reserved.
#
# This code is proprietary and confidential.
# Unauthorized copying of this file, via any medium is strictly prohibited.
#
# Provenance: Authenticated by MD BABU MIA
-->
name: bio-restriction-sites description: 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. tool_type: python primary_tool: Bio.Restriction measurable_outcome: Execute skill workflow successfully with valid output within 15 minutes. allowed-tools:
- read_file
- run_shell_command
Finding Restriction Sites
Core Pattern
from 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
Search with Single Enzyme
from 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')
Search with Multiple Enzymes
from 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()
Use Built-in Enzyme Collections
from 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}')
Linear vs Circular DNA
from 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
Filter Results
from 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()
Get Enzyme Information
from 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()}')
Common Cloning Enzymes
from 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()
Access Enzymes by Name
from 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')
Search Multiple Sequences
from 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}')
Notes
- Positions are 1-based - first base is position 1
- Cut position - where enzyme cuts (between bases)
- Linear default - set
for circular DNAlinear=False - Case insensitive - recognition matches regardless of case
- Ambiguous bases - some enzymes recognize N, R, Y, etc.
Related Skills
- restriction-mapping - Visualize cut positions on sequence
- enzyme-selection - Choose enzymes by criteria
- fragment-analysis - Analyze resulting fragments