/bio-bedgraph-handling
<!--
$ npx -y skills add FreedomIntelligence/OpenClaw-Medical-Skills --skill bio-bedgraph-handling --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/bio-bedgraph-handling
Context preview
The summary Claude sees to decide when to auto-load this skill.
<!--
SKILL.md
bio-bedgraph-handling.SKILL.md<!--
COPYRIGHT NOTICE
This file is part of the "Universal Biomedical Skills" project.
Copyright (c) 2026 MD BABU MIA, PhD <md.babu.mia@mssm.edu>
All Rights Reserved.
#
This code is proprietary and confidential.
Unauthorized copying of this file, via any medium is strictly prohibited.
#
Provenance: Authenticated by MD BABU MIA
-->
--- name: bio-bedgraph-handling description: Create, manipulate, and convert bedGraph files for genome browser visualization. Covers bedGraph format, conversion to/from bigWig, normalization, and signal processing. Use when handling coverage and signal tracks from ChIP-seq, ATAC-seq, or RNA-seq. tool_type: mixed primary_tool: pyBigWig measurable_outcome: Execute skill workflow successfully with valid output within 15 minutes. allowed-tools:
- read_file
- run_shell_command
---
bedGraph Handling
bedGraph is a text format for displaying continuous-valued data on genome browsers. Common for coverage, signal intensity, and scores.
bedGraph Format
track type=bedGraph name="Sample" description="Coverage"
chr1 0 100 1.5
chr1 100 200 2.3
chr1 200 300 0.8
Four columns: chrom, start, end, value (0-based, half-open)
Create bedGraph from BAM
Using bedtools genomecov
bedtools genomecov -ibam sample.bam -bg > sample.bedgraph
bedtools genomecov -ibam sample.bam -bg -split > sample.bedgraph
bedtools genomecov -ibam sample.bam -bg -scale 1.5 > sample.scaled.bedgraph
Strand-Specific
bedtools genomecov -ibam sample.bam -bg -strand + > sample.plus.bedgraph
bedtools genomecov -ibam sample.bam -bg -strand - > sample.minus.bedgraph
5' End Coverage (ChIP-seq)
bedtools genomecov -ibam sample.bam -bg -5 > sample.5prime.bedgraph
Normalize by Library Size (CPM)
total_reads=$(samtools view -c -F 260 sample.bam)
scale=$(echo "scale=10; 1000000 / $total_reads" | bc)
bedtools genomecov -ibam sample.bam -bg -scale $scale > sample.cpm.bedgraph
Sort bedGraph
bedGraph must be sorted for conversion to bigWig.
sort -k1,1 -k2,2n sample.bedgraph > sample.sorted.bedgraph
LC_ALL=C sort -k1,1 -k2,2n sample.bedgraph > sample.sorted.bedgraph
Convert bedGraph to bigWig
Using UCSC bedGraphToBigWig
bedGraphToBigWig sample.sorted.bedgraph chrom.sizes sample.bw
fetchChromSizes hg38 > hg38.chrom.sizes
bedGraphToBigWig sample.sorted.bedgraph hg38.chrom.sizes sample.bw
Generate chrom.sizes
samtools faidx reference.fa
cut -f1,2 reference.fa.fai > chrom.sizes
fetchChromSizes hg38 > hg38.chrom.sizes
mysql --user=genome --host=genome-mysql.soe.ucsc.edu -A -e \
"select chrom, size from hg38.chromInfo" > hg38.chrom.sizesClip to Chromosome Boundaries
bedClip sample.bedgraph chrom.sizes sample.clipped.bedgraph
bedGraphToBigWig sample.clipped.bedgraph chrom.sizes sample.bw
Convert bigWig to bedGraph
bigWigToBedGraph sample.bw sample.bedgraph
bigWigToBedGraph sample.bw sample.chr1.bedgraph -chrom=chr1
bigWigToBedGraph sample.bw sample.region.bedgraph -chrom=chr1 -start=1000 -end=2000
Merge bedGraph Files
Using bedtools unionbedg
bedtools unionbedg -i sample1.bedgraph sample2.bedgraph sample3.bedgraph \
-header -names sample1 sample2 sample3 > merged.bedgraphAverage Across Samples
bedtools unionbedg -i sample1.bedgraph sample2.bedgraph sample3.bedgraph | \
awk '{sum=0; for(i=4;i<=NF;i++) sum+=$i; print $1,$2,$3,sum/(NF-3)}' OFS='\t' \
> average.bedgraphMathematical Operations
bedtools map for Region Statistics
bedtools map -a regions.bed -b sample.bedgraph -c 4 -o mean > region_means.bed
bedtools map -a regions.bed -b sample.bedgraph -c 4 -o sum > region_sums.bed
bedtools map -a regions.bed -b sample.bedgraph -c 4 -o max > region_max.bed
Subtract Background
bedtools unionbedg -i treatment.bedgraph input.bedgraph | \
awk '{diff=$4-$5; if(diff<0) diff=0; print $1,$2,$3,diff}' OFS='\t' \
> subtracted.bedgraphLog Transform
awk '{print $1,$2,$3,log($4+1)/log(2)}' OFS='\t' sample.bedgraph > sample.log2.bedgraphSmooth Signal
bedtools slop -i sample.bedgraph -g chrom.sizes -b 50 | \
bedtools merge -i - -c 4 -o mean > smoothed.bedgraphPython with pyBigWig
Write bedGraph
import pyBigWig
bw = pyBigWig.open('output.bedgraph', 'w')
bw.addHeader([('chr1', 248956422), ('chr2', 242193529)])
chroms = ['chr1', 'chr1', 'chr1']
starts = [0, 100, 200]
ends = [100, 200, 300]
values = [1.5, 2.3, 0.8]
bw.addEntries(chroms, starts, ends=ends, values=values)
bw.close()Read bigWig to bedGraph Format
import pyBigWig
bw = pyBigWig.open('sample.bw')
for chrom, size in bw.chroms().items():
intervals = bw.intervals(chrom)
if intervals:
for start, end, value in intervals:
print(f'{chrom}\t{start}\t{end}\t{value}')
bw.close()Convert bigWig Region to bedGraph
import pyBigWig
bw = pyBigWig.open('sample.bw')
intervals = bw.intervals('chr1', 1000000, 2000000)
with open('region.bedgraph', 'w') as f:
for start, end, value in intervals:
f.write(f'chr1\t{start}\t{end}\t{value}\n')
bw.close()deepTools for Normalization
bamCoverage (BAM to bedGraph/bigWig)
bamCoverage -b sample.bam -o sample.bw --normalizeUsing RPKM
bamCoverage -b sample.bam -o sample.bw --normalizeUsing CPM
bamCoverage -b sample.bam -o sample.bw --normalizeUsing BPM
bamCoverage -b sample.bam -o sample.bedgraph --outFileFormat bedgraph --normalizeUsing CPM
bamCompare (Treatment vs Control)
bamCompare -b1 treatment.bam -b2 input.bam -o log2ratio.bw --scaleFactorsMethod readCount
bamCompare -b1 treatment.bam -b2 input.bam -o subtracted.bw --ratio subtract
bigwigCompare
bigwigCompare -b1 treatment.bw -b2 input.bw -o ratio.bw --ratio log2
bigwigCompare -b
Read more
<!--
COPYRIGHT NOTICE
This file is part of the "Universal Biomedical Skills" project.
Copyright (c) 2026 MD BABU MIA, PhD <md.babu.mia@mssm.edu>
All Rights Reserved.
#
This code is proprietary and confidential.
Unauthorized copying of this file, via any medium is strictly prohibited.
#
Provenance: Authenticated by MD BABU MIA
-->
--- name: bio-bedgraph-handling description: Create, manipulate, and convert bedGraph files for genome browser visualization. Covers bedGraph format, conversion to/from bigWig, normalization, and signal processing. Use when handling coverage and signal tracks from ChIP-seq, ATAC-seq, or RNA-seq. tool_type: mixed primary_tool: pyBigWig measurable_outcome: Execute skill workflow successfully with valid output within 15 minutes. allowed-tools:
- read_file
- run_shell_command
---
bedGraph Handling
bedGraph is a text format for displaying continuous-valued data on genome browsers. Common for coverage, signal intensity, and scores.
bedGraph Format
track type=bedGraph name="Sample" description="Coverage" chr1 0 100 1.5 chr1 100 200 2.3 chr1 200 300 0.8
Four columns: chrom, start, end, value (0-based, half-open)
Create bedGraph from BAM
Using bedtools genomecov
bedtools genomecov -ibam sample.bam -bg > sample.bedgraph bedtools genomecov -ibam sample.bam -bg -split > sample.bedgraph bedtools genomecov -ibam sample.bam -bg -scale 1.5 > sample.scaled.bedgraph
Strand-Specific
bedtools genomecov -ibam sample.bam -bg -strand + > sample.plus.bedgraph bedtools genomecov -ibam sample.bam -bg -strand - > sample.minus.bedgraph
5' End Coverage (ChIP-seq)
bedtools genomecov -ibam sample.bam -bg -5 > sample.5prime.bedgraph
Normalize by Library Size (CPM)
total_reads=$(samtools view -c -F 260 sample.bam) scale=$(echo "scale=10; 1000000 / $total_reads" | bc) bedtools genomecov -ibam sample.bam -bg -scale $scale > sample.cpm.bedgraph
Sort bedGraph
bedGraph must be sorted for conversion to bigWig.
sort -k1,1 -k2,2n sample.bedgraph > sample.sorted.bedgraph LC_ALL=C sort -k1,1 -k2,2n sample.bedgraph > sample.sorted.bedgraph
Convert bedGraph to bigWig
Using UCSC bedGraphToBigWig
bedGraphToBigWig sample.sorted.bedgraph chrom.sizes sample.bw fetchChromSizes hg38 > hg38.chrom.sizes bedGraphToBigWig sample.sorted.bedgraph hg38.chrom.sizes sample.bw
Generate chrom.sizes
samtools faidx reference.fa
cut -f1,2 reference.fa.fai > chrom.sizes
fetchChromSizes hg38 > hg38.chrom.sizes
mysql --user=genome --host=genome-mysql.soe.ucsc.edu -A -e \
"select chrom, size from hg38.chromInfo" > hg38.chrom.sizesClip to Chromosome Boundaries
bedClip sample.bedgraph chrom.sizes sample.clipped.bedgraph bedGraphToBigWig sample.clipped.bedgraph chrom.sizes sample.bw
Convert bigWig to bedGraph
bigWigToBedGraph sample.bw sample.bedgraph bigWigToBedGraph sample.bw sample.chr1.bedgraph -chrom=chr1 bigWigToBedGraph sample.bw sample.region.bedgraph -chrom=chr1 -start=1000 -end=2000
Merge bedGraph Files
Using bedtools unionbedg
bedtools unionbedg -i sample1.bedgraph sample2.bedgraph sample3.bedgraph \
-header -names sample1 sample2 sample3 > merged.bedgraphAverage Across Samples
bedtools unionbedg -i sample1.bedgraph sample2.bedgraph sample3.bedgraph | \
awk '{sum=0; for(i=4;i<=NF;i++) sum+=$i; print $1,$2,$3,sum/(NF-3)}' OFS='\t' \
> average.bedgraphMathematical Operations
bedtools map for Region Statistics
bedtools map -a regions.bed -b sample.bedgraph -c 4 -o mean > region_means.bed bedtools map -a regions.bed -b sample.bedgraph -c 4 -o sum > region_sums.bed bedtools map -a regions.bed -b sample.bedgraph -c 4 -o max > region_max.bed
Subtract Background
bedtools unionbedg -i treatment.bedgraph input.bedgraph | \
awk '{diff=$4-$5; if(diff<0) diff=0; print $1,$2,$3,diff}' OFS='\t' \
> subtracted.bedgraphLog Transform
awk '{print $1,$2,$3,log($4+1)/log(2)}' OFS='\t' sample.bedgraph > sample.log2.bedgraphSmooth Signal
bedtools slop -i sample.bedgraph -g chrom.sizes -b 50 | \
bedtools merge -i - -c 4 -o mean > smoothed.bedgraphPython with pyBigWig
Write bedGraph
import pyBigWig
bw = pyBigWig.open('output.bedgraph', 'w')
bw.addHeader([('chr1', 248956422), ('chr2', 242193529)])
chroms = ['chr1', 'chr1', 'chr1']
starts = [0, 100, 200]
ends = [100, 200, 300]
values = [1.5, 2.3, 0.8]
bw.addEntries(chroms, starts, ends=ends, values=values)
bw.close()Read bigWig to bedGraph Format
import pyBigWig
bw = pyBigWig.open('sample.bw')
for chrom, size in bw.chroms().items():
intervals = bw.intervals(chrom)
if intervals:
for start, end, value in intervals:
print(f'{chrom}\t{start}\t{end}\t{value}')
bw.close()Convert bigWig Region to bedGraph
import pyBigWig
bw = pyBigWig.open('sample.bw')
intervals = bw.intervals('chr1', 1000000, 2000000)
with open('region.bedgraph', 'w') as f:
for start, end, value in intervals:
f.write(f'chr1\t{start}\t{end}\t{value}\n')
bw.close()deepTools for Normalization
bamCoverage (BAM to bedGraph/bigWig)
bamCoverage -b sample.bam -o sample.bw --normalizeUsing RPKM bamCoverage -b sample.bam -o sample.bw --normalizeUsing CPM bamCoverage -b sample.bam -o sample.bw --normalizeUsing BPM bamCoverage -b sample.bam -o sample.bedgraph --outFileFormat bedgraph --normalizeUsing CPM
bamCompare (Treatment vs Control)
bamCompare -b1 treatment.bam -b2 input.bam -o log2ratio.bw --scaleFactorsMethod readCount bamCompare -b1 treatment.bam -b2 input.bam -o subtracted.bw --ratio subtract
bigwigCompare
bigwigCompare -b1 treatment.bw -b2 input.bw -o ratio.bw --ratio log2 bigwigCompare -b
The largest open-source medical AI skill library for OpenClaw.
Other skills on openclaw-medical-skills.
adaptyv
Cloud laboratory platform for automated protein testing and validation. Use when designing proteins and needing experimental validation including binding…
adhd-daily-planner
Time-blind friendly planning, executive function support, and daily structure for ADHD brains. Specializes in realistic time estimation, dopamine-aware task…
aeon
This skill should be used for time series machine learning tasks including classification, regression, clustering, forecasting, anomaly detection,…
agent-browser
Browse the web for any task — research topics, read articles, interact with web apps, fill forms, take screenshots, extract data, and test web pages. Use…

