Variants on protein structures part 2: degenerative myelopathy in dogs
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.20. Desktop beta builds for Linux and
macOS are on the releases page;
the Windows build waits on code signing.
Degenerative myelopathy is a late-onset paralysis of dogs that resembles amyotrophic lateral sclerosis in people. A genome-wide association study found the risk allele in SOD1: c.118G>A changes glutamate 40 of superoxide dismutase to lysine (E40K), and most affected dogs are homozygous for it (Awano et al. 2009). We put the codon beside a crystal structure of the E40K protein itself, then read the allele across the Dog10K collection, with wolves and coyotes as the control, since an allele they share would predate domestication. We:
- launch structure 7WX0 and an ortholog alignment from the SOD1 gene's right-click menu on the canFam4 dog assembly, with Launch protein view and Launch MSA view
- slice SOD1 out of the Dog10K SNV callset with
bcftools, and write a sample sheet of each animal's category - add the slice as a variant track, one row per animal, with the rows colored by category
- open 7WX0 on the E40K record from a session spec, with the protein view's
variantkey labelling the change on the gene and the structure
Prerequisites
- for your own JBrowse, the protein3d and msaview plugins from the plugin store; genomes.jbrowse.org already loads them
bcftoolsbuilt with libcurl, and htslib (tabix)curl
# Debian/Ubuntu
sudo apt install bcftools tabix
# or conda, which has every tool above
conda install -c bioconda -c conda-forge bcftools htslibThe data
The callset and the sample table come from the Dog10K consortium's public share (Meadows et al. 2023). You don't need these files to follow the page: the track reads hosted copies of what the commands below write. The slicing command streams the callset over HTTP, so a tabix-indexed VCF of your own slices the same way.
| What it is | File |
|---|---|
| The SNV callset, 397 GB over 1,987 canids on canFam4 (UU_Cfam_GSD_1.0), streamed and never downloaded | AutoAndXPAR.SNPs.vqsr99.vcf.gz |
| The sample table, breed and category per animal | dog10K-alignment-sample-table.2022-02-23-v7.txt |
Read by URL (no download needed)
| What it is | File |
|---|---|
| Canine SOD1 E40K, PDB 7WX0 | 7WX0.cif |
| NCBI's ortholog report, the rows of the alignment | rest-api/ |
Opening SOD1 on codon 40 with the E40K structure
Part 1 opened its gene from the protein browser, which opens dog genes on a Labrador assembly. Dog10K is called against canFam4, so here we launch the same three views from the gene's right-click menu on canFam4. Codon 40 of NM_001003035.1 sits in SOD1's second coding exon, at chr31:27,123,057-27,123,059. Open the canFam4 hub on genomes.jbrowse.org and:
- type
chr31:27123013-27123103into the location box - in the track selector, tick NCBI RefSeq - RefSeq Curated
- right-click the SOD1 transcript and choose Launch protein view. On the PDB search tab pick 7WX0, then choose Open side by side from the arrow beside Launch
- right-click the transcript again and choose Launch MSA view, which opens on its Orthologs tab; press Submit
- click Reset Zoom, the circular arrow at the top right of the structure, to fit the whole structure
- hover column 40 of the
dog_queryrow in the alignment
The hover lights the codon on the gene, the column in the alignment and the residue on the structure, and the protein view's header compares the two letters: glutamate in the dog genome, lysine in the crystal.
Slicing SOD1 out of Dog10K
bcftools reads one gene of the tabix-indexed callset over HTTP and writes a
small VCF of its genotypes. Set SNVS to your own callset's path or URL to
slice it the same way:
SNVS=https://kiddlabshare.med.umich.edu/dog10K/SNP_and_indel_calls_2021-10-17/AutoAndXPAR.SNPs.vqsr99.vcf.gz
# -x INFO,^FORMAT/GT: drop every INFO field and every FORMAT field but GT
bcftools annotate -r chr31:27118000-27128000 -x INFO,^FORMAT/GT \
-Oz -o dog10k_sod1.vcf.gz "$SNVS"
tabix -p vcf dog10k_sod1.vcf.gzThe sample table files each animal under a category:
curl -o sample-table.txt https://kiddlabshare.med.umich.edu/dog10K/sample-information/dog10K-alignment-sample-table.2022-02-23-v7.txtJBrowse reads a sample sheet as a TSV whose first column, name, matches the
VCF's sample names, with any further columns as metadata the rows can be colored
by. An awk command writes that sheet from the table, with wolves first, then
coyotes, village dogs, mixed and other dogs, and breed dogs, sorted by breed
within each:
awk -F'\t' 'BEGIN { OFS = "\t"
n = split("Wolf Coyote Village_Dogs Mixed/Other Breed_Dogs", o, " ")
for (i = 1; i <= n; i++) rank[o[i]] = i }
NR > 1 { print rank[$3], $1, $3, $2 }' sample-table.txt \
| sort -t$'\t' -k1,1n -k4,4 -k2,2 | cut -f2- \
| (printf 'name\tcategory\tbreed\n'; cat) > samples.tsvE40K across breeds, village dogs and wild canids
The track reads hosted copies of the slice and the sheet; for your own, point
vcfGzLocation and samplesTsvLocation at the files the commands wrote.
rows.color names the sheet's column that colors each row:
Goes in the tracks array of config.json. See Tracks.
{
"type": "VariantTrack",
"trackId": "dog10k_sod1",
"name": "Dog10K SNVs at SOD1",
"assemblyNames": ["canFam4"],
"adapter": {
"type": "VcfTabixAdapter",
"vcfGzLocation": {
"uri": "https://jbrowse.org/demos/dog10k_sod1/dog10k_sod1.vcf.gz"
},
"index": {
"location": {
"uri": "https://jbrowse.org/demos/dog10k_sod1/dog10k_sod1.vcf.gz.tbi"
}
},
"samplesTsvLocation": {
"uri": "https://jbrowse.org/demos/dog10k_sod1/dog10k_samples.tsv"
}
},
"displays": [
{
"type": "LinearVariantDisplay",
"displayId": "dog10k_sod1-LinearVariantDisplay",
"rows": { "color": "category" }
}
]
}jbrowse add-track-json '{
"type": "VariantTrack",
"trackId": "dog10k_sod1",
"name": "Dog10K SNVs at SOD1",
"assemblyNames": ["canFam4"],
"adapter": {
"type": "VcfTabixAdapter",
"vcfGzLocation": {
"uri": "https://jbrowse.org/demos/dog10k_sod1/dog10k_sod1.vcf.gz"
},
"index": {
"location": {
"uri": "https://jbrowse.org/demos/dog10k_sod1/dog10k_sod1.vcf.gz.tbi"
}
},
"samplesTsvLocation": {
"uri": "https://jbrowse.org/demos/dog10k_sod1/dog10k_samples.tsv"
}
},
"displays": [
{
"type": "LinearVariantDisplay",
"displayId": "dog10k_sod1-LinearVariantDisplay",
"rows": { "color": "category" }
}
]
}'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_sod1",
"name": "Dog10K SNVs at SOD1",
"assemblyNames": ["canFam4"],
"adapter": {
"type": "VcfTabixAdapter",
"vcfGzLocation": {
"uri": "https://jbrowse.org/demos/dog10k_sod1/dog10k_sod1.vcf.gz"
},
"index": {
"location": {
"uri": "https://jbrowse.org/demos/dog10k_sod1/dog10k_sod1.vcf.gz.tbi"
}
},
"samplesTsvLocation": {
"uri": "https://jbrowse.org/demos/dog10k_sod1/dog10k_samples.tsv"
}
},
"displays": [
{
"type": "LinearVariantDisplay",
"displayId": "dog10k_sod1-LinearVariantDisplay",
"rows": { "color": "category" }
}
]
}To put a site where the wolves have the alternate allele beside codon 40, type
chr31:27122805-27122834 chr31:27123013-27123103 into the location box. The
first region is 30 bp of the upstream intron, around an SNV at chr31:27,122,819.
Opening the structure on the E40K record
A VCF record names its change on the genome's forward strand, the spelling the
protein view's variant key takes. E40K's record in the slice reads
chr31 27123057 . G A, so a session spec opens 7WX0 on it. Swap the gene, the
PDB id and the record for your own:
{
"views": [
{
"type": "ProteinView",
"gene": "SOD1",
"pdbId": "7WX0",
"variant": "chr31:27123057 G>A",
"sideBySide": true,
"connectedView": { "loc": "chr31:27123013-27123103" }
}
]
}Needs JBrowse Desktop 5.0 or newer. If nothing opens, copy the link and paste it into Desktop's Open JBrowse Web link..., on the start screen or under File → Session.
https://jbrowse.org/code/jb2/main/?config=https%3A%2F%2Fjbrowse.org%2Fucsc%2FcanFam4%2Fconfig.json&session=spec-%7B%22views%22%3A%5B%7B%22type%22%3A%22ProteinView%22%2C%22gene%22%3A%22SOD1%22%2C%22pdbId%22%3A%227WX0%22%2C%22variant%22%3A%22chr31%3A27123057+G%3EA%22%2C%22sideBySide%22%3Atrue%2C%22connectedView%22%3A%7B%22loc%22%3A%22chr31%3A27123013-27123103%22%7D%7D%5D%7D&sessionName=JBrowse+docs+exampleOpen it from the link under the spec. gene finds the SOD1 transcript through
the hub's search index, and connectedView.loc opens the genome view on
codon 40. The launch translates the record on that transcript, labels the base
with the protein change and frames residue 40 on the structure.
See also
- Tutorial: Variants on protein structures part 1: sickle cell from GWAS hit to haemoglobin S
- Tutorial: A loss-of-function allele across breeds (Dog10K)
- Tutorial: Proteins on genomes.jbrowse.org
External links
Citations
- Awano et al. (2009). Genome-wide association analysis reveals a SOD1 mutation in canine degenerative myelopathy that resembles amyotrophic lateral sclerosis
- Hashimoto et al. (2023). Intrinsic structural vulnerability in the hydrophobic core induces species-specific aggregation of canine SOD1 with degenerative myelopathy-linked E40K mutation
- 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.