Add native CRAM output support (unsorted and coordinate-sorted) via HTSlib#2670
Open
BenjaminDEMAILLE wants to merge 4 commits into
Open
Add native CRAM output support (unsorted and coordinate-sorted) via HTSlib#2670BenjaminDEMAILLE wants to merge 4 commits into
BenjaminDEMAILLE wants to merge 4 commits into
Conversation
…ite1 after sorting
birdingman0626
added a commit
to birdingman0626/STAR-Cross
that referenced
this pull request
Jun 29, 2026
…ndian support (#7) * fix(macos): spawn readFilesCommand via posix_spawnp The POSIX path used vfork()+execlp()+exit(0) to run the generated readsCommand script. On macOS this fails ("Failed spawning readFilesCommand", upstream issue alexdobin#2663) because the script has no shebang and posix_spawn-style exec has no ENOEXEC->/bin/sh fallback; calling exit() in a vfork child is also undefined behavior. Replace with posix_spawnp invoking "<shell> <script>" explicitly, with proper error checking. POSIX-only branch; the Windows system()-based path is unchanged. Ported from upstream PR alexdobin#2693. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat: big-endian support with guarded little-endian fast path STAR read the genome, suffix array and packed arrays through native uint*/uint128* casts, assuming little-endian byte order, which caused "next index is smaller than previous" failures on big-endian hosts (s390x, ppc64). Add byteOrder.h with loadUintLE/storeUintLE helpers and route the four endian-sensitive sites (PackedArray::operator[]/writePacked, funCompareSuffixes, funCalcSAiFromSA) through them. The helpers are guarded by STAR_BIG_ENDIAN: little-endian builds keep the original single-instruction native load (zero performance/behavior change), and only known big-endian compiles take the portable byte-wise path. The existing MSVC byte-access path in funCalcSAiFromSA is reused for BE. The byte-wise implementation is exposed by name and unit-tested (test_byteOrder.cpp) so the BE algorithm is validated on the LE CI runner. Ported from the patch in upstream issue alexdobin#2690. Note: compile-validated only; CI has no big-endian runner. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat: referenceless CRAM output (--outSAMtype CRAM) Add CRAM as an output container. STAR produces its BAM via the proven output path, then transcodes it to referenceless CRAM at finalization (cramOutput.cpp, using bundled HTSlib with CRAM_OPT_NO_REF, so no external reference FASTA is required). On conversion failure the original BAM is kept and the run continues. - Parameters_runtimeSetup: accept "CRAM" as outSAMtype[0], reusing the BAM Unsorted/SortedByCoordinate logic; set outCRAMbool and CRAM names. - STAR.cpp: transcode Aligned.out.bam / Aligned.sortedByCoord.out.bam to .cram after wiggle output, removing the intermediate BAM. - Hot per-record output code is untouched; the transcriptome BAM stays BAM for RSEM/Salmon. CRAM is incompatible with --outStd. - WebUI: CRAM options in the outSAMtype dropdown, .cram artifacts and MIME type. - Registered cramOutput in CMake build. Implemented properly rather than porting the incomplete upstream draft PR alexdobin#2670 (which wrote a NULL header and rerouted the working BAM path). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * build: Makefile ARM64/macOS/libomp parity and cramOutput Port the platform-detection from upstream PR alexdobin#2694 to the Makefile (CI uses CMake, which already handles ARM64; this is for `make` users): - detect UNAME_S/UNAME_M; select -mavx2 on x86_64, -march=armv8-a+simd on ARM64/AArch64 - macOS + Apple clang OpenMP: -Xpreprocessor -fopenmp + libomp include, -lomp at link; add native STARforMac target (dynamic libomp) - portable BSD/macOS date fallback for the build timestamp - add cramOutput.o to OBJECTS Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * docs: document CRAM output, ARM64/macOS, and big-endian support Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add native CRAM output support to STAR
Overview
This contribution adds full support for CRAM output in STAR, both for unsorted and coordinate-sorted alignments, using HTSlib’s native APIs. The implementation is fully backward compatible and preserves all existing BAM/SAM functionality.
Motivation
Features
New output format:
Users can now specify
--outSAMtype CRAM Unsortedor--outSAMtype CRAM SortedByCoordinateto produce CRAM files directly from STAR.HTSlib integration:
Output is handled via HTSlib’s
htsFileandsam_write1APIs, ensuring compatibility with the CRAM standard and future-proofing for other formats.Automatic format detection:
The output format is detected from the
--outSAMtypeparameter and the correct file mode is used for htslib.Unsorted and sorted output:
sam_write1.Backward compatibility:
Existing BAM/SAM output logic is preserved. If CRAM is not requested, STAR behaves as before.
Implementation Details
BAMoutputclass now supports both legacy BGZF output and htslib-based output (htsFile), with logic to route records to the appropriate backend.ReadAlignChunk.cppandbamSortByCoordinate.cppis updated to usehts_openwith the correct mode for CRAM/SAM/BAM.sam_write1.bam_catlogic is preserved.Usage