Install any skill in seconds. Free to start, no credit card required.
Get Started Free →End-to-end ChIP-seq workflow from FASTQ files to annotated peaks. Covers QC, alignment, peak calling with MACS3, and peak annotation with ChIPseeker. Use when processing ChIP-seq data from alignment through peak annotation.
.claude/skills/bio-workflows-chipseq-pipeline/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 94% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 65% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 179% | 0% |
<!--
#
#
-->
Complete workflow from raw ChIP-seq FASTQ files to annotated peaks.
FASTQ files (IP + Input)
|
v
[1. QC & Trimming] -----> fastp
|
v
[2. Alignment] ---------> Bowtie2
|
v
[3. BAM Processing] ----> sort, markdup, filter
|
v
[4. Peak Calling] ------> MACS3
|
v
[5. QC] ----------------> FRiP, fingerprint plots
|
v
[6. Annotation] --------> ChIPseeker
|
v
Annotated peaks + QC reportbash# Process both IP and Input samples for sample in IP_rep1 IP_rep2 Input_rep1 Input_rep2; do fastp -i ${sample}_R1.fastq.gz -I ${sample}_R2.fastq.gz \ -o trimmed/${sample}_R1.fq.gz -O trimmed/${sample}_R2.fq.gz \ --detect_adapter_for_pe \ --qualified_quality_phred 20 \ --length_required 25 \ --html qc/${sample}_fastp.html done
bash# Build index (once) bowtie2-build genome.fa bt2_index/genome # Align for sample in IP_rep1 IP_rep2 Input_rep1 Input_rep2; do bowtie2 -p 8 -x bt2_index/genome \ -1 trimmed/${sample}_R1.fq.gz \ -2 trimmed/${sample}_R2.fq.gz \ --no-mixed --no-discordant \ --maxins 1000 \ 2> aligned/${sample}.log | \ samtools view -@ 4 -bS -q 30 - | \ samtools sort -@ 4 -o aligned/${sample}.bam done
QC Checkpoint: Check alignment rate
bashfor sample in IP_rep1 IP_rep2 Input_rep1 Input_rep2; do # Mark and remove duplicates samtools fixmate -m aligned/${sample}.bam - | \ samtools sort - | \ samtools markdup -r - aligned/${sample}.dedup.bam # Index samtools index aligned/${sample}.dedup.bam # Remove chrM reads (high mitochondrial is common) samtools view -h aligned/${sample}.dedup.bam | \ grep -v chrM | \ samtools view -b - > aligned/${sample}.final.bam samtools index aligned/${sample}.final.bam done
bash# Narrow peaks (TFs, sharp histone marks like H3K4me3) macs3 callpeak \ -t aligned/IP_rep1.final.bam aligned/IP_rep2.final.bam \ -c aligned/Input_rep1.final.bam aligned/Input_rep2.final.bam \ -f BAMPE \ -g hs \ -n experiment \ --outdir peaks \ -q 0.01 # Broad peaks (H3K27me3, H3K36me3) macs3 callpeak \ -t aligned/IP_rep1.final.bam aligned/IP_rep2.final.bam \ -c aligned/Input_rep1.final.bam aligned/Input_rep2.final.bam \ -f BAMPE \ -g hs \ -n experiment_broad \ --outdir peaks \ --broad \ --broad-cutoff 0.1
bash# Calculate FRiP (Fraction of Reads in Peaks) total_reads=$(samtools view -c aligned/IP_rep1.final.bam) reads_in_peaks=$(bedtools intersect -a aligned/IP_rep1.final.bam -b peaks/experiment_peaks.narrowPeak -u | samtools view -c) frip=$(echo "scale=4; $reads_in_peaks / $total_reads" | bc) echo "FRiP: $frip" # Generate bigWig for visualization bamCoverage -b aligned/IP_rep1.final.bam \ -o bigwig/IP_rep1.bw \ --normalizeUsing RPKM \ -p 8 # Fingerprint plot (assess enrichment) plotFingerprint \ -b aligned/IP_rep1.final.bam aligned/Input_rep1.final.bam \ --labels IP Input \ -o qc/fingerprint.pdf
QC Checkpoint: Assess enrichment quality
rlibrary(ChIPseeker) library(TxDb.Hsapiens.UCSC.hg38.knownGene) library(org.Hs.eg.db) txdb <- TxDb.Hsapiens.UCSC.hg38.knownGene # Read peaks peaks <- readPeakFile('peaks/experiment_peaks.narrowPeak') # Annotate peak_anno <- annotatePeak(peaks, TxDb = txdb, annoDb = 'org.Hs.eg.db', tssRegion = c(-3000, 3000)) # Visualize plotAnnoPie(peak_anno) plotDistToTSS(peak_anno) # Export write.csv(as.data.frame(peak_anno), 'peaks/annotated_peaks.csv') # Get genes with peaks in promoter promoter_peaks <- as.data.frame(peak_anno) promoter_genes <- unique(promoter_peaks$SYMBOL[grepl('Promoter', promoter_peaks$annotation)]) write.table(promoter_genes, 'peaks/promoter_genes.txt', row.names = FALSE, col.names = FALSE, quote = FALSE)
| Step | Parameter | Narrow Peaks | Broad Peaks | |------|-----------|--------------|-------------| | MACS3 | --broad | No | Yes | | MACS3 | -q | 0.01 | - | | MACS3 | --broad-cutoff | - | 0.1 | | MACS3 | -g | hs/mm/ce/dm | Same | | Bowtie2 | -q (samtools) | 30 | 30 |
| Issue | Likely Cause | Solution | |-------|--------------|----------| | Few peaks | Low enrichment, wrong parameters | Check fingerprint, adjust -q threshold | | Many peaks | High noise, PCR duplicates | Remove duplicates, use stricter -q | | Low FRiP | Poor antibody, low enrichment | Check antibody, increase sequencing | | Peaks in blacklist | Technical artifacts | Filter against ENCODE blacklist |
bash#!/bin/bash set -e THREADS=8 GENOME="genome.fa" INDEX="bt2_index/genome" IP_SAMPLES="IP_rep1 IP_rep2" INPUT_SAMPLES="Input_rep1 Input_rep2" OUTDIR="results" mkdir -p ${OUTDIR}/{trimmed,aligned,peaks,qc,bigwig} # Step 1: QC for sample in $IP_SAMPLES $INPUT_SAMPLES; do fastp -i ${sample}_R1.fastq.gz -I ${sample}_R2.fastq.gz \ -o ${OUTDIR}/trimmed/${sample}_R1.fq.gz \ -O ${OUTDIR}/trimmed/${sample}_R2.fq.gz \ --html ${OUTDIR}/qc/${sample}_fastp.html -w ${THREADS} done # Step 2-3: Align and process for sample in $IP_SAMPLES $INPUT_SAMPLES; do bowtie2 -p ${THREADS} -x ${INDEX} \ -1 ${OUTDIR}/trimmed/${sample}_R1.fq.gz \ -2 ${OUTDIR}/trimmed/${sample}_R2.fq.gz \ --no-mixed --no-discordant 2> ${OUTDIR}/qc/${sample}_align.log | \ samtools view -@ ${THREADS} -bS -q 30 - | \ samtools fixmate -m - - | \ samtools sort -@ ${THREADS} - | \ samtools markdup -r - ${OUTDIR}/aligned/${sample}.bam samtools index ${OUTDIR}/aligned/${sample}.bam done # Step 4: Peak calling ip_bams=$(for s in $IP_SAMPLES; do echo "${OUTDIR}/aligned/${s}.bam"; done | tr '\n' ' ') input_bams=$(for s in $INPUT_SAMPLES; do echo "${OUTDIR}/aligned/${s}.bam"; done | tr '\n' ' ') macs3 callpeak -t ${ip_bams} -c ${input_bams} \ -f BAMPE -g hs -n experiment \ --outdir ${OUTDIR}/peaks -q 0.01 echo "Pipeline complete. Peaks: ${OUTDIR}/peaks/experiment_peaks.narrowPeak"
<!-- AUTHOR_SIGNATURE: 9a7f3c2e-MD-BABU-MIA-2026-MSSM-SECURE -->
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | pass→pass | 16,751 | 15,426 | -8% | 1 | 1 | 0% | 3,260 | 5,617 | +72% | 0 | 0 | — |
case-22 | pass→pass | 16,551 | 15,312 | -7% | 1 | 1 | 0% | 2,958 | 5,302 | +79% | 0 | 0 | — |
case-01 | fail→pass | 24,369 | 15,631 | -36% | 1 | 1 | 0% | 4,805 | 6,006 | +25% | 0 | 0 | — |
case-03 | pass→pass | 9,815 | 5,016 | -49% | 1 | 1 | 0% | 1,882 | 3,324 | +77% | 0 | 0 | — |
case-04 | fail→pass | 12,001 | 4,254 | -65% | 1 | 1 | 0% | 2,231 | 3,170 | +42% | 0 | 0 | — |
case-05 | pass→pass | 14,546 | 10,271 | -29% | 1 | 1 | 0% | 2,534 | 4,424 | +75% | 0 | 0 | — |
case-06 | fail→pass | 10,385 | 6,882 | -34% | 1 | 1 | 0% | 1,931 | 3,742 | +94% | 0 | 0 | — |
case-07 | fail→pass | 12,125 | 6,808 | -44% | 1 | 1 | 0% | 2,163 | 3,578 | +65% | 0 | 0 | — |
case-08 | pass→pass | 10,896 | 5,184 | -52% | 1 | 1 | 0% | 2,155 | 3,475 | +61% | 0 | 0 | — |
case-09 | pass→pass | 9,199 | 5,745 | -38% | 1 | 1 | 0% | 1,752 | 3,640 | +108% | 0 | 0 | — |
case-10 | pass→pass | 10,325 | 8,147 | -21% | 1 | 1 | 0% | 1,966 | 3,806 | +94% | 0 | 0 | — |
case-11 | pass→pass | 5,464 | 2,886 | -47% | 1 | 1 | 0% | 966 | 2,942 | +205% | 0 | 0 | — |
case-12 | pass→pass | 3,451 | 3,104 | -10% | 1 | 1 | 0% | 564 | 2,968 | +426% | 0 | 0 | — |
case-13 | pass→pass | 17,141 | 13,077 | -24% | 1 | 1 | 0% | 3,013 | 4,856 | +61% | 0 | 0 | — |
case-14 | pass→pass | 10,142 | 6,627 | -35% | 1 | 1 | 0% | 1,827 | 3,628 | +99% | 0 | 0 | — |
case-15 | pass→pass | 12,417 | 9,078 | -27% | 1 | 1 | 0% | 2,155 | 4,087 | +90% | 0 | 0 | — |
case-16 | fail→fail | 11,861 | 10,480 | -12% | 1 | 1 | 0% | 2,113 | 4,405 | +108% | 0 | 0 | — |
case-17 | pass→pass | 4,967 | 2,878 | -42% | 1 | 1 | 0% | 862 | 2,963 | +244% | 0 | 0 | — |
case-18 | fail→pass | 6,380 | 4,496 | -30% | 1 | 1 | 0% | 1,176 | 3,280 | +179% | 0 | 0 | — |
case-19 | pass→pass | 12,196 | 8,010 | -34% | 1 | 1 | 0% | 2,458 | 4,189 | +70% | 0 | 0 | — |
case-20 | pass→pass | 16,121 | 15,839 | -2% | 1 | 1 | 0% | 3,156 | 5,639 | +79% | 0 | 0 | — |
case-21 | pass→pass | 17,983 | 15,805 | -12% | 1 | 1 | 0% | 3,674 | 6,035 | +64% | 0 | 0 | — |
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 +23 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 7/24/2026 | +13% |
Other measured skills in the registry, with their headline benchmark lift.