Restriction site analysis is still a practical part of many cloning workflows. You often need to find enzymes that cut your vector in the right place while avoiding unwanted cuts in your insert. In this tutorial, you will use `Bio.Restriction` for cloning-oriented site analysis. ## Scanning Vector and Insert for Restriction Sites
from Bio.Seq import Seq
from Bio.Restriction import RestrictionBatch, Analysis
# Example vector and insert sequences
vector = Seq("AAGCTTGAATTCCCGGGATCCGCTAGCGGATCCGAATTC")
insert = Seq("ATGGCCGGAATTCTTACCGGATCCGGTTAAGCTT")
# Enzymes commonly considered in cloning
enzymes = RestrictionBatch(["EcoRI", "BamHI", "HindIII", "NheI", "XhoI"])
vector_analysis = Analysis(enzymes, vector)
insert_analysis = Analysis(enzymes, insert)
print("Vector cut sites:")
print(vector_analysis.full())
print("Insert cut sites:")
print(insert_analysis.full())Vector cut sites:
{EcoRI: [8, 35], HindIII: [2], NheI: [23], XhoI: [], BamHI: [17, 29]}
Insert cut sites:
{EcoRI: [9], HindIII: [30], NheI: [], XhoI: [], BamHI: [20]}
This first scan shows where each enzyme cuts both molecules. It helps you quickly identify enzymes that are useful versus problematic for a given cloning plan. ## Finding Enzymes that Cut Insert Once
from Bio.Seq import Seq
from Bio.Restriction import RestrictionBatch, Analysis
vector = Seq("AAGCTTGAATTCCCGGGATCCGCTAGCGGATCCGAATTC")
insert = Seq("ATGGCCGGAATTCTTACCGGATCCGGTTAAGCTT")
enzymes = RestrictionBatch(["EcoRI", "BamHI", "HindIII", "NheI", "XhoI"])
insert_sites = Analysis(enzymes, insert).full()
single_cutters = []
for enzyme, positions in insert_sites.items():
if len(positions) == 1:
single_cutters.append(str(enzyme))
print("Single-cut enzymes in insert:", single_cutters)Single-cut enzymes in insert: ['EcoRI', 'HindIII', 'BamHI']
Single-cut enzymes are often useful for directional cloning strategies and cleaner ligation outcomes. ## Avoiding Enzymes that Cut Vector Multiple Times
from Bio.Seq import Seq
from Bio.Restriction import RestrictionBatch, Analysis
vector = Seq("AAGCTTGAATTCCCGGGATCCGCTAGCGGATCCGAATTC")
insert = Seq("ATGGCCGGAATTCTTACCGGATCCGGTTAAGCTT")
enzymes = RestrictionBatch(["EcoRI", "BamHI", "HindIII", "NheI", "XhoI"])
vector_sites = Analysis(enzymes, vector).full()
insert_sites = Analysis(enzymes, insert).full()
recommended = []
for enzyme in enzymes:
v_cuts = len(vector_sites[enzyme])
i_cuts = len(insert_sites[enzyme])
# Example rule: vector must cut once, insert must cut once or zero
if v_cuts == 1 and i_cuts <= 1:
recommended.append((str(enzyme), v_cuts, i_cuts))
print("Recommended enzymes (rule-based):", recommended)Recommended enzymes (rule-based): [('NheI', 1, 0), ('HindIII', 1, 1)]
This gives a practical rule-based shortlist for cloning setup. You can adapt the rule to your lab strategy (e.g., require no insert cuts for some approaches). ## Detecting Restriction-Site Conflicts in Designed Primers
from Bio.Seq import Seq
from Bio.Restriction import EcoRI, BamHI
# Example primer tails added for cloning
forward_primer = Seq("GAATTCATGGCCGTA") # EcoRI tail
reverse_primer = Seq("GGATCCTTACCGGTA") # BamHI tail
print("Forward primer has EcoRI site:", bool(EcoRI.search(forward_primer)))
print("Forward primer has BamHI site:", bool(BamHI.search(forward_primer)))
print("Reverse primer has EcoRI site:", bool(EcoRI.search(reverse_primer)))
print("Reverse primer has BamHI site:", bool(BamHI.search(reverse_primer)))Forward primer has EcoRI site: True Forward primer has BamHI site: False Reverse primer has EcoRI site: False Reverse primer has BamHI site: True
Primer-tail checks help confirm your engineered cloning sites are actually present and that unwanted enzyme sites were not introduced accidentally.