Skill Tracer
Skills › Scientific Agent Skills › pysam

pysam

skill · 365 lines · MIT · skills/pysam/SKILL.md

The facts

Its description

Provides Python/HTSlib workflows for genomic files. Used when reading, querying, filtering, or writing SAM/BAM/CRAM, VCF/BCF, FASTA/FASTQ, or tabix data with pysam, including pileup, coverage, indexing, and CRAM references.

The description the agent reads to decide when to use it.

From its settingsline 3

Tools it may use, or may not

allowed-tools: Read Write Edit Bash

Tools it may use while it runs without asking you first.

From its settingsline 5

Runs scripts

python scripts/inspect_hts.py, scripts/inspect_hts.py, scripts/alignment_qc.py, python scripts/alignment_qc.py (first 5 of 7 lines)

Scripts the text names. Found by matching words, so treat them as pointers.

Found by matching wordsline 66 line 67 line 68 line 75 line 76

Files it mentions

references/sources.md, scripts/inspect_hts.py, scripts/alignment_qc.py, scripts/variant_summary.py (first 5 of 20 lines)

Files the text names, such as ones to read or write. Found by matching words, so treat them as pointers.

Found by matching wordsline 26 line 48 line 75 line 76 line 77

Licence

MIT, from the skill file

The terms its author shares it under, which let it be shown here.

From its settingsline 4 licence text

Other settings

compatibility: Requires Python 3.9+ and pysam 0.24.1. Bundled scripts use local files. CRAM decoding may require the matching reference FASTA or an explicitly configured REF_PATH/REF_CACHE. metadata: version: "2.3" last-reviewed: "2026-10-01" skill-author: K-Dense Inc.

More settings at the top of the file, shown as written.

From its settingsline 6 line 7
Other files in this skill (13) Close

The text

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1---
2name: pysam
3description: Provides Python/HTSlib workflows for genomic files. Used when reading, querying, filtering, or writing SAM/BAM/CRAM, VCF/BCF, FASTA/FASTQ, or tabix data with pysam, including pileup, coverage, indexing, and CRAM references.
4license: MIT
5allowed-tools: Read Write Edit Bash
6compatibility: Requires Python 3.9+ and pysam 0.24.1. Bundled scripts use local files. CRAM decoding may require the matching reference FASTA or an explicitly configured REF_PATH/REF_CACHE.
7metadata:
8 version: "2.3"
9 last-reviewed: "2026-10-01"
10 skill-author: K-Dense Inc.
11---
13# pysam
15## Overview
17Use pysam for low-level, streaming access to HTSlib-supported genomic formats:
19- `AlignmentFile` and `AlignedSegment` for SAM/BAM/CRAM
20- `VariantFile`, `VariantHeader`, and `VariantRecord` for VCF/BCF
21- `FastaFile` for indexed FASTA and `FastxFile` for sequential FASTA/FASTQ
22- `TabixFile` for BGZF-compressed, tabix-indexed BED/GFF/GTF/custom tables
23- `pysam.samtools` and `pysam.bcftools` for wrapped command dispatchers
25Current upstream baseline: **pysam 0.24.1** (7 September 2026), wrapping
26HTSlib/samtools/bcftools 1.24. Read `references/sources.md` before updating
27version-specific guidance.

Overview

Use pysam for low-level, streaming access to HTSlib-supported genomic formats:

  • AlignmentFile and AlignedSegment for SAM/BAM/CRAM
  • VariantFile, VariantHeader, and VariantRecord for VCF/BCF
  • FastaFile for indexed FASTA and FastxFile for sequential FASTA/FASTQ
  • TabixFile for BGZF-compressed, tabix-indexed BED/GFF/GTF/custom tables
  • pysam.samtools and pysam.bcftools for wrapped command dispatchers

Current upstream baseline: pysam 0.24.1 (7 September 2026), wrapping HTSlib/samtools/bcftools 1.24. Read references/sources.md before updating version-specific guidance.

Raw lines 15 to 28
Reads a file references/sources.md :26
29## Installation
31Use the pinned release for reproducible work:
33```bash
34uv pip install "pysam==0.24.1"
35```
37Confirm the runtime:
39```python
40import pysam
42print(pysam.__version__) # 0.24.1
43print(pysam.__samtools_version__) # 1.24
44```
46Prebuilt wheels are available for supported macOS and Linux platforms. A
47source build needs a C compiler and HTSlib build dependencies; read the
48official installation guide linked from `references/sources.md`.

Installation

Use the pinned release for reproducible work:

uv pip install "pysam==0.24.1"

Confirm the runtime:

import pysam

print(pysam.__version__)           # 0.24.1
print(pysam.__samtools_version__)  # 1.24

Prebuilt wheels are available for supported macOS and Linux platforms. A source build needs a C compiler and HTSlib build dependencies; read the official installation guide linked from references/sources.md.

Raw lines 29 to 49
Reads a file references/sources.md :48
50## First Decide
52Before writing code:
541. Identify the real format, compression, sort order, and available index.
552. Decide whether coordinates are numeric Python coordinates or a region
56 string. Do not mix them.
573. For CRAM, identify the exact reference assembly and FASTA.
584. Prefer indexed region access; use sequential iteration only when intended.
595. Preserve headers when writing and write to a new path by default.
606. State filtering semantics: mapping/base quality, flags, overlap handling,
61 duplicate handling, and pileup depth cap.
63For unfamiliar files, start with the bundled read-only inspector:
65```bash
66python scripts/inspect_hts.py sample.bam
67python scripts/inspect_hts.py cohort.vcf.gz
68python scripts/inspect_hts.py reference.fa
69```

First Decide

Before writing code:

  1. Identify the real format, compression, sort order, and available index.
  2. Decide whether coordinates are numeric Python coordinates or a region string. Do not mix them.
  3. For CRAM, identify the exact reference assembly and FASTA.
  4. Prefer indexed region access; use sequential iteration only when intended.
  5. Preserve headers when writing and write to a new path by default.
  6. State filtering semantics: mapping/base quality, flags, overlap handling, duplicate handling, and pileup depth cap.

For unfamiliar files, start with the bundled read-only inspector:

python scripts/inspect_hts.py sample.bam
python scripts/inspect_hts.py cohort.vcf.gz
python scripts/inspect_hts.py reference.fa
Raw lines 50 to 70
Runs code python scripts/inspect_hts.py :66
71## Bundled Scripts
73| Script | Purpose | Typical call |
74|---|---|---|
75| `scripts/inspect_hts.py` | Metadata-only inspection for alignment, variant, FASTA, FASTQ, and tabix files | `python scripts/inspect_hts.py sample.cram --reference ref.fa` |
76| `scripts/alignment_qc.py` | Streaming aggregate read/QC counts as JSON | `python scripts/alignment_qc.py sample.bam --max-records 100000` |
77| `scripts/variant_summary.py` | Streaming variant, FILTER, and genotype summary as JSON | `python scripts/variant_summary.py cohort.vcf.gz --region chr1:1-1000000` |
78| `scripts/filter_alignments.py` | Filter SAM/BAM/CRAM without changing record order | `python scripts/filter_alignments.py input.bam output.bam --exclude-secondary` |
80All scripts refuse to overwrite existing outputs. The filter also refuses stale
81output indexes and offers `--index --csi` for large BAM contigs. FASTA inspection
82requires an existing `.fai`; create it explicitly with `pysam.faidx()` first.
83Run each with `--help` for coordinate, index, and privacy notes.
85Examples use illustrative filenames and assay-specific thresholds. The local
86synthetic suite exercises these API patterns on pysam 0.24.1; remote storage and
87biological datasets are not part of that validation.

Bundled Scripts

ScriptPurposeTypical call
scripts/inspect_hts.pyMetadata-only inspection for alignment, variant, FASTA, FASTQ, and tabix filespython scripts/inspect_hts.py sample.cram --reference ref.fa
scripts/alignment_qc.pyStreaming aggregate read/QC counts as JSONpython scripts/alignment_qc.py sample.bam --max-records 100000
scripts/variant_summary.pyStreaming variant, FILTER, and genotype summary as JSONpython scripts/variant_summary.py cohort.vcf.gz --region chr1:1-1000000
scripts/filter_alignments.pyFilter SAM/BAM/CRAM without changing record orderpython scripts/filter_alignments.py input.bam output.bam --exclude-secondary

All scripts refuse to overwrite existing outputs. The filter also refuses stale output indexes and offers --index --csi for large BAM contigs. FASTA inspection requires an existing .fai; create it explicitly with pysam.faidx() first. Run each with --help for coordinate, index, and privacy notes.

Examples use illustrative filenames and assay-specific thresholds. The local synthetic suite exercises these API patterns on pysam 0.24.1; remote storage and biological datasets are not part of that validation.

Raw lines 71 to 88
Reads a file scripts/inspect_hts.py :75
Runs code python scripts/inspect_hts.py :75
Reads a file scripts/alignment_qc.py :76
Runs code python scripts/alignment_qc.py :76
Runs code python scripts/variant_summary.py :77
Runs code python scripts/filter_alignments.py :78
89## Coordinate Contract
91**Numeric coordinates accepted by pysam APIs are 0-based, half-open.** This
92includes numeric `AlignmentFile.fetch()`, `VariantFile.fetch()`,
93`FastaFile.fetch()`, `TabixFile.fetch()`, and `pileup()` arguments.
95**Region strings are samtools-style: 1-based and inclusive.**
97```python
98# The same 100 bases:
99bam.fetch("chr1", 99, 199) # [99, 199)
100bam.fetch(region="chr1:100-199") # 1-based inclusive
101```
103VCF text uses 1-based `POS`, while record properties expose both systems:
105```python
106record.pos # 1-based
107record.start # 0-based inclusive
108record.stop # 0-based exclusive
109```
111Read `references/coordinates_and_indexing.md` for format conversions, overlap
112semantics, index choices, and contig-name checks.

Coordinate Contract

Numeric coordinates accepted by pysam APIs are 0-based, half-open. This includes numeric AlignmentFile.fetch(), VariantFile.fetch(), FastaFile.fetch(), TabixFile.fetch(), and pileup() arguments.

Region strings are samtools-style: 1-based and inclusive.

# The same 100 bases:
bam.fetch("chr1", 99, 199)          # [99, 199)
bam.fetch(region="chr1:100-199")    # 1-based inclusive

VCF text uses 1-based POS, while record properties expose both systems:

record.pos    # 1-based
record.start  # 0-based inclusive
record.stop   # 0-based exclusive

Read references/coordinates_and_indexing.md for format conversions, overlap semantics, index choices, and contig-name checks.

Raw lines 89 to 113
114## Alignment Files
116Use context managers and explicit modes:
118```python
119import pysam
121with pysam.AlignmentFile("sample.bam", "rb", threads=4) as bam:
122 for read in bam.fetch("chr1", 1_000, 2_000):
123 if (
124 not read.is_unmapped
125 and not read.is_secondary
126 and not read.is_supplementary
127 and read.mapping_quality >= 30
128 ):
129 print(read.query_name, read.reference_start, read.cigarstring)
130```
132Use `fetch(until_eof=True)` to stream every record in file order, including
133unplaced unmapped reads, without requiring an index:
135```python
136with pysam.AlignmentFile("sample.bam", "rb") as bam:
137 for read in bam.fetch(until_eof=True):
138 ...
139```
141Important distinctions:
143- `fetch()` returns placed alignment records overlapping a region; even an
144 unmapped-flagged record can have a reference position. Filter `is_unmapped`.
145- `count()` counts records and defaults to `read_callback="nofilter"`.
146- `count_coverage()` returns A/C/G/T base counts and defaults to base quality
147 15 plus `read_callback="all"`.
148- `pileup()` exposes per-column reads and has its own filtering, base-quality,
149 overlap, orphan, and `max_depth=8000` defaults.
151For exact-region pileups, set `truncate=True` and explicit filters:
153```python
154with pysam.FastaFile("reference.fa") as fasta, pysam.AlignmentFile(
155 "sample.bam", "rb"
156) as bam:
157 for column in bam.pileup(
158 "chr1",
159 1_000,
160 2_000,
161 truncate=True,
162 stepper="samtools",
163 fastafile=fasta,
164 min_mapping_quality=20,
165 min_base_quality=20,
166 max_depth=100_000,
167 ):
168 base_depth = sum(
169 not item.is_del and not item.is_refskip
170 and item.query_position is not None
171 for item in column.pileups
172 )
173 print(column.reference_pos, base_depth)
174```
176Read `references/alignment_files.md` for flags, CIGAR operations, tags,
177modified bases, writing records, pileup details, and iterator lifetime.

Alignment Files

Use context managers and explicit modes:

import pysam

with pysam.AlignmentFile("sample.bam", "rb", threads=4) as bam:
    for read in bam.fetch("chr1", 1_000, 2_000):
        if (
            not read.is_unmapped
            and not read.is_secondary
            and not read.is_supplementary
            and read.mapping_quality >= 30
        ):
            print(read.query_name, read.reference_start, read.cigarstring)

Use fetch(until_eof=True) to stream every record in file order, including unplaced unmapped reads, without requiring an index:

with pysam.AlignmentFile("sample.bam", "rb") as bam:
    for read in bam.fetch(until_eof=True):
        ...

Important distinctions:

  • fetch() returns placed alignment records overlapping a region; even an unmapped-flagged record can have a reference position. Filter is_unmapped.
  • count() counts records and defaults to read_callback="nofilter".
  • count_coverage() returns A/C/G/T base counts and defaults to base quality 15 plus read_callback="all".
  • pileup() exposes per-column reads and has its own filtering, base-quality, overlap, orphan, and max_depth=8000 defaults.

For exact-region pileups, set truncate=True and explicit filters:

with pysam.FastaFile("reference.fa") as fasta, pysam.AlignmentFile(
    "sample.bam", "rb"
) as bam:
    for column in bam.pileup(
        "chr1",
        1_000,
        2_000,
        truncate=True,
        stepper="samtools",
        fastafile=fasta,
        min_mapping_quality=20,
        min_base_quality=20,
        max_depth=100_000,
    ):
        base_depth = sum(
            not item.is_del and not item.is_refskip
            and item.query_position is not None
            for item in column.pileups
        )
        print(column.reference_pos, base_depth)

Read references/alignment_files.md for flags, CIGAR operations, tags, modified bases, writing records, pileup details, and iterator lifetime.

Raw lines 114 to 178
179## Variant Files
181Input format is auto-detected. Numeric fetch coordinates remain 0-based:
183```python
184import pysam
186with pysam.VariantFile("cohort.vcf.gz", threads=4) as variants:
187 for record in variants.fetch("chr1", 999_999, 2_000_000):
188 print(record.contig, record.pos, record.ref, record.alts)
189 for sample_name, call in record.samples.items():
190 print(sample_name, call.get("GT"))
191```
193Subset samples **before retrieving records**:
195```python
196with pysam.VariantFile("cohort.bcf") as variants:
197 variants.subset_samples(["sample_A", "sample_B"])
198 for record in variants:
199 ...
200```
202When changing a header, copy each record and translate it to the destination
203header before assigning newly declared INFO/FORMAT/FILTER fields. Do not
204manually clear and rebuild `header.samples`.
206Read `references/variant_files.md` for safe headers, writing, sample
207subsetting, missing genotypes, symbolic alleles, filtering, translation, and
208indexing.

Variant Files

Input format is auto-detected. Numeric fetch coordinates remain 0-based:

import pysam

with pysam.VariantFile("cohort.vcf.gz", threads=4) as variants:
    for record in variants.fetch("chr1", 999_999, 2_000_000):
        print(record.contig, record.pos, record.ref, record.alts)
        for sample_name, call in record.samples.items():
            print(sample_name, call.get("GT"))

Subset samples before retrieving records:

with pysam.VariantFile("cohort.bcf") as variants:
    variants.subset_samples(["sample_A", "sample_B"])
    for record in variants:
        ...

When changing a header, copy each record and translate it to the destination header before assigning newly declared INFO/FORMAT/FILTER fields. Do not manually clear and rebuild header.samples.

Read references/variant_files.md for safe headers, writing, sample subsetting, missing genotypes, symbolic alleles, filtering, translation, and indexing.

Raw lines 179 to 209
Reads a file references/variant_files.md :206
210## FASTA, FASTQ, and Tabix
212Indexed FASTA uses numeric 0-based coordinates:
214```python
215with pysam.FastaFile("reference.fa") as fasta:
216 sequence = fasta.fetch("chr1", 999, 1_099)
217```
219`FastxFile` is sequential. `persist=False` is faster but yielded records become
220invalid after iteration advances:
222```python
223with pysam.FastxFile("reads.fastq.gz", persist=False) as reads:
224 for read in reads:
225 qualities = read.get_quality_array()
226 ...
227```
229Tabix input must be coordinate-sorted and BGZF-compressed, not ordinary gzip.
230Use a non-destructive two-step workflow:
232```python
233pysam.tabix_compress("regions.bed", "regions.bed.gz")
234pysam.tabix_index("regions.bed.gz", preset="bed")
236with pysam.TabixFile("regions.bed.gz", parser=pysam.asBed()) as tbx:
237 for interval in tbx.fetch("chr1", 1_000, 2_000):
238 print(interval.contig, interval.start, interval.end)
239```
241Read `references/sequence_files.md` for FASTA/FASTQ records and safe tabix
242creation.

FASTA, FASTQ, and Tabix

Indexed FASTA uses numeric 0-based coordinates:

with pysam.FastaFile("reference.fa") as fasta:
    sequence = fasta.fetch("chr1", 999, 1_099)

FastxFile is sequential. persist=False is faster but yielded records become invalid after iteration advances:

with pysam.FastxFile("reads.fastq.gz", persist=False) as reads:
    for read in reads:
        qualities = read.get_quality_array()
        ...

Tabix input must be coordinate-sorted and BGZF-compressed, not ordinary gzip. Use a non-destructive two-step workflow:

pysam.tabix_compress("regions.bed", "regions.bed.gz")
pysam.tabix_index("regions.bed.gz", preset="bed")

with pysam.TabixFile("regions.bed.gz", parser=pysam.asBed()) as tbx:
    for interval in tbx.fetch("chr1", 1_000, 2_000):
        print(interval.contig, interval.start, interval.end)

Read references/sequence_files.md for FASTA/FASTQ records and safe tabix creation.

Raw lines 210 to 243
244## CRAM, Remote I/O, and Threads
246pysam 0.24 changed inherited HTSlib behavior:
248- Newly written CRAM defaults to CRAM 3.1, not 3.0.
249- HTSlib no longer contacts the EBI reference server by default.
250- Prefer `reference_filename="reference.fa"` for deterministic local reads and
251 writes.
253```python
254with pysam.AlignmentFile(
255 "sample.cram",
256 "rc",
257 reference_filename="reference.fa",
258 threads=4,
259) as cram:
260 for read in cram.fetch("chr1", 1_000, 2_000):
261 ...
262```
264Only configure `REF_PATH`/`REF_CACHE` when reference-by-MD5 lookup is
265intentional. Do not assume a CRAM is self-contained. `threads=` accelerates
266compression/decompression; it does not parallelize Python analysis.
268Read `references/cram_and_performance.md` before CRAM conversion, remote access,
269or concurrent iteration.

CRAM, Remote I/O, and Threads

pysam 0.24 changed inherited HTSlib behavior:

  • Newly written CRAM defaults to CRAM 3.1, not 3.0.
  • HTSlib no longer contacts the EBI reference server by default.
  • Prefer reference_filename="reference.fa" for deterministic local reads and writes.
with pysam.AlignmentFile(
    "sample.cram",
    "rc",
    reference_filename="reference.fa",
    threads=4,
) as cram:
    for read in cram.fetch("chr1", 1_000, 2_000):
        ...

Only configure REF_PATH/REF_CACHE when reference-by-MD5 lookup is intentional. Do not assume a CRAM is self-contained. threads= accelerates compression/decompression; it does not parallelize Python analysis.

Read references/cram_and_performance.md before CRAM conversion, remote access, or concurrent iteration.

Raw lines 244 to 270
271## Wrapped samtools and bcftools
273Import command modules explicitly. Pass each command-line token as a separate
274string:
276```python
277import pysam.samtools
278import pysam.bcftools
280pysam.samtools.sort(
281 "-@", "4", "-o", "sorted.bam", "input.bam", catch_stdout=False
283pysam.samtools.index("-@", "4", "sorted.bam", catch_stdout=False)
285pysam.bcftools.index("--csi", "variants.vcf.gz", catch_stdout=False)
286```
288Dispatchers capture stdout by default. For large or binary output, use the
289tool's `-o` option with `catch_stdout=False`, or `save_stdout=...`, rather than
290returning the complete output in memory.
292```python
293try:
294 pysam.samtools.quickcheck("-v", "sample.bam")
295except pysam.SamtoolsError as error:
296 # The exception contains current stderr; get_messages() can be stale
297 # after failure in 0.24.1.
298 raise RuntimeError(str(error)) from error
299```
301Use the Python API for record-level logic and dispatchers for mature bulk
302operations such as sort, index, merge, view, and normalization. Never compose
303dispatcher arguments by splitting an untrusted shell command.

Wrapped samtools and bcftools

Import command modules explicitly. Pass each command-line token as a separate string:

import pysam.samtools
import pysam.bcftools

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

pysam.bcftools.index("--csi", "variants.vcf.gz", catch_stdout=False)

Dispatchers capture stdout by default. For large or binary output, use the tool's -o option with catch_stdout=False, or save_stdout=..., rather than returning the complete output in memory.

try:
    pysam.samtools.quickcheck("-v", "sample.bam")
except pysam.SamtoolsError as error:
    # The exception contains current stderr; get_messages() can be stale
    # after failure in 0.24.1.
    raise RuntimeError(str(error)) from error

Use the Python API for record-level logic and dispatchers for mature bulk operations such as sort, index, merge, view, and normalization. Never compose dispatcher arguments by splitting an untrusted shell command.

Raw lines 271 to 304
305## Writing Rules
307- Copy or construct a valid header before opening output.
308- Write to a new path; do not use `force=True` unless replacement is explicit.
309- Preserve sort order if the output will be indexed.
310- Set `query_sequence` before `query_qualities`.
311- Prefer `pysam.CIGAR_OPS` enum members; top-level constants such as
312 `pysam.CMATCH` are compatibility aliases slated for future removal.
313- Use `pysam.samtools.quickcheck()` as a fast alignment header/EOF preflight;
314 it does not read the middle of the file and cannot rule out internal corruption.
315 When full readability must be established, perform a complete sequential decode
316 with the matching CRAM reference and compare expected counts/checksums. Reopen
317 variant/sequence outputs before downstream use. See the
318 [samtools quickcheck contract](https://www.htslib.org/doc/samtools-quickcheck.html).
319- Use CSI rather than BAI/TBI when references or coordinates exceed legacy
320 index limits.

Writing Rules

  • Copy or construct a valid header before opening output.
  • Write to a new path; do not use force=True unless replacement is explicit.
  • Preserve sort order if the output will be indexed.
  • Set query_sequence before query_qualities.
  • Prefer pysam.CIGAR_OPS enum members; top-level constants such as pysam.CMATCH are compatibility aliases slated for future removal.
  • Use pysam.samtools.quickcheck() as a fast alignment header/EOF preflight; it does not read the middle of the file and cannot rule out internal corruption. When full readability must be established, perform a complete sequential decode with the matching CRAM reference and compare expected counts/checksums. Reopen variant/sequence outputs before downstream use. See the samtools quickcheck contract.
  • Use CSI rather than BAI/TBI when references or coordinates exceed legacy index limits.
Raw lines 305 to 321
322## Reference Map
324| Need | Read |
325|---|---|
326| Alignment API, flags, CIGAR, pileup, modified bases | `references/alignment_files.md` |
327| VCF/BCF headers, records, samples, writing | `references/variant_files.md` |
328| FASTA/FASTQ and tabix-indexed tables | `references/sequence_files.md` |
329| Coordinate conversion and index selection | `references/coordinates_and_indexing.md` |
330| CRAM references, remote I/O, threads, performance | `references/cram_and_performance.md` |
331| Correct integrated analysis patterns | `references/common_workflows.md` |
332| Compact current API signatures and defaults | `references/api_reference.md` |
333| Upgrade notes for existing environments | `references/migration_to_0_24.md` |
334| Official docs, specifications, and release sources | `references/sources.md` |

Reference Map

NeedRead
Alignment API, flags, CIGAR, pileup, modified basesreferences/alignment_files.md
VCF/BCF headers, records, samples, writingreferences/variant_files.md
FASTA/FASTQ and tabix-indexed tablesreferences/sequence_files.md
Coordinate conversion and index selectionreferences/coordinates_and_indexing.md
CRAM references, remote I/O, threads, performancereferences/cram_and_performance.md
Correct integrated analysis patternsreferences/common_workflows.md
Compact current API signatures and defaultsreferences/api_reference.md
Upgrade notes for existing environmentsreferences/migration_to_0_24.md
Official docs, specifications, and release sourcesreferences/sources.md
Raw lines 322 to 335
336## Common Failure Modes
338- Treating numeric `VariantFile.fetch()` coordinates as 1-based
339- Using ordinary gzip where BGZF plus tabix/CSI is required
340- Calling region fetch without an index
341- Assuming `fetch()` includes unplaced unmapped alignments
342- Forgetting `truncate=True` for an exact pileup interval
343- Ignoring pileup defaults such as base quality 13 and depth cap 8000
344- Sharing one file handle across active iterators or threads
345- Decoding CRAM without its exact reference
346- Assigning a new VCF field before declaring it in the output header
347- Capturing large samtools/bcftools output in memory
348- Using a SNP base-counting method for indels or symbolic alleles

Common Failure Modes

  • Treating numeric VariantFile.fetch() coordinates as 1-based
  • Using ordinary gzip where BGZF plus tabix/CSI is required
  • Calling region fetch without an index
  • Assuming fetch() includes unplaced unmapped alignments
  • Forgetting truncate=True for an exact pileup interval
  • Ignoring pileup defaults such as base quality 13 and depth cap 8000
  • Sharing one file handle across active iterators or threads
  • Decoding CRAM without its exact reference
  • Assigning a new VCF field before declaring it in the output header
  • Capturing large samtools/bcftools output in memory
  • Using a SNP base-counting method for indels or symbolic alleles
Raw lines 336 to 349
Boilerplate, lines 350 to 365. The same text appears in 125 other files here. Close
350## Citing Scientific Agent Skills
352This skill is part of Scientific Agent Skills by K-Dense. If it materially contributed to a
353manuscript, report, presentation, or code release, add the paper to the references or
354software section and tell the user you did so:
356> Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent
357> Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065.
358> https://doi.org/10.48550/arXiv.2609.00065
360Always cite the current version. The DOI and https://arxiv.org/abs/2609.00065 resolve to the
361latest arXiv version, so never append a version suffix such as `v1`. When network access is
362available, fetch https://arxiv.org/abs/2609.00065 (or
363http://export.arxiv.org/api/query?id_list=2609.00065) before writing the reference and take
364the author list, year, and version from that record. If the record lists a journal reference
365or publisher DOI, cite the published version instead.

From K-Dense-AI/scientific-agent-skills at 5f2bc03, 2026-10-26. Not read by a model yet. Summary and techniques by Claude Opus 5.5 on 2026-11-06.