Day 5: In Silico Restriction Mapping & Recombinant Molecular Cloning
1. Mechanisms of Bacterial Restriction Endonucleases
Restriction Endonucleases (REases) are bacterial defense enzymes that recognize specific, typically palindromic DNA sequences (4–8 bp in length) and catalyze double-stranded phosphodiester bond cleavage. In molecular biology and recombinant DNA technology, Type II restriction enzymes are universally utilized because their recognition and cleavage sites are strictly identical and require only $Mg^{2+}$ as a cofactor without ATP hydrolysis.
| Enzyme Name | Microbial Source | Recognition Sequence & Cleavage Site | Overhang Geometry | Ligation Characteristics |
|---|---|---|---|---|
| EcoRI | Escherichia coli RY13 | 5'-G | A A T T C-3'3'-C T T A A | G-5' | 5' sticky overhang (4-nt: 5'-AATT-3') | High-efficiency directional cohesive ligation with T4 DNA ligase. |
| PstI | Providencia stuartii | 5'-C T G C A | G-3'3'-G | A C G T C-5' | 3' sticky overhang (4-nt: 3'-ACGT-5') | Cohesive ligation; incompatible with 5' overhangs. |
| EcoRV | Escherichia coli J62 | 5'-G A T | A T C-3'3'-C T A | T A G-5' | Blunt end (flush double-strand cut) | Universal compatibility with any blunt-ended insert; requires high T4 ligase concentrations; lacks directionality unless combined with cohesive enzymes. |
| BamHI | Bacillus amyloliquefaciens | 5'-G | G A T C C-3'3'-C C T A G | G-5' | 5' sticky overhang (4-nt: 5'-GATC-3') | Isocaudomer with BglII (5'-A|GATCT-3'); ligation generates non-cleavable hybrid site. |
| NotI | Nocardia otitidis-caviarum | 5'-G C | G G C C G C-3'3'-C G C C G G | C G-5' | 8-base rare cutter (5' overhang) | Cuts on average once every $4^8 = 65,536\text{ bp}$; ideal for genomic BAC library cloning and mammalian vector linearization. |
2. Directional Cloning & Vector Expression Strategy
To express a recombinant gene in an expression host (such as E. coli BL21(DE3) with a pET vector), the insert must be inserted in the correct $5' \to 3'$ orientation relative to the bacteriophage T7 promoter and maintaining the open reading frame across any amino-terminal polyhistidine purification tags (e.g. His6-tag). Directional cloning achieves this by cutting the plasmid's Multiple Cloning Site (MCS) and the PCR insert with two distinct, non-compatible restriction enzymes (e.g. NdeI at the 5' end and XhoI at the 3' end).
3. Production Python Script: In Silico Restriction Digestion & Agarose Band Simulator
#!/usr/bin/env python3
"""
Day 5 Practical: In Silico Restriction Digest & Gel Electrophoresis Simulation
Identifies restriction cut sites, fragment lengths, and simulated migration.
"""
from Bio.Seq import Seq
from Bio.Restriction import EcoRI, BamHI, HindIII, PstI, NotI, RestrictionBatch
def perform_restriction_digest(plasmid_seq: str, enzyme_list, is_circular=True):
"""Simulate complete restriction endonuclease digestion."""
seq = Seq(plasmid_seq.upper())
batch = RestrictionBatch(enzyme_list)
results = batch.search(seq, linear=not is_circular)
print("=== RESTRICTION SITE MAP ===")
for enzyme, cut_sites in results.items():
print(f"Enzyme {enzyme}: {len(cut_sites)} cut(s) at positions: {cut_sites}")
# Calculate fragment sizes for a double digest (e.g., EcoRI + HindIII)
all_cuts = sorted(results[EcoRI] + results[HindIII])
if not all_cuts:
fragments = [len(seq)]
elif is_circular:
fragments = []
for i in range(len(all_cuts)):
if i < len(all_cuts) - 1:
fragments.append(all_cuts[i+1] - all_cuts[i])
else:
fragments.append((len(seq) - all_cuts[-1]) + all_cuts[0])
else:
# Linear fragment calculation
cuts = [0] + all_cuts + [len(seq)]
fragments = [cuts[i+1] - cuts[i] for i in range(len(cuts)-1)]
fragments.sort(reverse=True)
return results, fragments
if __name__ == "__main__":
# Simulated 4,361 bp pBR322-like plasmid sequence containing EcoRI and HindIII sites
# EcoRI site: GAATTC (pos ~ 1000), HindIII site: AAGCTT (pos ~ 2500)
fake_plasmid = "A" * 999 + "GAATTC" + "C" * 1494 + "AAGCTT" + "T" * 1860
print(f"Total Plasmid Length: {len(fake_plasmid)} bp")
enzymes = [EcoRI, HindIII]
sites, frags = perform_restriction_digest(fake_plasmid, enzymes, is_circular=True)
print("
=== VIRTUAL AGAROSE GEL ELECTROPHORESIS ===")
print("Fragment Sizes (bp, sorted from slowest to fastest migration):")
for idx, f_size in enumerate(frags, 1):
print(f" Band {idx}: {f_size} bp")
Common Pitfalls & Troubleshooting Checklist
- Java Heap Exhaustion (GATK / Picard): If processes terminate with
java.lang.OutOfMemoryError, set your environment variable explicitly:export _JAVA_OPTIONS="-Xmx16g -Djava.io.tmpdir=/tmp". - Index Timestamp Mismatch: If tools complain that a BAM index is missing or out of date, regenerate with
samtools index -@ 4 sample.bam. - Conda Channel Conflicts: Avoid ABI incompatibilities between bioconda and conda-forge by setting strict priority:
conda config --set channel_priority strict. - Chromosome Naming Contamination: Always verify whether reference FASTA headers use
chr1or1; divergent naming causes silent alignment drops.