Gene fusion calls and the DNA behind them
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.8. Desktop beta builds are coming soon.
A fusion caller outputs a table of gene pairs and a junction coordinate, and nothing about the DNA event underneath. Load STAR-Fusion's short-read calls beside long RNA reads from the same cell line, count the molecules that cross each junction, then find where the chromosome broke: K562's BCR-ABL1 breaks 122 kb before the junction the caller reports, inside ABL1's first intron, and the DNA break under the amplicon's other junction, NUP214-XKR3, sits at the junction the caller reports.
Prerequisites
- nothing to read along. Everything below is for rebuilding the data
- a JBrowse to open them in: Desktop takes a local file by path, Web through Add track
- Command line tools (JBrowse CLI)
- samtools, to sort and merge the four Iso-Seq runs
bedGraphToBigWigandliftOver, both from the UCSC utilitiespython3, fordepmap_to_jbrowse.pyandlift_bnd_vcf.py
The two python helpers are one file each:
curl -fO https://raw.githubusercontent.com/GMOD/jbrowse-components/main/scripts/depmap_to_jbrowse.py
curl -fO https://raw.githubusercontent.com/GMOD/jbrowse-components/main/scripts/lift_bnd_vcf.py
Where the data comes from
Four PacBio Iso-Seq runs from ENCODE, two tables out of DepMap's 24Q4 release, and the DNA breakpoints on hg19:
- K562 PacBio Iso-Seq, ENCODE
ENCFF433YKW: https://www.encodeproject.org/files/ENCFF433YKW/@@download/ENCFF433YKW.bam - K562 PacBio Iso-Seq, ENCODE
ENCFF092NLB: https://www.encodeproject.org/files/ENCFF092NLB/@@download/ENCFF092NLB.bam - K562 PacBio Iso-Seq, ENCODE
ENCFF515YRZ: https://www.encodeproject.org/files/ENCFF515YRZ/@@download/ENCFF515YRZ.bam - K562 PacBio Iso-Seq, ENCODE
ENCFF475XQX: https://www.encodeproject.org/files/ENCFF475XQX/@@download/ENCFF475XQX.bam - K562 STAR-Fusion calls (DepMap 24Q4,
OmicsFusionFiltered.csv): https://ndownloader.figshare.com/files/51065693 - K562 copy-number segments (DepMap 24Q4 WGS,
OmicsCNSegmentsProfile.csv): https://ndownloader.figshare.com/files/51065333 - K562 DNA breakpoints (ENCODE 10X linked-read large-SV calls, hg19, lifted to hg38 by the build script): https://www.encodeproject.org/files/ENCFF863MPP/@@download/ENCFF863MPP.vcf.gz
- the hg19-to-hg38 chain the lift uses: https://hgdownload.soe.ucsc.edu/goldenPath/hg19/liftOver/hg19ToHg38.over.chain.gz
K562
K562 is a chronic myeloid leukemia line carrying the Philadelphia chromosome, the t(9;22) that fuses BCR to ABL1. Its transcripts here are long RNA reads, its fusion calls come from DepMap's short-read pipeline, and its DNA breakpoints from a linked-read run.
The fusion and copy-number tables both cover every line in the release.
depmap_to_jbrowse.py filters to one line and writes a STAR-Fusion TSV from the
fusion table and a bedGraph from the copy-number segments. K562 is model
ACH-000551, and its WGS copy-number profile is PR-aheaZL:
python3 depmap_to_jbrowse.py fusions OmicsFusionFiltered.csv ACH-000551 K562.star-fusion.tsv
python3 depmap_to_jbrowse.py segments OmicsCNSegmentsProfile.csv PR-aheaZL K562_cn.bedGraph
sort -k1,1 -k2,2n K562_cn.bedGraph |
awk 'NR==FNR{ok[$1];next} ($1 in ok)' hg38.chrom.sizes - > K562_cn.sorted.bedGraph
bedGraphToBigWig K562_cn.sorted.bedGraph hg38.chrom.sizes K562_cn.bw
The DNA breakpoints arrive on hg19. A breakend record carries a second
coordinate inside its ALT string, so a plain liftOver of the POS column
produces a valid VCF whose partner coordinates still point at hg19.
lift_bnd_vcf.py
moves both:
python3 lift_bnd_vcf.py calls.hg19.vcf.gz hg19ToHg38.over.chain.gz \
./liftOver calls.hg38.vcf liftwork
bgzip calls.hg38.vcf && tabix -p vcf calls.hg38.vcf.gz
The script's five arguments are the input VCF, the chain, the liftOver binary,
the output VCF and a scratch directory.
Triaging the calls
The SV inspector opens the STAR-Fusion table beside a circular view of it, one chord per row. Add → SV inspector, then the file: the import form reads the File Type off a STAR-Fusion filename or the table's own header line, and the menu sets it by hand for a file named some other way.
Searching the table narrows both halves. chrM collects the rows that pair a
gene with a mitochondrial transcript, the usual chimeric-read artefacts, and
Mitelman leaves the two rows the fusion databases already know. chr9 leaves
the same two, BCR--ABL1 and NUP214--XKR3: two junctions between chr9 and
chr22 whose chr22 partners are 6.5 Mb apart, which the rest of the page shows to
be the two ends of one amplified segment.
Each row's caret menu has Open in linear genome view, which puts the row's
two breakpoints side by side as two regions of one view, each turned so the
fusion transcript reads left to right across the join. XKR3 is on the minus
strand, so its region arrives reversed ([rev]). Turn on Read connections →
View as pairs / link supplementary alignments to merge each molecule's two
alignments onto one row.
BCR--ABL1 takes the rest of this page in the same layout. The build script
adds the STAR-Fusion calls as this track:
{
"type": "VariantTrack",
"trackId": "K562_star_fusion",
"name": "K562 STAR-Fusion calls (DepMap 24Q4)",
"assemblyNames": ["hg38"],
"adapter": {
"type": "StarFusionAdapter",
"starFusionLocation": { "uri": "K562.star-fusion.tsv" }
}
}
jbrowse add-track-json '{
"type": "VariantTrack",
"trackId": "K562_star_fusion",
"name": "K562 STAR-Fusion calls (DepMap 24Q4)",
"assemblyNames": ["hg38"],
"adapter": {
"type": "StarFusionAdapter",
"starFusionLocation": { "uri": "K562.star-fusion.tsv" }
}
}'
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": "K562_star_fusion",
"name": "K562 STAR-Fusion calls (DepMap 24Q4)",
"assemblyNames": ["hg38"],
"adapter": {
"type": "StarFusionAdapter",
"starFusionLocation": { "uri": "K562.star-fusion.tsv" }
}
}
K562.star-fusion.tsv is relative to a config.json. Replace it with its URL or its path on this computer.
BCR-ABL1 across three regions
Right-click a read that crosses the junction and choose Split current view to show split alignments, or type the locations into the location box separated by spaces. The transcript reaches ABL1 at more than one place, so this view uses three regions, the BCR donor and two acceptor windows.
A read crossing the junction is one alignment on chr22 and a supplementary alignment on chr9. Read connections → Use curved connectors draws a curve between the two across the region divider. Filter by... → Split alignments → Only split alignments drops every read that stays on one chromosome.
Near-identical curves stack into one line. Read connections → Read arcs adds a band under the coverage where each junction is drawn once, thickened by the reads behind it. An arc needs both ends in view, and each acceptor window receives one. The vertical at the BCR donor stands for the molecules whose ABL1 alignment lands in neither window.
Where the DNA broke
A fusion caller only reports transcribed junctions, so both of its breakpoints sit on exon edges and mark neither where the chromosome broke nor how much of it is amplified. Two DNA assays on the same cells answer that: ENCODE's 10X Chromium linked-read run on K562 (ENCSR053AXS, Zhou et al. 2019) called the breakends, and DepMap's WGS segmentation gives the copy number. The build script lifts the breakends to hg38 and adds both as tracks:
{
"type": "VariantTrack",
"trackId": "K562_10x_sv",
"name": "K562 DNA breakpoints (10X linked reads, lifted to hg38)",
"assemblyNames": ["hg38"],
"adapter": {
"type": "VcfTabixAdapter",
"vcfGzLocation": { "uri": "K562.10x-large-sv.vcf.gz" },
"index": { "location": { "uri": "K562.10x-large-sv.vcf.gz.tbi" } }
}
}
jbrowse add-track-json '{
"type": "VariantTrack",
"trackId": "K562_10x_sv",
"name": "K562 DNA breakpoints (10X linked reads, lifted to hg38)",
"assemblyNames": ["hg38"],
"adapter": {
"type": "VcfTabixAdapter",
"vcfGzLocation": { "uri": "K562.10x-large-sv.vcf.gz" },
"index": { "location": { "uri": "K562.10x-large-sv.vcf.gz.tbi" } }
}
}'
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": "K562_10x_sv",
"name": "K562 DNA breakpoints (10X linked reads, lifted to hg38)",
"assemblyNames": ["hg38"],
"adapter": {
"type": "VcfTabixAdapter",
"vcfGzLocation": { "uri": "K562.10x-large-sv.vcf.gz" },
"index": { "location": { "uri": "K562.10x-large-sv.vcf.gz.tbi" } }
}
}
K562.10x-large-sv.vcf.gz, K562.10x-large-sv.vcf.gz.tbi are relative to a config.json. Replace each with its URL or its path on this computer.
{
"type": "QuantitativeTrack",
"trackId": "K562_cn",
"name": "K562 copy-number segments (DepMap WGS)",
"assemblyNames": ["hg38"],
"adapter": {
"type": "BigWigAdapter",
"uri": "K562_cn.bw"
}
}
jbrowse add-track K562_cn.bw \
--trackId K562_cn \
--name "K562 copy-number segments (DepMap WGS)" \
--assemblyNames hg38 \
--load copy
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": "QuantitativeTrack",
"trackId": "K562_cn",
"name": "K562 copy-number segments (DepMap WGS)",
"assemblyNames": ["hg38"],
"adapter": {
"type": "BigWigAdapter",
"uri": "K562_cn.bw"
}
}
K562_cn.bw is relative to a config.json. Replace it with its URL or its path on this computer.
Open chr9 from ABL1 to past NUP214 with the copy-number track under both call tracks, each switched to Display types → Variant display arcs. A call whose partner is on another chromosome draws a stem at its breakpoint with a tick toward the sequence it keeps.
Both donors break a few hundred bases into the intron after their last retained exon. Both acceptors break upstream of the exon the transcript lands on, and the transcript is spliced from the break to that exon: a short hop for XKR3, a long one across ABL1's first intron.
| Junction | RNA junction (STAR-Fusion) | DNA break (10X) | Apart |
|---|---|---|---|
| BCR donor | chr22:23,290,413, end of exon 14 | chr22:23,290,556 | 143 bp into intron 14 |
| ABL1 acceptor | chr9:130,854,064, start of exon 2 | chr9:130,731,760 | 122 kb, in intron 1 |
| NUP214 donor | chr9:131,199,015, end of exon 29 | chr9:131,199,198 | 183 bp into intron 29 |
| XKR3 acceptor | chr22:16,808,083, start of exon 3 | chr22:16,819,350 | 11 kb, in intron 2 |
| none | no call | chr9:131,280,138 to chr13 | no gene at either end |
The amplified block on chr9 ends where the DNA breaks do, and the right-hand break, whose partner on chr13 is not inside any gene, is the one a fusion caller cannot see. DepMap's segmentation covers no interval over BCR itself, so the donor's own window shows an arc but no copy-number step. SplitThreader applied the same reasoning to the ERBB2 amplicon in SK-BR-3 (Nattestad et al. 2018): copy-number steps and breakpoints describing the same interval are evidence of one event.
Reproduce it end to end
scripts/build_cancer_sv_demo.sh
builds everything above from public sources:
curl -fO https://raw.githubusercontent.com/GMOD/jbrowse-components/main/scripts/build_cancer_sv_demo.sh
bash build_cancer_sv_demo.sh # builds ./cancer_sv_build/jbrowse2
npx --yes serve cancer_sv_build/jbrowse2
The script merges the four ENCODE Iso-Seq alignments, converts the DepMap release into a STAR-Fusion TSV and a copy-number bigWig, and lifts the ENCODE linked-read breakpoints onto hg38. The same run builds the COLO829 half of the demo, which Complex rearrangements and derivative alleles walks through.
See also
- Complex rearrangements and derivative alleles
- Structural variants from Hi-C
- SV inspector view
- SV visualization
- Structural variants (Cancer GIAB)
References
- Nattestad M, et al. Complex rearrangements and oncogene amplifications revealed by long-read DNA and RNA sequencing of a breast cancer cell line. Genome Research (2018). https://doi.org/10.1101/gr.231100.117
- Zhou B, et al. Comprehensive, integrated, and phased whole-genome analysis of the primary ENCODE cell line K562. Genome Research (2019). https://doi.org/10.1101/gr.234948.118
Feedback on this tutorial is welcome: contact us.