Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Visualize ChIP-seq data using deepTools, Gviz, and ChIPseeker. Create heatmaps, profile plots, and genome browser tracks. Visualize signal around peaks, TSS, or custom regions. Use when visualizing ChIP-seq signal and peaks.
.claude/skills/bio-chipseq-visualization/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | — | — |
| case-18 | ✗→✓ | ▲ Improved | — | — |
| case-06 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-07 | ✓→✓ | = Same ✓ | — | — |
Reference examples tested with: GenomicRanges 1.54+, deepTools 3.5+
Before using code patterns, verify installed versions match. If versions differ:
packageVersion('<pkg>') then ?function_name to verify parameters<tool> --version then <tool> --help to confirm flagsIf code throws ImportError, AttributeError, or TypeError, introspect the installed package and adapt the example to match the actual API rather than retrying.
"Create a heatmap of ChIP-seq signal around peaks" → Generate signal heatmaps, profile plots, and genome browser tracks showing enrichment patterns around genomic features.
deeptools computeMatrix reference-point → plotHeatmapGviz, ChIPseeker::plotAvgProf()Goal: Build a signal matrix of ChIP-seq coverage around reference points for downstream heatmaps and profiles.
Approach: Use computeMatrix to extract bigWig signal values in windows around genomic features like TSS.
bash# Compute signal matrix around TSS computeMatrix reference-point \ --referencePoint TSS \ -b 3000 -a 3000 \ # 3kb upstream and downstream -R genes.bed \ # Reference regions -S sample.bw \ # Signal file (bigWig) -o matrix.gz \ --outFileSortedRegions sorted_genes.bed
Goal: Visualize ChIP signal across gene bodies scaled to a uniform length.
Approach: Scale all gene regions to equal size and compute signal with flanking windows.
bash# Signal across gene bodies computeMatrix scale-regions \ -R genes.bed \ -S sample1.bw sample2.bw \ -b 3000 -a 3000 \ # Flanking regions -m 5000 \ # Scaled body length -o matrix_scaled.gz
Goal: Generate a heatmap of ChIP-seq signal intensity across genomic regions.
Approach: Render the precomputed signal matrix as a clustered heatmap with optional profile summary.
bash# Generate heatmap from matrix plotHeatmap \ -m matrix.gz \ -o heatmap.png \ --colorMap RdBu \ --whatToShow 'heatmap and colorbar' \ --zMin -3 --zMax 3 # With profile on top plotHeatmap \ -m matrix.gz \ -o heatmap_with_profile.png \ --plotTitle 'H3K4me3 Signal' \ --heatmapHeight 15 \ --refPointLabel TSS
Goal: Display average ChIP-seq signal profiles across genomic regions for sample comparison.
Approach: Plot mean signal from the computed matrix, optionally overlaying multiple samples.
bash# Average profile plot plotProfile \ -m matrix.gz \ -o profile.png \ --plotTitle 'Average Signal Profile' \ --perGroup # Multiple samples comparison plotProfile \ -m matrix_multi.gz \ -o profile_compare.png \ --colors red blue green \ --plotTitle 'Sample Comparison'
Goal: Convert BAM alignments to normalized bigWig signal tracks for visualization.
Approach: Use bamCoverage for single-sample normalization or bamCompare for log2 ratio of ChIP over input.
bash# Normalized bigWig (CPM) bamCoverage \ -b sample.bam \ -o sample.bw \ --normalizeUsing CPM \ --binSize 10 \ --numberOfProcessors 8 # With input subtraction bamCompare \ -b1 chip.bam \ -b2 input.bam \ -o chip_vs_input.bw \ --operation log2ratio \ --binSize 50
Goal: Visualize peak distribution around TSS using ChIPseeker tag matrices and profile plots.
Approach: Build a tag density matrix from peak locations relative to promoter windows, then plot as heatmap or average profile.
rlibrary(ChIPseeker) library(TxDb.Hsapiens.UCSC.hg38.knownGene) txdb <- TxDb.Hsapiens.UCSC.hg38.knownGene # Load peaks peaks <- readPeakFile('sample_peaks.narrowPeak') # Get promoter regions promoter <- getPromoters(TxDb = txdb, upstream = 3000, downstream = 3000) # Compute tag matrix tagMatrix <- getTagMatrix(peaks, windows = promoter) # Heatmap tagHeatmap(tagMatrix, xlim = c(-3000, 3000), color = 'red') # Profile plot plotAvgProf(tagMatrix, xlim = c(-3000, 3000), xlab = 'Distance from TSS (bp)', ylab = 'Peak Count Frequency') # With confidence interval plotAvgProf2(tagMatrix, xlim = c(-3000, 3000), conf = 0.95)
Goal: Create publication-quality genome browser views combining signal tracks, gene models, and ideograms.
Approach: Layer Gviz track objects (ideogram, axis, data, gene) and render a specific genomic region.
rlibrary(Gviz) library(GenomicRanges) # Define region chr <- 'chr1' start <- 1000000 end <- 1100000 # Ideogram track itrack <- IdeogramTrack(genome = 'hg38', chromosome = chr) # Genome axis gtrack <- GenomeAxisTrack() # Data track from bigWig dtrack <- DataTrack( range = 'sample.bw', genome = 'hg38', type = 'histogram', name = 'ChIP Signal', col.histogram = 'darkblue', fill.histogram = 'darkblue' ) # Gene track library(TxDb.Hsapiens.UCSC.hg38.knownGene) txdb <- TxDb.Hsapiens.UCSC.hg38.knownGene grtrack <- GeneRegionTrack(txdb, genome = 'hg38', chromosome = chr, name = 'Genes') # Plot plotTracks(list(itrack, gtrack, dtrack, grtrack), from = start, to = end, chromosome = chr)
Goal: Compare ChIP-seq signal from multiple samples in a single browser view.
Approach: Create separate DataTrack objects per sample and stack them in the plotTracks call.
r# Create data tracks for each sample dtrack1 <- DataTrack(range = 'control.bw', genome = 'hg38', name = 'Control', type = 'histogram', col.histogram = 'blue', fill.histogram = 'blue') dtrack2 <- DataTrack(range = 'treatment.bw', genome = 'hg38', name = 'Treatment', type = 'histogram', col.histogram = 'red', fill.histogram = 'red') plotTracks(list(itrack, gtrack, dtrack1, dtrack2, grtrack), from = start, to = end, chromosome = chr)
Goal: Generate customizable heatmaps of ChIP signal around genomic features using ComplexHeatmap framework.
Approach: Normalize bigWig signal to a matrix around target sites and render with EnrichedHeatmap.
rlibrary(EnrichedHeatmap) library(rtracklayer) # Load signal and regions signal <- import('sample.bw') tss <- promoters(txdb, upstream = 0, downstream = 1) # Normalize to matrix mat <- normalizeToMatrix(signal, tss, extend = 3000, mean_mode = 'w0', w = 50) # Heatmap EnrichedHeatmap(mat, name = 'Signal', col = c('white', 'red'))
Goal: Automate genome browser screenshots at specific loci without manual interaction.
Approach: Write an IGV batch script that loads tracks, navigates to regions, and saves snapshots.
bash# Create IGV batch script cat > igv_batch.txt << 'EOF' new genome hg38 load sample.bw load peaks.bed goto chr1:1000000-1100000 snapshot region1.png goto chr2:50000000-51000000 snapshot region2.png exit EOF # Run IGV in batch mode igv.sh -b igv_batch.txt
| Tool | Type | Best For | |------|------|----------| | deepTools | CLI | Large-scale heatmaps, profiles | | ChIPseeker | R | Peak-centric visualization | | Gviz | R | Publication-quality browser | | EnrichedHeatmap | R | Customizable heatmaps | | IGV | GUI | Interactive exploration |
| Command | Purpose | |---------|---------| | bamCoverage | BAM to bigWig | | bamCompare | Compare two BAMs | | computeMatrix | Signal matrix | | plotHeatmap | Heatmap visualization | | plotProfile | Profile plot | | multiBigwigSummary | Compare multiple bigWigs | | plotCorrelation | Sample correlation |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.