restriction-analysis/restriction-sites/SKILL.md
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.
npx skillsauth add GPTomics/bioSkills bio-restriction-sitesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Reference examples tested with: BioPython 1.83+
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.
"Find restriction sites in my DNA sequence" -> Locate cut positions for one or more restriction enzymes in linear or circular DNA.
Bio.Restriction.Analysis(rb, seq, linear=True).full()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
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')
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()
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}')
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
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()
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()}')
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()
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')
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}')
linear=False for circular DNAtesting
Analyze multi-modal single-cell data (CITE-seq, Multiome, spatial). Use when working with data that measures multiple modalities per cell like RNA + protein or RNA + ATAC. Use when analyzing CITE-seq, Multiome, or other multi-modal single-cell data.
data-ai
Analyze metabolite-mediated cell-cell communication using MeboCost for metabolic signaling inference between cell types. Predict metabolite secretion and sensing patterns from scRNA-seq data. Use when studying metabolic crosstalk between cell populations or metabolite-receptor interactions.
development
Find marker genes and annotate cell types in single-cell RNA-seq using Seurat (R) and Scanpy (Python). Use for differential expression between clusters, identifying cluster-specific markers, scoring gene sets, and assigning cell type labels. Use when finding marker genes and annotating clusters.
development
Reconstruct cell lineage trees from CRISPR barcode tracing or mitochondrial mutations. Use when studying clonal dynamics, cell fate decisions, or developmental trajectories.