Back to Claude Scientific Skills

Migration to Pysam 0.24

skills/pysam/references/migration_to_0_24.md

2.55.04.6 KB
Original Source

Migration to Pysam 0.24

Use this checklist when moving an existing environment or pipeline to pysam 0.24.0.

Runtime Baseline

  • Pysam 0.24.0 was released 27 April 2026.
  • It was tested with Python 3.8–3.14.
  • It wraps HTSlib/samtools/bcftools 1.23.1.
  • It requires Cython 3 when building/extending from source.
  • The release notes expect 0.24 to be the final line supporting Python 3.8.

For a reproducible environment:

bash
uv pip install "pysam==0.24.0"

If maintaining Python/Cython extensions that cimport pysam declarations, rebuild them against 0.24. Do not reuse binaries built against a different pysam ABI without verification.

CRAM Behavior

Output version

New CRAM output defaults to CRAM 3.1. If downstream software only supports 3.0:

python
pysam.AlignmentFile(
    "output.cram",
    "wc",
    header=header,
    reference_filename="reference.fa",
    format_options=["version=3.0"],
)

Upgrade downstream tooling instead of forcing 3.0 when possible.

Reference lookup

Implicit EBI reference fetching is no longer enabled by default. Existing pipelines that relied on hidden network retrieval can now fail.

Preferred fix:

python
pysam.AlignmentFile(
    "input.cram",
    "rc",
    reference_filename="reference.fa",
)

Only configure REF_PATH and REF_CACHE when managed checksum-based lookup is intentional. Do not restore remote fetching without documenting network, cache, and provenance behavior.

format_options

Pysam 0.24 fixes Python 3 handling so AlignmentFile(format_options=...) and HTSFile.add_hts_options() accept documented str values rather than requiring bytes:

python
format_options=["version=3.0"]

Remove workarounds that encode these strings to bytes.

CIGAR Constants

Pysam 0.23.2 restored top-level aliases such as pysam.CMATCH after a Cython behavior change, but the release notes warn that a future release will remove them.

Migrate new and maintained code:

python
# Compatibility alias
pysam.CMATCH

# Preferred
pysam.CIGAR_OPS.CMATCH

Audit all CIGAR operators, not only CMATCH.

Modified Bases

Pysam 0.24:

  • removes the prior five-modification-type limit in AlignedSegment.modified_bases
  • fixes a crash for degenerate MM fields that describe no modified bases

Retest MM/ML parsing with:

  • multiple modification codes
  • empty/degenerate MM tags
  • missing ML tags
  • forward and reverse alignments
  • modified_bases_forward

Quality Conversion

pysam.array_to_qualitystring() was optimized substantially in 0.24. Remove custom micro-optimizations only after confirming identical handling of missing or invalid values.

Coverage and Python 3.13+

The 0.24 release fixes coverage functionality for Python 3.13 and later. Re-run count_coverage() regression cases when upgrading both Python and pysam:

  • zero-depth positions
  • base-quality threshold boundaries
  • duplicate/secondary/supplementary filtering
  • ambiguous query bases
  • contig boundaries

Variant Documentation and Errors

Pysam 0.24 adds documentation for many VariantHeader and VariantRecord internal field wrappers. Prefer documented public mappings and methods over introspection into Cython implementation details.

Recent 0.23.x releases also improved AlignmentFile and VariantFile I/O exception handling. Catch specific OSError/ValueError conditions and do not depend on old message text.

Avoid Pysam 0.23.1 for Cython Extensions

Pysam 0.23.1 was yanked because it broke binary compatibility for Cython projects by changing AlignedSegment size. Pysam 0.23.2 restored compatibility. Pure Python users were not affected in the same way.

When migrating from 0.23:

  • skip 0.23.1
  • rebuild extension modules
  • test Cython cimports against the 0.24 declarations

Dispatcher Output

Keep wrapped command output out of memory for bulk or binary operations:

python
import pysam.samtools

pysam.samtools.sort(
    "-o",
    "sorted.bam",
    "input.bam",
    catch_stdout=False,
)

This is not new to 0.24, but it is important when updating older examples that omit catch_stdout=False.

Regression Checklist

  1. Print and record pysam.__version__ and pysam.__samtools_version__.
  2. Open representative BAM, CRAM, VCF.gz, BCF, FASTA, FASTQ, and tabix files.
  3. Compare numeric queries with equivalent region strings.
  4. Decode CRAM with no network and an explicit reference.
  5. Write/read CRAM 3.1; test 3.0 only if required.
  6. Rebuild all Cython extensions.
  7. Exercise pileup and count_coverage() thresholds.
  8. Test modified-base MM/ML edge cases.
  9. Run sort/index/normalization dispatchers with file output.
  10. Recreate indexes and compare known regions and aggregate counts.