A Python package for extracting data from Bruker timsTOF data files (.tdf and .tdf_bin). Includes a Numba-accelerated centroiding algorithm for efficient extraction of ion mobility data.
tdfpy reads Bruker timsTOF .d acquisitions straight from analysis.tdf and analysis.tdf_bin — no Bruker native library required. It gives you familiar Python objects for DDA, DIA, and PRM runs, plus a tunable, Numba-accelerated centroiding pipeline for pulling clean, ion-mobility-resolved peaks out of raw PASEF frames.
It's for proteomics and mass spec developers who want to script against timsTOF data without hand-rolling SQLite queries or reverse-engineering the binary frame format.
Why tdfpy?
- Pure Python, no native dependency —
analysis.tdf_binis decoded directly, so it runs on Linux, macOS, and Windows, x86-64 and ARM - One API for DDA, DIA, and PRM — frames, precursors, isolation windows, targets, and transitions are all typed Python objects
- Composable peak pipeline — chain region exclusion, smoothing, and noise filters before centroiding, or use short-hand defaults
- Two centroiders — a Numba-JIT'd greedy merge in float m/z space, and a watershed region-grower in integer TOF-index space, swappable without touching surrounding code
- Lazy spectral access — frame metadata loads upfront; raw peak data is only decoded when you call
.peaks,.raw_peaks(), or.centroid() - Query by m/z and RT, not just row index
Installation
pip install tdfpy
Requires Python 3.12+. On Python 3.12/3.13 the zstandard package is installed automatically; Python 3.14+ uses the standard library's zstd module.
Optional extras:
pip install "tdfpy[viz]" # matplotlib-based plotting helpers
pip install "tdfpy[mcp]" # MCP server for AI-agent access to acquisitions
Quick Start
from tdfpy import DDA
with DDA("sample.d") as dda:
# Iterate over MS1 frames
for frame in dda.ms1:
print(f"Frame {frame.frame_id} at RT {frame.time:.1f}s")
peaks = frame.centroid() # shape (N, 3): [m/z, intensity, 1/K0]
print(f" {len(peaks)} centroided peaks")
break
# Iterate over precursors (MS2)
for precursor in dda.precursors:
print(f"Precursor {precursor.precursor_id}: {precursor.largest_peak_mz:.4f} m/z")
peaks = precursor.peaks # MS2 centroided by tdfpy (mobility collapse + merge)
break
DIA and PRM acquisitions work the same way with DIA(...) and PRM(...); see the getting started guide for both.
What else it can do
| Feature | Example |
|---|---|
| Lookups & queries | dda.precursors.query(mz=1292.63, mz_tolerance=20.0, rt=2400.0, rt_tolerance=30.0) — by ID or by m/z/RT window |
| Custom peak pipelines | frame.centroid(exclude=ChargeStateRegion(), smooth=Smooth(...), noise=[MadThreshold(k=3), ...], centroid=WatershedCentroider(...)) |
| Noise filter shorthand | frame.centroid(noise="mad") or frame.centroid(noise=500.0) for common cases |
| CLI validation | tdfpy validate sample.d --full checks every binary frame without modifying the acquisition |
| MCP server | tdfpy-mcp exposes acquisition inspection and spectrum extraction as tools for AI agents |
Full pipeline options (region exclusion, smoothing, the two centroiders, and the noise-filter chain) are covered in the analysis guide and API reference.
Related packages
tdfpy is the timsTOF reader in the tacular-omics family. mzmlpy reads mzML files the same way, and spxtacular builds spectrum-processing pipelines on top of either.
Documentation
Full documentation: tacular-omics.github.io/tdfpy
Citation
If you use tdfpy in published work, please cite it — see CITATION.cff or the DOI record.
License
Release files for tdfpy 4.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tdfpy-4.1.0.tar.gz | 570.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tdfpy-4.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 675.8 kB
Release files / tdfpy-4.1.0.tar.gz
| Download URL | tdfpy-4.1.0.tar.gz |
|---|---|
| Size | 570.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bd18040f73383f8cb16e655fc3d5ca09e4e287224b3ac0c8882b93c0b9246ec7
|
|
BLAKE2b-256 checksum How to use checksums |
edb2ce5ad571e6c4e4e4c23e8b79da25b4cde23e332461840e3acb5075522f2a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / tdfpy-4.1.0-py3-none-any.whl
| Download URL | tdfpy-4.1.0-py3-none-any.whl |
|---|---|
| Size | 105.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
10f4a87abf79d90efa6ac9073c658874ba6673da41b6ca1d539aa49c16578321
|
|
BLAKE2b-256 checksum How to use checksums |
f858ac02edbcdfa5ece1d0efa261952eb6de1630fa0ceaf5687d5dd0161cbfe6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency log