Structural variants (Dog10K)
The tutorials target the JBrowse v5 beta, and the v4.3.0 release
on the download page lacks some of what they show. To install the
beta of JBrowse Web, run npm install -g @jbrowse/cli@next, then
jbrowse create jbrowse2 --branch v5.0.0-beta.13. Desktop beta builds are coming soon.
Dog breeds differ by large structural variants, some of them tied to a breed's traits. We slice four loci out of the Dog10K callsets over HTTP and show each animal's genotype as one row, labelled by breed, under the gene the variant sits in:
- a deletion in NHEJ1 behind Collie eye anomaly
- a duplication of the amylase gene AMY2B
- a SINE insertion in RNASE1
- the footprint an FGF4 retrogene leaves at its parent gene
Prerequisites
- the
UU_Cfam_GSD_1.0dog assembly set up in JBrowse (UCSC calls it canFam4, see the assemblies guide) bcftoolsbuilt with libcurlcurlpython3- htslib (
tabix) minimap2andsamtools, for the FGF4 alignments- the UCSC
liftOverbinary for the OMIA track, which the build script fetches itself
On Debian/Ubuntu, apt install bcftools samtools minimap2 tabix curl python3
covers the rest. The scripts write local files, which
JBrowse Desktop opens by path and JBrowse Web takes
through Add track.
Where the data comes from
Two Dog10K structural-variant callsets from Schall & Kidd (2025), read directly over HTTP, plus supporting UCSC and OMIA tracks and two sequenced retrocopies from GenBank.
The build scripts take these files from their URLs, so there is nothing to download by hand.
- the Zenodo Paragraph callset, 5.9 GB, with the NHEJ1 deletion and the RNASE1 insertion: zenodo.org/…/contenthttps://zenodo.org/api/records/14968874/files/Dog10k_manta_paragraph.vcf.gz/content
- the Michigan Manta aggregate callset, 1.08 GB, with the AMY2B duplication and the FGF4 intron records: kiddlabshare.med.umich.edu/…/SV-genotype-v2.merge.agg_only.08032022.vcf.gzhttps://kiddlabshare.med.umich.edu/dog10K/Manta-SV_2022-03-28/SV-genotype-v2.merge.agg_only.08032022.vcf.gz
- the sample table, breed and category per animal, behind every figure on this page: kiddlabshare.med.umich.edu/…/dog10K-alignment-sample-table.2022-02-23-v7.txthttps://kiddlabshare.med.umich.edu/dog10K/sample-information/dog10K-alignment-sample-table.2022-02-23-v7.txt
- OMIA's own dump, curating the Collie eye anomaly record independently of either callset: omia.org/…/omia.sql.gzhttps://omia.org/static/omia.sql.gz
- the canFam3-to-canFam4 chain that lifts OMIA's coordinates: hgdownload.soe.ucsc.edu/…/canFam3ToCanFam4.over.chain.gzhttps://hgdownload.soe.ucsc.edu/goldenPath/canFam3/liftOver/canFam3ToCanFam4.over.chain.gz
- the
UU_Cfam_GSD_1.0gene annotation from genomes.jbrowse.org's canFam4, checking the FGF4 records against the gene's introns and drawing the parent-gene track in the synteny figure: jbrowse.org/…/ncbiRefSeq.gff.gzhttps://jbrowse.org/ucsc/canFam4/ncbiRefSeq.gff.gz - the CFA18 retrocopy, MF040222, fetched from GenBank: eutils.ncbi.nlm.nih.gov/…/efetch.fcgihttps://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nuccore&id=MF040222&rettype=fasta&retmode=text
- the CFA12 retrocopy, MF040221, fetched from GenBank: eutils.ncbi.nlm.nih.gov/…/efetch.fcgihttps://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nuccore&id=MF040221&rettype=fasta&retmode=text
- the FGF4 parent-locus sequence the two retrocopies are aligned against, over UCSC's canFam4 REST API: api.genome.ucsc.edu/…/sequencehttps://api.genome.ucsc.edu/getData/sequence?genome=canFam4;chrom=chr18;start=48865000;end=48876000
Loading the UU_Cfam_GSD_1.0 dog assembly
The tracks name UU_Cfam_GSD_1.0, the Dog10K reference that UCSC calls canFam4.
We load it from UCSC's 2bit, with the alias file that maps the chr names to
GenBank accessions:
Goes in the assemblies array of config.json. See Assemblies.
{
"name": "UU_Cfam_GSD_1.0",
"aliases": ["canFam4"],
"sequence": {
"adapter": {
"type": "TwoBitAdapter",
"uri": "https://hgdownload.soe.ucsc.edu/goldenPath/canFam4/bigZips/canFam4.2bit"
}
},
"refNameAliases": {
"uri": "https://hgdownload.soe.ucsc.edu/goldenPath/canFam4/bigZips/canFam4.chromAlias.txt"
}
}jbrowse add-assembly https://hgdownload.soe.ucsc.edu/goldenPath/canFam4/bigZips/canFam4.2bit \
--name UU_Cfam_GSD_1.0 \
--alias canFam4 \
--refNameAliases https://hgdownload.soe.ucsc.edu/goldenPath/canFam4/bigZips/canFam4.chromAlias.txtA 7.8 kb deletion in NHEJ1
Schall and Kidd genotyped long-read-discovered structural variants across the Dog10K collection and flagged those whose allele frequencies track breed clades (groups of related breeds). One is a 7.8 kb deletion in an intron of NHEJ1, the variant Parker et al. (2007) tied to Collie eye anomaly, which should be common in Collies and their relatives and absent from unrelated breeds and wolves. The anomaly is recessive, so the darker cells below are affected animals and the lighter ones carriers.
Slicing the NHEJ1 locus out of the Paragraph callset
The Paragraph callset (Manta's structural variant calls, genotyped in every
sample with Illumina's Paragraph) is a 5.9 GB VCF across 1,879 dogs and wolves,
published on Zenodo with a tabix
index, so bcftools fetches only the locus. Zenodo serves the data and index
from separate URLs, so the index is named explicitly:
Z=https://zenodo.org/api/records/14968874/files
SV=$Z/Dog10k_manta_paragraph.vcf.gz/content
SVI=$Z/Dog10k_manta_paragraph.vcf.gz.tbi/content
# --force-samples: skip names in sv.samples that the VCF lacks
bcftools view -r chr37:25500000-25620000 -S sv.samples --force-samples \
-Oz -o dog10k_nhej1_svs.vcf.gz "$SV##idx##$SVI"
tabix -p vcf dog10k_nhej1_svs.vcf.gzsv.samples comes from the Dog10K sample table and lists:
- every Collie, Shetland Sheepdog and Silken Windhound in the analysis set
- four Lancashire Heelers, a breed where Collie eye anomaly is reported
- Australian Shepherds, German Shepherds and Labrador Retrievers, breeds with no reported association
- four Greek gray wolves, the outgroup
Read the genotypes directly first:
bcftools query -r chr37:25574005-25574006 -f '[%SAMPLE=%GT ]\n' \
dog10k_nhej1_svs.vcf.gz | tr ' ' '\n' | grep -v '=0/0'Most Collies have it, some homozygous, as do some Shetland Sheepdogs and Silken Windhounds. Every other animal, including the four Lancashire Heelers, is homozygous reference.
Loading the NHEJ1 slice with breed labels
An SV VCF loads as an ordinary VariantTrack. The multi-sample variant display
draws one row per sample across the variant's genomic span, so a 7.8 kb deletion
is a 7.8 kb block.
Goes in the tracks array of config.json. See Tracks.
{
"trackId": "dog10k_nhej1_svs",
"name": "Dog10K structural variants at NHEJ1",
"uri": "dog10k_nhej1_svs.vcf.gz",
"assemblyNames": ["UU_Cfam_GSD_1.0"]
}jbrowse add-track dog10k_nhej1_svs.vcf.gz \
--trackId dog10k_nhej1_svs \
--name "Dog10K structural variants at NHEJ1" \
--assemblyNames UU_Cfam_GSD_1.0 \
--load copyIn JBrowse Desktop, or in any running JBrowse Web session, open a view on this track’s assembly, then File → Open track..., choose Add track from pasted JSON, and paste:
{
"trackId": "dog10k_nhej1_svs",
"name": "Dog10K structural variants at NHEJ1",
"uri": "dog10k_nhej1_svs.vcf.gz",
"assemblyNames": ["UU_Cfam_GSD_1.0"]
}dog10k_nhej1_svs.vcf.gz is relative to a config.json. Replace it with its URL or its path on this computer.
The VCF names each sample by its Dog10K ID. In grammar-of-graphics terms, rows
orders the sample rows and names them, and rowColor is a color scale on each
row's label bar. The session below sets both for two animals, and the figure
does so for every row. Edit colors/arrangement... in the track menu writes
both as you rename and recolor rows by hand, and Advanced → Edit plot...
shows them as text.
Goes at the top level of config.json, replacing any defaultSession there. See Default session.
{
"defaultSession": {
"name": "NHEJ1 deletion",
"views": [
{
"type": "LinearGenomeView",
"assembly": "UU_Cfam_GSD_1.0",
"loc": "chr37:25,570,000-25,580,000",
"tracks": [
{
"trackId": "dog10k_nhej1_svs",
"type": "LinearMultiSampleVariantDisplay",
"rows": {
"domain": ["COLL000001", "CLUPGR000001"],
"labels": { "COLL000001": "Collie 1", "CLUPGR000001": "Wolf 1" }
},
"rowColor": {
"domain": ["COLL000001", "CLUPGR000001"],
"range": ["#0072B2", "#E69F00"]
}
}
]
}
]
}
}jbrowse set-default-session --session - << 'EOF'
{
"name": "NHEJ1 deletion",
"views": [
{
"type": "LinearGenomeView",
"assembly": "UU_Cfam_GSD_1.0",
"loc": "chr37:25,570,000-25,580,000",
"tracks": [
{
"trackId": "dog10k_nhej1_svs",
"type": "LinearMultiSampleVariantDisplay",
"rows": {
"domain": ["COLL000001", "CLUPGR000001"],
"labels": { "COLL000001": "Collie 1", "CLUPGR000001": "Wolf 1" }
},
"rowColor": {
"domain": ["COLL000001", "CLUPGR000001"],
"range": ["#0072B2", "#E69F00"]
}
}
]
}
]
}
EOFNHEJ1 deletion genotypes across breeds
Open the session above and add the assembly's gene annotation to see where the deletion falls in NHEJ1.
Checking the NHEJ1 deletion against OMIA's curated record
The middle track is OMIA, Online Mendelian Inheritance in Animals, which curates the published causal variants of Mendelian traits. Its Collie eye anomaly record (OMIA 000218-9615) is this deletion. OMIA gives the span on CanFam3.1, and the build script lifts it to canFam4 with the UCSC chain:
curl -fO https://hgdownload.soe.ucsc.edu/goldenPath/canFam3/liftOver/canFam3ToCanFam4.over.chain.gz
./liftOver omia_canFam3.bed canFam3ToCanFam4.over.chain.gz lifted.bed unmapped.bed
wc -l < unmapped.bed # records the chain could not placeGoes in the tracks array of config.json. See Tracks.
{
"trackId": "omia_dog_variants",
"name": "OMIA causal variants (dog)",
"uri": "omia_dog_variants.gff3.gz",
"assemblyNames": ["UU_Cfam_GSD_1.0"],
"displayDefaults": {
"labels": { "description": "jexl:feature.inheritance" }
}
}jbrowse add-track omia_dog_variants.gff3.gz \
--trackId omia_dog_variants \
--name "OMIA causal variants (dog)" \
--assemblyNames UU_Cfam_GSD_1.0 \
--displayDefaults '{"labels":{"description":"jexl:feature.inheritance"}}' \
--load copyIn JBrowse Desktop, or in any running JBrowse Web session, open a view on this track’s assembly, then File → Open track..., choose Add track from pasted JSON, and paste:
{
"trackId": "omia_dog_variants",
"name": "OMIA causal variants (dog)",
"uri": "omia_dog_variants.gff3.gz",
"assemblyNames": ["UU_Cfam_GSD_1.0"],
"displayDefaults": {
"labels": { "description": "jexl:feature.inheritance" }
}
}omia_dog_variants.gff3.gz is relative to a config.json. Replace it with its URL or its path on this computer.
The label under the bar gives the mode of inheritance, and clicking the bar opens the rest of the record, including whether the build lifted it from CanFam3.1.
Filtering the NHEJ1 window to the deletion record
The figure filters the window's SV records to the 7.8 kb deletion:
Goes in the tracks array of config.json. See Tracks.
{
"type": "VariantTrack",
"trackId": "dog10k_nhej1_svs",
"name": "Dog10K structural variants at NHEJ1",
"uri": "dog10k_nhej1_svs.vcf.gz",
"assemblyNames": ["UU_Cfam_GSD_1.0"],
"displays": [
{
"type": "LinearMultiSampleVariantDisplay",
"filter": ["jexl:feature.start == 25574004"]
}
]
}jbrowse add-track-json '{
"type": "VariantTrack",
"trackId": "dog10k_nhej1_svs",
"name": "Dog10K structural variants at NHEJ1",
"uri": "dog10k_nhej1_svs.vcf.gz",
"assemblyNames": ["UU_Cfam_GSD_1.0"],
"displays": [
{
"type": "LinearMultiSampleVariantDisplay",
"filter": ["jexl:feature.start == 25574004"]
}
]
}'In JBrowse Desktop, or in any running JBrowse Web session, open a view on this track’s assembly, then File → Open track..., choose Add track from pasted JSON, and paste:
{
"type": "VariantTrack",
"trackId": "dog10k_nhej1_svs",
"name": "Dog10K structural variants at NHEJ1",
"uri": "dog10k_nhej1_svs.vcf.gz",
"assemblyNames": ["UU_Cfam_GSD_1.0"],
"displays": [
{
"type": "LinearMultiSampleVariantDisplay",
"filter": ["jexl:feature.start == 25574004"]
}
]
}dog10k_nhej1_svs.vcf.gz is relative to a config.json. Replace it with its URL or its path on this computer.
Without the filter, a second deletion nested inside the 7.8 kb one draws yellow no-calls over the dark blue rows, so the two records look like one striped block. The no-calls are the dogs homozygous for the larger deletion, because a dog with no copy of the surrounding sequence has no reads to genotype it from:
# -r also returns records that span the region, so -i keeps the one starting here
bcftools query -r chr37:25578185-25578186 -i 'POS=25578185' \
-f '[%SAMPLE=%GT ]\n' dog10k_nhej1_svs.vcf.gz \
| tr ' ' '\n' | grep -v '=0/0'AMY2B duplication and RNASE1 insertion
A 14.9 kb duplication (DUP) at chr6:47,375,677 in the Michigan Manta callset
spans the pancreatic amylase gene AMY2B end to end. Extra copies help dogs
digest starch, a change
Axelsson et al. (2013) tied to
domestication. Across the whole collection, nearly every dog is homozygous for
the record and nearly every wolf lacks it.
A 223 bp SINE (short interspersed nuclear element) insertion in pancreatic
ribonuclease (RNASE1), at chr15:18,164,072 in the Zenodo Paragraph set, occurs
in wolves and almost no dogs.
build_dog10k_amy2b_sv.sh
prints both records' genotypes tallied by population.
The build script slices the same animals from both callsets in the same order, so the two tracks line up row for row:
- two ordinary breeds
- the three Arctic breeds
- the English Springer Spaniels and Czechoslovakian Wolfdogs
- the Alaskan village dogs
- every gray wolf, labelled by country
Goes in the tracks array of config.json. See Tracks.
{
"type": "VariantTrack",
"trackId": "dog10k_amy2b_svs",
"name": "Dog10K structural variants at AMY2B (dogs and every wolf)",
"assemblyNames": ["UU_Cfam_GSD_1.0"],
"adapter": {
"type": "VcfTabixAdapter",
"uri": "dog10k_amy2b_svs.vcf.gz",
"samplesTsvLocation": { "uri": "dog10k_amy2b_samples.tsv" }
},
"displays": [
{
"type": "LinearMultiSampleVariantDisplay",
"rowColor": "group",
"height": 900
}
]
}jbrowse add-track-json '{
"type": "VariantTrack",
"trackId": "dog10k_amy2b_svs",
"name": "Dog10K structural variants at AMY2B (dogs and every wolf)",
"assemblyNames": ["UU_Cfam_GSD_1.0"],
"adapter": {
"type": "VcfTabixAdapter",
"uri": "dog10k_amy2b_svs.vcf.gz",
"samplesTsvLocation": { "uri": "dog10k_amy2b_samples.tsv" }
},
"displays": [
{
"type": "LinearMultiSampleVariantDisplay",
"rowColor": "group",
"height": 900
}
]
}'In JBrowse Desktop, or in any running JBrowse Web session, open a view on this track’s assembly, then File → Open track..., choose Add track from pasted JSON, and paste:
{
"type": "VariantTrack",
"trackId": "dog10k_amy2b_svs",
"name": "Dog10K structural variants at AMY2B (dogs and every wolf)",
"assemblyNames": ["UU_Cfam_GSD_1.0"],
"adapter": {
"type": "VcfTabixAdapter",
"uri": "dog10k_amy2b_svs.vcf.gz",
"samplesTsvLocation": { "uri": "dog10k_amy2b_samples.tsv" }
},
"displays": [
{
"type": "LinearMultiSampleVariantDisplay",
"rowColor": "group",
"height": 900
}
]
}dog10k_amy2b_svs.vcf.gz, dog10k_amy2b_samples.tsv are relative to a config.json. Replace each with its URL or its path on this computer.
A samples TSV labels these 86 rows. Its first column is the sample name and
every other column is an attribute that rowColor can name. The RNASE1 track
is the same config with the other slice's uri.
The grey Czechoslovakian Wolfdog row is CZEC000003, the animal the local-ancestry tutorial paints wolf-derived blocks on. Every wolf with the insertion is heterozygous.
A genotype records whether an animal has the duplication, so an animal with four
copies and one with twenty are both 1/1.
The CYP1A2 tutorial measures
copy number from the SNV callset's per-sample DP.
An FGF4 retrogene called as intron deletions
Parker et al. (2009) tied breed-defining short legs to an expressed FGF4 retrogene, a copy of the spliced FGF4 mRNA reinserted elsewhere in the genome. The copy has no introns, so short reads from it map to the parent gene's exons and stop at each splice site, and a short-read caller reports each intron as a deletion. The callset therefore records the retrogene as intron deletions that look like real ones.
Checking the records against the FGF4 introns
FGF4 has two introns, so a retrocopy should leave two records, each spanning
one intron end to end.
build_dog10k_fgf4_retrogene.sh
derives the introns from the RefSeq annotation and asserts each record against
them, with one base of slack at each breakpoint:
FGF4 RefSeq exons: 48869443-48869782, 48870315-48870418, 48870953-48873311
FGF4 RefSeq introns: 48869783-48870314 (532 bp), 48870419-48870952 (534 bp)
intron 48869783-48870314: called as a DEL of 532 bp at 48869783-48870314
intron 48870419-48870952: called as a DEL of 534 bp at 48870418-48870951Slicing the two FGF4 intron records out of the Manta callset
The FGF4 records come from the Michigan aggregate Manta callset, which has
DUP and INV records too. Selecting on POS keeps the two intron records:
SHARE=https://kiddlabshare.med.umich.edu/dog10K
SV=$SHARE/Manta-SV_2022-03-28/SV-genotype-v2.merge.agg_only.08032022.vcf.gz
# --force-samples: skip names in fgf4.samples that the VCF lacks
bcftools view -r chr18:48865000-48876000 -S fgf4.samples --force-samples \
-i 'POS=48869782 || POS=48870417' \
-Oz -o dog10k_fgf4_svs.vcf.gz "$SV"
tabix -p vcf dog10k_fgf4_svs.vcf.gzfgf4.samples holds whole breeds: three breeds whose short legs are the trait
Parker et al. mapped, two spaniel breeds, two standard-proportioned breeds, and
the Greek gray wolves. A samples TSV labels the rows, and rowColor paints its
group column, a breed's body proportions.
Goes in the tracks array of config.json. See Tracks.
{
"type": "VariantTrack",
"trackId": "dog10k_fgf4_svs",
"name": "Dog10K structural variants at FGF4 (named breeds)",
"assemblyNames": ["UU_Cfam_GSD_1.0"],
"adapter": {
"type": "VcfTabixAdapter",
"uri": "dog10k_fgf4_svs.vcf.gz",
"samplesTsvLocation": { "uri": "dog10k_fgf4_samples.tsv" }
},
"displays": [
{
"type": "LinearMultiSampleVariantDisplay",
"rowColor": "group",
"height": 690
}
]
}jbrowse add-track-json '{
"type": "VariantTrack",
"trackId": "dog10k_fgf4_svs",
"name": "Dog10K structural variants at FGF4 (named breeds)",
"assemblyNames": ["UU_Cfam_GSD_1.0"],
"adapter": {
"type": "VcfTabixAdapter",
"uri": "dog10k_fgf4_svs.vcf.gz",
"samplesTsvLocation": { "uri": "dog10k_fgf4_samples.tsv" }
},
"displays": [
{
"type": "LinearMultiSampleVariantDisplay",
"rowColor": "group",
"height": 690
}
]
}'In JBrowse Desktop, or in any running JBrowse Web session, open a view on this track’s assembly, then File → Open track..., choose Add track from pasted JSON, and paste:
{
"type": "VariantTrack",
"trackId": "dog10k_fgf4_svs",
"name": "Dog10K structural variants at FGF4 (named breeds)",
"assemblyNames": ["UU_Cfam_GSD_1.0"],
"adapter": {
"type": "VcfTabixAdapter",
"uri": "dog10k_fgf4_svs.vcf.gz",
"samplesTsvLocation": { "uri": "dog10k_fgf4_samples.tsv" }
},
"displays": [
{
"type": "LinearMultiSampleVariantDisplay",
"rowColor": "group",
"height": 690
}
]
}dog10k_fgf4_svs.vcf.gz, dog10k_fgf4_samples.tsv are relative to a config.json. Replace each with its URL or its path on this computer.
Every animal with the insertion is heterozygous: the parent gene's introns are still on both chromosomes, so each such animal's pileup is always a mixture.
The two known FGF4 retrocopies
Dogs have two known FGF4 retrocopies. Both leave the same records at the parent gene, so a genotype here cannot say which copy an animal has:
- one, tied to short legs by Parker et al.
- a second, on a different chromosome, tied to chondrodystrophy and intervertebral disc disease by Brown et al. (2017), which is why breeds of ordinary proportions have a copy too
The spaniels are the rows where body proportions and genotype disagree, and placing either insertion needs the other side of the junction from a different callset.
Aligning the retrocopies to FGF4
Brown et al. deposited Sanger sequences of both retrocopies: MF040222 for the CFA18 insertion and MF040221 for the CFA12 one. Align each against the parent locus, cut out as a separate FASTA:
# -x splice aligns across the parent's introns; -c writes the base-level CIGAR
samtools faidx parent.fa
minimap2 -x splice -c parent.fa FGF4retro-CFA12.fa > FGF4retro-CFA12.pafLoad each retrocopy as a one-contig assembly, from the indexed FASTA the build script writes:
Goes in the assemblies array of config.json. See Assemblies.
{
"name": "FGF4retro-CFA12",
"uri": "FGF4retro-CFA12.fa"
}jbrowse add-assembly FGF4retro-CFA12.fa \
--name FGF4retro-CFA12 \
--load copyIn JBrowse Desktop, Open new genome on the start screen (or File → Open genome... in a session), then Open from a URL and paste, one per line:
FGF4retro-CFA12.fa
FGF4retro-CFA12.fa.faiJBrowse reads the format off the file name. Then fill in:
- Genome name:
FGF4retro-CFA12
FGF4retro-CFA12.fa is relative to a config.json. Replace it with its URL or its path on this computer.
Goes in the assemblies array of config.json. See Assemblies.
{
"name": "FGF4retro-CFA18",
"uri": "FGF4retro-CFA18.fa"
}jbrowse add-assembly FGF4retro-CFA18.fa \
--name FGF4retro-CFA18 \
--load copyIn JBrowse Desktop, Open new genome on the start screen (or File → Open genome... in a session), then Open from a URL and paste, one per line:
FGF4retro-CFA18.fa
FGF4retro-CFA18.fa.faiJBrowse reads the format off the file name. Then fill in:
- Genome name:
FGF4retro-CFA18
FGF4retro-CFA18.fa is relative to a config.json. Replace it with its URL or its path on this computer.
Each alignment is a SyntenyTrack between its retrocopy and the dog assembly:
Goes in the tracks array of config.json. See Tracks.
{
"type": "SyntenyTrack",
"trackId": "dog10k_fgf4_retro_cfa12",
"name": "FGF4 CFA12 retrocopy (MF040221) vs its parent gene",
"assemblyNames": ["FGF4retro-CFA12", "UU_Cfam_GSD_1.0"],
"adapter": {
"type": "PAFAdapter",
"uri": "dog10k_fgf4_retro_cfa12.paf",
"queryAssembly": "FGF4retro-CFA12",
"targetAssembly": "UU_Cfam_GSD_1.0"
}
}jbrowse add-track-json '{
"type": "SyntenyTrack",
"trackId": "dog10k_fgf4_retro_cfa12",
"name": "FGF4 CFA12 retrocopy (MF040221) vs its parent gene",
"assemblyNames": ["FGF4retro-CFA12", "UU_Cfam_GSD_1.0"],
"adapter": {
"type": "PAFAdapter",
"uri": "dog10k_fgf4_retro_cfa12.paf",
"queryAssembly": "FGF4retro-CFA12",
"targetAssembly": "UU_Cfam_GSD_1.0"
}
}'In JBrowse Desktop, or in any running JBrowse Web session, open a view on this track’s assembly, then File → Open track..., choose Add track from pasted JSON, and paste:
{
"type": "SyntenyTrack",
"trackId": "dog10k_fgf4_retro_cfa12",
"name": "FGF4 CFA12 retrocopy (MF040221) vs its parent gene",
"assemblyNames": ["FGF4retro-CFA12", "UU_Cfam_GSD_1.0"],
"adapter": {
"type": "PAFAdapter",
"uri": "dog10k_fgf4_retro_cfa12.paf",
"queryAssembly": "FGF4retro-CFA12",
"targetAssembly": "UU_Cfam_GSD_1.0"
}
}dog10k_fgf4_retro_cfa12.paf is relative to a config.json. Replace it with its URL or its path on this computer.
That shows it in the linear view. For the synteny view, open Add → Linear synteny view, pick the track under Quick start, and click Launch.
Goes in the tracks array of config.json. See Tracks.
{
"type": "SyntenyTrack",
"trackId": "dog10k_fgf4_retro_cfa18",
"name": "FGF4 CFA18 retrocopy (MF040222) vs its parent gene",
"assemblyNames": ["FGF4retro-CFA18", "UU_Cfam_GSD_1.0"],
"adapter": {
"type": "PAFAdapter",
"uri": "dog10k_fgf4_retro_cfa18.paf",
"queryAssembly": "FGF4retro-CFA18",
"targetAssembly": "UU_Cfam_GSD_1.0"
}
}jbrowse add-track-json '{
"type": "SyntenyTrack",
"trackId": "dog10k_fgf4_retro_cfa18",
"name": "FGF4 CFA18 retrocopy (MF040222) vs its parent gene",
"assemblyNames": ["FGF4retro-CFA18", "UU_Cfam_GSD_1.0"],
"adapter": {
"type": "PAFAdapter",
"uri": "dog10k_fgf4_retro_cfa18.paf",
"queryAssembly": "FGF4retro-CFA18",
"targetAssembly": "UU_Cfam_GSD_1.0"
}
}'In JBrowse Desktop, or in any running JBrowse Web session, open a view on this track’s assembly, then File → Open track..., choose Add track from pasted JSON, and paste:
{
"type": "SyntenyTrack",
"trackId": "dog10k_fgf4_retro_cfa18",
"name": "FGF4 CFA18 retrocopy (MF040222) vs its parent gene",
"assemblyNames": ["FGF4retro-CFA18", "UU_Cfam_GSD_1.0"],
"adapter": {
"type": "PAFAdapter",
"uri": "dog10k_fgf4_retro_cfa18.paf",
"queryAssembly": "FGF4retro-CFA18",
"targetAssembly": "UU_Cfam_GSD_1.0"
}
}dog10k_fgf4_retro_cfa18.paf is relative to a config.json. Replace it with its URL or its path on this computer.
That shows it in the linear view. For the synteny view, open Add → Linear synteny view, pick the track under Quick start, and click Launch.
assemblyNames is ordered [query, target], the reverse of minimap2's argument
order. The build script turns each FGF4retro-*.paf into the file the track
loads, dog10k_fgf4_retro_cfa12.paf and its CFA18 twin. For each file it:
- renames the target to
chr18and shifts its coordinates by the window's start - rewrites each CIGAR
NtoD, since those bases are absent from the retrocopy - writes each GenBank feature table as GFF3 for the gene model, and checks that the CDS is a single interval (the parent's has three)
To put the parent gene between the two retrocopies, we:
- Choose Add → Linear synteny view, switch to Manual, and set the rows
to
FGF4retro-CFA18,UU_Cfam_GSD_1.0andFGF4retro-CFA12, top to bottom. - Give the upper pair the CFA18 alignment and the lower pair the CFA12 one, then click Launch.
- Open the view's sliders menu and set CIGAR indels → Transparent indels. Colored indels would show one gap as a deletion above the parent row and an insertion below it, because each ribbon reads the CIGAR from its own side.
The window ends where the CFA18 alignment does, and the CFA12 ribbon runs past it.
Slicing more clade-associated SVs from Schall and Kidd
Any clade-associated SV on Schall and Kidd's list slices and loads the same way. Another retrogene shows up as a gene whose introns are all called deleted in some animals, and each record should match an annotated intron to the base, as the FGF4 check does.
Reproduce it end to end
Five scripts build the tracks in the figures; see
Prerequisites. Each writes a *_build/ directory.
BASE=https://raw.githubusercontent.com/GMOD/jbrowse-components/main/scripts
curl -fO $BASE/build_dog10k_nhej1_sv.sh
curl -fO $BASE/build_omia_dog_variants.sh
curl -fO $BASE/build_dog10k_amy2b_sv.sh
curl -fO $BASE/build_dog10k_fgf4_retrogene.sh
curl -fO $BASE/build_dog10k_fgf4_synteny.sh
bash build_dog10k_nhej1_sv.sh
bash build_omia_dog_variants.sh
bash build_dog10k_amy2b_sv.sh
bash build_dog10k_fgf4_retrogene.sh
bash build_dog10k_fgf4_synteny.shbuild_omia_dog_variants.shreads OMIA's nightly mysqldump, since OMIA has no coordinate API. OMIA updates the database continuously, so the record count changes from day to day.build_dog10k_fgf4_retrogene.shalso writesdog10k_fgf4_cohort_svs, the two FGF4 intron records over every canid in the callset, which this tutorial's config holds as a track.build_dog10k_fgf4_synteny.shexits non-zero unless every gap in both alignments lands on an annotated FGF4 intron and each deposited CDS is a single interval.
See also
- Tutorial: A loss-of-function allele across breeds (Dog10K)
- Tutorial: A selected haplotype (Dog10K)
- Tutorial: Local ancestry (Dog10K)
- Tutorial: Structural variants (1000 Genomes)
- Tutorial: CNV across a population (1000 Genomes)
- User guide: Multi-sample variant display
- User guide: SV visualization
- User guide: Linear synteny view
- Config guide: Variant track
Citations
- Axelsson et al. (2013). The genomic signature of dog domestication reveals adaptation to a starch-rich diet
- Schall & Kidd (2025). Integrative genotyping and analysis of canine structural variation using long-read and short-read data
- Parker et al. (2007). Breed relationships facilitate fine-mapping studies: a 7.8-kb deletion cosegregates with Collie eye anomaly across multiple dog breeds
- Parker et al. (2009). An expressed fgf4 retrogene is associated with breed-defining chondrodysplasia in domestic dogs
- Brown et al. (2017). FGF4 retrogene on CFA12 is responsible for chondrodystrophy and intervertebral disc disease in dogs
- Meadows et al. (2023). Genome sequencing of 2000 canids by the Dog10K consortium advances the understanding of demography, genome function and architecture
Feedback on this tutorial is welcome: contact us.