CNV across a population (1000 Genomes)
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.
Copy number varies from person to person, and we show the whole 1000 Genomes panel at once: one heatmap row per individual, colored by how far that person strays from the diploid baseline of 2. JBrowse draws the heatmap from per-sample BigWigs, and past a few hundred samples the per-file requests dominate the load time, so the second half of the page packs the values into one Zarr store.
Prerequisites
- a JBrowse instance to paste a track into (see the web quickstart or the desktop quickstart)
- the zarr plugin, for the Zarr store. In your own JBrowse, load it by the URL that section gives
node24 or newer, to build a Zarr store- QuicK-mer2 and a 30x alignment, to add samples of your own
samtoolsandbedGraphToBigWig, to turn QuicK-mer2's output into a bigWig
Where the data comes from
QuicK-mer2 copy-number estimates over the 30x 1000 Genomes panel, from the Kidd lab at the University of Michigan (Shen and Kidd 2020).
The build script fetches these files, so there is nothing to download by hand.
- the sample list across 26 populations, from the lab's UCSC track hub: raw.githubusercontent.com/…/kmer-1kg.trackDb.txthttps://raw.githubusercontent.com/KiddLab/kmer_1KG/master/kmer-1kg.trackDb.txt
Read by URL (no download needed)
- the per-sample bigWigs, one individual's copy number in 1 kb bins, re-hosted unmodified because the lab's download share is offline. Each file sits under its population, so HG00551 and HG00553 are jbrowse.org/…/HG00551.qm2.CN.1k.bwhttps://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00551.qm2.CN.1k.bw and jbrowse.org/…/HG00553.qm2.CN.1k.bwhttps://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00553.qm2.CN.1k.bw
- the same values packed into one Zarr store for the
whole panel. The store is a directory of
chunks that 404s at its root, and the URL is what an adapter takes as
uri: jbrowse.org/…/qm2_cn_1kb.zarrhttps://jbrowse.org/demos/1000g/qm2_cn_1kb.zarr
Load the hg38 assembly
The copy-number bins are on GRCh38, so the tracks attach to hg38:
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
Load the panel as one heatmap track
QuicK-mer2 counts k-mers that occur
exactly once in the reference, so each estimate belongs to one paralog, one
copy of a duplicated sequence. The config lists two of the panel's 104 PUR
(Puerto Rican) bigWigs, and every file follows the
kidd_lab_cnv/<population>/<sample>.qm2.CN.1k.bw pattern above:
Goes in the tracks array of config.json. See Tracks.
{
"type": "MultiQuantitativeTrack",
"trackId": "pur_copynumber_1000g",
"name": "PUR copy number (1000 Genomes)",
"assemblyNames": ["hg38"],
"adapter": {
"type": "MultiWiggleAdapter",
"bigWigs": [
"https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00551.qm2.CN.1k.bw",
"https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00553.qm2.CN.1k.bw"
]
},
"displayDefaults": {
"mark": "span",
"origin": 2,
"scales": { "y": { "domainMin": 0, "domainMax": 4 } },
"color": {
"field": "score",
"scale": "threshold",
"range": ["#2166ac", "#b2182b"],
"title": "Copy number"
}
}
}jbrowse add-track-json '{
"type": "MultiQuantitativeTrack",
"trackId": "pur_copynumber_1000g",
"name": "PUR copy number (1000 Genomes)",
"assemblyNames": ["hg38"],
"adapter": {
"type": "MultiWiggleAdapter",
"bigWigs": [
"https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00551.qm2.CN.1k.bw",
"https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00553.qm2.CN.1k.bw"
]
},
"displayDefaults": {
"mark": "span",
"origin": 2,
"scales": { "y": { "domainMin": 0, "domainMax": 4 } },
"color": {
"field": "score",
"scale": "threshold",
"range": ["#2166ac", "#b2182b"],
"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": "MultiQuantitativeTrack",
"trackId": "pur_copynumber_1000g",
"name": "PUR copy number (1000 Genomes)",
"assemblyNames": ["hg38"],
"adapter": {
"type": "MultiWiggleAdapter",
"bigWigs": [
"https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00551.qm2.CN.1k.bw",
"https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00553.qm2.CN.1k.bw"
]
},
"displayDefaults": {
"mark": "span",
"origin": 2,
"scales": { "y": { "domainMin": 0, "domainMax": 4 } },
"color": {
"field": "score",
"scale": "threshold",
"range": ["#2166ac", "#b2182b"],
"title": "Copy number"
}
}
}Open this track in JBrowse Web ↗
Open this track in JBrowse Desktop ↗ (JBrowse Desktop 5.0+)
The bigWigs shorthand takes a
plain list of absolute URLs and names each subtrack from its filename. In
grammar-of-graphics terms, color is a color scale and scales.y the y scale,
which these settings turn into a copy-number heatmap:
markspangives each sample one strip of color.origin2puts white at the diploid baseline, andcolorcuts there, painting gains in therange's second color and losses in its first.scales.y.domainMinandscales.y.domainMaxpin the scale, so two copies are the same color in every window. Keep the bounds symmetric around the origin, because the ramp divides both sides by the longer one: 0 to 4 lets both extremes saturate, and gains past 4 clamp.
Clustering → Cluster rows by score... in the track menu brings similar samples together, since rows otherwise stay in file order.
The full list is the pur_copynumber_1000g track in
https://jbrowse.org/code/jb2/main/test_data/config_demo.json, so
the panel opens on a copy-number-polymorphic window of chr3
with these settings already applied.
Six individuals' copy-number profiles at CCL3L1
Navigate to chr17:36,080,000-36,270,000, around CCL3L1 (a chemokine gene
with a variable number of copies), and load six individuals spanning the range
of copy number as a second track. It draws step lines on one pinned axis, so
each plateau lines up with a copy count:
Goes in the tracks array of config.json. See Tracks.
{
"type": "MultiQuantitativeTrack",
"trackId": "pur_cnv_ladder",
"name": "PUR copy number, six individuals",
"assemblyNames": ["hg38"],
"adapter": {
"type": "MultiWiggleAdapter",
"subadapters": [
{
"type": "BigWigAdapter",
"name": "HG01177",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG01177.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG01083",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG01083.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG01070",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG01070.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG01395",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG01395.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG00731",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00731.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG00553",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00553.qm2.CN.1k.bw"
}
]
},
"displayDefaults": {
"mark": "line",
"scales": {
"y": { "domainMin": 0, "domainMax": 10, "title": "Copy number" }
}
}
}jbrowse add-track-json '{
"type": "MultiQuantitativeTrack",
"trackId": "pur_cnv_ladder",
"name": "PUR copy number, six individuals",
"assemblyNames": ["hg38"],
"adapter": {
"type": "MultiWiggleAdapter",
"subadapters": [
{
"type": "BigWigAdapter",
"name": "HG01177",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG01177.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG01083",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG01083.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG01070",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG01070.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG01395",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG01395.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG00731",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00731.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG00553",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00553.qm2.CN.1k.bw"
}
]
},
"displayDefaults": {
"mark": "line",
"scales": {
"y": { "domainMin": 0, "domainMax": 10, "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": "MultiQuantitativeTrack",
"trackId": "pur_cnv_ladder",
"name": "PUR copy number, six individuals",
"assemblyNames": ["hg38"],
"adapter": {
"type": "MultiWiggleAdapter",
"subadapters": [
{
"type": "BigWigAdapter",
"name": "HG01177",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG01177.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG01083",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG01083.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG01070",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG01070.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG01395",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG01395.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG00731",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00731.qm2.CN.1k.bw"
},
{
"type": "BigWigAdapter",
"name": "HG00553",
"uri": "https://jbrowse.org/genomes/GRCh38/1000g/kidd_lab_cnv/PUR/HG00553.qm2.CN.1k.bw"
}
]
},
"displayDefaults": {
"mark": "line",
"scales": {
"y": { "domainMin": 0, "domainMax": 10, "title": "Copy number" }
}
}
}Open this track in JBrowse Web ↗
Open this track in JBrowse Desktop ↗ (JBrowse Desktop 5.0+)
Two paralogous blocks hold the variation. The right-hand block spans the chemokine genes CCL3L1 and CCL4L1 (labelled CCL3L3 and CCL4L2 in the hg38 gene track) in a variable number of tandem copies, and the left-hand block is a TBC1D3 repeat.
UGT2B17, a simple deletion, against the 1000 Genomes SV map
At a simple biallelic deletion the 1000 Genomes phase 3 integrated structural
variant (SV) map and the depth profiles should agree. We'll add the SV map as a
variant track, then navigate to UGT2B17 on chr4 with the PUR panel track from
Load the panel as one heatmap track
under it. For your own callset, swap uri for a bgzip-compressed, tabix-indexed
VCF on the same assembly:
Goes in the tracks array of config.json. See Tracks.
{
"type": "VariantTrack",
"trackId": "integrated_sv_map_v2",
"name": "1000 Genomes integrated SV map (phase 3)",
"assemblyNames": ["hg38"],
"uri": "https://1000genomes.s3.amazonaws.com/phase3/integrated_sv_map/supporting/GRCh38_positions/ALL.wgs.integrated_sv_map_v2_GRCh38.20130502.svs.genotypes.vcf.gz"
}jbrowse add-track https://1000genomes.s3.amazonaws.com/phase3/integrated_sv_map/supporting/GRCh38_positions/ALL.wgs.integrated_sv_map_v2_GRCh38.20130502.svs.genotypes.vcf.gz \
--trackId integrated_sv_map_v2 \
--name "1000 Genomes integrated SV map (phase 3)" \
--assemblyNames hg38In 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://1000genomes.s3.amazonaws.com/phase3/integrated_sv_map/supporting/GRCh38_positions/ALL.wgs.integrated_sv_map_v2_GRCh38.20130502.svs.genotypes.vcf.gz
Click Next. JBrowse reads the adapter and track type off the file name. Then fill in:
- Track name:
1000 Genomes integrated SV map (phase 3) - Assembly:
hg38
Click Add.
Load the whole panel from one Zarr store
The PUR panel track in config_demo.json holds 104 individuals, and the full
1000 Genomes panel has 2504.
measure_signal_latency.ts
measures the requests, bytes and time to fill the CCL3L1 window from all 2504
BigWigs and from a Zarr store of the same samples, using the readers the browser
uses. It takes the converter's name/group/url TSV, which the
build script writes:
curl -fO https://raw.githubusercontent.com/GMOD/jbrowse-components/main/scripts/measure_signal_latency.ts
npm install @gmod/bbi generic-filehandle2
node measure_signal_latency.ts --samples 1000g_cnv_build/samples.tsv \
--region chr17:36,080,000-36,270,000 \
--zarr https://jbrowse.org/demos/1000g/qm2_cn_1kb.zarrAgainst the hosted files, at a median range request of 25 ms:
| chr17:36,080,000-36,270,000, 2504 samples | 2504 BigWigs | Zarr store |
|---|---|---|
| requests | 15,048 | 3 |
| bytes | 48.39 MB | 0.22 MB |
| wall clock | 24.5 s | 0.2 s |
Each BigWig needs several dependent reads to find and fetch a region's values, so the cost grows with the number of files. The Zarr store is one array of samples by bins, read in two metadata requests and one chunk.
Zarr v3 stores such arrays as chunk files on static
hosting, and
jbrowse-plugin-zarr adds a
MultiWiggleZarrAdapter that reads them with the same display settings as the
BigWig track. The plugin is in beta and not yet in the plugin store. On Desktop,
add the URL below as a
custom plugin named
Zarr; elsewhere, add this plugins entry to config.json:
{
"plugins": [
{
"name": "Zarr",
"url": "https://jbrowse.org/demos/zarr/jbrowse-plugin-zarr.umd.production.min.js"
}
]
}With the plugin loaded, the adapter's uri names the store:
Goes in the tracks array of config.json. See Tracks.
{
"type": "MultiQuantitativeTrack",
"trackId": "cnv_1000g_zarr",
"name": "1000 Genomes copy number, 2504 individuals",
"assemblyNames": ["hg38"],
"adapter": {
"type": "MultiWiggleZarrAdapter",
"uri": "https://jbrowse.org/demos/1000g/qm2_cn_1kb.zarr"
},
"displayDefaults": {
"mark": "span",
"origin": 2,
"scales": { "y": { "domainMin": 0, "domainMax": 4 } },
"color": {
"field": "score",
"scale": "threshold",
"range": ["#2166ac", "#b2182b"],
"title": "Copy number"
}
}
}jbrowse add-track-json '{
"type": "MultiQuantitativeTrack",
"trackId": "cnv_1000g_zarr",
"name": "1000 Genomes copy number, 2504 individuals",
"assemblyNames": ["hg38"],
"adapter": {
"type": "MultiWiggleZarrAdapter",
"uri": "https://jbrowse.org/demos/1000g/qm2_cn_1kb.zarr"
},
"displayDefaults": {
"mark": "span",
"origin": 2,
"scales": { "y": { "domainMin": 0, "domainMax": 4 } },
"color": {
"field": "score",
"scale": "threshold",
"range": ["#2166ac", "#b2182b"],
"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": "MultiQuantitativeTrack",
"trackId": "cnv_1000g_zarr",
"name": "1000 Genomes copy number, 2504 individuals",
"assemblyNames": ["hg38"],
"adapter": {
"type": "MultiWiggleZarrAdapter",
"uri": "https://jbrowse.org/demos/1000g/qm2_cn_1kb.zarr"
},
"displayDefaults": {
"mark": "span",
"origin": 2,
"scales": { "y": { "domainMin": 0, "domainMax": 4 } },
"color": {
"field": "score",
"scale": "threshold",
"range": ["#2166ac", "#b2182b"],
"title": "Copy number"
}
}
}A relative uri resolves against the config that holds it, so a store beside
your config.json takes qm2_cn_1kb.zarr.
A deletion nested inside another on chr3, sorted by clustering
The Zarr store covers chr3:162.5-163.2 Mb, where a 22 kb deletion sits inside a 114 kb one:
- Navigate the Zarr track to
chr3:162,650,000-163,050,000. - Run Clustering → Cluster rows by score... to sort individuals by which of the two deletions they have.
- The long-read assembly calls of the Human Genome Structural Variation Consortium (Logsdon et al. 2025) place both. We'll add those calls as a variant track:
Goes in the tracks array of config.json. See Tracks.
{
"type": "VariantTrack",
"trackId": "hgsvc3_sv_insdel",
"name": "HGSVC3 structural variants, 5 kb and longer",
"assemblyNames": ["hg38"],
"uri": "https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/HGSVC3/release/Variant_Calls/1.0/GRCh38/variants_GRCh38_sv_insdel_sym_HGSVC2024v1.0.vcf.gz"
}jbrowse add-track https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/HGSVC3/release/Variant_Calls/1.0/GRCh38/variants_GRCh38_sv_insdel_sym_HGSVC2024v1.0.vcf.gz \
--trackId hgsvc3_sv_insdel \
--name "HGSVC3 structural variants, 5 kb and longer" \
--assemblyNames hg38In 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.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/HGSVC3/release/Variant_Calls/1.0/GRCh38/variants_GRCh38_sv_insdel_sym_HGSVC2024v1.0.vcf.gz
Click Next. JBrowse reads the adapter and track type off the file name. Then fill in:
- Track name:
HGSVC3 structural variants, 5 kb and longer - Assembly:
hg38
Click Add.
Open this track in JBrowse Web ↗
Open this track in JBrowse Desktop ↗ (JBrowse Desktop 5.0+)
The HGSVC3 track holds every insertion and deletion, and a filter keeps the long ones.
Filter by... → Edit filters... in the track menu takes a filter. Enter
this one to drop every record under 5 kb:
jexl:alleleLength(feature)>=5000Building a Zarr store from per-sample BigWigs
build_signal_zarr.ts
turns a list of BigWigs into one store. Its input is a TSV of name and url,
with an optional group column between them (here the population, which labels
and groups the rows), and it imports two npm packages:
curl -fO https://raw.githubusercontent.com/GMOD/jbrowse-components/main/scripts/build_signal_zarr.ts
npm install @gmod/bbi generic-filehandle2
node build_signal_zarr.ts \
--samples samples.tsv \
--out qm2_cn_1kb.zarr \
--region chr17:35000000-37500000 \
--region chr4:68000000-69000000 \
--region chr1:25150000-25450000 \
--region chr3:162500000-163200000 \
--levels 1000,10000This command built the hosted store from all 2504 samples over the windows in the figures.
Three things shape the store:
--levelssets the resolution pyramid, one samples-by-bins array per entry, with coarser ones averaged from the finest. The adapter reads the coarsest level whose bins are no wider than a screen pixel, so a whole-chromosome view costs the same couple of requests. List the input's bin size first, then steps of roughly 3x (10000,30000,100000, not10000,100000), since a 10x gap leaves a view fetching 10x the bins it can draw.--regionlimits the build to the windows you pass. The converter holds the finest level in memory and derives the rest from it, so without--regionthis panel takes a few GB at 10 kb bins and tens of GB at the 1 kb of the BigWigs; start a whole-genome pyramid coarse. The converter prints the finest level's size before allocating it and exits if it will not fit.- Summary levels above the finest store the minimum and maximum of the bins
they average alongside the mean.
aggregatepicks which a view draws, so an amplification narrower than a bin is visible undermaxand averaged away undermean.
The output is a folder of files, which any static host with CORS enabled can serve to a track. The plugin's store format gives the layout for writing a store from something other than BigWigs.
Run QuicK-mer2 on your own samples
Run QuicK-mer2 over your aligned reads.
The lab's
tutorial takes
one 30x 1000 Genomes CRAM through count and est, and the GRCh38 k-mer index
is
prebuilt.
est writes copy number in 1 kb windows, and its four columns are bedGraph once
the decoy and EBV contigs are dropped:
grep -v decoy sample.qm2.CN.1k.bed | grep -v chrEBV >sample.bedgraph
samtools faidx GRCh38_BSM.fa
cut -f1,2 GRCh38_BSM.fa.fai >GRCh38_BSM.chrom.sizes
bedGraphToBigWig sample.bedgraph GRCh38_BSM.chrom.sizes sample.qm2.CN.1k.bwHost it, then add its URL to bigWigs, or a name and url row to
samples.tsv for the Zarr build. An individual the panel already covers gives
the lab's estimate as a check.
Reproduce it end to end
build_1000g_cnv_zarr.sh
builds the store above. The script:
- Derives the full 2504-sample list from the Kidd lab
trackDb. - Fetches the converter and its two npm packages.
- Runs the converter over the tutorial's windows, or over every main contig
with
--whole-genome.
curl -fO https://raw.githubusercontent.com/GMOD/jbrowse-components/main/scripts/build_1000g_cnv_zarr.sh
bash build_1000g_cnv_zarr.sh # the tutorial's windows, 1kb base, into ./1000g_cnv_build
bash build_1000g_cnv_zarr.sh --whole-genome # every main contig, 10kb base and five levelsSee also
- Tutorial: CNV cohort (TCGA)
- Tutorial: Single-cell RNA pseudobulk
- Tutorial: Structural variants (1000 Genomes)
- Tutorial: Structural variants (Dog10K)
- User guide: Quantitative track
- User guide: Clustering rows
External links
- KiddLab/kmer_1KG, the Kidd lab track hub these files come from, and KiddLab/QuicK-mer2, the caller that produced them
- The QuicK-mer2 tutorial, one sample from CRAM to copy number, with the lab's own output to check against
- Zarr v3 specification
Citations
- Shen & Kidd (2020). Rapid, Paralog-Sensitive CNV Analysis of 2457 Human Genomes Using QuicK-mer2, the citation for the copy-number data used throughout this page
- 1000 Genomes phase 3 integrated SV map
- Logsdon et al. (2025). Complex genetic variation in nearly complete human genomes, the HGSVC3 structural variant calls in the nested deletion figure
Feedback on this tutorial is welcome: contact us.