Structural variants (Cancer GIAB) part 1: breakpoints
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.15. Desktop beta builds are coming soon.
The Cancer Genome in a Bottle project publishes HG008, a matched tumor/normal PDAC cell line, as PacBio HiFi reads, a draft SV and CNV benchmark, and a telomere-to-telomere assembly of the tumor. We read its structural variants against the reads and the assembly; part 2 reads its copy number. We:
- load the benchmark SV calls and four further published SV callsets as variant tracks
- align the tumor assembly to GRCh38 and load the alignment as a synteny track
- open one chr3-chr13 translocation in the SV inspector and a breakpoint split view, and compare the tumor reads with the normal's
- read a small heterozygous deletion in CUZD1 in a read pileup, beside ClinVar's copy-number variants
- open the translocation in a dotplot and a linear synteny view of the assembly
Prerequisites
The walkthroughs at the end also run on the hosted C-GIAB demo. Building your own instance needs:
- A JBrowse instance, from the web quickstart
- A machine with HTTP access, either a public URL or
http://localhost - ~1 TB of free disk for the tracks, or ~1.5 TB for the full pipeline
- At least 32 GB of RAM for the minimap2 step; only data preparation needs it.
- The command-line tools below, with the versions tested in parentheses:
- JBrowse CLI (
@jbrowse/cliv3.6.5 or later) - Node.js (v18 minimum, v24.1.0 used for this tutorial)
- samtools (v1.21 or later)
- minimap2
- JBrowse CLI (
# Debian/Ubuntu
sudo apt install samtools minimap2 nodejs
# or conda, which has every tool above
conda install -c bioconda -c conda-forge samtools minimap2 nodejs
# any platform
npm install -g @jbrowse/cliThe data
HG008, the C-GIAB matched tumor/normal pair (NCBI BioProject PRJNA200694), is on the C-GIAB FTP, and the assemblies are on NIST's S3 bucket. The build script takes these files from their URLs, over 200 GB and hours of download. The page's commands build local files from them, and the tracks over those read them from disk; every other track reads a hosted copy. Each step takes your own tumor and normal reads in place of HG008's.
| What it is | File |
|---|---|
| The C-GIAB reference build (GRCh38 with decoys and masked regions) | GRCh38_GIABv3_no_alt_analysis_set_maskedGRC_decoys_MAP2K3_KMT2C_KCNJ18.fasta.gz |
| The tumor/normal PacBio HiFi reads (Revio run, 116x tumor, 35x normal) | PacBio_Revio_20240125/ |
| The V0.5 draft benchmark SV and CNV calls | NIST_HG008-T_somatic-stvar-CNV_DraftBenchmark_V0.5-20260318/ |
| Severus somatic SVs (HiFi) | severus_somatic.vcf.gz |
| The minda ensemble SVs (HiFi, ONT and Illumina callers) | HG008_minda_ensemble.vcf |
| DRAGEN's somatic SV calls (Illumina) | standard/ |
| NYGC's somatic SVs (Illumina) | GRCh38-GIABv3/ |
| The T2T tumor assembly, v3.2 | HG008T_v3.2.fasta.gz |
| The matched normal assembly, v6.3, which the build script leaves out | HG008N_v6.3.fasta.gz |
HG008, a pancreatic tumor and its matched normal
C-GIAB publishes HG008 from one pancreatic ductal adenocarcinoma (PDAC) donor, as the tumor (HG008-T) and normal pancreatic tissue (HG008-N-P). HG008-T is hypodiploid: 35 chromosomes down from 46, with widespread arm-level loss and truncal (present in every tumor cell) interchromosomal rearrangements (Wagner et al. 2026).
Assemblies: the C-GIAB GRCh38 reference and the tumor assembly
Every track below names one of two assemblies. The calls and reads sit on the
C-GIAB GRCh38 build, GRCh38_GIABv3, which GIAB hosts BGZF-compressed with its
.fai and .gzi, so the assembly reads it in place:
Goes in the assemblies array of config.json. See Assemblies.
{
"name": "GRCh38_GIABv3",
"uri": "https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/release/references/GRCh38/GRCh38_GIABv3_no_alt_analysis_set_maskedGRC_decoys_MAP2K3_KMT2C_KCNJ18.fasta.gz"
}jbrowse add-assembly https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/release/references/GRCh38/GRCh38_GIABv3_no_alt_analysis_set_maskedGRC_decoys_MAP2K3_KMT2C_KCNJ18.fasta.gz \
--name GRCh38_GIABv3In 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://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/release/references/GRCh38/GRCh38_GIABv3_no_alt_analysis_set_maskedGRC_decoys_MAP2K3_KMT2C_KCNJ18.fasta.gz
https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/release/references/GRCh38/GRCh38_GIABv3_no_alt_analysis_set_maskedGRC_decoys_MAP2K3_KMT2C_KCNJ18.fasta.gz.fai
https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/release/references/GRCh38/GRCh38_GIABv3_no_alt_analysis_set_maskedGRC_decoys_MAP2K3_KMT2C_KCNJ18.fasta.gz.gziJBrowse reads the format off the file name. Then fill in:
- Genome name:
GRCh38_GIABv3
The synteny and dotplot sections use HG008T_v3.2, the T2T tumor assembly. NIST
ships it BGZF-compressed, so samtools faidx writes the .fai and .gzi
beside it without decompressing:
curl -LO https://nist-giab.s3.us-east-1.amazonaws.com/giab_tumor-normal/analysis/HG008/NIST_asm_dev/HG008T_v3.2/HG008T_v3.2.fasta.gz
samtools faidx HG008T_v3.2.fasta.gzGoes in the assemblies array of config.json. See Assemblies.
{
"name": "HG008T_v3.2",
"uri": "HG008T_v3.2.fasta.gz"
}jbrowse add-assembly HG008T_v3.2.fasta.gz \
--name HG008T_v3.2 \
--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:
HG008T_v3.2.fasta.gz
HG008T_v3.2.fasta.gz.fai
HG008T_v3.2.fasta.gz.gziJBrowse reads the format off the file name. Then fill in:
- Genome name:
HG008T_v3.2
HG008T_v3.2.fasta.gz is relative to a config.json. Replace it with its URL or its path on this computer.
The benchmark SV and CNV calls
The V0.5 HG008-T draft benchmark is an indexed VCF of SV calls and a BED of CNV calls, both loaded straight from their FTP URL.
Goes in the tracks array of config.json. See Tracks.
{
"trackId": "hg008t_benchmark_sv",
"name": "HG008-T V0.5 draft benchmark somatic SVs",
"uri": "https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NIST_HG008-T_somatic-stvar-CNV_DraftBenchmark_V0.5-20260318/GRCh38_HG008-T-V0.5_somatic-stvar_PASS.draftbenchmark.vcf.gz",
"assemblyNames": ["GRCh38_GIABv3"]
}jbrowse add-track https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NIST_HG008-T_somatic-stvar-CNV_DraftBenchmark_V0.5-20260318/GRCh38_HG008-T-V0.5_somatic-stvar_PASS.draftbenchmark.vcf.gz \
--trackId hg008t_benchmark_sv \
--name "HG008-T V0.5 draft benchmark somatic SVs" \
--assemblyNames GRCh38_GIABv3In 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:
https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NIST_HG008-T_somatic-stvar-CNV_DraftBenchmark_V0.5-20260318/GRCh38_HG008-T-V0.5_somatic-stvar_PASS.draftbenchmark.vcf.gz
Click Next. JBrowse reads the adapter and track type off the file name. Then fill in:
- Track name:
HG008-T V0.5 draft benchmark somatic SVs - Assembly:
GRCh38_GIABv3
Click Add.
The CNV BED has no header, so
columnNames names its columns. In
grammar-of-graphics terms, the track's
color is a color scale that maps the field total_copy_number through the
cuts in domain to the colors in range.
Goes in the tracks array of config.json. See Tracks.
{
"type": "FeatureTrack",
"trackId": "hg008t_somatic_cnv",
"name": "HG008-T somatic CNV",
"assemblyNames": ["GRCh38_GIABv3"],
"adapter": {
"type": "BedAdapter",
"uri": "https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NIST_HG008-T_somatic-stvar-CNV_DraftBenchmark_V0.5-20260318/GRCh38_HG008-T-V0.5_somatic-CNV_PASS.draftbenchmark.calls.bed",
"columnNames": [
"chrom",
"start",
"end",
"total_copy_number",
"hap1_copy_number",
"hap2_copy_number",
"name"
]
},
"displayDefaults": {
"labels": {
"name": "jexl:'CN '+feature.total_copy_number+' ('+feature.hap1_copy_number+'|'+feature.hap2_copy_number+')'"
},
"color": {
"field": "total_copy_number",
"scale": "threshold",
"domain": [1, 2, 3, 4],
"range": ["#2166ac", "#92c5de", "#e0e0e0", "#f4a582", "#b2182b"],
"labels": ["CN 0", "CN 1", "CN 2", "CN 3", "CN 4+"],
"title": "Copy number"
}
}
}jbrowse add-track-json '{
"type": "FeatureTrack",
"trackId": "hg008t_somatic_cnv",
"name": "HG008-T somatic CNV",
"assemblyNames": ["GRCh38_GIABv3"],
"adapter": {
"type": "BedAdapter",
"uri": "https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NIST_HG008-T_somatic-stvar-CNV_DraftBenchmark_V0.5-20260318/GRCh38_HG008-T-V0.5_somatic-CNV_PASS.draftbenchmark.calls.bed",
"columnNames": [
"chrom",
"start",
"end",
"total_copy_number",
"hap1_copy_number",
"hap2_copy_number",
"name"
]
},
"displayDefaults": {
"labels": {
"name": "jexl:'\''CN '\''+feature.total_copy_number+'\'' ('\''+feature.hap1_copy_number+'\''|'\''+feature.hap2_copy_number+'\'')'\''"
},
"color": {
"field": "total_copy_number",
"scale": "threshold",
"domain": [1, 2, 3, 4],
"range": ["#2166ac", "#92c5de", "#e0e0e0", "#f4a582", "#b2182b"],
"labels": ["CN 0", "CN 1", "CN 2", "CN 3", "CN 4+"],
"title": "Copy number"
}
}
}'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": "FeatureTrack",
"trackId": "hg008t_somatic_cnv",
"name": "HG008-T somatic CNV",
"assemblyNames": ["GRCh38_GIABv3"],
"adapter": {
"type": "BedAdapter",
"uri": "https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NIST_HG008-T_somatic-stvar-CNV_DraftBenchmark_V0.5-20260318/GRCh38_HG008-T-V0.5_somatic-CNV_PASS.draftbenchmark.calls.bed",
"columnNames": [
"chrom",
"start",
"end",
"total_copy_number",
"hap1_copy_number",
"hap2_copy_number",
"name"
]
},
"displayDefaults": {
"labels": {
"name": "jexl:'CN '+feature.total_copy_number+' ('+feature.hap1_copy_number+'|'+feature.hap2_copy_number+')'"
},
"color": {
"field": "total_copy_number",
"scale": "threshold",
"domain": [1, 2, 3, 4],
"range": ["#2166ac", "#92c5de", "#e0e0e0", "#f4a582", "#b2182b"],
"labels": ["CN 0", "CN 1", "CN 2", "CN 3", "CN 4+"],
"title": "Copy number"
}
}
}Converting the HiFi reads to CRAM
The tumor and normal BAMs have no MD tags. Convert each to a local CRAM
against the reference above:
# -T: the reference for the CRAM, the same build the assembly was loaded from
# --write-index: write the .crai in the same pass
samtools view HG008-T.bam --write-index -o HG008-T.cram -T GRCh38.faEach CRAM is a read track that decodes against GRCh38_GIABv3; the normal uses
HG008-N.cram:
Goes in the tracks array of config.json. See Tracks.
{
"trackId": "HG008-T_hifi",
"name": "HG008-T PacBio HiFi",
"uri": "HG008-T.cram",
"assemblyNames": ["GRCh38_GIABv3"]
}jbrowse add-track HG008-T.cram \
--trackId HG008-T_hifi \
--name "HG008-T PacBio HiFi" \
--assemblyNames GRCh38_GIABv3 \
--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:
HG008-T.cram
Click Next. JBrowse reads the adapter and track type off the file name. Then fill in:
- Track name:
HG008-T PacBio HiFi - Assembly:
GRCh38_GIABv3
Click Add.
HG008-T.cram is relative to a config.json. Replace it with its URL or its path on this computer.
Structural variants from the published callsets
C-GIAB publishes five somatic SV callsets for this pair, the benchmark among them:
| Callset | Called from |
|---|---|
| NIST V0.5 draft benchmark | assembly comparison plus read support |
| Severus | PacBio HiFi |
| minda ensemble | eleven caller runs over HiFi, ONT and Illumina |
| DRAGEN | Illumina WGS |
| NYGC somatic pipeline (Manta and GRIDSS) | Illumina WGS |
Loading Severus and DRAGEN SV calls
Severus and DRAGEN are indexed VCFs with a record at each breakend, so they load with no display settings:
Goes in the tracks array of config.json. See Tracks.
{
"type": "VariantTrack",
"trackId": "hg008t_severus_sv",
"name": "HG008-T Severus somatic SVs (HiFi)",
"assemblyNames": ["GRCh38_GIABv3"],
"adapter": {
"type": "VcfTabixAdapter",
"uri": "https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NIH_HiFi_Severus-SV_20240308/somatic_SVs/severus_somatic.vcf.gz"
}
}jbrowse add-track https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NIH_HiFi_Severus-SV_20240308/somatic_SVs/severus_somatic.vcf.gz \
--trackId hg008t_severus_sv \
--name "HG008-T Severus somatic SVs (HiFi)" \
--assemblyNames GRCh38_GIABv3In 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:
https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NIH_HiFi_Severus-SV_20240308/somatic_SVs/severus_somatic.vcf.gz
Click Next. JBrowse reads the adapter and track type off the file name. Then fill in:
- Track name:
HG008-T Severus somatic SVs (HiFi) - Assembly:
GRCh38_GIABv3
Click Add.
Open this track in JBrowse Web ↗
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%2Fdemos%2Fcgiab%2Fconfig.json&session=spec-%7B%22sessionTracks%22%3A%5B%7B%22type%22%3A%22VariantTrack%22%2C%22trackId%22%3A%22hg008t_severus_sv%22%2C%22name%22%3A%22HG008-T+Severus+somatic+SVs+%28HiFi%29%22%2C%22assemblyNames%22%3A%5B%22GRCh38_GIABv3%22%5D%2C%22adapter%22%3A%7B%22type%22%3A%22VcfTabixAdapter%22%2C%22uri%22%3A%22https%3A%2F%2Fftp-trace.ncbi.nlm.nih.gov%2FReferenceSamples%2Fgiab%2Fdata_somatic%2FHG008%2FLiss_lab%2Fanalysis%2FNIH_HiFi_Severus-SV_20240308%2Fsomatic_SVs%2Fseverus_somatic.vcf.gz%22%7D%7D%5D%2C%22views%22%3A%5B%7B%22type%22%3A%22LinearGenomeView%22%2C%22assembly%22%3A%22GRCh38_GIABv3%22%2C%22loc%22%3A%22chr3%3A139%2C970%2C000-140%2C005%2C000%22%2C%22tracks%22%3A%5B%22hg008t_severus_sv%22%5D%7D%5D%7D&sessionName=JBrowse+docs%3A+HG008-T+Severus+somatic+SVs+%28HiFi%29Goes in the tracks array of config.json. See Tracks.
{
"type": "VariantTrack",
"trackId": "hg008t_dragen_sv",
"name": "HG008-T DRAGEN somatic SVs (Illumina)",
"assemblyNames": ["GRCh38_GIABv3"],
"adapter": {
"type": "VcfTabixAdapter",
"uri": "https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/DRAGEN-v4.2.4_ILMN-WGS_20240312/standard/dragen_4.2.4_HG008-mosaic_tumor.sv.vcf.gz"
}
}jbrowse add-track https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/DRAGEN-v4.2.4_ILMN-WGS_20240312/standard/dragen_4.2.4_HG008-mosaic_tumor.sv.vcf.gz \
--trackId hg008t_dragen_sv \
--name "HG008-T DRAGEN somatic SVs (Illumina)" \
--assemblyNames GRCh38_GIABv3In 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:
https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/DRAGEN-v4.2.4_ILMN-WGS_20240312/standard/dragen_4.2.4_HG008-mosaic_tumor.sv.vcf.gz
Click Next. JBrowse reads the adapter and track type off the file name. Then fill in:
- Track name:
HG008-T DRAGEN somatic SVs (Illumina) - Assembly:
GRCh38_GIABv3
Click Add.
Open this track in JBrowse Web ↗
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%2Fdemos%2Fcgiab%2Fconfig.json&session=spec-%7B%22sessionTracks%22%3A%5B%7B%22type%22%3A%22VariantTrack%22%2C%22trackId%22%3A%22hg008t_dragen_sv%22%2C%22name%22%3A%22HG008-T+DRAGEN+somatic+SVs+%28Illumina%29%22%2C%22assemblyNames%22%3A%5B%22GRCh38_GIABv3%22%5D%2C%22adapter%22%3A%7B%22type%22%3A%22VcfTabixAdapter%22%2C%22uri%22%3A%22https%3A%2F%2Fftp-trace.ncbi.nlm.nih.gov%2FReferenceSamples%2Fgiab%2Fdata_somatic%2FHG008%2FLiss_lab%2Fanalysis%2FDRAGEN-v4.2.4_ILMN-WGS_20240312%2Fstandard%2Fdragen_4.2.4_HG008-mosaic_tumor.sv.vcf.gz%22%7D%7D%5D%2C%22views%22%3A%5B%7B%22type%22%3A%22LinearGenomeView%22%2C%22assembly%22%3A%22GRCh38_GIABv3%22%2C%22loc%22%3A%22chr3%3A139%2C970%2C000-140%2C005%2C000%22%2C%22tracks%22%3A%5B%22hg008t_dragen_sv%22%5D%7D%5D%7D&sessionName=JBrowse+docs%3A+HG008-T+DRAGEN+somatic+SVs+%28Illumina%29Loading the minda ensemble SV calls
The minda ensemble callset is a plain VCF, so
VcfAdapter loads it whole, with no index:
Goes in the tracks array of config.json. See Tracks.
{
"type": "VariantTrack",
"trackId": "hg008t_minda_sv",
"name": "HG008-T minda ensemble SVs (HiFi, ONT, Illumina)",
"assemblyNames": ["GRCh38_GIABv3"],
"adapter": {
"type": "VcfAdapter",
"uri": "https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NIH-NCI_minda-ensemble_20240710/HG008_minda_ensemble.vcf"
}
}jbrowse add-track https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NIH-NCI_minda-ensemble_20240710/HG008_minda_ensemble.vcf \
--trackId hg008t_minda_sv \
--name "HG008-T minda ensemble SVs (HiFi, ONT, Illumina)" \
--assemblyNames GRCh38_GIABv3In 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:
https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NIH-NCI_minda-ensemble_20240710/HG008_minda_ensemble.vcf
Click Next. JBrowse reads the adapter and track type off the file name. Then fill in:
- Track name:
HG008-T minda ensemble SVs (HiFi, ONT, Illumina) - Assembly:
GRCh38_GIABv3
Click Add.
Open this track in JBrowse Web ↗
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%2Fdemos%2Fcgiab%2Fconfig.json&session=spec-%7B%22sessionTracks%22%3A%5B%7B%22type%22%3A%22VariantTrack%22%2C%22trackId%22%3A%22hg008t_minda_sv%22%2C%22name%22%3A%22HG008-T+minda+ensemble+SVs+%28HiFi%2C+ONT%2C+Illumina%29%22%2C%22assemblyNames%22%3A%5B%22GRCh38_GIABv3%22%5D%2C%22adapter%22%3A%7B%22type%22%3A%22VcfAdapter%22%2C%22uri%22%3A%22https%3A%2F%2Fftp-trace.ncbi.nlm.nih.gov%2FReferenceSamples%2Fgiab%2Fdata_somatic%2FHG008%2FLiss_lab%2Fanalysis%2FNIH-NCI_minda-ensemble_20240710%2FHG008_minda_ensemble.vcf%22%7D%7D%5D%2C%22views%22%3A%5B%7B%22type%22%3A%22LinearGenomeView%22%2C%22assembly%22%3A%22GRCh38_GIABv3%22%2C%22loc%22%3A%22chr3%3A139%2C970%2C000-140%2C005%2C000%22%2C%22tracks%22%3A%5B%22hg008t_minda_sv%22%5D%7D%5D%7D&sessionName=JBrowse+docs%3A+HG008-T+minda+ensemble+SVs+%28HiFi%2C+ONT%2C+Illumina%29Drawing the NYGC SV calls (BEDPE) as arcs
BedpeAdapter reads a paired-end BED whole, with
no index, and serves it to a variant track:
Goes in the tracks array of config.json. See Tracks.
{
"type": "VariantTrack",
"trackId": "hg008t_nygc_sv",
"name": "HG008-T NYGC somatic SVs (Manta, GRIDSS)",
"assemblyNames": ["GRCh38_GIABv3"],
"adapter": {
"type": "BedpeAdapter",
"uri": "https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NYGC-somatic-pipeline_20240412/GRCh38-GIABv3/HG008-T--HG008-N.sv.annotated.v7.somatic.high_confidence.final.bedpe"
},
"displays": [
{
"type": "LinearMarkDisplay",
"marks": [
{
"mark": "link",
"encoding": { "size": 2 },
"transform": [{ "type": "mate" }]
}
]
}
]
}jbrowse add-track-json '{
"type": "VariantTrack",
"trackId": "hg008t_nygc_sv",
"name": "HG008-T NYGC somatic SVs (Manta, GRIDSS)",
"assemblyNames": ["GRCh38_GIABv3"],
"adapter": {
"type": "BedpeAdapter",
"uri": "https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NYGC-somatic-pipeline_20240412/GRCh38-GIABv3/HG008-T--HG008-N.sv.annotated.v7.somatic.high_confidence.final.bedpe"
},
"displays": [
{
"type": "LinearMarkDisplay",
"marks": [
{
"mark": "link",
"encoding": { "size": 2 },
"transform": [{ "type": "mate" }]
}
]
}
]
}'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": "hg008t_nygc_sv",
"name": "HG008-T NYGC somatic SVs (Manta, GRIDSS)",
"assemblyNames": ["GRCh38_GIABv3"],
"adapter": {
"type": "BedpeAdapter",
"uri": "https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data_somatic/HG008/Liss_lab/analysis/NYGC-somatic-pipeline_20240412/GRCh38-GIABv3/HG008-T--HG008-N.sv.annotated.v7.somatic.high_confidence.final.bedpe"
},
"displays": [
{
"type": "LinearMarkDisplay",
"marks": [
{
"mark": "link",
"encoding": { "size": 2 },
"transform": [{ "type": "mate" }]
}
]
}
]
}Open chr3:139,970,000-140,005,000 with the five callsets loaded. A link whose
other breakend lies outside the view draws as a short stem, as both NYGC records
do below. The figure also shows the HiFiCNV depth, which
part 2
builds.
Aligning the tumor assembly to GRCh38
The tumor assembly is haplotype-resolved into T2T scaffolds. The synteny and dotplot views draw its alignment to GRCh38, a PAF file:
# asm5: minimap2's preset for an assembly against a reference of the same species
# -c: write base-level CIGARs
minimap2 -cx asm5 GRCh38.fa HG008T_v3.2.fasta > HG008T_v3.2.pafThe track lists the query assembly (the tumor assembly) first and the target (GRCh38) second, the reverse of the minimap2 argument order; reversed, the view opens empty and reports no error.
Goes in the tracks array of config.json. See Tracks.
{
"type": "SyntenyTrack",
"trackId": "HG008T_v3.2_paf",
"name": "HG008T_v3.2 vs GRCh38_GIABv3",
"assemblyNames": ["HG008T_v3.2", "GRCh38_GIABv3"],
"adapter": {
"type": "PAFAdapter",
"uri": "HG008T_v3.2.paf"
}
}jbrowse add-track HG008T_v3.2.paf \
--trackId HG008T_v3.2_paf \
--name "HG008T_v3.2 vs GRCh38_GIABv3" \
--assemblyNames HG008T_v3.2,GRCh38_GIABv3 \
--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:
{
"type": "SyntenyTrack",
"trackId": "HG008T_v3.2_paf",
"name": "HG008T_v3.2 vs GRCh38_GIABv3",
"assemblyNames": ["HG008T_v3.2", "GRCh38_GIABv3"],
"adapter": {
"type": "PAFAdapter",
"uri": "HG008T_v3.2.paf"
}
}HG008T_v3.2.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.
The matched normal assembly (HG008N_v6.3.fasta.gz, same S3 path) loads the
same way, as the synteny track config guide
shows.
Checking SV calls against reads and the assembly
A chr3-chr13 translocation: breakpoint reads and the tumor contig
Add → SV inspector, then Open from track to pick the C-GIAB benchmark VCF loaded earlier.
SV_20 and SV_190 are the two records of one breakpoint, where
chr3:139,976,414 joins chr13:114,353,244. The benchmark files them under
EVENT=cluster_3 with two further breakends and tags the cluster
EVENTTYPE=CHROMOPLEXY (rearrangements chained across chromosomes). To read the
junction in the reads:
- Choose
cluster_3under Filter by event, then click the chord joining chr3 and chr13 to launch the breakpoint split view. - Set Read height → Compact on the tumor PacBio HiFi reads opened on each panel.
- Sort by... → Split reads first lifts the split reads to the top of each pileup.
The cancer SV tutorial covers opening the view from a record and following the further breakends.
We read the same junction three ways:
- In the tumor reads, each split read has one half on chr13 and one on chr3, joined by a spline. The read runs forward on chr13 into the junction, then continues on the reverse strand of chr3.
- In the matched normal, the reads run through the locus with no split. Open
HG008-N-P_PacBio-HiFi-Revio_20240125_35x_GRCh38-GIABv3from the hosted config on the same two panels. - In the tumor assembly, the synteny track loaded earlier shows the junction with no reads. The C-GIAB assembly resolves both loci onto one tumor contig, named for the two chromosomes it fuses.
CUZD1: a small heterozygous deletion
Use the search (magnifying glass) button in the SV inspector to find
SV_85, a heterozygous deletion of two exons of CUZD1
(NCBI Gene 50624). At about 1.8 kb,
the whole deletion fits in a pileup at base level.
The ClinVar CNVs track holds submitted copy-number variants and their clinical significance, served by UCSC as a bigBed:
Goes in the tracks array of config.json. See Tracks.
{
"type": "FeatureTrack",
"trackId": "hg38_clinvar_cnv_ucsc",
"name": "ClinVar CNVs (UCSC)",
"assemblyNames": ["GRCh38_GIABv3"],
"adapter": {
"type": "BigBedAdapter",
"uri": "https://hgdownload.soe.ucsc.edu/gbdb/hg38/bbi/clinvar/clinvarCnv.bb"
},
"displayDefaults": {
"displayMode": "compact",
"filter": ["jexl:feature._varLen < 50000"]
}
}jbrowse add-track https://hgdownload.soe.ucsc.edu/gbdb/hg38/bbi/clinvar/clinvarCnv.bb \
--trackId hg38_clinvar_cnv_ucsc \
--name "ClinVar CNVs (UCSC)" \
--assemblyNames GRCh38_GIABv3 \
--displayDefaults '{"displayMode":"compact","filter":["jexl:feature._varLen < 50000"]}'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": "FeatureTrack",
"trackId": "hg38_clinvar_cnv_ucsc",
"name": "ClinVar CNVs (UCSC)",
"assemblyNames": ["GRCh38_GIABv3"],
"adapter": {
"type": "BigBedAdapter",
"uri": "https://hgdownload.soe.ucsc.edu/gbdb/hg38/bbi/clinvar/clinvarCnv.bb"
},
"displayDefaults": {
"displayMode": "compact",
"filter": ["jexl:feature._varLen < 50000"]
}
}The filter keeps ClinVar CNVs under 50 kb, and none of those covers this deletion.
Open NCBI RefSeq genes (hg38) from the hosted config and the tumor PacBio HiFi reads, then set Read height → Compact and Sort by... → Base pair in the reads' track menu and center the deletion. Show... → Center line in the view menu helps line up the breakpoint.
Dotplot and synteny views of the tumor assembly against GRCh38
Add → Dotplot view, set the tumor assembly as one axis and GRCh38 as the other, and pick the matching synteny track.
HG008-T v3.2's scaffold names end in _hap1 or _hap2, so one plot stacks both
haplotypes and doubles every diagonal. In the import form, tick Plot only
certain chromosomes and type *_hap1 into the chromosomes box of the
HG008T_v3.2 axis, then *_hap2 in a second view, for a plain
assembly-vs-reference diagonal per haplotype.
Drag over a region and take Launch → Linear synteny view, keeping
HG008T_v3.2 vs GRCh38_GIABv3 (HG008T v3.2 in the hosted config) as the
synteny track, then enter chr13 chr3 in the GRCh38 search box.
Add row in the import form gives each haplotype a separate row: hap2, GRCh38, hap1, with ribbons between each adjacent pair.
The dotplot view guide and the linear synteny view guide cover these views.
Reproduce it end to end
build_sv_visualization_cgiab.sh
runs the data preparation above in one shot. The script:
- Fetches the C-GIAB GRCh38 build and the V0.5 benchmark calls.
- Runs the CRAM and minimap2 steps above, and the coverage, HiFiCNV and BAF steps of part 2.
- Downloads JBrowse and writes a
config.jsonwith all of it loaded beside the published Wakhan segments.
curl -fO https://raw.githubusercontent.com/GMOD/jbrowse-components/main/scripts/build_sv_visualization_cgiab.sh
bash build_sv_visualization_cgiab.sh # builds ./cgiab_build/jbrowse2
npx --yes serve cgiab_build/jbrowse2The script downloads over 200 GB and takes hours.
See also
- Tutorial: Structural variants (Cancer GIAB) part 2: copy number
- Tutorial: Synteny visualization (pairwise minimap2)
- Tutorial: Reviewing a whole SV callset
- Tutorial: Complex rearrangements and derivative alleles
- Tutorial: Gene fusion calls and the DNA behind them
- User guide: SV visualization
- User guide: SV inspector view
Citations
- Diesh et al. (2023). JBrowse 2: A Modular Genome Browser with Views of Synteny and Structural Variation
- McDaniel et al. (2025). Development and Extensive Sequencing of a Broadly-Consented Genome in a Bottle Matched Tumor-Normal Pair
- Rautiainen et al. (2023). Verkko: telomere-to-telomere assembly of diploid chromosomes
- Wagner et al. (2026). A complete human pancreatic cancer genome
Feedback on this tutorial is welcome: contact us.