Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
888ce6b
Pass the `--pangenome_contig_prefix` to `PangenomeSV`.
DonFreed Jul 24, 2026
8d3d68e
Fix shell-pipeline correctness bugs and size internal pipes natively
DonFreed Aug 12, 2026
a34554f
Rework the DAG/scheduler/executor engine layer
DonFreed Aug 12, 2026
faf6c9a
Fix BasePipeline lifecycle issues
DonFreed Aug 12, 2026
ffd4b60
Trim unused engine functionality and condense comments
DonFreed Aug 13, 2026
dcdaada
Merge pull request #30 from Sentieon/engine-updates
DonFreed Aug 13, 2026
56082bd
Add a per-run log directory with run.log and command.txt
DonFreed Aug 13, 2026
0f7930a
Give jobs a task name and a unique, human-readable job id
DonFreed Aug 14, 2026
91c4d66
Capture each process's output to per-task log files
DonFreed Aug 14, 2026
7a89cd4
Merge pull request #31 from Sentieon/log-restructure
DonFreed Aug 14, 2026
87f54b2
Fix log-directory setup ordering, id sanitization, and verbosity flags
DonFreed Aug 14, 2026
0d4150d
Record per-process rusage by owning the child reap
DonFreed Aug 14, 2026
be5b184
Report per-process rusage in the run logs
DonFreed Aug 14, 2026
fb9fa2c
Test rusage capture and the per-process metrics report
DonFreed Aug 14, 2026
76394ba
Tear down children when the run loop fails; make the wait pool tunable
DonFreed Aug 14, 2026
1dd30ca
Merge pull request #32 from Sentieon/log-metrics
DonFreed Aug 14, 2026
58c9c4d
Add the hybrid-pangenome pipeline
DonFreed Aug 15, 2026
74f25ba
Support aligned short-read and unaligned long-read input in hybrid-pa…
DonFreed Aug 16, 2026
e6d526f
Sort SV update regions in reference contig order
DonFreed Aug 16, 2026
390c5cf
Thread the pangenome contig prefix through all graph consumers
DonFreed Aug 16, 2026
f7b4a0f
Harden input readgroup validation and the KMC patch check
DonFreed Aug 16, 2026
feabf07
Sort the HybridStage1 hap_bam output explicitly
DonFreed Aug 17, 2026
ecc7663
Remove the temporary directory when a sentieon-pangenome run fails
DonFreed Aug 17, 2026
4f0750f
Revert the k-mer count check in check_kmc_patch
DonFreed Aug 17, 2026
31ae7fd
Increment version
DonFreed Aug 18, 2026
5b60f8a
Use the SENTIEON_VERSION repo variable in CI-smoke
DonFreed Aug 18, 2026
9b2b2a8
Merge pull request #33 from Sentieon/hybrid-pangenome
DonFreed Aug 18, 2026
be7b241
Write per-process and per-job metrics tables to the log directory
DonFreed Aug 19, 2026
dfb7f52
Run pangenome metrics on the bwa alignment only
DonFreed Aug 22, 2026
9c9471f
Update the pangenome AD and DP counts from SAD or LAD
DonFreed Aug 31, 2026
12c70a1
Support the new CNVscope syntax from release 202503.04
DonFreed Sep 1, 2026
bd66813
Emit --interval_padding only when it is set
DonFreed Sep 2, 2026
6f7d777
Add the stage building blocks
DonFreed Sep 2, 2026
54913fd
Move CNV calling and ploidy estimation into stages
DonFreed Sep 2, 2026
c64e941
Move duplicate marking and metrics into stages
DonFreed Sep 2, 2026
b0b3a73
Move small-variant calling into stages
DonFreed Sep 2, 2026
11bf13c
Insert the hybrid calling jobs directly into the DAG
DonFreed Sep 2, 2026
a82a973
Insert the long-read calling jobs directly into the DAG
DonFreed Sep 2, 2026
6f0c225
Move alignment and read extraction into stages
DonFreed Sep 2, 2026
4c54088
Use the shared version-check and required-argument helpers
DonFreed Sep 2, 2026
cfdc6a3
Remove unused helpers
DonFreed Sep 2, 2026
98338cd
Simplify the stages after review
DonFreed Sep 4, 2026
7ab0e4e
Move short-read preprocessing, mosdepth and LongReadSV into stages
DonFreed Sep 4, 2026
b3289b7
Make the hybrid pipeline a direct BasePipeline subclass
DonFreed Sep 4, 2026
4ccade9
Drop the attribute renames from validate()
DonFreed Sep 4, 2026
3298912
Update the require_versions docstring
DonFreed Sep 4, 2026
55ff138
Default the hybrid pipeline's minimap2 arguments to -YL
DonFreed Sep 4, 2026
c1066a7
Run the pangenome pipeline through BasePipeline.main
DonFreed Sep 4, 2026
ac7c36a
Collect the transfer inputs with TransferConfig.from_pipeline
DonFreed Sep 4, 2026
f8f7280
Let the hybrid pangenome pipeline use LongReadSVStage
DonFreed Sep 4, 2026
a494662
Skip CNV calling in the hybrid smoke tests
DonFreed Sep 5, 2026
137cc3a
Merge pull request #36 from Sentieon/code-refactor
DonFreed Sep 5, 2026
caa216f
Write CRAM output with the default util sort arguments
DonFreed Sep 5, 2026
f1924df
Pass --dump_probes to CNVscope
DonFreed Sep 5, 2026
aa31de4
Extract the pangenome FASTA with vg paths on non-GRCh38 references
DonFreed Sep 8, 2026
819060c
Add segdup, ExpansionHunter, T1K and pangenome CNV stages
DonFreed Sep 8, 2026
6e3bc76
Compose the dnascope-pangenome callers from the shared stages
DonFreed Sep 8, 2026
179ba3f
Validate the optional callers and estimate ploidy in hybrid-pangenome
DonFreed Sep 8, 2026
3ff98a9
Call CNVs, repeat expansions and segdups in the hybrid-pangenome seco…
DonFreed Sep 8, 2026
af91064
Merge pull request #37 from Sentieon/hybrid-pangenome-callers
DonFreed Sep 8, 2026
7121923
Drop the path selector from the vg paths gfa2fa fallback
DonFreed Sep 8, 2026
e554e25
Import SEGDUP_MIN_VERSIONS from stages.segdup in the Dockerfile
DonFreed Sep 8, 2026
5d39e3a
Detect the pangenome reference from the GBZ metadata
DonFreed Sep 12, 2026
fb193d3
Check pop VCF contig lengths against the reference for any backbone
DonFreed Sep 12, 2026
4756e9e
Merge pull request #38 from Sentieon/gbz-name-validation
DonFreed Sep 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
max-parallel: 1
matrix:
python-version: ["3.11", "3.14"]
sentieon-version: ["202503.02"]
sentieon-version: ["${{ vars.SENTIEON_VERSION }}"]
os: [ubuntu-22.04] #, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
Expand All @@ -41,6 +41,10 @@ jobs:
pip install multiqc
- name: Install sentieon
run: |
if [ -z "$SENTIEON_VERSION" ]; then
echo "::error::Repository variable SENTIEON_VERSION is not set." >&2
exit 1
fi
url="https://s3.amazonaws.com/sentieon-release/software/sentieon-genomics-$SENTIEON_VERSION.tar.gz"
bin_dir=$(pwd)/sentieon-genomics-$SENTIEON_VERSION/bin
machine_arch=$(uname -m)
Expand Down Expand Up @@ -98,7 +102,7 @@ jobs:
max-parallel: 1
matrix:
python-version: ["3.11", "3.14"]
sentieon-version: ["202503.02"]
sentieon-version: ["${{ vars.SENTIEON_VERSION }}"]
os: [ubuntu-22.04] #, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
Expand Down Expand Up @@ -136,6 +140,10 @@ jobs:
sudo chmod ugo+x /usr/local/bin/mosdepth
- name: Install sentieon
run: |
if [ -z "$SENTIEON_VERSION" ]; then
echo "::error::Repository variable SENTIEON_VERSION is not set." >&2
exit 1
fi
url="https://s3.amazonaws.com/sentieon-release/software/sentieon-genomics-$SENTIEON_VERSION.tar.gz"
bin_dir=$(pwd)/sentieon-genomics-$SENTIEON_VERSION/bin
machine_arch=$(uname -m)
Expand Down Expand Up @@ -220,7 +228,7 @@ jobs:
max-parallel: 1
matrix:
python-version: ["3.11", "3.14"]
sentieon-version: ["202503.02"]
sentieon-version: ["${{ vars.SENTIEON_VERSION }}"]
os: [ubuntu-22.04] #, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
Expand Down Expand Up @@ -261,6 +269,10 @@ jobs:
pip install multiqc
- name: Install sentieon
run: |
if [ -z "$SENTIEON_VERSION" ]; then
echo "::error::Repository variable SENTIEON_VERSION is not set." >&2
exit 1
fi
url="https://s3.amazonaws.com/sentieon-release/software/sentieon-genomics-$SENTIEON_VERSION.tar.gz"
bin_dir=$(pwd)/sentieon-genomics-$SENTIEON_VERSION/bin
machine_arch=$(uname -m)
Expand Down Expand Up @@ -296,6 +308,7 @@ jobs:
--sr_aln "tests/smoke/illumina.cram" \
--lr_aln "tests/smoke/sam ple.cram" \
-m "DNAscope hybrid IlmnPB1.1.bundle" \
--skip_cnv \
--sr_duplicate_marking none \
"output_hybrid1.vcf.gz"
if [ ! -f "output_hybrid1.vcf.gz" ]; then
Expand All @@ -314,6 +327,7 @@ jobs:
--lr_align_input \
--lr_input_ref "tests/smoke/r ef.fa" \
-m "DNAscope hybrid IlmnPB1.1.bundle" \
--skip_cnv \
"output_hybrid2.vcf.gz"
if [ ! -f "output_hybrid2.vcf.gz" ]; then
exit 1
Expand All @@ -331,6 +345,7 @@ jobs:
--sr_aln "tests/smoke/illumina.cram" "tests/smoke/illumina_2.bam" \
--lr_aln "tests/smoke/sam ple.cram" \
-m "DNAscope hybrid IlmnPB1.1.bundle" \
--skip_cnv \
--sr_duplicate_marking none \
"output_hybrid3.vcf.gz"
if [ ! -f "output_hybrid3.vcf.gz" ]; then
Expand Down
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ RUN sentieon driver --help && \
perl -c "$(command -v run-t1k)" && \
SENTIEON_LICENSE=placeholder segdup-caller --version && \
SENTIEON_LICENSE=placeholder python -c "import sys; from packaging.version import Version; \
from sentieon_cli.sentieon_pangenome import SEGDUP_MIN_VERSION; \
from sentieon_cli.stages.segdup import SEGDUP_MIN_VERSIONS; \
from sentieon_cli.util import check_version; \
sys.exit(0 if all(check_version(c, v) for c, v in SEGDUP_MIN_VERSION.items()) else 1)" && \
sys.exit(0 if all(check_version(c, v) for c, v in SEGDUP_MIN_VERSIONS.items()) else 1)" && \
sentieon-cli -h
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,12 @@ sentieon-cli ...

## Global arguments
The `sentieon-cli` supports the following global arguments:
- `--verbose`: verbose logging.
- `--debug`: debugging mode for more verbose logging.
- `--verbose` (`-v`): verbose logging. This is the default.
- `--quiet` (`-q`): only log warnings and errors.
- `--debug` (`-d`): debugging mode for more verbose logging. Takes precedence over `--verbose` and `--quiet`.

## Logging
Each run writes its log files to a directory next to the output VCF, named after the output file with the `.vcf.gz` suffix replaced by `_logs`, so `sample.vcf.gz` produces `sample_logs/`. The directory records the invocation in `command.txt`, the pipeline's own messages in `run.log`, and the output of each tool under `task_logs/`. Run metrics are also written as tab-separated tables for analysis: `process_metrics.txt` (one row per process, with its CPU time, peak memory and exit code) and `job_metrics.txt` (one row per pipeline job). Every pipeline accepts a `--log_dir` argument to write these files elsewhere. Rerunning a pipeline with the same output overwrites the logs of the previous run.

## Supported pipelines
- [**DNAscope**](https://support.sentieon.com/docs/sentieon_cli/#dnascope) - DNAscope pipeline implementation for germline SNV and indel calling from short read data.
Expand Down
7 changes: 6 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

[project]
name = "sentieon_cli"
version = "1.7.0"
version = "2.0.0"
description = "Pipeline implementations for the Sentieon software"
authors = [
{name = "Don Freed", email = "don.freed@sentieon.com"},
Expand All @@ -27,6 +27,10 @@ dependencies = [
[project.scripts]
sentieon-cli = "sentieon_cli:main"

[tool.poetry]
# Ship the packaged pseudo-autosomal region (PAR) BED files
include = [{ path = "sentieon_cli/data/*.bed", format = ["sdist", "wheel"] }]

[tool.mypy]
ignore_missing_imports = true

Expand All @@ -44,6 +48,7 @@ exclude = [
"sentieon_cli/scripts/hybrid_anno.py",
"sentieon_cli/scripts/hybrid_select.py",
"sentieon_cli/scripts/indel2cnv.py",
"sentieon_cli/scripts/sad_lad_update.py",
"sentieon_cli/scripts/trimalt.py",
"sentieon_cli/archive.py",
"playground",
Expand Down
51 changes: 40 additions & 11 deletions sentieon_cli/__init__.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,50 @@
import argparse

from . import argh_parser
from .dnascope import DNAscopePipeline
from .dnascope_hybrid import DNAscopeHybridPipeline
from .dnascope_longread import DNAscopeLRPipeline
from .hybrid_pangenome import HybridPangenome
from .job import Job
from .sentieon_pangenome import SentieonPangenome
from .util import __version__


def main():
"""main entry point for this project"""
parser = argh_parser.CustomArgparseParser()
def add_logging_args(parser: argparse.ArgumentParser) -> None:
"""Add the console verbosity flags"""
parser.add_argument(
"-v",
"--verbose",
help="Verbose logging",
action="store_const",
dest="loglevel",
const="INFO",
default="WARNING",
help="Verbose logging (the default)",
action="store_true",
)
parser.add_argument(
"-q",
"--quiet",
help="Only log warnings and errors",
action="store_true",
)
parser.add_argument(
"-d",
"--debug",
help="Print debugging info",
action="store_const",
dest="loglevel",
const="DEBUG",
action="store_true",
)


def resolve_loglevel(args: argparse.Namespace) -> str:
"""The console log level implied by the verbosity flags"""
if args.debug:
return "DEBUG"
if args.quiet and not args.verbose:
return "WARNING"
return "INFO"


def main():
"""main entry point for this project"""
parser = argh_parser.CustomArgparseParser()
add_logging_args(parser)
parser.add_argument(
"--version",
action="version",
Expand Down Expand Up @@ -58,7 +77,17 @@ def main():
pipeline.add_arguments(dnascope_pangenome_subparser)
dnascope_pangenome_subparser.set_defaults(pipeline=pipeline.main)

# Hybrid pangenome
pipeline = HybridPangenome()
hybrid_pangenome_subparser = subparsers.add_parser("hybrid-pangenome")
pipeline.add_arguments(hybrid_pangenome_subparser)
hybrid_pangenome_subparser.set_defaults(pipeline=pipeline.main)

args = parser.parse_args()
args.loglevel = resolve_loglevel(args)
# Job ids must be unique for the whole run, which may execute more than
# one DAG, so numbering restarts here rather than per DAG.
Job.reset_ids()
args.pipeline(args)


Expand Down
Loading
Loading