| name | bio-genome-intervals-bigwig-tracks |
| description | Create and read bigWig browser tracks for visualizing continuous genomic data. Convert bedGraph to bigWig, extract signal values, and generate coverage tracks using UCSC tools and pyBigWig. Use when preparing coverage tracks for genome browsers or extracting signal at specific regions. |
| tool_type | mixed |
| primary_tool | pyBigWig |
BigWig Tracks
BigWig is an indexed binary format for continuous genomic data. Efficient for genome browsers and programmatic access.
Why BigWig?
| Format | Size | Random Access | Browser Support |
|---|
| bedGraph | Large | No | Limited |
| bigWig | ~10x smaller | Yes (indexed) | Excellent |
Convert bedGraph to bigWig (CLI)
Installation
conda install -c bioconda ucsc-bedgraphtobigwig ucsc-bigwigtobedgraph
wget http://hgdownload.soe.ucsc.edu/admin/exe/linux.x86_64/bedGraphToBigWig
chmod +x bedGraphToBigWig
Basic Conversion
sort -k1,1 -k2,2n coverage.bedGraph > coverage.sorted.bedGraph
bedGraphToBigWig coverage.sorted.bedGraph chrom.sizes output.bw
Get Chromosome Sizes
cut -f1,2 reference.fa.fai > chrom.sizes
wget https://hgdownload.soe.ucsc.edu/goldenPath/hg38/bigZips/hg38.chrom.sizes
samtools view -H alignments.bam | grep @SQ | sed 's/@SQ\tSN:\|LN://g' > chrom.sizes
Full Workflow
bedtools genomecov -ibam alignments.bam -bg > coverage.bedGraph
sort -k1,1 -k2,2n coverage.bedGraph > coverage.sorted.bedGraph
bedGraphToBigWig coverage.sorted.bedGraph hg38.chrom.sizes coverage.bw
rm coverage.bedGraph coverage.sorted.bedGraph
Read BigWig with pyBigWig (Python)
Installation
pip install pyBigWig
Open and Inspect
import pyBigWig
bw = pyBigWig.open('coverage.bw')
print(f'Chromosomes: {bw.chroms()}')
print(f'Header: {bw.header()}')
print(f'Is bigWig: {bw.isBigWig()}')
bw.close()
Extract Values
import pyBigWig
bw = pyBigWig.open('coverage.bw')
values = bw.values('chr1', 1000000, 1001000)
print(f'Mean: {values.mean():.2f}')
print(f'Max: {values.max():.2f}')
intervals = bw.intervals('chr1', 1000000, 1001000)
for start, end, val in intervals:
print(f'{start}-{end}: {val}')
stats = bw.stats('chr1', 1000000, 1001000, type='mean')
print(f'Mean coverage: {stats[0]:.2f}')
max_val = bw.stats('chr1', 1000000, 1001000, type='max')
coverage = bw.stats('chr1', 1000000, 1001000, type='coverage')
bw.close()
Binned Statistics
import pyBigWig
bw = pyBigWig.open('coverage.bw')
region_start, region_end = 1000000, 2000000
n_bins = 1000
binned = bw.stats('chr1', region_start, region_end, type='mean', nBins=n_bins)
bw.close()
Extract for BED Regions
import pyBigWig
import pybedtools
bw = pyBigWig.open('coverage.bw')
bed = pybedtools.BedTool('regions.bed')
results = []
for interval in bed:
chrom, start, end = interval.chrom, interval.start, interval.end
mean_signal = bw.stats(chrom, start, end, type='mean')[0]
results.append({
'chrom': chrom,
'start': start,
'end': end,
'name': interval.name,
'signal': mean_signal if mean_signal else 0
})
bw.close()
import pandas as pd
df = pd.DataFrame(results)
print(df)
Create BigWig with pyBigWig
import pyBigWig
bw = pyBigWig.open('output.bw', 'w')
bw.addHeader([('chr1', 248956422), ('chr2', 242193529)])
bw.addEntries(['chr1', 'chr1'], [0, 100], ends=[100, 200], values=[1.5, 2.3])
bw.addEntries('chr1', [0, 100, 200], ends=[100, 200, 300], values=[1.5, 2.3, 3.1])
bw.addEntries('chr2', 0, values=[1.0, 2.0, 3.0, 4.0], span=100, step=100)
bw.close()
deepTools for BigWig Operations
Installation
conda install -c bioconda deeptools
Generate Normalized BigWig from BAM
bamCoverage -b alignments.bam -o coverage.bw --normalizeUsing RPKM
bamCoverage -b alignments.bam -o coverage.bw --normalizeUsing CPM
bamCoverage -b alignments.bam -o coverage.bw --normalizeUsing BPM
bamCoverage -b alignments.bam -o coverage.bw \
--binSize 10 \
--normalizeUsing CPM \
--smoothLength 30
bamCoverage -b alignments.bam -o coverage.bw \
--extendReads 200 \
--normalizeUsing CPM
Compare BigWig Files
bigwigCompare -b1 treatment.bw -b2 control.bw -o log2ratio.bw --ratio log2
bigwigCompare -b1 treatment.bw -b2 control.bw -o diff.bw --ratio subtract
bigwigAverage -b file1.bw file2.bw file3.bw -o average.bw
Summarize BigWig Over Regions
computeMatrix reference-point -S signal.bw -R regions.bed \
-b 2000 -a 2000 -o matrix.gz
plotHeatmap -m matrix.gz -o heatmap.png
multiBigwigSummary BED-file -b sample1.bw sample2.bw -o results.npz --BED regions.bed
Convert BigWig to bedGraph
bigWigToBedGraph input.bw output.bedGraph
bigWigToBedGraph input.bw output.bedGraph -chrom=chr1 -start=1000000 -end=2000000
Common Patterns
ChIP-seq Signal Track
bamCoverage -b chip.bam -o chip.bw \
--normalizeUsing CPM \
--extendReads 200 \
--binSize 10
bigwigCompare -b1 chip.bw -b2 input.bw -o chip_minus_input.bw --ratio subtract
RNA-seq Coverage
bamCoverage -b rnaseq.bam -o forward.bw --filterRNAstrand forward
bamCoverage -b rnaseq.bam -o reverse.bw --filterRNAstrand reverse
Extract Signal for Analysis
import pyBigWig
import pandas as pd
def extract_signal(bw_path, bed_path, stat='mean'):
'''Extract bigWig signal for BED regions.'''
import pybedtools
bw = pyBigWig.open(bw_path)
bed = pybedtools.BedTool(bed_path)
results = []
for interval in bed:
val = bw.stats(interval.chrom, interval.start, interval.end, type=stat)[0]
results.append({
'chrom': interval.chrom,
'start': interval.start,
'end': interval.end,
'name': interval.name if interval.name else '.',
'signal': val if val is not None else 0
})
bw.close()
return pd.DataFrame(results)
df = extract_signal('coverage.bw', 'peaks.bed', stat='mean')
print(df)
Related Skills
- coverage-analysis - Generate bedGraph input
- chip-seq/chipseq-visualization - ChIP-seq signal tracks
- alignment-files/bam-statistics - BAM to coverage
- interval-arithmetic - Region operations