mcpbeat Sign in

Bio Chipseq Visualization Agent Skill

Visualizes ChIP-seq data using deepTools (computeMatrix, plotHeatmap, plotProfile, bamCoverage, bamCompare), pyGenomeTracks (modern INI-driven track plots), Gviz (R browser-style), EnrichedHeatmap (ComplexHeatmap-based), ChIPseeker tag heatmaps, and IGV batch screenshots. Handles bigWig normalization choices (CPM, BPM, RPGC, spike-in scaled), bamCompare operations (log2 ratio, subtract, SES), k-means clustering of heatmaps for biological subgrouping, and spike-in-scaled tracks for global-shift experiments. Use when generating publication-quality ChIP-seq signal heatmaps, profile plots, genome-browser tracks, or comparing samples visually.

6k tokens
context cost
the whole folder, loaded on every use
4
files
ships runnable scripts
0
copies elsewhere
how many repositories repackaged it
132
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/BioTender-max/awesome-bio-agent-skills --skill bio-chipseq-visualization

What comes with it

9 700 bytes besides the instruction
examples/chipseeker_profile.R
examples/deeptools_heatmap.sh
usage-guide.md

The instruction itself

24 sections, as written by the author

Version Compatibility

Reference examples tested with: deepTools 3.5+, pyGenomeTracks 3.9+, Gviz 1.46+, EnrichedHeatmap 1.32+, ChIPseeker 1.38+, IGV 2.17+, samtools 1.19+, bedtools 2.31+.

ChIP-seq Visualization

"Visualize ChIP-seq signal around features of interest" -> Generate normalized signal tracks (bigWig), heatmaps centered on TSS/peaks, average profile plots, and genome-browser views — with normalization that supports the biological claim (within-sample vs cross-sample vs spike-in scaled).

  • CLI (production): deepTools bamCoverage -> computeMatrix -> plotHeatmap / plotProfile
  • CLI (config-driven tracks): pyGenomeTracks (replaces Gviz for many use cases)
  • R (publication): Gviz, EnrichedHeatmap, ChIPseeker tag heatmaps
  • GUI: IGV with batch scripts for reproducible screenshots

The single most consequential choice is bigWig normalization — it determines whether visual comparison reflects biology. Get this right before generating any heatmap or browser view.

bigWig Normalization Decision Tree

| Goal | Method | When to use |

|------|--------|------------|

| Within-sample profile of a single ChIP | --normalizeUsing CPM | Standard; reads per million; comparable within one library |

| Within-sample, length-aware | --normalizeUsing BPM | TPM-analog; useful for variable-width regions; less common for ChIP-seq |

| Cross-sample with equal effective depth | --normalizeUsing RPGC --effectiveGenomeSize <N> | "1x genome coverage" — assumes equal sequencing genome-wide; ENCODE convention |

| Cross-condition with global signal change | --scaleFactor <spike_in_derived> (skip --normalizeUsing) | HDACi / BETi / EZH2i; see chip-seq/spike-in-normalization |

| ChIP vs input ratio | bamCompare --operation log2 | Visualize enrichment over input |

| ChIP vs input control-subtracted | bamCompare --operation subtract | Absolute signal above background |

| ChIP vs input SES-corrected | bamCompare --operation SES | More robust to library size; uses signal-extraction-scaling |

ENCODE convention: RPGC with read-length-matched effective genome size. For visual comparison of treatment vs control on a fold-change biology, log2 bamCompare against shared input.

Spike-in scaled tracks (the right way):

# Compute scale factor from spike-in reads (ChIP-Rx Drosophila or CUT&RUN E. coli)
SCALE=$(echo "scale=6; 1.0 / $SPIKE_IN_READS_M" | bc)  # 1 per million spike reads
bamCoverage -b chip.bam -o chip.bw --scaleFactor $SCALE --binSize 10
# DO NOT also pass --normalizeUsing; mutually exclusive

deepTools Workflow

bigWig generation

# Standard within-sample (CPM)
bamCoverage -b chip.bam -o chip.bw \
    --normalizeUsing CPM --binSize 10 \
    --extendReads 200 --numberOfProcessors 8

# Cross-sample at 1x genome coverage (ENCODE)
bamCoverage -b chip.bam -o chip.bw \
    --normalizeUsing RPGC --effectiveGenomeSize 2701495761 \
    --binSize 10 --extendReads 200

# ChIP vs Input log2 ratio (visualization of enrichment)
bamCompare -b1 chip.bam -b2 input.bam -o chip_vs_input.bw \
    --operation log2 --binSize 50 --extendReads 200 \
    --pseudocount 1 --skipZeroOverZero

Signal matrix and heatmap (reference-point: TSS / peak summit)

# Compute matrix centered on TSS
computeMatrix reference-point \
    --referencePoint TSS \
    -b 3000 -a 3000 \
    -R genes.bed \
    -S chip.bw input.bw \
    -o matrix.gz \
    --outFileSortedRegions sorted_regions.bed \
    --numberOfProcessors 8 \
    --skipZeros

# Heatmap with k-means clustering (biology emerges from clusters)
plotHeatmap -m matrix.gz \
    -o heatmap.pdf \
    --kmeans 3 \
    --colorMap RdBu_r \
    --zMin -3 --zMax 3 \
    --refPointLabel TSS \
    --heatmapHeight 12 \
    --whatToShow 'heatmap and colorbar'

# Profile plot (average signal across regions)
plotProfile -m matrix.gz \
    -o profile.pdf \
    --perGroup \
    --plotTitle 'H3K4me3 around TSS'

Scale-regions (gene-body scaled to common length)

computeMatrix scale-regions \
    -R genes.bed \
    -S chip.bw \
    -b 3000 -a 3000 \
    -m 5000 \
    -o matrix_genebody.gz \
    --numberOfProcessors 8

plotProfile -m matrix_genebody.gz -o genebody_profile.pdf --perGroup

Sample correlation

multiBamSummary bins -b sample1.bam sample2.bam sample3.bam \
    --binSize 10000 -o results.npz \
    --numberOfProcessors 8

plotCorrelation -in results.npz \
    --corMethod spearman \
    --whatToPlot heatmap \
    --plotNumbers -o correlation.pdf \
    --outFileCorMatrix correlation.tab
# Replicates should correlate > 0.8 (narrow), > 0.6 (broad)

pyGenomeTracks (Modern Browser-Style Plotting)

INI-driven, config-as-code; better than Gviz for complex layouts or pipeline integration.

# tracks.ini
[x-axis]

[chip-h3k27ac]
file = h3k27ac.bw
color = darkblue
height = 3
title = H3K27ac

[chip-h3k4me3]
file = h3k4me3.bw
color = darkred
height = 3
title = H3K4me3

[peaks-narrowpeak]
file = peaks.narrowPeak
file_type = narrow_peak
color = black
height = 0.5
title = MACS peaks

[se-bed]
file = super_enhancers.bed
color = orange
height = 0.5
title = Super-enhancers

[genes]
file = genes.gtf
color = darkgreen
prefered_name = gene_name
height = 4
pyGenomeTracks --tracks tracks.ini --region chr1:1000000-1500000 -o region.pdf

For pipeline-driven figure generation across multiple regions, pyGenomeTracks is easier to script than Gviz. For one-off publication figures with complex annotation, Gviz remains useful.

R: Gviz and EnrichedHeatmap

library(Gviz)
library(GenomicRanges)
library(TxDb.Hsapiens.UCSC.hg38.knownGene)

chr <- 'chr1'; start <- 1e6; end <- 1.1e6
itrack <- IdeogramTrack(genome = 'hg38', chromosome = chr)
gtrack <- GenomeAxisTrack()
dtrack <- DataTrack(range = 'sample.bw', genome = 'hg38',
                     type = 'histogram', name = 'ChIP', col.histogram = 'darkblue')
grtrack <- GeneRegionTrack(TxDb.Hsapiens.UCSC.hg38.knownGene,
                            genome = 'hg38', chromosome = chr, name = 'Genes')
plotTracks(list(itrack, gtrack, dtrack, grtrack), from = start, to = end, chromosome = chr)
library(EnrichedHeatmap)
library(rtracklayer)

# Normalize bigWig signal to a matrix around target sites
signal <- import('sample.bw')
tss <- promoters(txdb, upstream = 0, downstream = 1)
mat <- normalizeToMatrix(signal, tss, extend = 3000, mean_mode = 'w0', w = 50)

# Heatmap with customization
EnrichedHeatmap(mat, name = 'Signal', col = c('white', 'red'),
                top_annotation = HeatmapAnnotation(lines = anno_enriched()))

ChIPseeker Tag Heatmap (R)

library(ChIPseeker)
library(TxDb.Hsapiens.UCSC.hg38.knownGene)

peaks <- readPeakFile('peaks.narrowPeak')
promoter <- getPromoters(TxDb = TxDb.Hsapiens.UCSC.hg38.knownGene,
                          upstream = 3000, downstream = 3000)
tagMatrix <- getTagMatrix(peaks, windows = promoter)

# Tag heatmap and average profile
tagHeatmap(tagMatrix, xlim = c(-3000, 3000), color = 'red')
plotAvgProf(tagMatrix, xlim = c(-3000, 3000), conf = 0.95,
             xlab = 'Distance from TSS (bp)', ylab = 'Peak density')

IGV Batch Scripts

# IGV batch script for reproducible screenshots
cat > igv.batch << 'EOF'
new
genome hg38
load chip.bw
load peaks.bed
load super_enhancers.bed
goto chr1:1000000-1100000
snapshot region1.png
goto chr2:50000000-51000000
snapshot region2.png
exit
EOF

igv.sh -b igv.batch

Per-Tool Failure Modes

bamCoverage -- --normalizeUsing and --scaleFactor conflict

Trigger: Passing both --normalizeUsing CPM and --scaleFactor X.

Mechanism: deepTools applies scaleFactor first, then normalizes; the normalization undoes the scale.

Symptom: Spike-in scaling appears to have no effect; tracks look like CPM.

Fix: Use ONE — --scaleFactor alone for spike-in; --normalizeUsing alone otherwise. Never both.

bamCompare -- log2 with zeros produces -Inf

Trigger: bamCompare --operation log2 without pseudocount; many bins have zero reads.

Mechanism: log2(0/x) = -Inf; downstream tools (plotHeatmap) may color these as NaN or fail.

Fix: Add --pseudocount 1 to both samples; or use --skipZeroOverZero to skip bins with zero in both samples.

computeMatrix -- Stranded bigWig vs unstranded reference points

Trigger: Using stranded bigWigs (separate plus/minus) with reference-point mode on a BED without strand info.

Mechanism: computeMatrix doesn't auto-detect strand; signal is plotted in genomic-strand orientation, breaking TSS-centered plots.

Fix: Use unstranded merged bigWig OR ensure BED has strand column 6.

plotHeatmap --kmeans -- Order depends on first sample only

Trigger: Using k-means with multiple samples and expecting consistent clustering.

Mechanism: k-means clusters by signal in the first -S bigWig only; other samples are plotted in the same row order.

Fix: Order samples in -S so the most-discriminating one is first; for combined clustering across samples, use --hclust or run k-means externally on combined matrix.

Spike-in scaled bigWig -- Wrong scale factor direction

Trigger: Computing scale_factor = spike_reads / 1e6 and passing to --scaleFactor.

Mechanism: deepTools multiplies signal by scaleFactor; the INVERSE is correct (sample with fewer spike reads gets larger scale factor to compensate).

Symptom: Treatment samples appear lower than control even when biology says higher.

Fix: scale_factor = MIN(spike_reads_all_samples) / spike_reads_this_sample. Always verify against known internal-control regions (blacklist should show no signal change post-scaling).

Gviz / EnrichedHeatmap -- Memory failure on whole-genome bigWigs

Trigger: Loading a 3 GB bigWig into R as a GRanges.

Mechanism: Gviz loads the entire bigWig into memory for genome-wide views.

Fix: Use chromosome parameter to restrict; use import.bw(con, which = GRanges(...)) to subset; consider pyGenomeTracks for whole-chromosome views.

pyGenomeTracks -- INI parsing strict

Trigger: Custom INI keys not recognized; or section names with spaces.

Mechanism: pyGenomeTracks expects exact key names; case-sensitive section labels.

Fix: Run make_tracks_file --trackFiles sample.bw -o tracks.ini to generate a template; modify from there.

Reconciliation: When Visualizations Disagree

| Pattern | Likely cause | Action |

|---------|--------------|--------|

| Heatmap shows enrichment; profile plot doesn't | Signal concentrated at few regions; profile averages them out | Both correct; heatmap shows distribution, profile shows central tendency |

| Replicate heatmaps differ at peak edges | Different normalization or stranded vs unstranded bigWigs | Verify bigWig parameters identical; use same --normalizeUsing |

| Spike-in scaled tracks show opposite trend from CPM | Global shift; CPM forces median to control levels | Spike-in is correct; CPM is fooled by composition |

| ChIPseeker tag heatmap differs from deepTools heatmap | ChIPseeker uses peak density; deepTools uses signal coverage | Different metrics; pick one per analysis |

| Profile plot loose-replicate band wide | Genuine biological variability OR one replicate failed | Check per-replicate metrics (chipseq-qc); don't average across failing rep |

Common Errors

| Error / symptom | Cause | Solution |

|-----------------|-------|----------|

| bigWig has all zeros | Wrong chromosome naming (chr vs no chr) | samtools view -H bam | head to check; convert if needed |

| computeMatrix "all regions skipped" | BED chromosome naming mismatches bigWig | Match seqlevels |

| plotHeatmap colors compressed | --zMin/--zMax not set; outliers dominate | Set --zMin -3 --zMax 3 or use percentile-based |

| IGV batch hangs | exit command missing; IGV waits for input | Always end batch script with exit |

| pyGenomeTracks region out of range | Region exceeds chromosome length | Verify region from samtools view -H bam |

| Spike-in scaled track has artifact stripes | Scale factor too extreme (>10x) | Verify spike-in reads adequate (>100k); check titration |

References

  • Ramírez F et al 2016 Nucleic Acids Res 44:W160 (deepTools)
  • Lopez-Delisle L et al 2021 Bioinformatics 37:422 (pyGenomeTracks)
  • Hahne F & Ivanek R 2016 Methods Mol Biol 1418:335 (Gviz)
  • Gu Z et al 2018 Bioinformatics 34:2879 (EnrichedHeatmap)
  • Yu G et al 2015 Bioinformatics 31:2382 (ChIPseeker)
  • Thorvaldsdóttir H et al 2013 Brief Bioinform 14:178 (IGV)
  • ENCODE 2012 quality metrics (NSC/RSC; for cross-correlation context)
  • chip-seq/peak-calling - Peak files for heatmap reference regions
  • chip-seq/chipseq-qc - QC plots (fingerprint, correlation) complement visualization
  • chip-seq/spike-in-normalization - Spike-in-scaled bigWig generation
  • chip-seq/differential-binding - Visualize differential peak signal
  • chip-seq/super-enhancers - SE region visualization in tracks
  • data-visualization/genome-tracks - General genome track patterns + IGV batch + pyGenomeTracks
  • data-visualization/heatmaps-clustering - General heatmap conventions

Other skills for the same job

different authors, same section of the catalogue
Use My Browser
by xixu-me

Use when work depends on the user's live browser session or visible rendered state rather than static fetches, especially for browser debugging contexts or DevTools-selected elements or requests, logged-in dashboards or CMS flows, localhost apps, forms, uploads, downloads, media inspection, DOM or iframe inspection, Shadow DOM, or browser failures that look like soft 404s, auth walls, anti-bot checks, or rate limits.

25k tokens
Office Web UI System
by thienanblog

Design, verify, and refactor admin dashboard, internal dashboard, customer/user management dashboard, back-office console, and reporting UI. Use only for dashboard-style management systems with operational workflows such as metrics, stat cards, filters, data tables, CRUD/list/detail pages, forms, side panels, admin shells, Playwright/browser UI verification, screenshot-based dashboard fixes, or visual QA for operational interfaces. Do not use for general UI/UX design, marketing pages, landing pages, portfolios, product sites, games, or consumer app screens unless the task is specifically an admin or management dashboard.

13k tokens scripts
XLSX
by anthropics
vendor ×15

Comprehensive spreadsheet creation, editing, and analysis with support for formulas, formatting, data analysis, and visualization. When Claude needs to work with spreadsheets (.xlsx, .xlsm, .csv, .tsv, etc) for: (1) Creating new spreadsheets with formulas and formatting, (2) Reading or analyzing data, (3) Modify existing spreadsheets while preserving formulas, (4) Data analysis and visualization in spreadsheets, or (5) Recalculating formulas

5k tokens scripts
Webapp Testing
by anthropics
vendor ×12

Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.

6k tokens scripts
XLSX
by w95
×7

Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved.

3k tokens
Notebooklm
by ZhanlinCui
×6

Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automation, library management, persistent auth. Drastically reduced hallucinations through document-only responses.

26k tokens scripts
Raffle Winner Picker
by frostant
×5

Picks random winners from lists, spreadsheets, or Google Sheets for giveaways, raffles, and contests. Ensures fair, unbiased selection with transparency.

949 tokens
Playwright Skill
by lackeyjb
×4

Complete browser automation with Playwright. Auto-detects dev servers, writes clean test scripts to /tmp. Test pages, fill forms, take screenshots, check responsive design, validate UX, test login flows, check links, automate any browser task. Use when user wants to test websites, automate browser interactions, validate web functionality, or perform any browser-based testing.

12k tokens scripts

How to use it

Copy the folder

Take biotender-max/bio-chipseq-visualization from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.