diff --git a/Cargo.lock b/Cargo.lock index dc57fe3a..a1a2c25a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -178,6 +178,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +dependencies = [ + "hybrid-array", +] + [[package]] name = "borsh" version = "1.6.1" @@ -398,6 +407,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -501,6 +516,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" +dependencies = [ + "hybrid-array", +] + [[package]] name = "cstr8" version = "0.1.4" @@ -541,8 +565,19 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "crypto-common", + "block-buffer 0.10.4", + "crypto-common 0.1.7", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.0", + "const-oid", + "crypto-common 0.2.1", ] [[package]] @@ -750,6 +785,15 @@ dependencies = [ "lzma-sys", ] +[[package]] +name = "hybrid-array" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d46837a0ed51fe95bd3b05de33cd64a1ee88fc797477ca48446872504507c5" +dependencies = [ + "typenum", +] + [[package]] name = "icu_collections" version = "2.2.0" @@ -932,9 +976,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.97" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" dependencies = [ "cfg-if", "futures-util", @@ -1116,12 +1160,12 @@ dependencies = [ [[package]] name = "md-5" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ "cfg-if", - "digest", + "digest 0.11.3", ] [[package]] @@ -1173,9 +1217,9 @@ dependencies = [ [[package]] name = "noodles" -version = "0.109.0" +version = "0.110.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4876a9caa25647b9ddc09883263b61fd6500ec7a4394f31daa5428026d5eb415" +checksum = "34e7ed524a472dbd0dc69cc7b63408f37552e48460028af44a3024f2eb77f036" dependencies = [ "noodles-bam", "noodles-bcf", @@ -1189,9 +1233,9 @@ dependencies = [ [[package]] name = "noodles-bam" -version = "0.88.0" +version = "0.89.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff57687677d53f36c3574d2350a4668825ff2fa762b6d086f779d3eeaa96b0aa" +checksum = "f0c1872afd5963f751ae78ef04ab3fb050aefc615c05c04cda7c54120eedf9b0" dependencies = [ "bstr", "indexmap", @@ -1204,9 +1248,9 @@ dependencies = [ [[package]] name = "noodles-bcf" -version = "0.85.0" +version = "0.86.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6af174cafaa3361322037561d2fc7a7b4aa77ff7fe6fdfde49266341d96d3df3" +checksum = "7b724e6dd33b8327a59e500edec383da46d54ddb743e972b88f742836838e31b" dependencies = [ "indexmap", "memchr", @@ -1218,30 +1262,30 @@ dependencies = [ [[package]] name = "noodles-bgzf" -version = "0.46.0" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37290f565045fd2775b549e62dffca7e1afadc70d8d5a3a2ef19609eb3d8193b" +checksum = "4d22589ec50582fa0c3e629d27e5263fc5ff5d436955648ba601b7ac4155fbf2" dependencies = [ "bytes", "crossbeam-channel", - "flate2", "libdeflater", + "zlib-rs", ] [[package]] name = "noodles-core" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e1e8a419dbba0e4000b0e60830b124138c7f2277ad556463506f1a81d32d17" +checksum = "c8dbac7c5f9a7de9fe45590f198a09697df631cd13d2060b4742cc48144555b0" dependencies = [ "bstr", ] [[package]] name = "noodles-cram" -version = "0.92.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb428af87832b75e4ca78e6f86a189499af8f7a1988b2582eeeb9aeb85a0c37" +checksum = "bae197edf3fbf530f6cbd4cf22dc36dba94b1a14d6ed1a925bd17e0eaecc40e8" dependencies = [ "bitflags", "bstr", @@ -1259,9 +1303,9 @@ dependencies = [ [[package]] name = "noodles-csi" -version = "0.55.0" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9c846d8128bd80b18d891b13cb9e0bc1d364429d6ab3ec3c83939f3d32ba105" +checksum = "6832254d731cb022d46927ce64403221b280b17140516cafa21e43ee4140d633" dependencies = [ "bit-vec 0.9.1", "bstr", @@ -1272,9 +1316,9 @@ dependencies = [ [[package]] name = "noodles-fasta" -version = "0.60.0" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5c8ccd951d43ba0a1c4dcc1f86fdc2ee86c1742de2988956bcdf1bc58905769" +checksum = "f0e6a772d7a5cb566196d1a1806c4471ad63bc6ffad5b2d549e9602708a9aaab" dependencies = [ "bstr", "memchr", @@ -1284,9 +1328,9 @@ dependencies = [ [[package]] name = "noodles-sam" -version = "0.84.0" +version = "0.85.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa5367d794dd6b766b7e9fe7ae93accfc9288f590ac61a881c29b7b307dbad2" +checksum = "fbaf538bea4f886de8b3fb611784a13f82c9f8e08e942849e88ec44234674512" dependencies = [ "bitflags", "bstr", @@ -1300,9 +1344,9 @@ dependencies = [ [[package]] name = "noodles-tabix" -version = "0.61.0" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2443d0852c9618cd4aa8d11bc7c1884285e46aa4466cf5c1e49f3d9756ca7ced" +checksum = "f5dceef2f7228d2977133f7b1a707c00ce0fdcf7c171e60b1e0286df0d8886fe" dependencies = [ "bstr", "indexmap", @@ -1313,9 +1357,9 @@ dependencies = [ [[package]] name = "noodles-util" -version = "0.78.0" +version = "0.79.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23492c10265ba0e28206a5a84effc980231e191040e1968e77eb9baa315748d" +checksum = "0e06ac9bac751257b5594bafa5194e026be7e42f51fb2d51819888bacb94a1a8" dependencies = [ "bstr", "flate2", @@ -1330,9 +1374,9 @@ dependencies = [ [[package]] name = "noodles-vcf" -version = "0.87.0" +version = "0.88.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b339e85269ab7689661c690f9108dceb606bf3d230e1768799ae107d505e76" +checksum = "234b3ba31b05ffd6971d838a41ca5a94e902d424ab293cd3b520776293baa96c" dependencies = [ "indexmap", "memchr", @@ -1794,7 +1838,7 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -2096,9 +2140,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" dependencies = [ "cfg-if", "once_cell", @@ -2109,9 +2153,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2119,9 +2163,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" dependencies = [ "bumpalo", "proc-macro2", @@ -2132,9 +2176,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" dependencies = [ "unicode-ident", ] @@ -2175,9 +2219,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.97" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/crates/seqair-types/CHANGELOG.md b/crates/seqair-types/CHANGELOG.md new file mode 100644 index 00000000..f524d7a9 --- /dev/null +++ b/crates/seqair-types/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## v0.1.0 (2026-05-08) + +First ever release. Changelog entries will start in next one. diff --git a/crates/seqair-types/Cargo.toml b/crates/seqair-types/Cargo.toml index bd6b520c..931d659a 100644 --- a/crates/seqair-types/Cargo.toml +++ b/crates/seqair-types/Cargo.toml @@ -6,6 +6,7 @@ description = "Core types for the seqair bioinformatics library" repository = "https://github.com/Softleif/seqair" license = "MIT OR Apache-2.0" rust-version = "1.92.0" +readme = "README.md" [dependencies] serde = { workspace = true } diff --git a/crates/seqair-types/README.md b/crates/seqair-types/README.md new file mode 100644 index 00000000..59c90bf8 --- /dev/null +++ b/crates/seqair-types/README.md @@ -0,0 +1,7 @@ +# seqair-types + +Helper types for [seqair](https://github.com/Softleif/seqair) + +## License + +MIT/Apache-2.0 diff --git a/crates/seqair/CHANGELOG.md b/crates/seqair/CHANGELOG.md new file mode 100644 index 00000000..f524d7a9 --- /dev/null +++ b/crates/seqair/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## v0.1.0 (2026-05-08) + +First ever release. Changelog entries will start in next one. diff --git a/crates/seqair/Cargo.toml b/crates/seqair/Cargo.toml index f93d0a5a..8e1a5a67 100644 --- a/crates/seqair/Cargo.toml +++ b/crates/seqair/Cargo.toml @@ -6,6 +6,8 @@ description = "Pure-Rust BAM/SAM/CRAM/FASTA reader and pileup engine" repository = "https://github.com/Softleif/seqair" license = "MIT OR Apache-2.0" rust-version = "1.92.0" +readme = "../../README.md" +exclude = ["fuzz/*", "tests/*", "benches/*"] [package.metadata.docs.rs] cargo-args = ["-Zunstable-options", "-Zrustdoc-scrape-examples"] @@ -21,7 +23,7 @@ indexmap = "2" itoa = "1" libdeflater = "1.25.2" ryu = "1" -seqair-types = { version = "0.1.0", path = "../seqair-types" } +seqair-types = { version = "^0.1.0", path = "../seqair-types" } rustc-hash = "2.1.2" flate2 = "1.1.9" bzip2 = "0.6.1" @@ -42,7 +44,7 @@ rust-htslib = { workspace = true, default-features = false, features = [ "lzma", "static", ] } -noodles = { version = "0.109.0", features = [ +noodles = { version = "0.110.0", features = [ "bam", "bcf", "bgzf", @@ -52,8 +54,8 @@ noodles = { version = "0.109.0", features = [ "sam", "vcf", ] } -noodles-bgzf = { version = "0.46.0", features = ["libdeflate"] } -noodles-util = { version = "0.78.0", features = ["alignment"] } +noodles-bgzf = { version = "0.47.0", features = ["libdeflate"] } +noodles-util = { version = "0.79.0", features = ["alignment"] } cstr8 = "0.1.4" clap = { version = "4.6.1", features = ["derive"] } anyhow = "1.0.102" diff --git a/crates/seqair/README.md b/crates/seqair/README.md deleted file mode 100644 index 337718ec..00000000 --- a/crates/seqair/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# seqair - -Pure-Rust indexed BAM/CRAM/FASTA reader and pileup engine. - -## Why a custom implementation - -Cause we wanted to try it! -This allows us to tweak the pieces that we want and to experiment with different approaches. - -Right now, we have: - -- Zero per-record allocation: `RecordStore` packs all variable-length data into contiguous byte slabs (names + data). No `Box`, no `Rc`. -- Cluster-optimized I/O: `RegionBuf` bulk-reads all compressed bytes for a region in one operation, then decompresses from memory. Important for high-latency NFS/Lustre on HPC clusters. -- Custom pileup engine: tailored access patterns with overlapping-pair dedup, per-position max-depth, and read filtering. -- SIMD optimizations for x86_64 (SSSE3, AVX2) and aarch64 -- Only native dependency is `libdeflate`. - -## Architecture - -```mermaid -flowchart TD - A[BAM file] --> B[RegionBuf\nbulk read into RAM] - B --> C[fetch_into] - C --> D[RecordStore\n3 contiguous Vecs, zero per-record alloc] - D --> E[PileupEngine\nIterator of PileupColumn] - E --> F["PileupColumn { pos, Vec }"] -``` - -## Specs - -Requirements live in `docs/spec/*.md` using [Tracey](https://tracey.bearcove.eu/) `r[rule.id]` syntax. Implementations are annotated `// r[impl rule.id]`, tests `// r[verify rule.id]`. - -## Testing - -```sh -cargo test -``` - -Comparison tests in `tests/` validate against `rust-htslib`. Property tests use `proptest`. diff --git a/crates/seqair/proptest-regressions/bam/aux.txt b/crates/seqair/proptest-regressions/bam/aux.txt deleted file mode 100644 index ae76288a..00000000 --- a/crates/seqair/proptest-regressions/bam/aux.txt +++ /dev/null @@ -1,8 +0,0 @@ -# Seeds for failure cases proptest has generated in the past. It is -# automatically read and these particular cases re-run before any -# novel cases are generated. -# -# It is recommended to check this file in to source control so that -# everyone who runs the test benefits from these saved cases. -cc 4ef2c7670aee0ebf06d6e370f80c76734cc82e217bc8b10807631f5476de1684 # shrinks to tag = [65, 65], value = 4294967296 -cc 6cc1e4ca841db8831903134a56a04b66d93aec9c0b3981579ce7cf161dfcf7f6 # shrinks to tag = [65, 65], value = -inf diff --git a/crates/seqair/src/bam.rs b/crates/seqair/src/bam.rs index 84b136e0..c304a055 100644 --- a/crates/seqair/src/bam.rs +++ b/crates/seqair/src/bam.rs @@ -40,6 +40,7 @@ // r[impl io.minimal_public_api] pub mod aligned_pairs; pub mod aligned_pairs_view; +#[path = "bam/aux_.rs"] pub mod aux; pub mod aux_data; pub mod base_mod; diff --git a/crates/seqair/src/bam/aux.rs b/crates/seqair/src/bam/aux_.rs similarity index 100% rename from crates/seqair/src/bam/aux.rs rename to crates/seqair/src/bam/aux_.rs