Detect syntenic blocks and structural rearrangements between genomes using MCScanX (Wang 2012), JCVI/MCScan (Tang 2008 Python), GENESPACE (Lovell 2022) for orthology-anchored riparian visualization, SyRI for structural variation, AnchorWave for sequence-level synteny, i-ADHoRe 3.0 for highly diverged species, SynNet for synteny networks, and ntSynt for multi-genome macrosynteny. Use when identifying collinear gene blocks across species, distinguishing macrosynteny from microsynteny, detecting inversions/translocations/duplications, anchoring orthology in WGD lineages, producing publication riparian plots, computing synteny block age via Ks (cross-references whole-genome-duplication), or running synteny-aware ortholog inference in polyploids.
Detect syntenic blocks and structural rearrangements between genomes using MCScanX (Wang 2012), JCVI/MCScan (Tang 2008 Python), GENESPACE (Lovell 2022) for orthology-anchored riparian visualization, SyRI for structural variation, AnchorWave for sequence-level synteny, i-ADHoRe 3.0 for highly diverged species, SynNet for synteny networks, and ntSynt for multi-genome macrosynteny. Use when identifying collinear gene blocks across species, distinguishing macrosynteny from microsynteny, detecting inversions/translocations/duplications, anchoring orthology in WGD lineages, producing publication riparian plots, computing synteny block age via Ks (cross-references whole-genome-duplication), or running synteny-aware ortholog inference in polyploids.
If code throws MCScanX: argument bad format, syri: input alignment file missing required columns, or GENESPACE: GFF parse error, these tools have brittle input parsing: MCScanX requires 4-column species_chr gene start end BED (non-standard), JCVI expects 4-column simple BED, GENESPACE requires GFF3 with gene feature type. Pre-process with jcvi.formats.gff bed or custom AWK.
Synteny Analysis
"Compare genome architecture between these species" -> Detect conserved gene order (synteny) and infer rearrangement history. Synteny is NOT the same as collinearity: synteny is "genes on same chromosome", collinearity is "same order on same chromosome" (modern usage often conflates them). The choice of tool depends on whether the question is gene-level co-linearity (MCScanX, JCVI), whole-genome structural rearrangements (SyRI, AnchorWave), multi-genome macrosynteny (GENESPACE, ntSynt), or synteny-aware orthology (GENESPACE, ProteinOrtho-synteny). Repeat-masking quality is the dominant determinant of result reliability -- unmasked TEs produce ~100x more false anchor pairs than real syntenic anchors.
CLI: MCScanX for collinear gene blocks via dynamic programming
CLI: python -m jcvi.compara.catalog ortholog A B for JCVI/MCScan Python pipeline
Methodology evolves; GENESPACE has emerged as the de facto standard for plant comparative genomics (2022-2026). For non-plant clades, MCScanX or JCVI remain the workhorses. Whole-genome alignment for synteny is increasingly delegated to Cactus / Minigraph-Cactus and HAL toolkit (see [[whole-genome-alignment]]).
Decision Tree by Experimental Scenario
Scenario
Recommended approach
Why
Plant comparative genomics, 2-20 species
GENESPACE
Integrated orthology + synteny + visualization; modern standard
Animal / fungal, 2 species comparison
JCVI/MCScan
Best plots; flexible; widely cited
Animal / fungal, 10+ species
OrthoFinder + MCScanX + custom plot OR JCVI multi-genome
Avoid plant-specific GENESPACE assumptions
Bacterial / prokaryote synteny
progressiveMauve OR MCScanX-bacterial
Tools designed for compact genomes
Chromosome-level rearrangement inventory
SyRI + plotsr
Comprehensive SV (INV/TRANS/DUP) with publication viz
Polyploid genome analysis
AnchorWave proali mode with ploidy
WGD-aware synteny; subgenome-aware
Closely related strains (>= 95% identity)
nucmer + dnadiff
Faster than chromosome-level WGA; appropriate sensitivity
Distantly related species (< 70% identity)
i-ADHoRe 3.0 or LASTZ chains/nets
Sequence-level approaches lose power; ordered-list methods retain it
Ancient WGD detection
See [[whole-genome-duplication]]
wgd v2, KsRates; Ks-based dating outside synteny scope
WGA at clade-level (10+ vertebrates)
Cactus / Minigraph-Cactus -> halSynteny
See [[whole-genome-alignment]]; multi-genome reference-free
Pan-genome of bacterial strains
See [[pangenome-analysis]]
Panaroo / PPanGGOLiN / PEPPAN; different problem
Synteny-aware ortholog disambiguation
ProteinOrtho -synteny or GENESPACE
Tandem duplicates collapsed; co-orthologs assigned to syntenic position
Reference-guided assembly bias check
DO NOT use synteny across reference-guided scaffolds
Network from many genomes; detects ancient micro-conserved clusters
Synteny across > 15% divergent genomes
ntSynt or i-ADHoRe
Alignment-free or ordered-list approaches
Identifying syntelogs (syntenic orthologs only)
GENESPACE riparian() output; or MCScanX filtered by chr-pair
Syntelog tracks only same-chromosome-pair orthologs
Per-Tool Failure Modes
Repeat-derived false synteny
Trigger: Running BLAST input for MCScanX/JCVI without softmasking repeats; or weak softmasking.
Mechanism: Transposable elements occupy 30-80% of plant and animal genomes; unmasked TEs produce millions of paralogous BLAST hits forming "synteny" blocks that are TE-driven, not real ancestry. The dynamic programming sees long apparent collinear blocks of TE-encoded proteins.
Symptom: MCScanX/JCVI output dominated by short (5-10 anchor) blocks; blocks cluster in TE-rich regions (heterochromatin, centromeric); BLAST hit count > 10x what is expected for the divergence.
Fix: Softmask genomes with RepeatModeler2 (de novo TE library) + RepeatMasker before BLAST; report softmasking statistics. For MCScanX, set -e 1e-10 (stricter) for close species, -e 1e-5 for distant. JCVI --cscore 0.95 enforces near-reciprocal-best-hit, dramatically reducing TE-driven blocks. Always check that block size distribution drops at 5-10 anchors (TE-driven) vs proper > 20 anchor blocks (real synteny).
Trigger: Comparing a de novo assembly with a reference-guided scaffold of the same / related species.
Mechanism: Reference-guided scaffolding orders contigs based on synteny to the reference. Comparing the resulting scaffold to that same reference produces "synteny" that is actually the imposed reference order, not biological gene order. The comparison is circular.
Symptom: Suspicious uniformity in synteny across most chromosomes; visualization shows reference and query as perfectly parallel; SyRI reports few SVs where divergence-time-appropriate counts would predict many.
Fix: Verify assembly method via metadata. For reference-guided assemblies, treat synteny inferences with the reference as suspect; use a sister species reference or pure de novo assembly. Hi-C-scaffolded assemblies are not "reference-guided" in this sense and are safe.
Trigger: Running synteny on draft assemblies with N50 < 1 Mb.
Mechanism: Macrosynteny detection requires that syntenic blocks be on single contigs; if contigs are short, blocks are artificially truncated. JCVI reports show artifactual "synteny loss" between species when one assembly is fragmented.
Symptom: Synteny "loss" correlates with assembly N50; per-chromosome dotplots show dotted lines where solid diagonals expected; SyRI reports excessive INVs / TRANS where the divergence is actually low.
Fix: Require minimum N50 of 1 Mb for cross-species synteny; chromosome-level assemblies preferred for SyRI. For fragmented assemblies, restrict analysis to long-contig regions or use SyRI's contig-level mode with caveats.
Tandem duplicate inflation
Trigger: Including tandemly duplicated genes in synteny anchor input.
Mechanism: Tandem duplicates produce many same-region BLAST hits between species; the dynamic programming includes them as multiple anchors per gene position, artificially inflating block size and confidence.
Symptom: "High-confidence" synteny blocks in regions known for tandem expansions (NLR clusters in plants, OR genes in mammals); blocks anchored largely on adjacent tandem duplicates of the same gene.
Fix: MCScanX automatically collapses tandem duplicates (within 5 genes by default; -w parameter). Verify in the output the tandem-collapse step ran. JCVI --tandem_Nmax 10 is more aggressive. For NLR / OR genes specifically, manual tandem filtering before BLAST is preferred.
Cross-genome chromosome name mismatch
Trigger: GFF and FASTA from different sources with different chromosome naming (chr1 vs Chr1 vs 1 vs NC_001234.5).
Mechanism: MCScanX requires chromosomes to be named consistently; mismatch causes empty output or partial blocks.
Symptom: MCScanX completes but .collinearity file is small or empty; warnings about unknown chromosome IDs.
Fix: Normalize chromosome names with awk or samtools faidx --regions to unify naming convention; verify GFF + FASTA share the same names. For NCBI assemblies, use datasets to download with consistent labels.
SyRI complaining about inversions in absence of true inversions
Trigger: Running SyRI on alignments with many small-scale rearrangements; or when one genome has been re-ordered (different convention for which strand is "+").
Mechanism: SyRI's syntenic-path algorithm penalizes any rearrangement; high-divergence pairs accumulate small-scale rearrangements that are not "real" inversions but inheritance differences.
Symptom: SyRI reports thousands of small "inversions" (< 1 kb); blocks dominate the SV count; total INV length unrealistic.
Fix: Filter SyRI output by size: real biologically-relevant INVs are typically > 5 kb. Tighten minimap2 sensitivity (-x asm5 for close species; -x asm10 or -x asm20 for more divergent). Reverse-complement one assembly's chromosomes if the strand convention differs.
GENESPACE OrthoFinder version mismatch
Trigger: Running GENESPACE with an outdated bundled OrthoFinder.
Mechanism: GENESPACE bundles a specific OrthoFinder version; if user's installed OrthoFinder is newer (v3 vs v2.5), the HOG output layout differs and GENESPACE parsing fails.
Symptom: GENESPACE reports "Phylogenetic_Hierarchical_Orthogroups not found" or similar; orthogroup table is empty.
Fix: Use the OrthoFinder version GENESPACE expects (currently OrthoFinder 2.5.4 for GENESPACE 1.4.x). Pin via conda env. Future GENESPACE versions will adapt to OrthoFinder 3 layout (Lovell update expected).
Microsynteny vs macrosynteny conflation
Trigger: Reporting "synteny" without specifying scale.
Mechanism: Macrosynteny (same chromosome) is detectable across hundreds of millions of years but decays as rearrangements accumulate; microsynteny (same order within local region) can be deeply conserved even when macrosynteny is lost. Conflating them produces misleading "synteny loss" claims.
Symptom: Reports of "synteny lost between species X and Y" when both share microsyntenic gene clusters; or vice versa.
Fix: Always specify scale. SynNet (Zhao 2017) explicitly separates the two. MCScanX -s parameter (minimum block anchors) at 5 = microsynteny; at 20+ = macrosynteny. Report block-size distribution.
Polyploid / WGD-affected genome ambiguity
Trigger: Running MCScanX on a polyploid (e.g. allohexaploid wheat) without subgenome assignment.
Mechanism: WGD doubles all genes; synteny is between subgenomes within the polyploid AND across to outgroup. Without subgenome assignment, all paralogs and orthologs collapse into the same blocks.
Symptom: Many "1:many" or "many:many" synteny relationships; per-chromosome synteny counts indicate doubled or tripled blocks; Ks distribution multimodal.
Fix: Use AnchorWave proali with explicit ploidy specification. Alternatively, run synteny twice: within polyploid (subgenome-vs-subgenome) and across to outgroup. See [[whole-genome-duplication]] for subgenome assignment workflow.
Quantitative Thresholds
Quantity
Threshold
Source / Rationale
Assembly N50 for synteny
>= 1 Mb
Below this, results tool-dependent and unreliable; chromosome-level strongly preferred
MCScanX -s (minimum anchors per block)
5 default; 10 stringent; 3 sensitive
Standard configuration; 5 is balance
MCScanX -m (maximum gaps between anchors)
25 default
Higher for distant species; lower for recent
MCScanX -k (match score per anchor)
50 default
Higher rewards longer blocks
MCScanX -e (BLAST e-value)
1e-5 default; 1e-10 for close species
Stricter for recent radiations
BLAST evalue threshold
1e-5 to 1e-10 typical
Depends on divergence
JCVI --cscore for reciprocal best
0.7 default; 0.95 near-RBH; 0.99 RBH-only
Higher = fewer false positives, fewer hits
Tandem duplicate window
5-10 genes (MCScanX default 5; JCVI 10)
Wang 2012; species-specific tuning
SyRI INV minimum size for biological significance
>= 5 kb
Below this, alignment noise dominates
SyRI TRANS minimum size
>= 1 kb
Standard convention
GENESPACE minimum syntenic block
5 orthogroups
Lovell 2022 default
Synteny block decay (macrosynteny half-life)
~150 Myr in vertebrates
Approximate convention
Microsynteny conservation
up to 1 Gyr for metabolic gene clusters
Stated convention; verify per-clade
minimap2 preset for synteny
-x asm5 for < 5% divergence; asm10 for ~10%; asm20 for ~20%
minimap2 docs
MUMmer nucmer maxmatch
--maxmatch for SyRI; --mum default
MUMmer4 manual
Ks for syntenic block age (cross-references WGD)
Ks 0.1-0.5 recent; 0.5-1.5 older; > 1.5 saturated
See [[whole-genome-duplication]] for Ks plot interpretation
Repeat masking minimum
>= 90% of known TE families masked (RepeatMasker .tbl)
Below this, expect spurious synteny
MCScanX Standard Pipeline
Goal: Detect collinear gene blocks between two genomes.
Approach: Prepare 4-column BED with species prefix -> all-vs-all BLASTP -> run MCScanX -> parse .collinearity -> classify blocks.
'''Parse MCScanX .collinearity and classify synteny relationships.'''import re
from collections import defaultdict
defparse_collinearity(path):
'''Returns list of dicts: {block_id, n_anchors, e_value, score, gene_pairs: [(g1, g2), ...]}'''
blocks = []
current = Nonewithopen(path) as fh:
for line in fh:
if line.startswith('## Alignment'):
if current:
blocks.append(current)
m = re.match(r'## Alignment (\d+): score=([0-9.]+) e_value=([0-9.e\-]+) N=(\d+)', line)
if m:
current = {
'block_id': int(m.group(1)),
'score': float(m.group(2)),
'e_value': float(m.group(3)),
'n_anchors': int(m.group(4)),
'gene_pairs': []
}
elif current and':'in line and'\t'in line:
parts = line.strip().split()
iflen(parts) >= 3:
current['gene_pairs'].append((parts[1], parts[2]))
if current:
blocks.append(current)
return blocks
defclassify_chromosome_synteny(blocks, gene_to_chr):
'''Classify syntenic chromosome relationships: 1-1, 1-many, many-many.'''
a_partners = defaultdict(set)
for blk in blocks:
for g1, g2 in blk['gene_pairs']:
c1, c2 = gene_to_chr.get(g1), gene_to_chr.get(g2)
if c1 and c2:
a_partners[c1].add(c2)
result = {}
for chr_a, partners in a_partners.items():
n = len(partners)
result[chr_a] = '1-1'if n == 1else ('1-many'if n <= 3else'many-many')
return result
GENESPACE Plant-Focused Pipeline
Goal: Build pan-gene tracks across N plant genomes with orthology-anchored synteny visualization.
Approach: Format input: per-species GFF + protein FASTA -> initialize -> run -> riparian plot.
GENESPACE outputs include results/syntenicHits.txt (anchor pairs), results/pangenes.txt (pan-gene presence/absence matrix), and results/riparian.pdf (riparian visualization). Pan-gene tracks across species are particularly useful for identifying lineage-specific genes (cf. pangenome-analysis for bacterial scope).
SyRI for Structural Rearrangement Inventory
Goal: Identify INVs, TRANSs, DUPs, INS, DEL between two chromosome-level genome assemblies.
Approach: Align with minimap2 -x asm5 -> filter to chromosome-level mappings -> run SyRI -> visualize with plotsr.
Discard synteny calls between scaffold and its reference
Operational rule for publication: Synteny block annotation requires (1) BUSCO/Compleasm > 90% complete on both genomes; (2) softmasked repeats verified; (3) at least one cross-validation tool (MCScanX vs JCVI or MCScanX vs GENESPACE); (4) microsynteny vs macrosynteny scale explicit; (5) for SV calls, plotsr / SyRI followed by manual review of large rearrangements with read-coverage support.
Cohort Gotchas
Polyploid plants: WGD events confound 1:1 synteny; use AnchorWave or subgenome-assigned analysis
Salmonids / fish 4R: Ts3R + Ss4R WGD events; ohnologs (WGD paralogs) appear as syntenic but not orthologous; cross-reference [[whole-genome-duplication]]
Mammalian X chromosome: Massive recombination suppression; "synteny" sometimes inverted in opposite sex; verify strand convention
Centromeric regions: generally unalignable; synteny tools may produce false breaks near centromeres
Telomeres: assembly often incomplete; synteny calls near telomere boundaries unreliable
Sex chromosomes: rapidly evolving; lower synteny signal than autosomes
Plant B chromosomes: supernumerary; exclude from synteny analysis
For GENESPACE, OrthoFinder 2.5.x must be pinned; install via conda install -c bioconda orthofinder=2.5.5. JCVI is the most generally useful Python toolkit; install per-project alongside specific synteny tools.
References
Wang Y et al 2012 NAR 40:e49 (MCScanX)
Tang H et al 2008 GR 18:1944 (synteny / MCScan Python)
Lovell JT et al 2022 eLife 11:e78526 (GENESPACE)
Proost S et al 2012 NAR 40:e11 (i-ADHoRe 3.0)
Song B et al 2022 PNAS 119:e2113075119 (AnchorWave)
Goel M et al 2019 Genome Biol 20:277 (SyRI)
Goel M et al 2022 Bioinformatics 38:2922 (plotsr)
Zhao T et al 2017 Plant Cell 29:1278 (SynNet synteny network)
Marçais G et al 2018 PLoS Comp Biol 14:e1005944 (MUMmer4)
Kent WJ et al 2003 PNAS 100:11484 (chains and nets)
Schwartz S et al 2003 GR 13:103 (BLASTZ pairwise aligner)
Jain C et al 2018 Bioinformatics 34:i748 (MashMap)
Li H 2018 Bioinformatics 34:3094 (minimap2)
Holland PWH et al 1994 Development Suppl:125 (2R hypothesis)
Vanneste K et al 2013 MBE 30:177 (Ks saturation)
Birchler JA & Veitia RA 2007 Plant Cell 19:395 (gene balance)
Force A et al 1999 Genetics 151:1531 (subfunctionalization)
Zhao T & Schranz ME 2017 Curr Opin Plant Biol 36:129 (synteny network for phylogeny)