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.13. Desktop beta builds are coming soon.
A fusion caller writes a table of gene pairs, each with the coordinate of the transcript junction where the RNA joins the two genes. We load STAR-Fusion's short-read calls beside long RNA reads from the same cell line and count the molecules crossing each junction. Then we find where the chromosome broke. In K562, the BCR-ABL1 DNA break lies in the first intron of ABL1, well before the junction the caller reports. The break under NUP214-XKR3, another junction on the same amplified segment, sits at the reported junction.
Prerequisites
- 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
Each python helper is a single file:
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.pyWhere 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.
The build script takes these files from their URLs, so there is nothing to download by hand.
- K562 PacBio Iso-Seq, ENCODE
ENCFF433YKW: www.encodeproject.org/…/ENCFF433YKW.bamhttps://www.encodeproject.org/files/ENCFF433YKW/@@download/ENCFF433YKW.bam - K562 PacBio Iso-Seq, ENCODE
ENCFF092NLB: www.encodeproject.org/…/ENCFF092NLB.bamhttps://www.encodeproject.org/files/ENCFF092NLB/@@download/ENCFF092NLB.bam - K562 PacBio Iso-Seq, ENCODE
ENCFF515YRZ: www.encodeproject.org/…/ENCFF515YRZ.bamhttps://www.encodeproject.org/files/ENCFF515YRZ/@@download/ENCFF515YRZ.bam - K562 PacBio Iso-Seq, ENCODE
ENCFF475XQX: www.encodeproject.org/…/ENCFF475XQX.bamhttps://www.encodeproject.org/files/ENCFF475XQX/@@download/ENCFF475XQX.bam - K562 STAR-Fusion calls (DepMap 24Q4,
OmicsFusionFiltered.csv): ndownloader.figshare.com/…/51065693https://ndownloader.figshare.com/files/51065693 - K562 copy-number segments (DepMap 24Q4 WGS,
OmicsCNSegmentsProfile.csv): ndownloader.figshare.com/…/51065333https://ndownloader.figshare.com/files/51065333 - K562 DNA breakpoints (ENCODE 10X linked-read large-SV calls, hg19, lifted to hg38 by the build script): www.encodeproject.org/…/ENCFF863MPP.vcf.gzhttps://www.encodeproject.org/files/ENCFF863MPP/@@download/ENCFF863MPP.vcf.gz
- the hg19-to-hg38 chain the lift uses: hgdownload.soe.ucsc.edu/…/hg19ToHg38.over.chain.gzhttps://hgdownload.soe.ucsc.edu/goldenPath/hg19/liftOver/hg19ToHg38.over.chain.gz
Cutting K562 out of DepMap and lifting its breakpoints to hg38
K562 is a chronic myeloid leukemia line with the Philadelphia chromosome, the t(9;22) translocation between chr9 and chr22 that fuses BCR to ABL1.
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.bwThe DNA breakpoints arrive on hg19. A breakend record has a second coordinate
inside its ALT string, so a plain liftOver of the POS column leaves the
partner coordinates on 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.gzLoading hg38 and the merged Iso-Seq reads
The lifted DNA breakpoints and the Iso-Seq molecules are on hg38, so we load that assembly first.
Goes in the assemblies array of config.json. See Assemblies.
{
"name": "hg38",
"uri": "https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz",
"refNameAliases": {
"uri": "https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/hg38_aliases.txt"
},
"cytobands": "https://jbrowse.org/genomes/GRCh38/cytoBand.txt"
}jbrowse add-assembly https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz \
--name hg38 \
--refNameAliases https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/hg38_aliases.txt \
--config '{"cytobands":"https://jbrowse.org/genomes/GRCh38/cytoBand.txt"}'hg38 is one of the genomes JBrowse Desktop hosts, with gene tracks already set up: on the start screen click Show all available genomes and pick it. To load the files of this config instead:
In 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:
https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz
https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz.fai
https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz.gziJBrowse reads the format off the file name. Then fill in:
- Genome name:
hg38 - refName aliases (under More options):
https://s3.amazonaws.com/jbrowse.org/genomes/GRCh38/hg38_aliases.txt - cytobands (under More options):
https://jbrowse.org/genomes/GRCh38/cytoBand.txt
ENCODE releases each Iso-Seq alignment unsorted. Sort each run, merge them into one BAM and index it:
samtools sort -o s_run1.bam run1.bam
samtools sort -o s_run2.bam run2.bam
samtools sort -o s_run3.bam run3.bam
samtools sort -o s_run4.bam run4.bam
samtools merge -f K562_isoseq.bam s_run1.bam s_run2.bam s_run3.bam s_run4.bam
samtools index K562_isoseq.bamThe merged BAM loads as one read track. For your own long RNA reads, swap uri
for a BAM aligned to the same assembly, with its .bai beside it:
Goes in the tracks array of config.json. See Tracks.
{
"trackId": "K562_isoseq",
"name": "K562 PacBio Iso-Seq (ENCODE)",
"uri": "K562_isoseq.bam",
"assemblyNames": ["hg38"]
}jbrowse add-track K562_isoseq.bam \
--trackId K562_isoseq \
--name "K562 PacBio Iso-Seq (ENCODE)" \
--assemblyNames hg38 \
--load copyIn JBrowse Desktop, or in any running JBrowse Web session, open a view on this track’s assembly, then File → Open track... and, in Add a track from file or URL, enter:
- Main file:
K562_isoseq.bam
Click Next. JBrowse reads the adapter and track type off the file name. Then fill in:
- Track name:
K562 PacBio Iso-Seq (ENCODE) - Assembly:
hg38
Click Add.
K562_isoseq.bam is relative to a config.json. Replace it with its URL or its path on this computer.
Triaging the STAR-Fusion calls in the SV inspector
Add → SV inspector, then the file, opens the STAR-Fusion table beside a circular view of it, one chord per row. The import form reads the File Type from the filename or the table's header line, and its menu sets the type by hand.
Searching the SV inspector's table filters the table and the circular view together:
chrMkeeps the rows that pair a gene with a mitochondrial transcript, the usual chimeric-read artefacts.Mitelmankeeps the two rows listed in the fusion databases.chr9keeps the same two,BCR--ABL1andNUP214--XKR3: junctions between chr9 and chr22 whose chr22 partners lie megabases apart.
Each table 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 region is oriented so the fusion transcript reads left to right across
the join. XKR3 is on the minus strand, so its region arrives reversed
(
[rev]). - Read connections → View as pairs / link supplementary alignments merges each molecule's two alignments onto one row.
The build script adds the STAR-Fusion calls as a track:
Goes in the tracks array of config.json. See Tracks.
{
"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.
Split RNA reads at BCR-ABL1 across three regions
The transcript reaches ABL1 at more than one place, so the view uses three
regions: the BCR donor, where the transcript starts, and two ABL1 acceptor
windows. Right-click a read that crosses the junction and choose Split current
view to show split alignments, or type the three locations into the location
box separated by spaces:
chr22:23,286,000-23,293,000 chr9:130,778,000-130,785,000 chr9:130,851,000-130,858,000.
A read crossing the junction is one alignment on chr22 and a supplementary alignment (the second piece of the split read) on chr9. In the track menu:
- Read connections → Use curved connectors joins the two across the region divider.
- Filter by... → Split alignments → Only split alignments drops every read that stays on one chromosome.
- Read connections → Read arcs adds a band under the coverage with one arc per junction, thicker where more reads support it. An arc needs both ends in view: the right-hand window gets one arc and the intron 1 window two, one at each place the reads enter it.
A vertical line at the BCR donor marks molecules whose ABL1 alignment lands in neither window.
Where the DNA broke under BCR-ABL1 and NUP214-XKR3
A fusion caller reports transcribed junctions, which sit on exon edges. Two DNA assays on the same cells show where the chromosome broke and how much of it is amplified:
- 10X Chromium linked reads from ENCODE (ENCSR053AXS, Zhou et al. 2019) call the breakends, the two ends of each junction.
- DepMap WGS segmentation gives the copy number.
The build script lifts the breakends to hg38 and adds both as tracks:
Goes in the tracks array of config.json. See 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.
Goes in the tracks array of config.json. See Tracks.
{
"trackId": "K562_cn",
"name": "K562 copy-number segments (DepMap WGS)",
"uri": "K562_cn.bw",
"assemblyNames": ["hg38"],
"displayDefaults": {
"scales": {
"y": { "domainMin": 0, "domainMax": 8, "title": "copy ratio (DepMap)" }
}
}
}jbrowse add-track K562_cn.bw \
--trackId K562_cn \
--name "K562 copy-number segments (DepMap WGS)" \
--assemblyNames hg38 \
--displayDefaults '{"scales":{"y":{"domainMin":0,"domainMax":8,"title":"copy ratio (DepMap)"}}}' \
--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": "K562_cn",
"name": "K562 copy-number segments (DepMap WGS)",
"uri": "K562_cn.bw",
"assemblyNames": ["hg38"],
"displayDefaults": {
"scales": {
"y": { "domainMin": 0, "domainMax": 8, "title": "copy ratio (DepMap)" }
}
}
}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, and pick Display types → Marks from each call track's menu. In
grammar-of-graphics terms, a mark is the shape drawn per record. A record that
names its partner breakend draws as a link with nothing configured
(mark display), and a call whose
partner is on another chromosome draws a stem at its breakpoint.
| 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. A Hi-C scan also pairs the ABL1 intron 1 break with BCR. DepMap's segmentation has no interval over BCR, so the donor window shows an arc and no copy-number step. SplitThreader matched copy-number steps to breakpoints the same way in the SK-BR-3 ERBB2 amplicon (Nattestad et al. 2018).
Reproduce it end to end
scripts/build_cancer_sv_demo.sh
builds everything above from public sources. For K562 it:
- sorts the four ENCODE Iso-Seq runs, which ENCODE releases unsorted, and merges them into the one read track the junction counts come from
- cuts K562's rows out of DepMap's fusion and copy-number tables, with the fusion calls ordered by FFPM (fusion fragments per million RNA-seq fragments), best-supported first
- lifts the 10X breakends to hg38 as above, and drops a junction whole when either end fails to lift or lands reversed in hg38, where its orientation would come out wrong
The same run builds the COLO829 half of the demo, which Complex rearrangements and derivative alleles walks through.
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/jbrowse2See also
- Tutorial: Complex rearrangements and derivative alleles
- Tutorial: Structural variants from Hi-C
- Tutorial: Structural variants (Cancer GIAB)
- User guide: SV inspector view
- User guide: SV visualization
Citations
- 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.