Skip to main content

Comprehensive BAM file deduplication that automatically handles multiple sequencing conditions and edge cases

Project description

MarkDup

Python Version License: MIT Development Status Version

A comprehensive Python tool for deduplicating BAM files that automatically handles multiple sequencing conditions and edge cases with intelligent UMI clustering and biological positioning.

⚠️ Early Development Stage: This tool is currently in alpha development. While functional, it may have bugs and the API may change. Please report any issues you encounter.

🆕 Version 0.0.2: Enhanced error handling, better input validation, improved memory management, and more detailed progress reporting.

🎯 Key Differentiators

Unlike other deduplication tools, MarkDup automatically handles multiple sequencing conditions and edge cases:

  • 🔬 Multi-condition Support: Works with or without UMIs, single-end or paired-end reads
  • 🧬 Biological Positioning: Automatically handles strand-aware positioning (start-only, end-only, or full fragment)
  • 🎯 Intelligent Clustering: Frequency-aware UMI clustering prevents unrealistic merging
  • ⚡ Edge Case Handling: Automatically detects and handles various sequencing artifacts
  • 🔧 Adaptive Processing: Automatically adjusts algorithms based on input data characteristics

🚀 Features

Core Capabilities

  • 🔬 UMI-based deduplication with quality-based read selection
  • 📍 Coordinate-based deduplication for files without UMIs
  • 🧬 Biological positioning for strand-aware clustering
  • ⚡ Process-based parallelism for multi-core performance
  • 🎯 Advanced clustering with edit distance and frequency-aware algorithms
  • 📊 Comprehensive statistics and progress tracking

Automatic Edge Case Handling

  • 🔄 UMI Detection: Automatically detects UMI presence and format
  • 🧬 Strand Awareness: Automatically handles forward/reverse strand reads
  • 📏 CIGAR Handling: Properly processes reads with indels and complex CIGAR strings
  • 🎯 Position Grouping: Intelligent grouping based on biological vs. reference coordinates
  • ⚖️ Frequency Balancing: Prevents over-clustering of high-frequency UMIs
  • 🔧 Quality Selection: Multiple quality metrics with automatic fallback

📦 Installation

From PyPI (Recommended)

pip install markdup

From Source

git clone https://github.com/y9c/markdup.git
cd markdup
pip install .

Using uv (Development)

git clone https://github.com/y9c/markdup.git
cd markdup
uv sync

🚀 Quick Start

Automatic UMI Detection and Processing

# Tool automatically detects UMIs and chooses appropriate method
markdup input.bam output.bam

# With multiple threads
markdup input.bam output.bam --threads 8

# Keep duplicates and mark them
markdup input.bam output.bam --keep-duplicates

Explicit Method Selection

# Force UMI-based deduplication
markdup input.bam output.bam --method umi

# Force coordinate-based deduplication (no UMIs)
markdup input.bam output.bam --method coordinate

Advanced Positioning Options

# Start-only positioning (e.g., for ChIP-seq)
markdup input.bam output.bam --start-only

# End-only positioning (e.g., for reverse-complemented reads)
markdup input.bam output.bam --end-only

# Full fragment positioning (default, handles both start and end)
markdup input.bam output.bam

UMI Clustering Tuning

# Custom edit distance threshold
markdup input.bam output.bam --min-edit-dist-frac 0.17

# Frequency-aware clustering to prevent over-merging
markdup input.bam output.bam --min-frequency-ratio 0.1

# Custom UMI separator
markdup input.bam output.bam --umi-separator ":"

📋 Command Line Interface

Global Options

Option Description Default
--help Show help message -
--version Show version information -

Input/Output Options

Option Description Default
INPUT_BAM Input BAM file path Required
OUTPUT_BAM Output BAM file path Required
--force Overwrite output file if it exists False

Deduplication Method

Option Description Default
--method Deduplication method: umi or coordinate umi

UMI Options

Option Description Default
--umi-separator Separator for extracting UMIs from read names _
--min-edit-dist-frac Minimum UMI edit distance as fraction of UMI length 0.1
--min-frequency-ratio Minimum frequency ratio for UMI clustering 0.1

Positioning Options

Option Description Default
--start-only Group reads by start position only False
--end-only Group reads by end position only False

Quality Selection

Option Description Default
--best-read-by Select best read by: mapq, avg_base_q avg_base_q

Processing Options

Option Description Default
--threads Number of threads for parallel processing 1
--window-size Size of genomic windows for processing 100000
--keep-duplicates Keep duplicate reads and mark them False

🧬 Algorithm Details

Automatic Condition Detection

The tool automatically detects and handles:

  1. UMI Presence: Scans read names for UMI patterns
  2. Read Type: Single-end vs. paired-end detection
  3. Strand Orientation: Forward vs. reverse strand handling
  4. CIGAR Complexity: Indel and complex alignment handling
  5. Quality Metrics: Available quality scores and selection criteria

UMI-based Deduplication

  1. Fragment Creation: Reads are grouped into fragments (single-end or paired-end)
  2. Biological Positioning: Fragments are positioned using strand-aware coordinates
  3. Position Grouping: Fragments are grouped by biological position and strand
  4. UMI Clustering: Within each position group, UMIs are clustered using:
    • Exact matching for identical UMIs
    • Edit distance clustering for similar UMIs
    • Frequency-aware clustering to prevent unrealistic merging
  5. Quality Selection: The highest quality read from each cluster is selected
  6. Output Generation: Selected reads are written with comprehensive cluster information

Coordinate-based Deduplication

  1. Fragment Creation: Reads are grouped into fragments
  2. Position Grouping: Fragments are grouped by genomic coordinates
  3. Quality Selection: The highest quality read from each group is selected
  4. Output Generation: Selected reads are written

Biological Positioning

  • Forward strand: Biological start = reference start, Biological end = reference end
  • Reverse strand: Biological start = reference end, Biological end = reference start
  • Strand-aware clustering: Ensures proper grouping regardless of strand orientation
  • CIGAR-aware positioning: Properly handles indels and complex alignments

📊 Output Format

BAM Tags

Tag Description
cn Cluster name with genomic coordinates and UMI (format: chr:start-end:strand:UMI)
cs Cluster size (number of reads in cluster)

Example Output

read1_UMI123    0    chr1    1001    60    50M    *    0    0    ATGC...    IIII...    cn:Z:chr1:1001-1050:+:UMI123    cs:i:3
read2_UMI123    1024  chr1    1001    50    50M    *    0    0    ATGC...    IIII...    cn:Z:chr1:1001-1050:+:UMI123    cs:i:3
read3_UMI123    1024  chr1    1001    45    50M    *    0    0    ATGC...    IIII...    cn:Z:chr1:1001-1050:+:UMI123    cs:i:3

📚 Documentation

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

markdup-0.0.3.tar.gz (38.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

markdup-0.0.3-py3-none-any.whl (28.5 kB view details)

Uploaded Python 3

File details

Details for the file markdup-0.0.3.tar.gz.

File metadata

  • Download URL: markdup-0.0.3.tar.gz
  • Upload date:
  • Size: 38.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for markdup-0.0.3.tar.gz
Algorithm Hash digest
SHA256 62fc58be961f339d99b05442191489e0f3c8c69cf64e7011e4fcb94db8cf03dd
MD5 4c8ffb2d14e6eb523deea4129ffb268d
BLAKE2b-256 925444854efab228f2515b4c661f5a9a19f15644e448b85dedb7cd1a562b6a78

See more details on using hashes here.

Provenance

The following attestation bundles were made for markdup-0.0.3.tar.gz:

Publisher: publish.yml on y9c/markdup

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file markdup-0.0.3-py3-none-any.whl.

File metadata

  • Download URL: markdup-0.0.3-py3-none-any.whl
  • Upload date:
  • Size: 28.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for markdup-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 2a6ed9b363511061834354c1f56fd8220265662a0ea2d54a4968fa60c81670dd
MD5 438260679543cf0fedabdd7271d1bbdf
BLAKE2b-256 461adfdec93cf34436c0e16c9f3c77357594f9c7a4ce3885014567add43b837a

See more details on using hashes here.

Provenance

The following attestation bundles were made for markdup-0.0.3-py3-none-any.whl:

Publisher: publish.yml on y9c/markdup

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page