Checks whether a PCR primer PAIR amplifies only the intended target genome-wide, using pair-aware in-silico PCR (MFEprimer-3.0, UCSC isPcr, NCBI Primer-BLAST) plus a primer3-py 3'-end-stability prefilter, against the correct database. Covers why plain BLAST is the wrong tool (it scores per-primer similarity, blind to 3'-terminal anchoring and to whether the two primers form a convergent amplicon in range), why a single 3'-terminal mismatch suppresses amplification while internal mismatches ar...
Scanned 9/5/2026
Install to Claude Code
npx -y skills add FridrichMethod/awesome-skills --skill primer-specificity --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Primer Specificity?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/fridrichmethod-primer-specificity)More formats (shields.io, HTML) on the badges page.
---
name: bio-primer-design-primer-specificity
description: Checks whether a PCR primer PAIR amplifies only the intended target genome-wide, using pair-aware in-silico PCR (MFEprimer-3.0, UCSC isPcr, NCBI Primer-BLAST) plus a primer3-py 3'-end-stability prefilter, against the correct database. Covers why plain BLAST is the wrong tool (it scores per-primer similarity, blind to 3'-terminal anchoring and to whether the two primers form a convergent amplicon in range), why a single 3'-terminal mismatch suppresses amplification while internal mismatches are tolerated, why intron-spanning RT-qPCR is defeated by processed pseudogenes that force a GENOME search not transcriptome-only, how to read a Primer-BLAST report (empty unintended-products means none passed its filter, not none exist), and that in-silico checking reduces but never replaces empirical validation. Use when confirming specificity, screening off-target amplicons, avoiding paralog/pseudogene hits, or checking SNPs under the 3' end. Design is primer-basics; dimers primer-validation; alignment read-alignment.
tool_type: mixed
primary_tool: mfeprimer
---
## Version Compatibility
Reference examples tested with: primer3-py 2.3+ (offline prefilter). In-silico PCR tools: MFEprimer 3.x, UCSC isPcr, BLAST+ 2.14+, NCBI Primer-BLAST (web).
Before using code patterns, verify installed versions match. If versions differ:
- Python: `pip show primer3-py` then `help(primer3.calc_end_stability)` to check signatures
- CLI: `mfeprimer --help`, `isPcr`, `blastn -help` to confirm subcommands and flags
If code throws ImportError, AttributeError, or TypeError, introspect the installed
package and adapt the example to match the actual API rather than retrying.
# Primer Specificity -- Does the PAIR Amplify Only the Target Genome-Wide
**"Are these primers specific?"** -> Predict every amplicon the primer PAIR would generate against the correct database and confirm only the intended one survives -- because specificity is a property of a convergent, 3'-anchored, in-range PAIR, not of one primer's similarity to the genome.
- CLI: `mfeprimer -i primers.fa -d genome.fa` (or UCSC `isPcr`, or NCBI Primer-BLAST) predicts amplicons from the pair.
- Python: `primer3.calc_end_stability(primer, site)` ranks 3'-end anchoring -- the variable BLAST ignores.
Scope: genome/transcriptome-wide off-target and mispriming assessment of a chosen primer PAIR via in-silico PCR. Designing primers -> primer-basics. Intramolecular dimers/hairpins of the oligos -> primer-validation. General read alignment / building a BLAST DB -> read-alignment/bwa-alignment, database-access/blast-searches.
## The Single Most Important Modern Insight -- Plain BLAST Is the Wrong Tool, Because Specificity Is a Property of a Predicted Amplicon, Not One Primer's Similarity
1. **The unit of analysis is the amplicon, not the primer.** Amplification needs four things at once: the forward primer anchored, the reverse primer anchored, the two convergent, and the gap within the polymerase's range. BLAST evaluates none of these as a set -- it scores per-query local similarity and stops. So a clean BLAST is false confidence in BOTH directions: a primer with a perfect 5' region but mismatched 3' bases scores a high BLAST hit yet will NOT prime (false off-target), while a primer with internal mismatches but a perfect 3' anchor WILL prime yet may fall below BLAST's word size and be missed (false negative).
2. **The 3' terminus is the governing variable, and BLAST is blind to it.** A single 3'-terminal mismatch suppresses extension by roughly 20-100x depending on identity (A:G/G:A/C:C worst, A:A intermediate, G:T/T:G wobble weakest and NOT automatically safe), while internal mismatches are tolerated (Kwok 1990 *Nucleic Acids Res* 18:999). BLAST maximizes total alignment score and cannot tell a 5' match from a 3' match. Pair-aware tools (Primer-BLAST, MFEprimer, isPcr) use BLAST or a k-mer index only as a candidate FINDER, then apply a pair + 3'-anchor + product-size FILTER.
3. **Search the correct database or the answer is meaningless.** For RT-qPCR, intron-spanning primers do NOT escape genomic DNA: processed pseudogenes are intronless retro-copies that typically carry the exon-exon junction (3'-truncated retrocopies may not), so when present they amplify like cDNA -- the search must cover the GENOME (with pseudogenes and alt/unplaced contigs), not the transcriptome only. This is the most common RT-qPCR specificity trap.
## Why Plain BLAST Fails, Concretely
BLASTn defaults are wrong for a ~20 nt primer: megablast (the default `blastn`) seeds at word 28 and so cannot seed a 20-mer at all; plain `blastn` (word 11) does seed a perfect 20-mer, but its scoring and E-value defaults are tuned for long queries, so short or partial off-target hits fall below threshold; only `blastn-short` (word 7, short-query scoring) is the appropriate task -- and even then it scores similarity, not amplification. And BLAST evaluates each primer independently against the database; it never asks whether the forward and reverse hits face each other within an amplifiable span. So `blastn-short` is acceptable only as a quick EXPLORATORY check for gross multi-copy/repeat problems of a single primer, read with the 3' alignment inspected by hand -- never as the final specificity decision.
## Tool Taxonomy
| Tool / method | Citation | Mechanism / role | When |
|---------------|----------|------------------|------|
| MFEprimer-3.0 | Wang 2019 *Nucleic Acids Res* 47:W610 | k-mer index forbids a mismatch at the first 3' base, then nearest-neighbor scores stable binding; outputs amplicons + Ta/dG + dimer/hairpin modules; CLI/JSON | scriptable local in-silico PCR with thermodynamics; the default programmatic checker |
| NCBI Primer-BLAST | Ye 2012 *BMC Bioinformatics* 13:134 | BLAST candidate-find + convergent-pair + 3'-mismatch filter; "intended vs unintended products" report; any NCBI organism | tunable-mismatch, report-driven web check |
| UCSC In-Silico PCR (isPcr) | Kent (UCSC Genome Browser) | exact predicted product(s) of a pair on a chosen assembly, with coordinates | confirm the intended amplicon exists and is unique on a specific UCSC assembly; local batch |
| `blastn -task blastn-short` | Altschul 1990 *J Mol Biol* 215:403 | similarity seed at word_size 7 | EXPLORATORY single-primer repeat/multi-copy scan only |
| `primer3.calc_end_stability` | SantaLucia & Hicks 2004 *Annu Rev Biophys* 33:415 | dG of a primer's 3' end annealing to a site | rank candidate off-target sites by 3'-anchor strength (the BLAST-blind variable) |
## Decision Tree by Scenario
| Scenario | Recommended | Why |
|----------|-------------|-----|
| Any qPCR / quantitative assay | MFEprimer or Primer-BLAST against genome + transcriptome | off-targets and gDNA corrupt the quantitative number |
| Intron-spanning RT-qPCR | search the GENOME (pseudogenes), not transcriptome-only | processed pseudogenes usually carry the junction and amplify from gDNA |
| Genotyping / allele-specific | weight the 3' end; check SNPs under the anchor (dbSNP/gnomAD) | the 3'-terminal base is the whole assay (Kwok 1990) |
| Confirm intended amplicon on a UCSC assembly | UCSC isPcr | exact product + genomic coordinates on that assembly |
| Tunable mismatch sensitivity + report | Primer-BLAST (loosen/tighten the 3'-mismatch filter) | stress-test how robust specificity is |
| Quick single-primer repeat scan | `blastn-short` word_size 7, dust off | gross multi-copy triage only; never final |
| Multiplex (N primers) | run in-silico PCR over the POOLED primer set + all-pairs cross-dimer | the pooled set enumerates cross-pair amplicons (Fwd_A + Rev_B, convergent and in-range), which per-pair checks miss; Primer-BLAST does NOT check inter-pair dimers either (O(N^2)) |
| Eukaryotic target with gene families / segmental duplications | pair-level genome + transcriptome search | paralogs in conserved exons amplify multiple members; segmental duplications / recent CNV families (e.g. SMN1/SMN2) give two near-identical loci a pair cannot distinguish |
Default when uncertain: run pair-aware in-silico PCR (MFEprimer or Primer-BLAST) against the genome AND, for RT work, the transcriptome; require exactly one intended amplicon, no qualifying off-target, and 3' ends clear of common SNPs -- then still validate empirically.
## Run In-Silico PCR on the Pair
**Goal:** Enumerate every amplicon the pair would make against the correct database and confirm only the intended one survives.
**Approach:** Build the database index once, run the pair-aware tool, and read the predicted products; require a single on-target amplicon of expected size and no qualifying off-target. The commands below need the tool binaries and a genome/transcriptome FASTA, so they are NOT offline-spot-runnable here -- verify flags with `--help` against the installed version.
```bash
# MFEprimer-3.0 (local, thermodynamic; build the k-mer index once, then run)
mfeprimer index -i genome.fa
mfeprimer -i primers.fa -d genome.fa -o specificity.txt # add --json for pipeline parsing; verify flags with: mfeprimer --help
# UCSC isPcr (exact products on one assembly; primers.txt = "name<TAB>FWD<TAB>REV" per line)
isPcr genome.2bit primers.txt stdout -out=fa
# blastn-short: EXPLORATORY single-primer repeat scan ONLY (not a specificity verdict)
blastn -task blastn-short -word_size 7 -dust no -query primers.fa -db genome -outfmt 6
```
NCBI Primer-BLAST (web, any organism): paste the pair, pick the organism and a database that includes the genome (not "RefSeq mRNA only" for RT-qPCR), set the max product size, and read the report.
## Rank Off-Target Sites by 3'-End Anchoring (offline)
**Goal:** Show why a candidate off-target site that BLAST would surface may or may not actually prime, using the 3'-anchor thermodynamics BLAST ignores.
**Approach:** For each candidate site (the complementary strand the primer would anneal to), contrast the overall duplex dG (`calc_heterodimer`, what a similarity search tracks) with the 3'-anchor dG (`calc_end_stability`); a 3'-terminal mismatch keeps the overall dG strong but collapses the anchor, so the site will not prime despite the similarity.
```python
import primer3
COMP = str.maketrans('ACGT', 'TGCA')
primer = 'GTCTCCTCTGACTTCAACAGCG'
site = primer.translate(COMP)[::-1] # the strand the primer anneals to; primer 3' base pairs site[0]
def mut(s, i):
return s[:i] + ('A' if s[i] != 'A' else 'C') + s[i + 1:]
sites = {'on-target': site, 'internal mismatch': mut(site, len(site) // 2), '3-prime mismatch': mut(site, 0)}
for label, s in sites.items():
overall = primer3.calc_heterodimer(primer, s).dg / 1000 # what overall similarity tracks
anchor = primer3.calc_end_stability(primer, s).dg / 1000 # the 3'-anchor BLAST ignores
print(f'{label}: overall dG={overall:.2f} 3-prime anchor dG={anchor:.2f} kcal/mol') # 3' mismatch: overall stays strong, anchor collapses
```
## Per-Method Failure Modes
### "BLAST was clean, so it is specific"
**Trigger:** Treating a per-primer BLAST result as a specificity verdict. **Mechanism:** BLAST scores similarity per primer, ignores 3'-anchoring and pairing. **Symptom:** primers pass BLAST but amplify off-target on the bench. **Fix:** use pair-aware in-silico PCR (MFEprimer / Primer-BLAST / isPcr).
### Intron-spanning RT-qPCR checked against the transcriptome only
**Trigger:** Searching "RefSeq mRNA" and concluding gDNA-safe. **Mechanism:** processed pseudogenes are intronless and carry the junction, amplifying like cDNA. **Symptom:** a genomic amplicon at the cDNA size; no-RT control is positive. **Fix:** search the genome (with pseudogenes); keep DNase + no-RT control.
### Misreading an empty Primer-BLAST "unintended" section
**Trigger:** Treating an empty section as proof of uniqueness. **Mechanism:** Primer-BLAST ignores any off-target with >=6 total mismatches OR >=2 mismatches in the last 5 bp at the 3' end -- equivalently it LISTS only hits with <6 total and <2 near the 3', so an empty section means "none my model predicts will amplify," not "none similar exist." **Symptom:** false confidence. **Fix:** loosen the mismatch settings to stress-test, and combine with isPcr.
### Wrong / too-narrow database
**Trigger:** Searching primary assembly only, or one chromosome, or a single transcript set. **Mechanism:** off-targets on alt/unplaced contigs, repeats, or paralog transcripts are excluded. **Symptom:** "unique" in-silico, multiple bands in vitro. **Fix:** match the database to the assay (genome + transcriptome for RT-qPCR; include alt/unplaced contigs).
### SNP/indel under the 3' end
**Trigger:** Validating against the reference only. **Mechanism:** an individual carrying a variant under the 3' anchor fails to amplify that allele (Kwok 1990 *Nucleic Acids Res* 18:999). **Symptom:** allele dropout in some samples. **Fix:** check primer 3' ends against dbSNP/gnomAD common variants and redesign (primer-basics).
### Checking a multiplex pair-by-pair instead of pooled
**Trigger:** Per-pair Primer-BLAST/in-silico PCR on a multiplex set. **Mechanism:** two off-target classes only appear in the POOLED set -- inter-pair cross-dimers (O(N^2), unexamined) and cross-pair amplicons where one pair's forward meets another pair's reverse convergently and in-range. **Symptom:** one channel silently fails or an unexpected band appears. **Fix:** run in-silico PCR over the pooled primer set AND all-pairs cross-dimer screening (primer-validation), not pair-by-pair.
## Quantitative Thresholds
| Threshold | Source | Rationale |
|-----------|--------|-----------|
| Primer-BLAST ignores off-target if >=6 total mismatches OR >=2 in last 5 bp at 3' | Ye 2012 *BMC Bioinformatics* 13:134 | encodes the 3'-anchor biology BLAST lacks (its actual default filter) |
| 3'-terminal mismatch suppresses ~20-100x (A:G/G:A/C:C worst, G:T/T:G weakest) | Kwok 1990 *Nucleic Acids Res* 18:999 | why a 3' anchor decides priming; wobble is not automatically safe |
| `blastn-short` word_size 7, dust off | Altschul 1990 *J Mol Biol* 215:403 | short-query-tuned scoring/E-value; megablast (word 28) cannot seed a 20-mer, default blastn (word 11) seeds it but its long-query scoring drops marginal hits |
| Require exactly 1 intended amplicon, expected size | -- | the in-silico pass condition before empirical validation |
| RT-qPCR: search genome + transcriptome | Ye 2012 *BMC Bioinformatics* 13:134 | genome catches pseudogenes/gDNA; transcriptome catches isoforms/paralogs |
## In-Silico Reduces, It Does Not Replace, Empirical Validation
A passing in-silico check removes most bad designs but does not license an assay. Confirm empirically: a gradient PCR to find the annealing temperature giving a single product; a single band on a gel (or single fragment on a TapeStation); for SYBR qPCR a single sharp melt peak with no low-Tm dimer shoulder; and Sanger sequencing of the product to prove identity (a same-size off-target is invisible on a gel). State this honestly -- "Primer-BLAST said it is specific" is not validation of a quantitative assay.
## Common Errors
| Error / symptom | Cause | Solution |
|-----------------|-------|----------|
| Primers pass BLAST, fail in vitro | per-primer similarity, not pair amplicon | run pair-aware in-silico PCR |
| RT-qPCR amplifies gDNA despite intron-spanning | processed pseudogene usually carries the junction | search the genome; DNase + no-RT control |
| Empty Primer-BLAST off-targets but multiple bands | filter hid a 3'-anchored off-target / wrong DB | loosen mismatch settings; search the genome incl. alts |
| isPcr returns nothing for the intended pair | wrong assembly / over-strict default match | confirm the assembly and target presence |
| `mfeprimer` errors on the database | index not built | run `mfeprimer index -i db.fa` first |
| Allele dropout in some individuals | SNP under the 3' end | check 3' ends vs gnomAD; redesign (primer-basics) |
## References
- Ye J, Coulouris G, Zaretskaya I, et al. 2012. Primer-BLAST: a tool to design target-specific primers for polymerase chain reaction. *BMC Bioinformatics* 13:134.
- Wang K, Li H, Xu Y, et al. 2019. MFEprimer-3.0: quality control for PCR primers. *Nucleic Acids Res* 47:W610-W613.
- Kwok S, Kellogg DE, McKinney N, et al. 1990. Effects of primer-template mismatches on the polymerase chain reaction: human immunodeficiency virus type 1 model studies. *Nucleic Acids Res* 18:999-1005.
- SantaLucia J Jr, Hicks D. 2004. The thermodynamics of DNA structural motifs. *Annu Rev Biophys Biomol Struct* 33:415-440.
- Altschul SF, Gish W, Miller W, et al. 1990. Basic local alignment search tool. *J Mol Biol* 215:403-410.
## Related Skills
- primer-basics - Design (or redesign) primers when specificity fails
- primer-validation - Intramolecular dimers/hairpins of the chosen oligos
- qpcr-primers - qPCR assays where specificity and gDNA exclusion are mandatory
- read-alignment/bwa-alignment - Align candidate amplicons / reads to a genome
- database-access/blast-searches - Build/query BLAST databases for candidate finding
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!