From a06c41d8df080c003ab70487faf1a1e9c4671cef Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Sat, 7 Nov 2026 17:38:06 +0100 Subject: [PATCH 1/7] fix(nextflow): count CPSR's cDNA read check under step 17 The CPSR read check ran as a second call of CLINVAR_CDNA_CHECK, so the process table and run_state.py counted it under step 06. It is now included as CPSR_CDNA_CHECK, with its own containers row, and step 17 lists it. The containers check and test_run_state.py read include aliases. Bead: pgp-5bja.19 --- assets/steps.tsv | 2 +- conf/containers.config | 1 + docs/17-cpsr.md | 2 +- scripts/ci/gen-containers-config.sh | 14 ++++++++++++-- tests/test_run_state.py | 15 +++++++++++++++ workflows/clinical.nf | 10 ++++++---- 6 files changed, 36 insertions(+), 8 deletions(-) diff --git a/assets/steps.tsv b/assets/steps.tsv index 17290263..5f8bb5df 100644 --- a/assets/steps.tsv +++ b/assets/steps.tsv @@ -37,7 +37,7 @@ step label tool recorded processes sections upstream hours hours_from hours_low 15 duphold duphold yes DUPHOLD,DUPHOLD_FILTER 04 0.07 measured 0.05 16 indexcov (sex check) yes INDEXCOV sex_check 02 0.01 measured 0.0002 16b mosdepth mosdepth yes MOSDEPTH coverage,callability 02 0.05 measured 0.0333 -17 CPSR cpsr yes CPSR cpsr 03 0.6 measured 0.2833 PCGR_DATA_BUNDLE,cpsr_clinvar_release +17 CPSR cpsr yes CPSR,CPSR_CDNA_CHECK cpsr 03 0.6 measured 0.2833 PCGR_DATA_BUNDLE,cpsr_clinvar_release 18 CNVpytor cnvpytor yes CNVPYTOR,CNVPYTOR_VCF cnvpytor 02 0.33 measured 0.2333 19 Delly delly yes DELLY,DELLY_BCF2VCF delly 02 3.32 measured 0.35 20 Mito variants (Mutect2) mito_variants yes MITO_VARIANTS,MITO_VARIANTS_ANNOTATE,MITO_DELETIONS mito 02 0.03 measured 0.0166 clinvar_file_date@self diff --git a/conf/containers.config b/conf/containers.config index 04fbf6f1..b5488efe 100644 --- a/conf/containers.config +++ b/conf/containers.config @@ -33,6 +33,7 @@ process { withName: 'COUPLE_CARRIER' { container = 'python:3.15.2@sha256:d7a732b20de2f5d3cf977cbcf69aacf30dc928a37908ff9fdb7bb3503024c91a' } withName: 'CPIC_LOOKUP' { container = 'python:3.15.2@sha256:d7a732b20de2f5d3cf977cbcf69aacf30dc928a37908ff9fdb7bb3503024c91a' } withName: 'CPSR' { container = 'ghcr.io/sigven/pcgr:2.3.2' } + withName: 'CPSR_CDNA_CHECK' { container = 'quay.io/biocontainers/pypgx:0.26.0--pyh7e72e81_0' } withName: 'CRAM_ARCHIVE' { container = 'staphb/samtools:1.24' } withName: 'CRAM_TO_BAM' { container = 'staphb/samtools:1.24' } withName: 'CYP2D6_DEPTH' { container = 'quay.io/biocontainers/mosdepth:0.3.14--h87be163_2' } diff --git a/docs/17-cpsr.md b/docs/17-cpsr.md index a5d59a2b..000ba0b5 100644 --- a/docs/17-cpsr.md +++ b/docs/17-cpsr.md @@ -121,7 +121,7 @@ Run by hand like this, `--sample_id` must be 3 to 40 characters long. The script - `${SAMPLE}.cpsr.grch38.classification.tsv.gz` — Tab-separated variant classifications (gzipped; read it with `zcat`) - Every variant in the panel genes gets one of the five ACMG/AMP classes: Pathogenic, Likely pathogenic, VUS, Likely benign, Benign - In the TSV, `CLASSIFICATION` is the final class and `ASSERTION_AUTHORITY` says whose it is: ClinVar's, unless ClinVar has no record or a conflicted one, then CPSR's own (`CPSR_CLASSIFICATION`, which every variant has). PCGR 2.2.5 named the final column `FINAL_CLASSIFICATION`; the reports (`bin/collect_summary.py`) read either. The file names are the same in both versions. -- `${SAMPLE}_cpsr_cdna_check.tsv` — step 6's cDNA read check on CPSR's P/LP rows (final class or CPSR's own), in the columns of step 6's `clinvar/${SAMPLE}_clinvar_cdna_check.tsv`. The rows are read from `VAR_ID` (or `GENOMIC_CHANGE`) and keep CPSR's contig names (`13`, not `chr13`); the BAM is read under either name. It needs the sample's BAM, `aligned/${SAMPLE}_sorted.bam` with its `.bai` (`ALIGN_DIR` picks another folder), and the GENCODE exons `setup.sh` installs; without either, every row is "not checked" with the reason. In Nextflow the `CLINVAR_CDNA_CHECK` process runs it after `CPSR` (source `cpsr`), with the samplesheet's BAM and `--gencode_exons`, and publishes the table to `cpsr/`; the HTML report puts it beside each P/LP row there too. +- `${SAMPLE}_cpsr_cdna_check.tsv` — step 6's cDNA read check on CPSR's P/LP rows (final class or CPSR's own), in the columns of step 6's `clinvar/${SAMPLE}_clinvar_cdna_check.tsv`. The rows are read from `VAR_ID` (or `GENOMIC_CHANGE`) and keep CPSR's contig names (`13`, not `chr13`); the BAM is read under either name. It needs the sample's BAM, `aligned/${SAMPLE}_sorted.bam` with its `.bai` (`ALIGN_DIR` picks another folder), and the GENCODE exons `setup.sh` installs; without either, every row is "not checked" with the reason. In Nextflow step 6's `CLINVAR_CDNA_CHECK` process runs it after `CPSR` (source `cpsr`) under the name `CPSR_CDNA_CHECK`, so the run's process table and the live view count it under step 17, with the samplesheet's BAM and `--gencode_exons`, and publishes the table to `cpsr/`; the HTML report puts it beside each P/LP row there too. Its image comes from a `withName: 'CPSR_CDNA_CHECK'` selector (a setting for step 6's `CLINVAR_CDNA_CHECK` does not reach it). ### What the reports show diff --git a/scripts/ci/gen-containers-config.sh b/scripts/ci/gen-containers-config.sh index bfb08ddb..317a2a70 100755 --- a/scripts/ci/gen-containers-config.sh +++ b/scripts/ci/gen-containers-config.sh @@ -62,6 +62,7 @@ CONSUMER_EXPORT PYTHON_IMAGE COUPLE_CARRIER PYTHON_IMAGE CPIC_LOOKUP PYTHON_IMAGE CPSR PCGR_IMAGE +CPSR_CDNA_CHECK PYPGX_IMAGE CRAM_ARCHIVE SAMTOOLS_IMAGE CRAM_TO_BAM SAMTOOLS_IMAGE CYP2D6_DEPTH MOSDEPTH_IMAGE @@ -240,7 +241,11 @@ check() { fail=1 fi rm -f "$want" - procs=$(cat "${ROOT}"/modules/local/*/main.nf | sed -nE 's/^process[[:space:]]+([A-Za-z0-9_]+).*/\1/p' | sort -u) + # Every process, and every alias a workflow includes one under (include { A as B }): + # a withName selector matches the alias, not the module's name. + procs=$( { cat "${ROOT}"/modules/local/*/main.nf | sed -nE 's/^process[[:space:]]+([A-Za-z0-9_]+).*/\1/p' + cat "${ROOT}"/main.nf "${ROOT}"/workflows/*.nf 2>/dev/null \ + | sed -nE 's/^include[[:space:]]*\{[[:space:]]*[A-Za-z0-9_]+[[:space:]]+as[[:space:]]+([A-Za-z0-9_]+)[[:space:]]*\}.*/\1/p'; } | sort -u) [ -n "$procs" ] || { echo "FAIL: found no process in modules/local/*/main.nf"; return 1; } sels=$(sed -nE -e "s/^[[:space:]]*withName:[[:space:]]*'([A-Za-z0-9_]+)'[[:space:]]*\{[[:space:]]*container[[:space:]]*=[[:space:]]*'[^']+'[[:space:]]*\}.*/\1/p" \ -e "s/^[[:space:]]*withName:[[:space:]]*'([A-Za-z0-9_]+)'[[:space:]]*\{[[:space:]]*ext\.pipeline_version[[:space:]]*=[[:space:]]*'[^']+'.*/\1/p" \ @@ -314,7 +319,7 @@ self_test() { copy() { mkdir -p "${tmp}/$1/conf" cp "${ROOT}/versions.env" "${tmp}/$1/" - cp -R "${ROOT}/modules" "${tmp}/$1/" + cp -R "${ROOT}/modules" "${ROOT}/workflows" "${ROOT}/main.nf" "${tmp}/$1/" # Start from a fresh file, so the self-test checks the checker, not this tree. "$0" --root "${tmp}/$1" >/dev/null } @@ -353,6 +358,11 @@ self_test() { >> "${tmp}/new-process/modules/local/roh/main.nf" expect new-process '^FAIL: process NEW_TOOL has no container' + # A process included under a new alias, which a withName selector must name. + copy new-alias + printf '%s\n' "include { ROH as ROH_AGAIN } from '../modules/local/roh/main'" >> "${tmp}/new-alias/workflows/clinical.nf" + expect new-alias '^FAIL: process ROH_AGAIN has no container' + # A selector left behind for a process that no longer exists. copy stray sed -i.bak "s/^process VEP /process VEP_RENAMED /" "${tmp}/stray/modules/local/vep/main.nf" diff --git a/tests/test_run_state.py b/tests/test_run_state.py index 945889e2..aeb43947 100755 --- a/tests/test_run_state.py +++ b/tests/test_run_state.py @@ -207,6 +207,10 @@ def module_processes(): for fn in files: if fn.endswith(".nf"): names |= set(re.findall(r"^process\s+([A-Z0-9_]+)", open(os.path.join(root, fn)).read(), re.M)) + # A process a workflow includes under another name (include { A as B }) runs, and is counted, as B + for fn in ["main.nf"] + [os.path.join("workflows", f) for f in os.listdir(os.path.join(REPO, "workflows"))]: + if fn.endswith(".nf"): + names |= set(re.findall(r"^include\s*\{\s*\w+\s+as\s+([A-Z0-9_]+)\s*\}", open(os.path.join(REPO, fn)).read(), re.M)) return names @@ -241,6 +245,15 @@ def catalogue_checks(steps, sections, run_all_set): twice = {p: v for p, v in procs.items() if len(v) > 1 and p != "PRS"} # step 26 runs inside PRS out["every module process belongs to a step"] = (len(mods) > 100 and not lost and not twice and set(procs) <= mods, (lost, twice, sorted(set(procs) - mods))) + # Step 17 runs step 06's read check on CPSR's rows: workflows/clinical.nf includes it under its own + # name, so that task counts under step 17, and step 06's own call under step 06. + clinical = open(os.path.join(REPO, "workflows", "clinical.nf")).read() + step_of = {p: s["step"] for s in steps for p in s["processes"]} + got = (step_of.get(run_state.task_name("CLINICAL:CPSR_CDNA_CHECK (S1)")[0]), + step_of.get(run_state.task_name("PGX:CLINVAR_CDNA_CHECK (S1)")[0])) + out["CPSR's read check counts under step 17, ClinVar's under step 06"] = ( + got == ("17", "06") and re.search(r"^include \{ CLINVAR_CDNA_CHECK as CPSR_CDNA_CHECK \}", clinical, re.M) + is not None and "CPSR_CDNA_CHECK(" in clinical, got) tools = {s["tool"] for s in steps if s["tool"]} out["the tools are main.nf's known tools"] = (tools == main_nf_tools(), sorted(tools ^ main_nf_tools())) def low_ok(s): @@ -354,6 +367,8 @@ def opens_vcf(d): ("every module process belongs to a step", [dict(s, processes=[p for p in s["processes"] if p != "Y_STR"]) for s in steps], None), ("the tools are main.nf's known tools", [dict(s, tool="") if s["step"] == "34" else s for s in steps], None), + ("CPSR's read check counts under step 17, ClinVar's under step 06", + [dict(s, processes=[p for p in s["processes"] if p != "CPSR_CDNA_CHECK"]) for s in steps], None), ("one row per step, every upstream step has a row", steps + [copy.deepcopy(steps[0])], None), ("every measured row has hours_low below hours, no other row has one", [dict(s, hours_low="") if s["step"] == "03" else s for s in steps], None), diff --git a/workflows/clinical.nf b/workflows/clinical.nf index 220ca95c..df5adcf7 100644 --- a/workflows/clinical.nf +++ b/workflows/clinical.nf @@ -16,7 +16,9 @@ */ include { CPSR } from '../modules/local/cpsr/main' -include { CLINVAR_CDNA_CHECK } from '../modules/local/clinvar_screen/main' +// Step 17's call of step 06's read check, under its own name, so the run's +// process table and run_state.py count it under step 17 (assets/steps.tsv) +include { CLINVAR_CDNA_CHECK as CPSR_CDNA_CHECK } from '../modules/local/clinvar_screen/main' include { ROH } from '../modules/local/roh/main' include { PRS_PREPARE } from '../modules/local/prs/main' include { PRS_SCORE_SITES } from '../modules/local/prs/main' @@ -78,7 +80,7 @@ workflow CLINICAL { // Step 17's cDNA read check of CPSR's P/LP rows, with the BAM and // exons of step 06's check, or [] for a sample without a BAM, so its // table says "not checked" and why. No construct catalog, as step 17. - CLINVAR_CDNA_CHECK( + CPSR_CDNA_CHECK( CPSR.out.tsv_report .map { meta, tsv -> [meta.id, meta, tsv] } .join(ch_bam.map { meta, bam, bai -> [meta.id, [bam, bai]] }, remainder: true) @@ -88,8 +90,8 @@ workflow CLINICAL { [], 'cpsr' ) - ch_cpsr_cdna = CLINVAR_CDNA_CHECK.out.cpsr_cdna_check - ch_versions = ch_versions.mix(CLINVAR_CDNA_CHECK.out.versions) + ch_cpsr_cdna = CPSR_CDNA_CHECK.out.cpsr_cdna_check + ch_versions = ch_versions.mix(CPSR_CDNA_CHECK.out.versions) } // From 588c6ef4d6bb30dfe8d0cc0f8fa73b9aa3d21b2c Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Sat, 7 Nov 2026 17:38:15 +0100 Subject: [PATCH 2/7] fix(manifest): record the OwnGenome release in run_manifest.tsv write_manifest.sh writes a run pipeline_version row from the manifest block of nextflow.config, so the bash report can name the release. Bead: pgp-5bja.26 --- bin/write_manifest.sh | 13 ++++- .../followups-nf-manifest-release.sh | 51 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100755 tests/fake-docker/followups-nf-manifest-release.sh diff --git a/bin/write_manifest.sh b/bin/write_manifest.sh index 96fb8f48..c773c769 100755 --- a/bin/write_manifest.sh +++ b/bin/write_manifest.sh @@ -5,7 +5,8 @@ # # Writes ${GENOME_DIR}//run_manifest.tsv, three tab-separated columns # (section, key, value): -# run written_utc, written_by, git_commit, declared_sex +# run written_utc, written_by, git_commit, pipeline_version (the OwnGenome +# release: the version in nextflow.config's manifest block), declared_sex # version every NAME=VALUE line of versions.env # image each *_IMAGE reference and the digest Docker resolved it to # ("not pulled" when the image is not on this machine) @@ -53,6 +54,16 @@ if git -C "$PGP_ROOT" rev-parse --verify -q HEAD >/dev/null 2>&1; then fi fi row run git_commit "$commit" +# The OwnGenome release: the version = '...' line inside the manifest { } block +# of nextflow.config (the release tag is v). No row when there is none. +release=$(awk ' + /^[[:space:]]*manifest[[:space:]]*\{/ {inside = 1; next} + inside && /^[[:space:]]*\}/ {inside = 0} + inside && /^[[:space:]]*version[[:space:]]*=/ { + s = $0; sub(/^[^=]*=[[:space:]]*/, "", s); sub(/[[:space:]]*(\/\/.*)?$/, "", s) + gsub(/^["\047]|["\047]$/, "", s); print s; exit + }' "${PGP_ROOT}/nextflow.config" 2>/dev/null || true) +[ -z "$release" ] || row run pipeline_version "$release" [ -z "$DECLARED_SEX" ] || row run declared_sex "$DECLARED_SEX" # versions.env as written (comments and blank lines dropped) diff --git a/tests/fake-docker/followups-nf-manifest-release.sh b/tests/fake-docker/followups-nf-manifest-release.sh new file mode 100755 index 00000000..c4822fd1 --- /dev/null +++ b/tests/fake-docker/followups-nf-manifest-release.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +# bin/write_manifest.sh's run pipeline_version row: the OwnGenome release, the +# version in the manifest { } block of nextflow.config, which both reports +# print beside the pipeline commit. +# 1. The repository's write_manifest.sh writes the row, with the version +# nextflow.config declares. +# 2. A copy of the tree whose nextflow.config declares 9.8.7 gets 9.8.7: the +# row is read, not written from a constant. +# 3. Red control: a copy of write_manifest.sh without the row line writes no +# row, so the check in 1 can fail. +# shellcheck source=../../scripts/ci/fake-docker/lib.sh +. "${REPO_ROOT:?}/scripts/ci/fake-docker/lib.sh" + +export GENOME_DIR="${CASE_WORK}/genome" +seed_reference "$GENOME_DIR" +mkdir -p "${GENOME_DIR}/sample1" +M="${GENOME_DIR}/sample1/run_manifest.tsv" +release() { awk -F'\t' '$1 == "run" && $2 == "pipeline_version" {print $3}' "$M"; } +DECLARED=$(sed -nE "/^manifest[[:space:]]*\{/,/^\}/ s/^[[:space:]]*version[[:space:]]*=[[:space:]]*'([^']+)'.*/\1/p" \ + "${REPO_ROOT}/nextflow.config") +[ -n "$DECLARED" ] || fail "could not read the manifest version of nextflow.config" + +# 1. the repository's script +run_expect 0 repo env bash "${REPO_ROOT}/bin/write_manifest.sh" sample1 test +[ "$(release)" = "$DECLARED" ] || fail "run pipeline_version reads '$(release)', nextflow.config declares '${DECLARED}'" +[ "$(grep -c $'^run\tpipeline_version\t' "$M")" = 1 ] || fail "run_manifest.tsv has not exactly one pipeline_version row" + +# A copy of the files write_manifest.sh reads: bin/, scripts/lib/, versions.env, nextflow.config +copy_tree() { + rm -rf "${CASE_WORK}/$1" + mkdir -p "${CASE_WORK}/$1/scripts" + cp -R "${REPO_ROOT}/bin" "${CASE_WORK}/$1/" + cp -R "${REPO_ROOT}/scripts/lib" "${CASE_WORK}/$1/scripts/" + cp "${REPO_ROOT}/versions.env" "${REPO_ROOT}/nextflow.config" "${CASE_WORK}/$1/" +} + +# 2. another declared version +copy_tree other +sed -i.bak -E "/^manifest[[:space:]]*\{/,/^\}/ s/^([[:space:]]*version[[:space:]]*=[[:space:]]*)'[^']+'/\1'9.8.7'/" \ + "${CASE_WORK}/other/nextflow.config" +grep -q "version = '9.8.7'" "${CASE_WORK}/other/nextflow.config" || fail "could not plant 9.8.7 in the copy" +run_expect 0 other env bash "${CASE_WORK}/other/bin/write_manifest.sh" sample1 test +[ "$(release)" = 9.8.7 ] || fail "with nextflow.config at 9.8.7 the row reads '$(release)'" + +# 3. red control: the script without the row line +copy_tree norow +sed -i.bak '/row run pipeline_version/d' "${CASE_WORK}/norow/bin/write_manifest.sh" +! grep -q 'pipeline_version "' "${CASE_WORK}/norow/bin/write_manifest.sh" || fail "the control copy still writes the row" +run_expect 0 norow env bash "${CASE_WORK}/norow/bin/write_manifest.sh" sample1 test +[ -z "$(release)" ] || fail "control: the copy without the row line still wrote '$(release)'" +echo "run pipeline_version is nextflow.config's manifest version (${DECLARED}), and the control without it has none." From 7fd781f6adcbbe41aef9f21af02570707c3bb87b Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Sat, 7 Nov 2026 17:38:23 +0100 Subject: [PATCH 3/7] fix(nextflow): pass the CYP21A2, dosage, gVCF and release data to the report and couple screen BAM_ANALYSIS emits step 35's CYP21A2 and gene-dosage tables; main.nf joins them into HTML_REPORT's inputs and gives each partner's CYP21A2 table to COUPLE_CARRIER. HTML_REPORT links the sample's gVCF as vcf/.g.vcf.gz and writes the release into the run manifest it reads. A --locityper_data folder without DONE stops the run at the start. Bead: pgp-5bja.21 Bead: pgp-q4jt Bead: pgp-pfw6.21 Bead: pgp-5bja.26 Bead: pgp-5bja.28 --- README.md | 2 +- assets/output_contract.tsv | 4 +- docs/35-paralogs.md | 3 +- docs/nextflow.md | 4 +- main.nf | 23 ++- modules/local/couple/main.nf | 9 +- modules/local/html_report/main.nf | 29 +++- scripts/ci/e2e-case-paths.tsv | 1 + scripts/ci/e2e-case-times.tsv | 1 + tests/e2e/followups-nf-1-nf-wiring.sh | 209 ++++++++++++++++++++++++++ workflows/bam_analysis.nf | 6 + 11 files changed, 278 insertions(+), 13 deletions(-) create mode 100755 tests/e2e/followups-nf-1-nf-wiring.sh diff --git a/README.md b/README.md index cc4b123b..e3cea971 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ This pipeline takes raw sequencing data (FASTQ/BAM/VCF) from any vendor and runs - Calls SNPs and indels with DeepVariant, and structural and copy number variants with Manta, Delly and CNVpytor merged into a consensus. - Screens ClinVar and runs CPSR cancer predisposition panels, VEP annotation with CADD, SpliceAI, REVEL and AlphaMissense, and slivar prioritization. - Pharmacogenomics with PharmCAT, pypgx (29 genes, 13 of them with copy number from the BAM, so gene deletions, duplications and hybrid genes) and CPIC drug recommendations. PharmCAT gets T1K's HLA types, and a CYP2D6 call only when pypgx and Cyrius (opt-in, non-commercial licence) agree. -- Repeat expansions, HLA typing (KIR opt-in), SMN1/SMN2 copy number (opt-in), and from PacBio HiFi reads HBA1/HBA2, CYP21A2, GBA1, PMS2, STRC, NCF1 and OTOA with Paraphase (opt-in), telomere length, mitochondrial haplogroup, heteroplasmy and an mtDNA contamination check, Y-chromosome haplogroup (opt-in), mosaic loss of chrY or chrX with its uncertainty, ROH, ancestry, admixture fractions with a chromosome painting (opt-in) and polygenic risk scores, and the blood group antigens (ABO, Rh, Kell, Duffy, Kidd and the other systems, opt-in). +- Repeat expansions, HLA typing (KIR opt-in), SMN1/SMN2 copy number and, from short reads, CYP21A2 with its 30 kb deletion and pseudogene conversions (opt-in, step 35), and from PacBio HiFi reads HBA1/HBA2, CYP21A2, GBA1, PMS2, STRC, NCF1 and OTOA with Paraphase (opt-in), telomere length, mitochondrial haplogroup, heteroplasmy and an mtDNA contamination check, Y-chromosome haplogroup (opt-in), mosaic loss of chrY or chrX with its uncertainty, ROH, ancestry, admixture fractions with a chromosome painting (opt-in) and polygenic risk scores, and the blood group antigens (ABO, Rh, Kell, Duffy, Kidd and the other systems, opt-in). - A raw-data file in the 23andMe layout from your genome (opt-in step 40), for genealogy and health services that read chip files. The pipeline writes it; uploading it is up to you. - A traits panel: lactase persistence, caffeine, alcohol flush, bitter taste, earwax, APOE and other replicated variants, read from the gVCF, each with the primary paper it comes from. - Every tool runs in a Docker container with a hard memory limit and no network; CPU is a hard cap in the single-step scripts and a Docker share in the pipeline ([a shared host](https://geiserx.github.io/OwnGenome/hardware-requirements/#a-shared-host)). Each image is pinned by tag or digest in `versions.env`. The opt-in Cyrius is installed once by `setup.sh --cyrius` from PyPI, every file checked against its hash, and then runs offline too. No script uploads your data; [a few steps download public files](https://geiserx.github.io/OwnGenome/why-local/#network-calls-during-a-run) during a run. diff --git a/assets/output_contract.tsv b/assets/output_contract.tsv index 5477c732..98aa8dae 100644 --- a/assets/output_contract.tsv +++ b/assets/output_contract.tsv @@ -172,8 +172,8 @@ file {sample}/locityper/{sample}_locityper.tsv 53 LOCITYPER both tsv experimenta file {sample}/locityper/work 53 LOCITYPER both dir experimental - - file {sample}/mosdepth/{sample}.mosdepth.summary.txt 16b - bash tsv stable bash chrom,length,bases,mean,min,max file {sample}/paralogs/{sample}_*_copy_number.tsv 35 PARASCOPY nextflow tsv experimental - - -file {sample}/paralogs/{sample}_cn_dosage.tsv 35 PARASCOPY nextflow tsv experimental - - -file {sample}/paralogs/{sample}_cn_intervals.tsv 35 PARASCOPY nextflow tsv experimental - - +file {sample}/paralogs/{sample}_cn_dosage.tsv 35 PARASCOPY both tsv experimental - - +file {sample}/paralogs/{sample}_cn_intervals.tsv 35 PARASCOPY both tsv experimental - - file {sample}/paralogs/{sample}_cyp21a2_psv.tsv 35 PARASCOPY both tsv experimental - - file {sample}/paralogs/{sample}_hba_copy_number.tsv 35 PARASCOPY nextflow tsv experimental - - file {sample}/paralogs/{sample}_paraphase 35b PARAPHASE nextflow dir experimental - - diff --git a/docs/35-paralogs.md b/docs/35-paralogs.md index 5262c197..a1b52ae9 100644 --- a/docs/35-paralogs.md +++ b/docs/35-paralogs.md @@ -226,6 +226,7 @@ The ratio of a site is its estimate over the median of the sites, so one copy co - The e2e case `cyp21a2-short-reads-1-hg002` runs the CYP21A2 block of step 35 on HG002's Illumina reads over the row, unmodified and with a planted In2G conversion and a planted chimeric deletion made from the same reads, and the block of the PARASCOPY module on the unmodified BAM, which must write the same table. - The e2e case `hba-short-read-accuracy-1-nf-report` runs the Nextflow `HTML_REPORT` with and without an HBA table and checks the HBA line and the not-assessed list, then stub-runs every tool and checks that `main.nf` passes the table to each `HTML_REPORT` task that got the SMN table, against a copy of the pipeline with that join removed. - `tests/test_collect_summary.py` (`cn_report_section`) reads made-up CYP21A2, dosage and interval tables into the summary and both reports: a CYP21A2 deletion, HP 3, LCE3BC 1, CCL3L1 not assessed, a 22q11.2 deletion with its counts; without the tables each line says the table is not in the output; a header without the copy-number columns is unreadable for the dosage, interval, catalog and SMN tables, also with no row. +- The e2e case `followups-nf-1-nf-wiring` stub-runs the pipeline on the stub pedigree and checks that `main.nf` passes the CYP21A2 and dosage tables to each `HTML_REPORT` task that got the interval table, and each partner's CYP21A2 table to `COUPLE_CARRIER`, against a copy of the pipeline without those lines. - The e2e case `cn-report-1-tables` runs steps 24, `generate-report.sh` and 39 in their images on made-up tables: both reports show the CYP21A2 deletion, the dosage loci and the 22q11.2 deletion; step 39 passes each partner's CYP21A2 table, and CFTRdele2,3 present in both partners is named under the shared-risk heading. Red controls: the CYP21A2 table removed, for the report and for one partner. ## In the Reports @@ -240,7 +241,7 @@ The same section shows the tables no Parascopy model makes, each read on its own A table that is not in the run's output reads `not assessed (step 35's _... is not in this run's output)`, so a missing table never reads as a normal result. An SMN, interval or dosage table with a header but without its columns makes the section unreadable, and a CYP21A2 table without a status row reads as not assessed; a catalog table without the copy-number columns makes that locus unreadable, also with no row under the header. -The couple screen reads the CYP21A2 table with `couple_report.py screen --cyp21a2 ID=_cyp21a2_psv.tsv`, where a deletion or a possible conversion is a CYP21A2 carrier finding. Step 39 passes it when a partner's folder holds it. The Nextflow `PARASCOPY` task writes the CYP21A2 and dosage tables, but `main.nf` does not pass them to `HTML_REPORT` or the couple screen yet, so a Nextflow run's reports say they are not in the output. +The couple screen reads the CYP21A2 table with `couple_report.py screen --cyp21a2 ID=_cyp21a2_psv.tsv`, where a deletion or a possible conversion is a CYP21A2 carrier finding. Step 39 passes it when a partner's folder holds it. In Nextflow, `main.nf` passes the `PARASCOPY` task's CYP21A2 and dosage tables to each sample's `HTML_REPORT`, and the CYP21A2 table of each partner to `COUPLE_CARRIER`, so both reports and the couple screen read them as the bash steps do. When neither step 35 nor step 35b left a result, both reports print `Paralog copy number: not checked (neither step 35 nor step 35b ran)`, naming a step that failed instead, so a missing check never reads as a normal result. Unless step 35's depth count made a call, or step 35b called both HBA1 and HBA2 (a run limited to other regions with `--paraphase_regions` has neither, and a `no call` row does not count), the "Not Assessed" list also names HBA1/HBA2 copy number. diff --git a/docs/nextflow.md b/docs/nextflow.md index b15ae58d..06e9595e 100644 --- a/docs/nextflow.md +++ b/docs/nextflow.md @@ -89,7 +89,7 @@ nextflow run main.nf \ # it names (two or more, each with a gVCF; docs/multi-sample.md) ``` -**Family workflow (opt-in).** `--pedigree` (tab separated: sample, sex, father, mother, partner; [`assets/pedigree.example.tsv`](https://github.com/GeiserX/OwnGenome/blob/main/assets/pedigree.example.tsv)) runs `workflows/family.nf` over the samplesheet rows it names. `--pedigree` may be a families file (a leading family column, [`assets/families.example.tsv`](https://github.com/GeiserX/OwnGenome/blob/main/assets/families.example.tsv)). `--family_name` names the family to run, which a file with more than one family needs, and the folder its results go to (`//` instead of `/family/`). The workflow does the same work as step 38: `FAMILY_PREPARE` checks the pedigree and that each member's gVCF names its own sample, `GLNEXUS` and `GLNEXUS_VCF` joint-call the gVCFs (`GLNEXUS` asks for 16 GB and gives GLnexus half of its memory as `--mem-gbytes`), `FAMILY_RELATE` and `FAMILY_CHECK` stop the run when somalier's relatedness of a pair disagrees with the pedigree (a sample swap), `WHATSHAP_PED` phases the children of complete trios by inheritance, and `FAMILY_REPORT` writes each child's allele origin, de novo candidates when both parents are sequenced, and compound heterozygotes among the clinical filter's candidates. With `--ancestry_fine_panel` (the panel folder of step 26b, `setup.sh --ancestry-fine-panel`), four more processes find the DNA each pair shares by descent, once `FAMILY_CHECK` has passed: `FAMILY_IBD_SITES` keeps the joint call's genotypes at the panel's SNVs on each autosome (a chromosome with fewer than 100 is left out), `FAMILY_IBD_PHASE` phases them with Beagle against the panel, `FAMILY_IBD_SEGMENTS` runs hap-ibd (its default 2 cM minimum) with the panel's genetic maps, and `FAMILY_IBD_REPORT` writes `ibd_pairs.tsv`, `ibd_segments.tsv` and `ibd_report.md`. They feed only the report, so a failure of one is logged and the run goes on. Without the panel none of them runs. Each member needs a gVCF: DEEPVARIANT's for a FASTQ or BAM row, the `gvcf` column for a VCF row (the run stops on a VCF row without one). Fewer than two named samples, or no `--somalier_sites`, stops the run at the start. When the pedigree marks two of those samples as each other's partner, `COUPLE_CARRIER` runs the couple carrier screen of step 39 on them ([Couple Carrier Screen](39-couple.md)): it reads each partner's ClinVar hits, so it needs `clinvar` in `--tools` (without it the run logs a warning and skips the screen), uses deletions over an exon only with `--gencode_exons` (the GENCODE exons BED `setup.sh` installs as `reference/gencode.v50.basic.exons.bed`), reads Delly's calls, ExpansionHunter's and Parascopy's SMN1 table when those steps ran, and, when `--annotsv_annotations` holds AnnotSV's benign loss set (`benign_Loss_SV_GRCh38.sorted.bed`, with gnomAD-SV's common deletions merged in by `setup.sh --annotsv-data`), sets aside a Delly deletion that matches a common one there. Without `--pedigree` none of these processes exists and a run is unchanged. What it checks and what the files hold: [Multi-sample comparison](multi-sample.md#family-analysis-step-38-opt-in). +**Family workflow (opt-in).** `--pedigree` (tab separated: sample, sex, father, mother, partner; [`assets/pedigree.example.tsv`](https://github.com/GeiserX/OwnGenome/blob/main/assets/pedigree.example.tsv)) runs `workflows/family.nf` over the samplesheet rows it names. `--pedigree` may be a families file (a leading family column, [`assets/families.example.tsv`](https://github.com/GeiserX/OwnGenome/blob/main/assets/families.example.tsv)). `--family_name` names the family to run, which a file with more than one family needs, and the folder its results go to (`//` instead of `/family/`). The workflow does the same work as step 38: `FAMILY_PREPARE` checks the pedigree and that each member's gVCF names its own sample, `GLNEXUS` and `GLNEXUS_VCF` joint-call the gVCFs (`GLNEXUS` asks for 16 GB and gives GLnexus half of its memory as `--mem-gbytes`), `FAMILY_RELATE` and `FAMILY_CHECK` stop the run when somalier's relatedness of a pair disagrees with the pedigree (a sample swap), `WHATSHAP_PED` phases the children of complete trios by inheritance, and `FAMILY_REPORT` writes each child's allele origin, de novo candidates when both parents are sequenced, and compound heterozygotes among the clinical filter's candidates. With `--ancestry_fine_panel` (the panel folder of step 26b, `setup.sh --ancestry-fine-panel`), four more processes find the DNA each pair shares by descent, once `FAMILY_CHECK` has passed: `FAMILY_IBD_SITES` keeps the joint call's genotypes at the panel's SNVs on each autosome (a chromosome with fewer than 100 is left out), `FAMILY_IBD_PHASE` phases them with Beagle against the panel, `FAMILY_IBD_SEGMENTS` runs hap-ibd (its default 2 cM minimum) with the panel's genetic maps, and `FAMILY_IBD_REPORT` writes `ibd_pairs.tsv`, `ibd_segments.tsv` and `ibd_report.md`. They feed only the report, so a failure of one is logged and the run goes on. Without the panel none of them runs. Each member needs a gVCF: DEEPVARIANT's for a FASTQ or BAM row, the `gvcf` column for a VCF row (the run stops on a VCF row without one). Fewer than two named samples, or no `--somalier_sites`, stops the run at the start. When the pedigree marks two of those samples as each other's partner, `COUPLE_CARRIER` runs the couple carrier screen of step 39 on them ([Couple Carrier Screen](39-couple.md)): it reads each partner's ClinVar hits, so it needs `clinvar` in `--tools` (without it the run logs a warning and skips the screen), uses deletions over an exon only with `--gencode_exons` (the GENCODE exons BED `setup.sh` installs as `reference/gencode.v50.basic.exons.bed`), reads Delly's calls, ExpansionHunter's, and Parascopy's SMN1, interval and CYP21A2 tables when those steps ran, and, when `--annotsv_annotations` holds AnnotSV's benign loss set (`benign_Loss_SV_GRCh38.sorted.bed`, with gnomAD-SV's common deletions merged in by `setup.sh --annotsv-data`), sets aside a Delly deletion that matches a common one there. Without `--pedigree` none of these processes exists and a run is unchanged. What it checks and what the files hold: [Multi-sample comparison](multi-sample.md#family-analysis-step-38-opt-in). `--reference` is the FASTA the reads are aligned to and the BAMs were aligned to, the GRCh38 no-ALT analysis set that `setup.sh` installs as `reference/GRCh38_no_alt_analysis_set.fasta`. The Nextflow pipeline does not compare a given BAM's header with it; `./scripts/validate-setup.sh ` does, and [Realigning after a reference change](realignment.md) covers a BAM aligned to another reference. @@ -357,7 +357,7 @@ Where a module and its script differ on purpose: | Mito variants (20) | extracts the chrM reads with `samtools view`; annotates the calls with `clinvar/clinvar_chr.vcf.gz` and the gnomAD chrM sites under `gnomad_mito/` when they are installed | with GATK `PrintReads`. Mutect2 applies its own read filters to either, so the calls are expected to match; CI does not compare them. Both mark possible NuMTs at the median autosomal depth from mosdepth (step 16b, or `MOSDEPTH` when `mosdepth` is in `--tools`). `MITO_VARIANTS_ANNOTATE` runs the same annotation (`bin/collect_summary.py mito-annotate`) with the files of `--mito_clinvar` and `--gnomad_mito`; without them the table names each file as not given and leaves its columns `.`. `run-all.sh` passes `--mito_clinvar` when `clinvar/clinvar_chr.vcf.gz` and its `.tbi` are installed, and `--gnomad_mito` when the gnomAD chrM sites are | | AnnotSV (05) | annotates step 15's duphold-filtered calls; without them, or when Manta's calls are newer, Manta's calls, and says so | `ANNOTSV` always reads `DUPHOLD_FILTER`'s output: `annotsv` in `--tools` needs `duphold` and `manta` | | Y haplogroup (37) | reads the sex step 16 (indexcov) infers | runs on the rows whose samplesheet sex is male, which `INDEXCOV` has checked against the reads | -| HTML report (24) | renders every section from `bin/collect_summary.py`'s summary | `HTML_REPORT` runs the same code on the outputs of this run's steps, among them the cDNA read check of the ClinVar hits, the CYP2D6 depth check, the phased compound-het pairs, the RFC1 motif count, AnnotSV's class 4 and 5 table, the chrM annotation and step 35's HBA1/HBA2 count. It also gets the VEP VCF (each ClinVar hit's gnomAD AF and rsIDs), CPSR's classification table and the cDNA read check of its P/LP rows, `ALIGN_MINIMAP2`'s read count, and the clinical filter's and slivar's summary tables. The slivar card has no compound-het variant and gene counts: the Nextflow slivar module writes no `_compound_hets.tsv`. For every section, run `GENOME_DIR= scripts/24-html-report.sh ` on the Nextflow output | +| HTML report (24) | renders every section from `bin/collect_summary.py`'s summary | `HTML_REPORT` runs the same code on the outputs of this run's steps, among them the cDNA read check of the ClinVar hits, the CYP2D6 depth check, the phased compound-het pairs, the RFC1 motif count, AnnotSV's class 4 and 5 table, the chrM annotation and step 35's HBA1/HBA2 count, CYP21A2 and gene-dosage tables. It also gets the sample's gVCF (DEEPVARIANT's or the `gvcf` column's, linked as `vcf/.g.vcf.gz`, where step 24 finds step 03's) and the release in nextflow.config's manifest, as a `run pipeline_version` row of the report's run manifest (`bin/write_manifest.sh` writes the same row for `run-all.sh`). It also gets the VEP VCF (each ClinVar hit's gnomAD AF and rsIDs), CPSR's classification table and the cDNA read check of its P/LP rows, `ALIGN_MINIMAP2`'s read count, and the clinical filter's and slivar's summary tables. The slivar card has no compound-het variant and gene counts: the Nextflow slivar module writes no `_compound_hets.tsv`. For every section, run `GENOME_DIR= scripts/24-html-report.sh ` on the Nextflow output | | CNVpytor (18) | mounts each resource file over the image's data folder | copies the files into the image's `site-packages`, so it needs a writable container | | Cyrius (21) | runs Cyrius from the install `setup.sh --cyrius` made | the same install, given as `--cyrius_install` (see [Cyrius, opt-in](#cyrius-opt-in)) | diff --git a/main.nf b/main.nf index 7160fb9d..30e43719 100644 --- a/main.nf +++ b/main.nf @@ -616,6 +616,15 @@ workflow { error "ERROR: --ancient_panel ${params.ancient_panel} is not a finished panel (no DONE); run scripts/setup.sh --ancient-panel again." } + // Step 53's database (setup.sh --locityper-data): its DONE is written last, + // with the digests of the reference it was built from, so a folder + // without it is an install that stopped. Checked here, before any task + // runs, as scripts/53-locityper.sh checks it before its first call. + if (tools_list.contains('locityper') && params.locityper_data && !workflow.stubRun + && !file("${params.locityper_data}/DONE").exists()) { + error "ERROR: --locityper_data ${params.locityper_data} has no DONE: run scripts/setup.sh --locityper-data again." + } + // ExpansionHunter variant catalog ch_expansion_catalog = Channel.value(params.expansion_catalog ? file(params.expansion_catalog, checkIfExists: true) : []) @@ -875,7 +884,7 @@ workflow { } def ch_couple_outputs = couple_ids && tools_list.contains('clinvar') ? Channel.empty().mix( PGX.out.clinvar_dir, SV.out.delly_vcf, BAM_ANALYSIS.out.expansion_vcf, BAM_ANALYSIS.out.smn_copy_number, - BAM_ANALYSIS.out.cn_intervals, SV.out.cnvpytor_vcf + BAM_ANALYSIS.out.cn_intervals, SV.out.cnvpytor_vcf, BAM_ANALYSIS.out.cyp21a2 ).filter { meta, f -> couple_ids.contains(meta.id) }.map { meta, f -> f } : Channel.empty() FAMILY( ch_gvcf.filter { meta, g, idx -> family_ids.contains(meta.id) }, @@ -1167,6 +1176,8 @@ workflow { .join(BAM_ANALYSIS.out.coverage.map { meta, f -> [meta.id, f] }, remainder: true) .join(BAM_ANALYSIS.out.callability.map { meta, f -> [meta.id, f] }, remainder: true) .join(BAM_ANALYSIS.out.cn_intervals.map { meta, f -> [meta.id, f] }, remainder: true) + .join(BAM_ANALYSIS.out.cn_dosage.map { meta, f -> [meta.id, f] }, remainder: true) + .join(BAM_ANALYSIS.out.cyp21a2.map { meta, f -> [meta.id, f] }, remainder: true) .join(BAM_ANALYSIS.out.sample_qc.map { meta, f -> [meta.id, f] }, remainder: true) .join(BAM_ANALYSIS.out.telomere_results.map { meta, f -> [meta.id, f] }, remainder: true) .join(BAM_ANALYSIS.out.mito_vcf.map { meta, f -> [meta.id, f] }, remainder: true) @@ -1216,6 +1227,16 @@ workflow { .join(ch_couple_tables.map { meta, f -> [meta.id, f] }, remainder: true) .filter { items -> items[1] != null } .map { items -> [items[1], items[2], items[3..-1].collectMany { f -> (f instanceof List ? f : [f]) }.findAll { f -> f != null } + report_assets] } + // The sample's gVCF and its index (DEEPVARIANT's, or the samplesheet's + // gvcf columns) go in the list too, with their names in meta.gvcf: + // HTML_REPORT links them as vcf/.g.vcf.gz, where the bash report + // finds step 03's gVCF. A sample without a gVCF gets no meta.gvcf. + .map { meta, vcf, files -> [meta.id, meta, vcf, files] } + .join(ch_gvcf.map { meta, gvcf, idx -> [meta.id, [gvcf, idx]] }, remainder: true) + .filter { items -> items[1] != null } + .map { id, meta, vcf, files, gvcf -> + gvcf ? [meta + [gvcf: gvcf.collect { f -> f.name }], vcf, files + gvcf] : [meta, vcf, files] + } // QC files for MultiQC (mosdepth summaries) ch_multiqc_files = BAM_ANALYSIS.out.coverage.map { meta, f -> f } diff --git a/modules/local/couple/main.nf b/modules/local/couple/main.nf index 7c4e0edd..3ac391a6 100644 --- a/modules/local/couple/main.nf +++ b/modules/local/couple/main.nf @@ -11,14 +11,17 @@ --annotsv_annotations when it is there), SMN1 copy number (PARASCOPY), the FMR1 and FXN repeats (EXPANSION_HUNTER), and the carrier deletion alleles and a male partner's AZF regions from PARASCOPY's interval table, - with CNVpytor's calls (CNVPYTOR_VCF) as their cross-check. It writes couple__.tsv and .md, published + with CNVpytor's calls (CNVPYTOR_VCF) as their cross-check, and CYP21A2 + from depth and its pseudogene sites (PARASCOPY's _cyp21a2_psv.tsv, + short reads). It writes couple__.tsv and .md, published under the family's folder, // (--family_name, default family/), and one copy of the table per partner, _couple_carrier.tsv, published under //couple/ for that partner's report. The step outputs come as one list; each file is matched to its sample by its name (_clinvar_hits.vcf, _sv.vcf.gz, _eh.vcf, - _smn_copy_number.tsv, _cn_intervals.tsv, _cnvs.vcf.gz). + _smn_copy_number.tsv, _cn_intervals.tsv, _cnvs.vcf.gz, + _cyp21a2_psv.tsv). Equivalent to: scripts/39-couple.sh ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -54,7 +57,7 @@ process COUPLE_CARRIER { script: def files = outputs instanceof List ? outputs : [outputs] def kinds = [clinvar: '_clinvar_hits.vcf', delly: '_sv.vcf.gz', eh: '_eh.vcf', smn: '_smn_copy_number.tsv', - 'cn-intervals': '_cn_intervals.tsv', cnvpytor: '_cnvs.vcf.gz'] + 'cn-intervals': '_cn_intervals.tsv', cnvpytor: '_cnvs.vcf.gz', cyp21a2: '_cyp21a2_psv.tsv'] def args = files.collect { f -> // A staged input's name is its stage path (in/): keep the file name only def n = f.name.tokenize('/')[-1] diff --git a/modules/local/html_report/main.nf b/modules/local/html_report/main.nf index 8473e5f6..ffaf67a4 100644 --- a/modules/local/html_report/main.nf +++ b/modules/local/html_report/main.nf @@ -25,7 +25,14 @@ (the confirmed mtDNA variants step 20's section names) and the paralog catalogs assets/paralog_loci.tsv and assets/paraphase_genes.tsv. Every __copy_number.tsv of step 35 goes to paralogs/, and so - does step 35's _cn_intervals.tsv. Every gene and rsID the + do step 35's _cn_intervals.tsv, _cn_dosage.tsv and + _cyp21a2_psv.tsv. The sample's gVCF and its index, named in + meta.gvcf because a samplesheet gVCF keeps the user's name, become + vcf/.g.vcf.gz and its .tbi (or .csi), where the bash report finds + step 03's gVCF. A run_manifest.tsv in the sample folder records the + OwnGenome release (nextflow.config's manifest.version), so the report + names it as the bash report does; it is not published, because + run-all.sh writes the full manifest there. Every gene and rsID the results mention also goes to ${id}_search_index.json beside it (bin/results_index.py), for the live site's search, and the report's charts to ${id}_charts.json, for the live page (docs/24-html-report.md). @@ -55,14 +62,30 @@ process HTML_REPORT { script: def id = meta.id + // single-quoted on the command line below, so a ' in a name is closed, escaped and reopened + def sq = { String v -> v.replace("'", "'\\''") } + def gvcf = meta.gvcf ? sq(meta.gvcf[0].toString()) : '' + def gvcf_index = meta.gvcf ? sq(meta.gvcf[1].toString()) : '' + def gvcf_suffix = gvcf_index.endsWith('.csi') ? 'csi' : 'tbi' + def release = workflow.manifest.version ?: '' """ # Where collect_summary.py looks for each output (bin/collect_summary.py) S=layout/${id} mkdir -p "\$S" place() { mkdir -p "\$S/\$1" && ln -s "\$(readlink -f "\$2")" "\$S/\$1/\$(basename "\$2")"; } place vcf input/sample.vcf.gz && mv "\$S/vcf/sample.vcf.gz" "\$S/vcf/${id}.vcf.gz" + gvcf='${gvcf}'; gvcf_index='${gvcf_index}' + if [ -n "\$gvcf" ]; then + ln -s "\$(readlink -f "input/\$gvcf")" "\$S/vcf/${id}.g.vcf.gz" + ln -s "\$(readlink -f "input/\$gvcf_index")" "\$S/vcf/${id}.g.vcf.gz.${gvcf_suffix}" + fi + # The release this run is (bash: bin/write_manifest.sh's run pipeline_version row) + release='${release}' + [ -z "\$release" ] || printf 'run\\tpipeline_version\\t%s\\n' "\$release" > "\$S/run_manifest.tsv" for f in input/*; do - case "\$(basename "\$f")" in + n=\$(basename "\$f") + if [ -n "\$gvcf" ] && { [ "\$n" = "\$gvcf" ] || [ "\$n" = "\$gvcf_index" ]; }; then continue; fi + case "\$n" in sample.vcf.gz) ;; ${id}_clinvar_hits.vcf|${id}_clinvar_cdna_check.tsv|${id}_clinvar_cdna_scan.tsv|${id}_clinvar_deep_intronic.tsv) place clinvar "\$f" ;; ${id}.report.json|${id}.report.html) place pharmcat "\$f" ;; @@ -78,7 +101,7 @@ process HTML_REPORT { ${id}_paraphase_copy_number.tsv|${id}_paraphase_variants.tsv|${id}_*_copy_number.tsv) place paralogs "\$f" ;; ${id}.mosdepth.summary.txt|${id}_callability.bed.gz) place coverage "\$f" ;; ${id}_sample_qc.tsv|${id}_read_count.tsv) place qc "\$f" ;; - ${id}_cn_intervals.tsv) place paralogs "\$f" ;; + ${id}_cn_intervals.tsv|${id}_cn_dosage.tsv|${id}_cyp21a2_psv.tsv) place paralogs "\$f" ;; ${id}_prs_summary.tsv) place prs "\$f" ;; ${id}_ancestry.tsv) place ancestry "\$f" ;; ${id}_ancestry_fine.tsv|${id}_painting.png) place ancestry_fine "\$f" ;; diff --git a/scripts/ci/e2e-case-paths.tsv b/scripts/ci/e2e-case-paths.tsv index 5dc19dc9..252b332a 100644 --- a/scripts/ci/e2e-case-paths.tsv +++ b/scripts/ci/e2e-case-paths.tsv @@ -90,6 +90,7 @@ family-joint-1 assets/construct_variants.tsv assets/deep_intronic_sites.tsv asse fixitfelix-chr21-1 assets/callability_genes.tsv scripts/16b-mosdepth.sh scripts/ci/fake-docker/lib.sh scripts/setup.sh followups-clinvar-traits-1-rules-html assets/genotype_rules.tsv assets/traits.tsv bin/render_report.py bin/traits_report.py scripts/42-traits.sh scripts/ci/check-rule-alleles.sh followups-cn-1-couple-report assets/carrier_genes.tsv assets/par_grch38.bed assets/stub/pedigree.tsv bin/collect_summary.py bin/couple_report.py bin/family_report.py bin/render_report.py bin/results_index.py modules/local/couple/* modules/local/html_report/* scripts/39-couple.sh scripts/ci/fake-docker/lib.sh +followups-nf-1-nf-wiring assets/stub/* assets/test_samplesheet.csv assets/steps.tsv bin/collect_summary.py bin/render_report.py bin/results_index.py bin/run_state.py conf/test.config conf/test_all.config conf/containers.config modules/local/html_report/* modules/local/couple/* modules/local/parascopy/* modules/local/deepvariant/* modules/local/cpsr/* modules/local/clinvar_screen/* modules/local/locityper/* workflows/* tests/fixtures/consumer_export/sites.tsv.gz genome-lookup-1 scripts/ci/fake-docker/lib.sh scripts/owngenome-lookup.sh genotype-rule-rows-1-str-extra assets/str_extra_loci.json assets/stub/db/catalog.json scripts/09-expansion-hunter.sh scripts/ci/fake-docker/lib.sh scripts/setup.sh genotype-rules-1-phase assets/genotype_rules.tsv assets/traits.tsv bin/traits_report.py modules/local/traits/* modules/local/vcf_precheck/* scripts/42-traits.sh scripts/ci/check-rule-alleles.sh scripts/ci/fake-docker/lib.sh scripts/validate-setup.sh diff --git a/scripts/ci/e2e-case-times.tsv b/scripts/ci/e2e-case-times.tsv index 6ad857e5..d8a03f8e 100644 --- a/scripts/ci/e2e-case-times.tsv +++ b/scripts/ci/e2e-case-times.tsv @@ -89,6 +89,7 @@ family-joint-1 shard 515 - fixitfelix-chr21-1 shard 98 - followups-clinvar-traits-1-rules-html shard 2 - followups-cn-1-couple-report shard 69 - +followups-nf-1-nf-wiring shard 240 - genome-lookup-1 shard 7 - genotype-rule-rows-1-str-extra shard 8 - genotype-rules-1-phase shard 37 - diff --git a/tests/e2e/followups-nf-1-nf-wiring.sh b/tests/e2e/followups-nf-1-nf-wiring.sh new file mode 100755 index 00000000..58581dbf --- /dev/null +++ b/tests/e2e/followups-nf-1-nf-wiring.sh @@ -0,0 +1,209 @@ +#!/usr/bin/env bash +# The Nextflow report and couple screen get the step 35 tables, the gVCF and +# the release the bash path already uses; CPSR's read check counts under step +# 17; a Locityper database without DONE stops the run before any task. +# 1. HTML_REPORT, run for real in its image through a two-line pipeline, on +# HG002's VCF, a gVCF under a samplesheet-style name (meta.gvcf), and +# made-up CYP21A2 and gene-dosage tables: the gVCF and its index are +# linked as vcf/.g.vcf.gz(.tbi), summary.json carries the CYP21A2 +# deletion and the HP count, and its manifest has the run +# pipeline_version row with the manifest version of the pipeline's +# config. Red controls: a copy of the module without the two place +# alternatives stops on the CYP21A2 table; a copy without the gVCF and +# release lines links no gVCF and writes no release. +# 2. main.nf passes them on: a stub run of the stub pedigree (two partners, +# both called by DEEPVARIANT) with clinvar, parascopy, cpsr and +# html_report stages the CYP21A2 and dosage tables in every HTML_REPORT +# task that got the HBA table, each partner's CYP21A2 table in +# COUPLE_CARRIER, and DEEPVARIANT's gVCF in the HTML_REPORT task of each +# called sample. Its process table has a CPSR_CDNA_CHECK row, which +# bin/run_state.py maps to step 17. Red control: a copy of the pipeline +# without the new lines stages none of them. +# 3. --tools locityper with a --locityper_data folder that has no DONE stops +# a -preview run (the workflow is built, no task runs) with the setup.sh +# command; with DONE it +# passes. Red control: a copy of main.nf without the check takes the +# folder in silence. +. "$(dirname "$0")/lib.sh" + +command -v nextflow >/dev/null || { fail "nextflow is not on PATH"; finish; } + +VCF="${GENOME_DIR}/${SAMPLE}/vcf/${SAMPLE}.vcf.gz" +check "an earlier case left ${VCF#"$GENOME_DIR"/}" nonempty "${VCF#"$GENOME_DIR"/}" +DECLARED=$(sed -nE "/^manifest[[:space:]]*\{/,/^\}/ s/^[[:space:]]*version[[:space:]]*=[[:space:]]*'([^']+)'.*/\1/p" \ + "${REPO}/nextflow.config") +check "nextflow.config declares a manifest version (${DECLARED})" test -n "$DECLARED" + +# --- 1. HTML_REPORT ---------------------------------------------------------------- +S=NFF +T="${CASE_TMP}/tables" +rm -rf "$T"; mkdir -p "$T" +ln -f "$VCF" "${T}/given.gvcf.gz" 2>/dev/null || cp "$VCF" "${T}/given.gvcf.gz" +ln -f "${VCF}.tbi" "${T}/given.gvcf.gz.tbi" 2>/dev/null || cp "${VCF}.tbi" "${T}/given.gvcf.gz.tbi" +printf 'metric\tvalue\nstatus\tcalled\ncyp21a2_copies\t1\nmodule_total\t3\nexpected_total\t4\nestimate\t1.02\nfinding\tdeletion\nreason\t.\nreading\tplanted\n' \ + > "${T}/${S}_cyp21a2_psv.tsv" +printf 'locus\tstatus\tcopies\testimate\treason\treading\nHP\tcalled\t3\t3.04\t.\tplanted\n' > "${T}/${S}_cn_dosage.tsv" + +NP="${CASE_TMP}/project" +rm -rf "$NP"; mkdir -p "$NP" +cp -R "${REPO}/bin" "${NP}/bin" +nfconf() { # nfconf OUT + printf "params.outdir = '%s'\nparams.publish_dir_mode = 'copy'\nmanifest.version = '%s'\ndocker.enabled = true\ndocker.runOptions = '--user %s:%s --network none'\n" \ + "$1" "$DECLARED" "$(id -u)" "$(id -g)" > "${NP}/nextflow.config" +} +nfrun() { # nfrun NAME: the pipeline in NP/main.nf, log CASE_TMP/NAME.log + echo "+ nextflow run ($1)" + ( cd "$CASE_TMP" && nextflow run "${NP}/main.nf" -ansi-log false -c "${REPO}/conf/containers.config" \ + -work-dir "${CASE_TMP}/work-$1" ) > "${CASE_TMP}/$1.log" 2>&1 + NF_RC=$? + [ "$NF_RC" = 0 ] || grep -E 'ERROR|Error executing process|Command error' -A 8 "${CASE_TMP}/$1.log" | head -40 +} +report_run() { # report_run NAME MODULE + rm -rf "${CASE_TMP:?}/$1" "${CASE_TMP:?}/work-$1" + nfconf "${CASE_TMP}/$1" + cat > "${NP}/main.nf" </dev/null | head -1) + [ -n "$l" ] && [ -s "$l" ] && case "$(basename "$(readlink -f "$l")")" in "given.gvcf.gz"*) true ;; *) false ;; esac +} +summary() { # summary NAME EXPR: a Python expression over d, the summary.json of run NAME + python3 -c "import json, sys +try: + d = json.load(open(sys.argv[1])) +except (OSError, ValueError): + print('no summary'); sys.exit(0) +print($2)" "${CASE_TMP}/$1/${S}/summary.json" 2>&1 +} +report_run report "${REPO}/modules/local/html_report/main" +check_eq "HTML_REPORT with the gVCF and both tables exits 0" "$NF_RC" 0 +check "the gVCF is linked as vcf/${S}.g.vcf.gz" linked report "${S}.g.vcf.gz" +check "and its index as vcf/${S}.g.vcf.gz.tbi" linked report "${S}.g.vcf.gz.tbi" +PARA="(d['sections'].get('parascopy') or {}).get('data') or {}" +check_eq "summary.json: the CYP21A2 finding and copies" \ + "$(summary report "[($PARA).get('cyp21a2', {}).get(k) for k in ('status', 'finding', 'cyp21a2_copies')]")" \ + "['called', 'deletion', '1']" +check_eq "summary.json: the HP dosage count" \ + "$(summary report "[(r['locus'], r['copies']) for r in ($PARA).get('dosage') or []]")" "[('HP', '3')]" +check_eq "summary.json: the manifest names the release" \ + "$(summary report "[r[2] for r in d['manifest'] if r[:2] == ['run', 'pipeline_version']]")" "['${DECLARED}']" +check "the report itself shows the release" grep -q "pipeline_version
${DECLARED}<" "${CASE_TMP}/report/${S}/${S}_report.html" +check "the run manifest is not published (run-all.sh writes the full one there)" test ! -e "${CASE_TMP}/report/${S}/run_manifest.tsv" + +mkdir -p "${NP}/noplace" "${NP}/nogvcf" +# shellcheck disable=SC2016 # the dollar signs are sed text +sed 's/|\${id}_cn_dosage\.tsv|\${id}_cyp21a2_psv\.tsv)/)/' "${REPO}/modules/local/html_report/main.nf" > "${NP}/noplace/main.nf" +check_eq "control copy: the module has no place for the two tables" \ + "$(grep -cE '_cn_dosage\.tsv\||_cyp21a2_psv\.tsv\)' "${NP}/noplace/main.nf")" 0 +report_run report-noplace "${NP}/noplace/main" +check "red: the module without the place alternatives stops (exit ${NF_RC})" test "$NF_RC" -ne 0 +check "and names the table it has no place for" grep -qE "no place for: ${S}_(cyp21a2_psv|cn_dosage)\.tsv" -r "${CASE_TMP}/work-report-noplace" --include=.command.err +sed -e 's/^\( *\)ln -s .*\.g\.vcf\.gz.*$/\1true/' -e '/run_manifest\.tsv"$/d' "${REPO}/modules/local/html_report/main.nf" > "${NP}/nogvcf/main.nf" +check_eq "control copy: the gVCF links and the release line are gone" \ + "$(grep -cE 'g\.vcf\.gz"|run_manifest\.tsv"$' "${NP}/nogvcf/main.nf")" 0 +report_run report-nogvcf "${NP}/nogvcf/main" +check_eq "control: that module still runs" "$NF_RC" 0 +check "red: it links no gVCF" test -z "$(find "${CASE_TMP}/work-report-nogvcf" -path "*/layout/${S}/vcf/${S}.g.vcf.gz" 2>/dev/null)" +check_eq "red: and its manifest has no release" \ + "$(summary report-nogvcf "[r[2] for r in d['manifest'] if r[:2] == ['run', 'pipeline_version']]")" "[]" + +# --- 2. main.nf: stub run of the stub pedigree --------------------------------------- +staged_in() { # staged_in WORK PROCESS PATTERN: tasks of PROCESS in WORK that stage a file matching PATTERN (ERE) + find "$1" -name .command.run -exec grep -l "^### name: .*$2" {} + 2>/dev/null \ + | while read -r f; do grep -lE -- "$3" "$f"; done | wc -l | tr -d ' ' +} +for n in stub stub-nowire; do + rm -rf "${CASE_TMP:?}/${n}"; mkdir -p "${CASE_TMP}/${n}" + git -C "$REPO" ls-files -z | (cd "$REPO" && tar --null -T - -cf -) | tar -xf - -C "${CASE_TMP}/${n}" +done +W1='BAM_ANALYSIS.out.cn_dosage.map'; W2='BAM_ANALYSIS.out.cyp21a2.map' +W3='SV.out.cnvpytor_vcf, BAM_ANALYSIS.out.cyp21a2$'; W4='.join(ch_gvcf.map { meta, gvcf, idx' +check_eq "main.nf joins the dosage and CYP21A2 tables into the report inputs once each" \ + "$(grep -cF -e "$W1" -e "$W2" "${CASE_TMP}/stub/main.nf")" 2 +check_eq "main.nf hands the CYP21A2 table to the couple screen once" "$(grep -c "$W3" "${CASE_TMP}/stub/main.nf")" 1 +check_eq "main.nf joins the gVCF into the report inputs once" "$(grep -cF "$W4" "${CASE_TMP}/stub/main.nf")" 1 +sed -i -e "/${W1}/d" -e "/${W2}/d" -e 's/SV.out.cnvpytor_vcf, BAM_ANALYSIS.out.cyp21a2$/SV.out.cnvpytor_vcf/' \ + -e 's/\.join(ch_gvcf\.map { meta, gvcf, idx/.join(ch_gvcf.filter { false }.map { meta, gvcf, idx/' \ + "${CASE_TMP}/stub-nowire/main.nf" +check_eq "control copy: the new lines are gone" \ + "$(grep -cF -e "$W1" -e "$W2" -e "$W4" "${CASE_TMP}/stub-nowire/main.nf")$(grep -c "$W3" "${CASE_TMP}/stub-nowire/main.nf")" 00 +echo '{"kir": false}' > "${CASE_TMP}/no-kir.json" +for n in stub stub-nowire; do + echo "+ nextflow run main.nf -profile test_all -stub --pedigree assets/stub/pedigree.tsv (${n})" + ( cd "${CASE_TMP}/${n}" && nextflow run main.nf -profile test_all -stub -ansi-log false --outdir "${CASE_TMP}/${n}/out" \ + -work-dir "${CASE_TMP}/${n}/work" --pedigree assets/stub/pedigree.tsv --tools clinvar,parascopy,cpsr,html_report \ + -params-file "${CASE_TMP}/no-kir.json" ) > "${CASE_TMP}/${n}.log" 2>&1 + rc=$? + tail -n 6 "${CASE_TMP}/${n}.log" + check_eq "stub run (${n}) exits 0" "$rc" 0 +done +SW="${CASE_TMP}/stub/work"; S0="${CASE_TMP}/stub-nowire/work" +HBA=$(staged_in "$SW" HTML_REPORT '_hba_copy_number[.]tsv') +check_ge "HTML_REPORT tasks with the HBA table" "$HBA" 1 +check_eq "every one of them stages the CYP21A2 table" "$(staged_in "$SW" HTML_REPORT '_cyp21a2_psv[.]tsv')" "$HBA" +check_eq "and the dosage table" "$(staged_in "$SW" HTML_REPORT '_cn_dosage[.]tsv')" "$HBA" +check_eq "both partners' CYP21A2 tables reach COUPLE_CARRIER" \ + "$(find "$SW" -name .command.run -exec grep -l '^### name: .*COUPLE_CARRIER' {} + 2>/dev/null | while read -r f; do grep -ho 'stub_[a-z]*_cyp21a2_psv.tsv' "$f"; done | sort -u | wc -l | tr -d ' ')" 2 +for id in stub_fastq stub_bam; do + check_eq "the HTML_REPORT task of ${id} stages DEEPVARIANT's gVCF" \ + "$(staged_in "$SW" "HTML_REPORT .${id}." "${id}[.]g[.]vcf[.]gz")" 1 +done +check_eq "red: without the lines no HTML_REPORT task stages the CYP21A2 or dosage table" \ + "$(staged_in "$S0" HTML_REPORT '_cyp21a2_psv[.]tsv|_cn_dosage[.]tsv')" 0 +check_ge "control: the stub run without the lines still ran COUPLE_CARRIER" "$(staged_in "$S0" COUPLE_CARRIER '_clinvar_hits[.]vcf')" 1 +check_eq "red: and COUPLE_CARRIER stages no CYP21A2 table" "$(staged_in "$S0" COUPLE_CARRIER '_cyp21a2_psv[.]tsv')" 0 +check_eq "red: and no HTML_REPORT task stages a gVCF" "$(staged_in "$S0" HTML_REPORT '[.]g[.]vcf[.]gz')" 0 +# CPSR's read check under step 17: the run's process table, read the way run-all.sh and the live view read it +STEP17=$(python3 - "${CASE_TMP}/stub/process_status.tsv" "${REPO}" <<'PY' +import sys +sys.path.insert(0, sys.argv[2] + "/bin") +import run_state +ps = run_state.read_process_status(sys.argv[1]) or {} +step_of = {p: s["step"] for s in run_state.read_steps(sys.argv[2] + "/assets/steps.tsv") for p in s["processes"]} +r = ps.get("CPSR_CDNA_CHECK") or {} +print(step_of.get("CPSR_CDNA_CHECK"), sum(v for v in r.values() if isinstance(v, int))) +PY +) +echo "CPSR_CDNA_CHECK: step and tasks: ${STEP17}" +check "the process table has CPSR_CDNA_CHECK tasks, and run_state.py maps them to step 17" \ + has '^17 [1-9]' "$STEP17" + +# --- 3. Locityper's DONE, before any task ------------------------------------------ +LD="${CASE_TMP}/locityper-db" +rm -rf "$LD"; mkdir -p "$LD" +cp -R "${CASE_TMP}/stub" "${CASE_TMP}/nocheck" 2>/dev/null || true +rm -rf "${CASE_TMP:?}/nocheck/work" "${CASE_TMP:?}/nocheck/out" +# shellcheck disable=SC2016 # the dollar signs are sed text +sed -i '/!file("${params.locityper_data}\/DONE").exists()) {/,/^ }$/d' "${CASE_TMP}/nocheck/main.nf" +sed -i '/tools_list.contains(.locityper.) && params.locityper_data && !workflow.stubRun$/d' "${CASE_TMP}/nocheck/main.nf" +check_eq "control copy: the DONE check is gone" "$(grep -c 'locityper_data} has no DONE' "${CASE_TMP}/nocheck/main.nf")" 0 +preview() { # preview NAME DIR: a -preview run of DIR/main.nf with locityper and the database LD + ( cd "$2" && nextflow run main.nf -profile test -preview -ansi-log false --outdir "${CASE_TMP}/$1-out" \ + -work-dir "${CASE_TMP}/$1-work" --tools locityper --locityper_data "$LD" ) > "${CASE_TMP}/$1.log" 2>&1 + PV_RC=$? + tail -n 4 "${CASE_TMP}/$1.log" +} +preview nodone "${CASE_TMP}/stub" +check "a database without DONE stops the run (exit ${PV_RC})" test "$PV_RC" -ne 0 +check "with the setup.sh command" grep -q "locityper_data ${LD} has no DONE: run scripts/setup.sh --locityper-data" "${CASE_TMP}/nodone.log" +preview nocheck "${CASE_TMP}/nocheck" +check_eq "red: without the check the same folder passes the preview" "$PV_RC" 0 +touch "${LD}/DONE" +preview with-done "${CASE_TMP}/stub" +check_eq "control: with DONE the preview passes" "$PV_RC" 0 + +rm -rf "${CASE_TMP:?}/stub" "${CASE_TMP:?}/stub-nowire" "${CASE_TMP:?}/nocheck" "${CASE_TMP:?}"/work-* "${CASE_TMP:?}"/*-work +finish diff --git a/workflows/bam_analysis.nf b/workflows/bam_analysis.nf index cb048ef8..fa5a68be 100644 --- a/workflows/bam_analysis.nf +++ b/workflows/bam_analysis.nf @@ -76,6 +76,8 @@ workflow BAM_ANALYSIS { ch_mito_deletions = Channel.empty() // [meta, _chrM_deletions.tsv] ch_mito_copies = Channel.empty() // [meta, _mtdna_copies.tsv] ch_cn_intervals = Channel.empty() // [meta, _cn_intervals.tsv] when Parascopy runs + ch_cn_dosage = Channel.empty() // [meta, _cn_dosage.tsv] when Parascopy runs + ch_cyp21a2 = Channel.empty() // [meta, _cyp21a2_psv.tsv] when Parascopy runs ch_kir_genotype = Channel.empty() ch_hla_optitype = Channel.empty() // [meta, _optitype_result.tsv] with --hla_qc ch_hla_concordance = Channel.empty() // [meta, _hla_concordance.tsv] when OptiType typed reads @@ -239,6 +241,8 @@ workflow BAM_ANALYSIS { if (params.tools && params.tools.split(',').collect{it.trim()}.contains('parascopy')) { PARASCOPY(ch_bam, ch_reference, ch_reference_fai, ch_parascopy_data, ch_parascopy_bed) ch_cn_intervals = PARASCOPY.out.intervals + ch_cn_dosage = PARASCOPY.out.dosage + ch_cyp21a2 = PARASCOPY.out.cyp21a2 ch_smn_copy_number = PARASCOPY.out.copy_number ch_hba_copy_number = PARASCOPY.out.hba // every other catalog row's table: SMN1's and HBA's come apart, above @@ -397,6 +401,8 @@ workflow BAM_ANALYSIS { coverage = ch_coverage callability = ch_callability // [meta, _callability.bed.gz] cn_intervals = ch_cn_intervals // [meta, _cn_intervals.tsv]: bin/cn_loci.tsv's interval rows + cn_dosage = ch_cn_dosage // [meta, _cn_dosage.tsv]: bin/cn_loci.tsv's gene-dosage rows + cyp21a2 = ch_cyp21a2 // [meta, _cyp21a2_psv.tsv]: CYP21A2 from depth and PSV sites mito_vcf = ch_mito_vcf mito_annotated = ch_mito_annotated // [meta, _chrM_annotated.tsv] mito_deletions = ch_mito_deletions // [meta, _chrM_deletions.tsv] From 790ae20affba9acc8c8a50f886d4a05d34527273 Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Sat, 7 Nov 2026 17:47:21 +0100 Subject: [PATCH 4/7] fix(nextflow): pass nextflow lint, and replay the demo with step 17's new process nextflow lint refuses a closure called as a function inside a process script, so the quote escape is inline. The demo weblog fixture comes from assets/steps.tsv, which now lists CPSR_CDNA_CHECK under step 17. Bead: pgp-pfw6.21 Bead: pgp-5bja.19 --- modules/local/html_report/main.nf | 5 +- tests/fixtures/live/demo-001.weblog.jsonl | 287 +++++++++++----------- 2 files changed, 147 insertions(+), 145 deletions(-) diff --git a/modules/local/html_report/main.nf b/modules/local/html_report/main.nf index ffaf67a4..b3ababcf 100644 --- a/modules/local/html_report/main.nf +++ b/modules/local/html_report/main.nf @@ -63,9 +63,8 @@ process HTML_REPORT { script: def id = meta.id // single-quoted on the command line below, so a ' in a name is closed, escaped and reopened - def sq = { String v -> v.replace("'", "'\\''") } - def gvcf = meta.gvcf ? sq(meta.gvcf[0].toString()) : '' - def gvcf_index = meta.gvcf ? sq(meta.gvcf[1].toString()) : '' + def gvcf = meta.gvcf ? meta.gvcf[0].toString().replace("'", "'\\''") : '' + def gvcf_index = meta.gvcf ? meta.gvcf[1].toString().replace("'", "'\\''") : '' def gvcf_suffix = gvcf_index.endsWith('.csi') ? 'csi' : 'tbi' def release = workflow.manifest.version ?: '' """ diff --git a/tests/fixtures/live/demo-001.weblog.jsonl b/tests/fixtures/live/demo-001.weblog.jsonl index 70407daa..3a20ce72 100644 --- a/tests/fixtures/live/demo-001.weblog.jsonl +++ b/tests/fixtures/live/demo-001.weblog.jsonl @@ -184,60 +184,61 @@ {"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":4,"hash":"de/000068","memory":8589934592,"name":"OWNGENOME:VEP_NORM (DEMO-001)","process":"OWNGENOME:VEP_NORM","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":68},"utcTime":"2026-01-03T01:04:54Z"} {"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":4,"hash":"de/000069","memory":8589934592,"name":"OWNGENOME:VEP (DEMO-001)","process":"OWNGENOME:VEP","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":69},"utcTime":"2026-01-03T01:04:54Z"} {"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000070","memory":2147483648,"name":"OWNGENOME:CPSR (DEMO-001)","process":"OWNGENOME:CPSR","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":70},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000071","memory":2147483648,"name":"OWNGENOME:PRS_PREPARE (DEMO-001)","process":"OWNGENOME:PRS_PREPARE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":71},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000072","memory":2147483648,"name":"OWNGENOME:PRS_SCORE_SITES (DEMO-001)","process":"OWNGENOME:PRS_SCORE_SITES","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":72},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000073","memory":2147483648,"name":"OWNGENOME:PRS (DEMO-001)","process":"OWNGENOME:PRS","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":73},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000074","memory":2147483648,"name":"OWNGENOME:PRS_SUMMARY (DEMO-001)","process":"OWNGENOME:PRS_SUMMARY","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":74},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000075","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_GENOTYPE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_GENOTYPE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":75},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000076","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PREPARE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_PREPARE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":76},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000077","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_ADMIXTURE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_ADMIXTURE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":77},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000078","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PHASE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_PHASE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":78},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000079","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PAINT (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_PAINT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":79},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000080","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_REPORT (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_REPORT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":80},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000081","memory":2147483648,"name":"OWNGENOME:PYPGX (DEMO-001)","process":"OWNGENOME:PYPGX","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":81},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000082","memory":2147483648,"name":"OWNGENOME:CYP2D6_DEPTH (DEMO-001)","process":"OWNGENOME:CYP2D6_DEPTH","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":82},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000083","memory":2147483648,"name":"OWNGENOME:Y_POSITIONS (DEMO-001)","process":"OWNGENOME:Y_POSITIONS","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":83},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000084","memory":2147483648,"name":"OWNGENOME:Y_PILEUP (DEMO-001)","process":"OWNGENOME:Y_PILEUP","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":84},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000085","memory":2147483648,"name":"OWNGENOME:Y_HAPLOGROUP (DEMO-001)","process":"OWNGENOME:Y_HAPLOGROUP","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":85},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000086","memory":2147483648,"name":"OWNGENOME:Y_PRIVATE (DEMO-001)","process":"OWNGENOME:Y_PRIVATE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":86},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000087","memory":2147483648,"name":"OWNGENOME:CONSUMER_EXPORT (DEMO-001)","process":"OWNGENOME:CONSUMER_EXPORT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":87},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000088","memory":2147483648,"name":"OWNGENOME:BLOODTYPE_REGIONS (DEMO-001)","process":"OWNGENOME:BLOODTYPE_REGIONS","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":88},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000089","memory":2147483648,"name":"OWNGENOME:BLOODTYPE_DEPTH (DEMO-001)","process":"OWNGENOME:BLOODTYPE_DEPTH","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":89},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000090","memory":2147483648,"name":"OWNGENOME:BLOODTYPE (DEMO-001)","process":"OWNGENOME:BLOODTYPE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":90},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000091","memory":2147483648,"name":"OWNGENOME:TRAITS_SITES (DEMO-001)","process":"OWNGENOME:TRAITS_SITES","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":91},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000092","memory":2147483648,"name":"OWNGENOME:TRAITS_PHASE (DEMO-001)","process":"OWNGENOME:TRAITS_PHASE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":92},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000093","memory":2147483648,"name":"OWNGENOME:TRAITS (DEMO-001)","process":"OWNGENOME:TRAITS","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":93},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000094","memory":2147483648,"name":"OWNGENOME:ARCHAIC_GENOTYPES (DEMO-001)","process":"OWNGENOME:ARCHAIC_GENOTYPES","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":94},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000095","memory":2147483648,"name":"OWNGENOME:ARCHAIC_IBDMIX (DEMO-001)","process":"OWNGENOME:ARCHAIC_IBDMIX","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":95},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000096","memory":2147483648,"name":"OWNGENOME:ARCHAIC_REPORT (DEMO-001)","process":"OWNGENOME:ARCHAIC_REPORT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":96},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000097","memory":2147483648,"name":"OWNGENOME:ANCIENT_SITES (DEMO-001)","process":"OWNGENOME:ANCIENT_SITES","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":97},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000098","memory":2147483648,"name":"OWNGENOME:ANCIENT_GENO (DEMO-001)","process":"OWNGENOME:ANCIENT_GENO","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":98},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000099","memory":2147483648,"name":"OWNGENOME:ANCIENT_PCA (DEMO-001)","process":"OWNGENOME:ANCIENT_PCA","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":99},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000100","memory":2147483648,"name":"OWNGENOME:ANCIENT_REPORT (DEMO-001)","process":"OWNGENOME:ANCIENT_REPORT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":100},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000101","memory":2147483648,"name":"OWNGENOME:EXOMISER_PREPARE (DEMO-001)","process":"OWNGENOME:EXOMISER_PREPARE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":101},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000102","memory":2147483648,"name":"OWNGENOME:EXOMISER (DEMO-001)","process":"OWNGENOME:EXOMISER","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":102},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000103","memory":2147483648,"name":"OWNGENOME:EXOMISER_REPORT (DEMO-001)","process":"OWNGENOME:EXOMISER_REPORT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":103},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000104","memory":2147483648,"name":"OWNGENOME:MOCHA_PREP (DEMO-001)","process":"OWNGENOME:MOCHA_PREP","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":104},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000105","memory":2147483648,"name":"OWNGENOME:MOCHA_PHASE (DEMO-001)","process":"OWNGENOME:MOCHA_PHASE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":105},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000106","memory":2147483648,"name":"OWNGENOME:MOCHA_CALL (DEMO-001)","process":"OWNGENOME:MOCHA_CALL","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":106},"utcTime":"2026-01-03T01:04:54Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000107","memory":2147483648,"name":"OWNGENOME:MOCHA_REPORT (DEMO-001)","process":"OWNGENOME:MOCHA_REPORT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":107},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000071","memory":2147483648,"name":"OWNGENOME:CPSR_CDNA_CHECK (DEMO-001)","process":"OWNGENOME:CPSR_CDNA_CHECK","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":71},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000072","memory":2147483648,"name":"OWNGENOME:PRS_PREPARE (DEMO-001)","process":"OWNGENOME:PRS_PREPARE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":72},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000073","memory":2147483648,"name":"OWNGENOME:PRS_SCORE_SITES (DEMO-001)","process":"OWNGENOME:PRS_SCORE_SITES","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":73},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000074","memory":2147483648,"name":"OWNGENOME:PRS (DEMO-001)","process":"OWNGENOME:PRS","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":74},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000075","memory":2147483648,"name":"OWNGENOME:PRS_SUMMARY (DEMO-001)","process":"OWNGENOME:PRS_SUMMARY","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":75},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000076","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_GENOTYPE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_GENOTYPE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":76},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000077","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PREPARE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_PREPARE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":77},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000078","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_ADMIXTURE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_ADMIXTURE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":78},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000079","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PHASE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_PHASE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":79},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000080","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PAINT (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_PAINT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":80},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000081","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_REPORT (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_REPORT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":81},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000082","memory":2147483648,"name":"OWNGENOME:PYPGX (DEMO-001)","process":"OWNGENOME:PYPGX","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":82},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000083","memory":2147483648,"name":"OWNGENOME:CYP2D6_DEPTH (DEMO-001)","process":"OWNGENOME:CYP2D6_DEPTH","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":83},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000084","memory":2147483648,"name":"OWNGENOME:Y_POSITIONS (DEMO-001)","process":"OWNGENOME:Y_POSITIONS","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":84},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000085","memory":2147483648,"name":"OWNGENOME:Y_PILEUP (DEMO-001)","process":"OWNGENOME:Y_PILEUP","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":85},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000086","memory":2147483648,"name":"OWNGENOME:Y_HAPLOGROUP (DEMO-001)","process":"OWNGENOME:Y_HAPLOGROUP","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":86},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000087","memory":2147483648,"name":"OWNGENOME:Y_PRIVATE (DEMO-001)","process":"OWNGENOME:Y_PRIVATE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":87},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000088","memory":2147483648,"name":"OWNGENOME:CONSUMER_EXPORT (DEMO-001)","process":"OWNGENOME:CONSUMER_EXPORT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":88},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000089","memory":2147483648,"name":"OWNGENOME:BLOODTYPE_REGIONS (DEMO-001)","process":"OWNGENOME:BLOODTYPE_REGIONS","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":89},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000090","memory":2147483648,"name":"OWNGENOME:BLOODTYPE_DEPTH (DEMO-001)","process":"OWNGENOME:BLOODTYPE_DEPTH","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":90},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000091","memory":2147483648,"name":"OWNGENOME:BLOODTYPE (DEMO-001)","process":"OWNGENOME:BLOODTYPE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":91},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000092","memory":2147483648,"name":"OWNGENOME:TRAITS_SITES (DEMO-001)","process":"OWNGENOME:TRAITS_SITES","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":92},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000093","memory":2147483648,"name":"OWNGENOME:TRAITS_PHASE (DEMO-001)","process":"OWNGENOME:TRAITS_PHASE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":93},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000094","memory":2147483648,"name":"OWNGENOME:TRAITS (DEMO-001)","process":"OWNGENOME:TRAITS","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":94},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000095","memory":2147483648,"name":"OWNGENOME:ARCHAIC_GENOTYPES (DEMO-001)","process":"OWNGENOME:ARCHAIC_GENOTYPES","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":95},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000096","memory":2147483648,"name":"OWNGENOME:ARCHAIC_IBDMIX (DEMO-001)","process":"OWNGENOME:ARCHAIC_IBDMIX","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":96},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000097","memory":2147483648,"name":"OWNGENOME:ARCHAIC_REPORT (DEMO-001)","process":"OWNGENOME:ARCHAIC_REPORT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":97},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000098","memory":2147483648,"name":"OWNGENOME:ANCIENT_SITES (DEMO-001)","process":"OWNGENOME:ANCIENT_SITES","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":98},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000099","memory":2147483648,"name":"OWNGENOME:ANCIENT_GENO (DEMO-001)","process":"OWNGENOME:ANCIENT_GENO","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":99},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000100","memory":2147483648,"name":"OWNGENOME:ANCIENT_PCA (DEMO-001)","process":"OWNGENOME:ANCIENT_PCA","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":100},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000101","memory":2147483648,"name":"OWNGENOME:ANCIENT_REPORT (DEMO-001)","process":"OWNGENOME:ANCIENT_REPORT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":101},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000102","memory":2147483648,"name":"OWNGENOME:EXOMISER_PREPARE (DEMO-001)","process":"OWNGENOME:EXOMISER_PREPARE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":102},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000103","memory":2147483648,"name":"OWNGENOME:EXOMISER (DEMO-001)","process":"OWNGENOME:EXOMISER","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":103},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000104","memory":2147483648,"name":"OWNGENOME:EXOMISER_REPORT (DEMO-001)","process":"OWNGENOME:EXOMISER_REPORT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":104},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000105","memory":2147483648,"name":"OWNGENOME:MOCHA_PREP (DEMO-001)","process":"OWNGENOME:MOCHA_PREP","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":105},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000106","memory":2147483648,"name":"OWNGENOME:MOCHA_PHASE (DEMO-001)","process":"OWNGENOME:MOCHA_PHASE","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":106},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000107","memory":2147483648,"name":"OWNGENOME:MOCHA_CALL (DEMO-001)","process":"OWNGENOME:MOCHA_CALL","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":107},"utcTime":"2026-01-03T01:04:54Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000108","memory":2147483648,"name":"OWNGENOME:MOCHA_REPORT (DEMO-001)","process":"OWNGENOME:MOCHA_REPORT","status":"SUBMITTED","submit":1767402294000,"tag":"DEMO-001","task_id":108},"utcTime":"2026-01-03T01:04:54Z"} {"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000059","memory":2147483648,"name":"OWNGENOME:CLINVAR_SCREEN (DEMO-001)","process":"OWNGENOME:CLINVAR_SCREEN","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":59},"utcTime":"2026-01-03T01:04:55Z"} {"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000062","memory":2147483648,"name":"OWNGENOME:PHARMCAT_PREPROCESS (DEMO-001)","process":"OWNGENOME:PHARMCAT_PREPROCESS","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":62},"utcTime":"2026-01-03T01:04:55Z"} {"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000064","memory":2147483648,"name":"OWNGENOME:ROH (DEMO-001)","process":"OWNGENOME:ROH","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":64},"utcTime":"2026-01-03T01:04:55Z"} {"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000065","memory":2147483648,"name":"OWNGENOME:MITO_EXTRACT_CHRM (DEMO-001)","process":"OWNGENOME:MITO_EXTRACT_CHRM","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":65},"utcTime":"2026-01-03T01:04:55Z"} {"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":4,"hash":"de/000068","memory":8589934592,"name":"OWNGENOME:VEP_NORM (DEMO-001)","process":"OWNGENOME:VEP_NORM","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":68},"utcTime":"2026-01-03T01:04:55Z"} {"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000070","memory":2147483648,"name":"OWNGENOME:CPSR (DEMO-001)","process":"OWNGENOME:CPSR","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":70},"utcTime":"2026-01-03T01:04:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000071","memory":2147483648,"name":"OWNGENOME:PRS_PREPARE (DEMO-001)","process":"OWNGENOME:PRS_PREPARE","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":71},"utcTime":"2026-01-03T01:04:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000075","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_GENOTYPE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_GENOTYPE","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":75},"utcTime":"2026-01-03T01:04:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000081","memory":2147483648,"name":"OWNGENOME:PYPGX (DEMO-001)","process":"OWNGENOME:PYPGX","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":81},"utcTime":"2026-01-03T01:04:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000083","memory":2147483648,"name":"OWNGENOME:Y_POSITIONS (DEMO-001)","process":"OWNGENOME:Y_POSITIONS","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":83},"utcTime":"2026-01-03T01:04:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000087","memory":2147483648,"name":"OWNGENOME:CONSUMER_EXPORT (DEMO-001)","process":"OWNGENOME:CONSUMER_EXPORT","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":87},"utcTime":"2026-01-03T01:04:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000088","memory":2147483648,"name":"OWNGENOME:BLOODTYPE_REGIONS (DEMO-001)","process":"OWNGENOME:BLOODTYPE_REGIONS","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":88},"utcTime":"2026-01-03T01:04:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000091","memory":2147483648,"name":"OWNGENOME:TRAITS_SITES (DEMO-001)","process":"OWNGENOME:TRAITS_SITES","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":91},"utcTime":"2026-01-03T01:04:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000094","memory":2147483648,"name":"OWNGENOME:ARCHAIC_GENOTYPES (DEMO-001)","process":"OWNGENOME:ARCHAIC_GENOTYPES","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":94},"utcTime":"2026-01-03T01:04:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000097","memory":2147483648,"name":"OWNGENOME:ANCIENT_SITES (DEMO-001)","process":"OWNGENOME:ANCIENT_SITES","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":97},"utcTime":"2026-01-03T01:04:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000101","memory":2147483648,"name":"OWNGENOME:EXOMISER_PREPARE (DEMO-001)","process":"OWNGENOME:EXOMISER_PREPARE","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":101},"utcTime":"2026-01-03T01:04:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000104","memory":2147483648,"name":"OWNGENOME:MOCHA_PREP (DEMO-001)","process":"OWNGENOME:MOCHA_PREP","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":104},"utcTime":"2026-01-03T01:04:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000072","memory":2147483648,"name":"OWNGENOME:PRS_PREPARE (DEMO-001)","process":"OWNGENOME:PRS_PREPARE","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":72},"utcTime":"2026-01-03T01:04:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000076","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_GENOTYPE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_GENOTYPE","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":76},"utcTime":"2026-01-03T01:04:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000082","memory":2147483648,"name":"OWNGENOME:PYPGX (DEMO-001)","process":"OWNGENOME:PYPGX","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":82},"utcTime":"2026-01-03T01:04:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000084","memory":2147483648,"name":"OWNGENOME:Y_POSITIONS (DEMO-001)","process":"OWNGENOME:Y_POSITIONS","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":84},"utcTime":"2026-01-03T01:04:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000088","memory":2147483648,"name":"OWNGENOME:CONSUMER_EXPORT (DEMO-001)","process":"OWNGENOME:CONSUMER_EXPORT","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":88},"utcTime":"2026-01-03T01:04:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000089","memory":2147483648,"name":"OWNGENOME:BLOODTYPE_REGIONS (DEMO-001)","process":"OWNGENOME:BLOODTYPE_REGIONS","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":89},"utcTime":"2026-01-03T01:04:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000092","memory":2147483648,"name":"OWNGENOME:TRAITS_SITES (DEMO-001)","process":"OWNGENOME:TRAITS_SITES","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":92},"utcTime":"2026-01-03T01:04:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000095","memory":2147483648,"name":"OWNGENOME:ARCHAIC_GENOTYPES (DEMO-001)","process":"OWNGENOME:ARCHAIC_GENOTYPES","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":95},"utcTime":"2026-01-03T01:04:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000098","memory":2147483648,"name":"OWNGENOME:ANCIENT_SITES (DEMO-001)","process":"OWNGENOME:ANCIENT_SITES","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":98},"utcTime":"2026-01-03T01:04:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000102","memory":2147483648,"name":"OWNGENOME:EXOMISER_PREPARE (DEMO-001)","process":"OWNGENOME:EXOMISER_PREPARE","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":102},"utcTime":"2026-01-03T01:04:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000105","memory":2147483648,"name":"OWNGENOME:MOCHA_PREP (DEMO-001)","process":"OWNGENOME:MOCHA_PREP","start":1767402295000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":105},"utcTime":"2026-01-03T01:04:55Z"} {"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402300000,"cpus":2,"exit":0,"hash":"de/000065","memory":2147483648,"name":"OWNGENOME:MITO_EXTRACT_CHRM (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:MITO_EXTRACT_CHRM","realtime":5000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":65},"utcTime":"2026-01-03T01:05:00Z"} {"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000066","memory":2147483648,"name":"OWNGENOME:MITO_HAPLOGROUP (DEMO-001)","process":"OWNGENOME:MITO_HAPLOGROUP","start":1767402301000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":66},"utcTime":"2026-01-03T01:05:01Z"} {"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402302000,"cpus":2,"exit":137,"hash":"de/000059","memory":2147483648,"name":"OWNGENOME:CLINVAR_SCREEN (DEMO-001)","peak_rss":2126008811,"process":"OWNGENOME:CLINVAR_SCREEN","realtime":7000,"start":1767402295000,"status":"FAILED","submit":1767402294000,"tag":"DEMO-001","task_id":59},"utcTime":"2026-01-03T01:05:02Z"} @@ -253,102 +254,104 @@ {"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000063","memory":2147483648,"name":"OWNGENOME:PHARMCAT (DEMO-001)","process":"OWNGENOME:PHARMCAT","start":1767402320000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":63},"utcTime":"2026-01-03T01:05:20Z"} {"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402345000,"cpus":2,"exit":0,"hash":"de/000061","memory":2147483648,"name":"OWNGENOME:CLINVAR_CDNA_CHECK (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:CLINVAR_CDNA_CHECK","realtime":25000,"start":1767402320000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":61},"utcTime":"2026-01-03T01:05:45Z"} {"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402345000,"cpus":2,"exit":0,"hash":"de/000063","memory":2147483648,"name":"OWNGENOME:PHARMCAT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PHARMCAT","realtime":25000,"start":1767402320000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":63},"utcTime":"2026-01-03T01:05:45Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000108","memory":2147483648,"name":"OWNGENOME:COUPLE_CARRIER (DEMO-001)","process":"OWNGENOME:COUPLE_CARRIER","status":"SUBMITTED","submit":1767402345000,"tag":"DEMO-001","task_id":108},"utcTime":"2026-01-03T01:05:45Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000108","memory":2147483648,"name":"OWNGENOME:COUPLE_CARRIER (DEMO-001)","process":"OWNGENOME:COUPLE_CARRIER","start":1767402346000,"status":"RUNNING","submit":1767402345000,"tag":"DEMO-001","task_id":108},"utcTime":"2026-01-03T01:05:46Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402394000,"cpus":2,"exit":0,"hash":"de/000075","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_GENOTYPE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCESTRY_FINE_GENOTYPE","realtime":99000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":75},"utcTime":"2026-01-03T01:06:34Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000076","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PREPARE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_PREPARE","start":1767402395000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":76},"utcTime":"2026-01-03T01:06:35Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402444000,"cpus":2,"exit":0,"hash":"de/000083","memory":2147483648,"name":"OWNGENOME:Y_POSITIONS (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:Y_POSITIONS","realtime":149000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":83},"utcTime":"2026-01-03T01:07:24Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402444000,"cpus":2,"exit":0,"hash":"de/000097","memory":2147483648,"name":"OWNGENOME:ANCIENT_SITES (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCIENT_SITES","realtime":149000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":97},"utcTime":"2026-01-03T01:07:24Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402444000,"cpus":2,"exit":0,"hash":"de/000104","memory":2147483648,"name":"OWNGENOME:MOCHA_PREP (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:MOCHA_PREP","realtime":149000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":104},"utcTime":"2026-01-03T01:07:24Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000084","memory":2147483648,"name":"OWNGENOME:Y_PILEUP (DEMO-001)","process":"OWNGENOME:Y_PILEUP","start":1767402445000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":84},"utcTime":"2026-01-03T01:07:25Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000098","memory":2147483648,"name":"OWNGENOME:ANCIENT_GENO (DEMO-001)","process":"OWNGENOME:ANCIENT_GENO","start":1767402445000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":98},"utcTime":"2026-01-03T01:07:25Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000105","memory":2147483648,"name":"OWNGENOME:MOCHA_PHASE (DEMO-001)","process":"OWNGENOME:MOCHA_PHASE","start":1767402445000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":105},"utcTime":"2026-01-03T01:07:25Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402494000,"cpus":2,"exit":0,"hash":"de/000076","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PREPARE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCESTRY_FINE_PREPARE","realtime":99000,"start":1767402395000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":76},"utcTime":"2026-01-03T01:08:14Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402494000,"cpus":2,"exit":0,"hash":"de/000088","memory":2147483648,"name":"OWNGENOME:BLOODTYPE_REGIONS (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:BLOODTYPE_REGIONS","realtime":199000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":88},"utcTime":"2026-01-03T01:08:14Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402494000,"cpus":2,"exit":0,"hash":"de/000091","memory":2147483648,"name":"OWNGENOME:TRAITS_SITES (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:TRAITS_SITES","realtime":199000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":91},"utcTime":"2026-01-03T01:08:14Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402494000,"cpus":2,"exit":0,"hash":"de/000094","memory":2147483648,"name":"OWNGENOME:ARCHAIC_GENOTYPES (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ARCHAIC_GENOTYPES","realtime":199000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":94},"utcTime":"2026-01-03T01:08:14Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402494000,"cpus":2,"exit":0,"hash":"de/000101","memory":2147483648,"name":"OWNGENOME:EXOMISER_PREPARE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:EXOMISER_PREPARE","realtime":199000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":101},"utcTime":"2026-01-03T01:08:14Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000077","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_ADMIXTURE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_ADMIXTURE","start":1767402495000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":77},"utcTime":"2026-01-03T01:08:15Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000089","memory":2147483648,"name":"OWNGENOME:BLOODTYPE_DEPTH (DEMO-001)","process":"OWNGENOME:BLOODTYPE_DEPTH","start":1767402495000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":89},"utcTime":"2026-01-03T01:08:15Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000092","memory":2147483648,"name":"OWNGENOME:TRAITS_PHASE (DEMO-001)","process":"OWNGENOME:TRAITS_PHASE","start":1767402495000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":92},"utcTime":"2026-01-03T01:08:15Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000095","memory":2147483648,"name":"OWNGENOME:ARCHAIC_IBDMIX (DEMO-001)","process":"OWNGENOME:ARCHAIC_IBDMIX","start":1767402495000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":95},"utcTime":"2026-01-03T01:08:15Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000102","memory":2147483648,"name":"OWNGENOME:EXOMISER (DEMO-001)","process":"OWNGENOME:EXOMISER","start":1767402495000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":102},"utcTime":"2026-01-03T01:08:15Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402530000,"cpus":2,"exit":0,"hash":"de/000081","memory":2147483648,"name":"OWNGENOME:PYPGX (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PYPGX","realtime":235000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":81},"utcTime":"2026-01-03T01:08:50Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000082","memory":2147483648,"name":"OWNGENOME:CYP2D6_DEPTH (DEMO-001)","process":"OWNGENOME:CYP2D6_DEPTH","start":1767402531000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":82},"utcTime":"2026-01-03T01:08:51Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402594000,"cpus":2,"exit":0,"hash":"de/000077","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_ADMIXTURE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCESTRY_FINE_ADMIXTURE","realtime":99000,"start":1767402495000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":77},"utcTime":"2026-01-03T01:09:54Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402594000,"cpus":2,"exit":0,"hash":"de/000084","memory":2147483648,"name":"OWNGENOME:Y_PILEUP (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:Y_PILEUP","realtime":149000,"start":1767402445000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":84},"utcTime":"2026-01-03T01:09:54Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402594000,"cpus":2,"exit":0,"hash":"de/000098","memory":2147483648,"name":"OWNGENOME:ANCIENT_GENO (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCIENT_GENO","realtime":149000,"start":1767402445000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":98},"utcTime":"2026-01-03T01:09:54Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402594000,"cpus":2,"exit":0,"hash":"de/000105","memory":2147483648,"name":"OWNGENOME:MOCHA_PHASE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:MOCHA_PHASE","realtime":149000,"start":1767402445000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":105},"utcTime":"2026-01-03T01:09:54Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000078","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PHASE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_PHASE","start":1767402595000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":78},"utcTime":"2026-01-03T01:09:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000085","memory":2147483648,"name":"OWNGENOME:Y_HAPLOGROUP (DEMO-001)","process":"OWNGENOME:Y_HAPLOGROUP","start":1767402595000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":85},"utcTime":"2026-01-03T01:09:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000099","memory":2147483648,"name":"OWNGENOME:ANCIENT_PCA (DEMO-001)","process":"OWNGENOME:ANCIENT_PCA","start":1767402595000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":99},"utcTime":"2026-01-03T01:09:55Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000106","memory":2147483648,"name":"OWNGENOME:MOCHA_CALL (DEMO-001)","process":"OWNGENOME:MOCHA_CALL","start":1767402595000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":106},"utcTime":"2026-01-03T01:09:55Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402694000,"cpus":2,"exit":0,"hash":"de/000078","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PHASE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCESTRY_FINE_PHASE","realtime":99000,"start":1767402595000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":78},"utcTime":"2026-01-03T01:11:34Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402694000,"cpus":2,"exit":0,"hash":"de/000089","memory":2147483648,"name":"OWNGENOME:BLOODTYPE_DEPTH (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:BLOODTYPE_DEPTH","realtime":199000,"start":1767402495000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":89},"utcTime":"2026-01-03T01:11:34Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402694000,"cpus":2,"exit":0,"hash":"de/000092","memory":2147483648,"name":"OWNGENOME:TRAITS_PHASE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:TRAITS_PHASE","realtime":199000,"start":1767402495000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":92},"utcTime":"2026-01-03T01:11:34Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402694000,"cpus":2,"exit":0,"hash":"de/000095","memory":2147483648,"name":"OWNGENOME:ARCHAIC_IBDMIX (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ARCHAIC_IBDMIX","realtime":199000,"start":1767402495000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":95},"utcTime":"2026-01-03T01:11:34Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402694000,"cpus":2,"exit":0,"hash":"de/000102","memory":2147483648,"name":"OWNGENOME:EXOMISER (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:EXOMISER","realtime":199000,"start":1767402495000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":102},"utcTime":"2026-01-03T01:11:34Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000079","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PAINT (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_PAINT","start":1767402695000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":79},"utcTime":"2026-01-03T01:11:35Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000090","memory":2147483648,"name":"OWNGENOME:BLOODTYPE (DEMO-001)","process":"OWNGENOME:BLOODTYPE","start":1767402695000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":90},"utcTime":"2026-01-03T01:11:35Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000093","memory":2147483648,"name":"OWNGENOME:TRAITS (DEMO-001)","process":"OWNGENOME:TRAITS","start":1767402695000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":93},"utcTime":"2026-01-03T01:11:35Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000096","memory":2147483648,"name":"OWNGENOME:ARCHAIC_REPORT (DEMO-001)","process":"OWNGENOME:ARCHAIC_REPORT","start":1767402695000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":96},"utcTime":"2026-01-03T01:11:35Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000103","memory":2147483648,"name":"OWNGENOME:EXOMISER_REPORT (DEMO-001)","process":"OWNGENOME:EXOMISER_REPORT","start":1767402695000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":103},"utcTime":"2026-01-03T01:11:35Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402744000,"cpus":2,"exit":0,"hash":"de/000085","memory":2147483648,"name":"OWNGENOME:Y_HAPLOGROUP (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:Y_HAPLOGROUP","realtime":149000,"start":1767402595000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":85},"utcTime":"2026-01-03T01:12:24Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402744000,"cpus":2,"exit":0,"hash":"de/000099","memory":2147483648,"name":"OWNGENOME:ANCIENT_PCA (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCIENT_PCA","realtime":149000,"start":1767402595000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":99},"utcTime":"2026-01-03T01:12:24Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402744000,"cpus":2,"exit":0,"hash":"de/000106","memory":2147483648,"name":"OWNGENOME:MOCHA_CALL (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:MOCHA_CALL","realtime":149000,"start":1767402595000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":106},"utcTime":"2026-01-03T01:12:24Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000086","memory":2147483648,"name":"OWNGENOME:Y_PRIVATE (DEMO-001)","process":"OWNGENOME:Y_PRIVATE","start":1767402745000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":86},"utcTime":"2026-01-03T01:12:25Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000100","memory":2147483648,"name":"OWNGENOME:ANCIENT_REPORT (DEMO-001)","process":"OWNGENOME:ANCIENT_REPORT","start":1767402745000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":100},"utcTime":"2026-01-03T01:12:25Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000107","memory":2147483648,"name":"OWNGENOME:MOCHA_REPORT (DEMO-001)","process":"OWNGENOME:MOCHA_REPORT","start":1767402745000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":107},"utcTime":"2026-01-03T01:12:25Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402767000,"cpus":2,"exit":0,"hash":"de/000082","memory":2147483648,"name":"OWNGENOME:CYP2D6_DEPTH (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:CYP2D6_DEPTH","realtime":236000,"start":1767402531000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":82},"utcTime":"2026-01-03T01:12:47Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000109","memory":2147483648,"name":"OWNGENOME:PGX_CONSENSUS (DEMO-001)","process":"OWNGENOME:PGX_CONSENSUS","status":"SUBMITTED","submit":1767402767000,"tag":"DEMO-001","task_id":109},"utcTime":"2026-01-03T01:12:47Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000109","memory":2147483648,"name":"OWNGENOME:PGX_CONSENSUS (DEMO-001)","process":"OWNGENOME:PGX_CONSENSUS","start":1767402768000,"status":"RUNNING","submit":1767402767000,"tag":"DEMO-001","task_id":109},"utcTime":"2026-01-03T01:12:48Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402785000,"cpus":2,"exit":0,"hash":"de/000109","memory":2147483648,"name":"OWNGENOME:PGX_CONSENSUS (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PGX_CONSENSUS","realtime":17000,"start":1767402768000,"status":"COMPLETED","submit":1767402767000,"tag":"DEMO-001","task_id":109},"utcTime":"2026-01-03T01:13:05Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000110","memory":2147483648,"name":"OWNGENOME:CPIC_LOOKUP (DEMO-001)","process":"OWNGENOME:CPIC_LOOKUP","status":"SUBMITTED","submit":1767402785000,"tag":"DEMO-001","task_id":110},"utcTime":"2026-01-03T01:13:05Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000110","memory":2147483648,"name":"OWNGENOME:CPIC_LOOKUP (DEMO-001)","process":"OWNGENOME:CPIC_LOOKUP","start":1767402786000,"status":"RUNNING","submit":1767402785000,"tag":"DEMO-001","task_id":110},"utcTime":"2026-01-03T01:13:06Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402794000,"cpus":2,"exit":0,"hash":"de/000079","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PAINT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCESTRY_FINE_PAINT","realtime":99000,"start":1767402695000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":79},"utcTime":"2026-01-03T01:13:14Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000080","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_REPORT (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_REPORT","start":1767402795000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":80},"utcTime":"2026-01-03T01:13:15Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402804000,"cpus":2,"exit":0,"hash":"de/000110","memory":2147483648,"name":"OWNGENOME:CPIC_LOOKUP (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:CPIC_LOOKUP","realtime":18000,"start":1767402786000,"status":"COMPLETED","submit":1767402785000,"tag":"DEMO-001","task_id":110},"utcTime":"2026-01-03T01:13:24Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000080","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_REPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCESTRY_FINE_REPORT","realtime":99000,"start":1767402795000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":80},"utcTime":"2026-01-03T01:14:54Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000086","memory":2147483648,"name":"OWNGENOME:Y_PRIVATE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:Y_PRIVATE","realtime":149000,"start":1767402745000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":86},"utcTime":"2026-01-03T01:14:54Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000087","memory":2147483648,"name":"OWNGENOME:CONSUMER_EXPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:CONSUMER_EXPORT","realtime":599000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":87},"utcTime":"2026-01-03T01:14:54Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000090","memory":2147483648,"name":"OWNGENOME:BLOODTYPE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:BLOODTYPE","realtime":199000,"start":1767402695000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":90},"utcTime":"2026-01-03T01:14:54Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000093","memory":2147483648,"name":"OWNGENOME:TRAITS (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:TRAITS","realtime":199000,"start":1767402695000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":93},"utcTime":"2026-01-03T01:14:54Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000096","memory":2147483648,"name":"OWNGENOME:ARCHAIC_REPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ARCHAIC_REPORT","realtime":199000,"start":1767402695000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":96},"utcTime":"2026-01-03T01:14:54Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000100","memory":2147483648,"name":"OWNGENOME:ANCIENT_REPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCIENT_REPORT","realtime":149000,"start":1767402745000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":100},"utcTime":"2026-01-03T01:14:54Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000103","memory":2147483648,"name":"OWNGENOME:EXOMISER_REPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:EXOMISER_REPORT","realtime":199000,"start":1767402695000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":103},"utcTime":"2026-01-03T01:14:54Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000107","memory":2147483648,"name":"OWNGENOME:MOCHA_REPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:MOCHA_REPORT","realtime":149000,"start":1767402745000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":107},"utcTime":"2026-01-03T01:14:54Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402945000,"cpus":2,"exit":0,"hash":"de/000108","memory":2147483648,"name":"OWNGENOME:COUPLE_CARRIER (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:COUPLE_CARRIER","realtime":599000,"start":1767402346000,"status":"COMPLETED","submit":1767402345000,"tag":"DEMO-001","task_id":108},"utcTime":"2026-01-03T01:15:45Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767403405000,"cpus":2,"exit":0,"hash":"de/000071","memory":2147483648,"name":"OWNGENOME:PRS_PREPARE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PRS_PREPARE","realtime":1110000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":71},"utcTime":"2026-01-03T01:23:25Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000072","memory":2147483648,"name":"OWNGENOME:PRS_SCORE_SITES (DEMO-001)","process":"OWNGENOME:PRS_SCORE_SITES","start":1767403406000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":72},"utcTime":"2026-01-03T01:23:26Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767403884000,"cpus":2,"exit":0,"hash":"de/000070","memory":2147483648,"name":"OWNGENOME:CPSR (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:CPSR","realtime":1589000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":70},"utcTime":"2026-01-03T01:31:24Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767404516000,"cpus":2,"exit":0,"hash":"de/000072","memory":2147483648,"name":"OWNGENOME:PRS_SCORE_SITES (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PRS_SCORE_SITES","realtime":1110000,"start":1767403406000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":72},"utcTime":"2026-01-03T01:41:56Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000073","memory":2147483648,"name":"OWNGENOME:PRS (DEMO-001)","process":"OWNGENOME:PRS","start":1767404517000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":73},"utcTime":"2026-01-03T01:41:57Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767405627000,"cpus":2,"exit":0,"hash":"de/000073","memory":2147483648,"name":"OWNGENOME:PRS (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PRS","realtime":1110000,"start":1767404517000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":73},"utcTime":"2026-01-03T02:00:27Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000074","memory":2147483648,"name":"OWNGENOME:PRS_SUMMARY (DEMO-001)","process":"OWNGENOME:PRS_SUMMARY","start":1767405628000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":74},"utcTime":"2026-01-03T02:00:28Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767406740000,"cpus":2,"exit":0,"hash":"de/000074","memory":2147483648,"name":"OWNGENOME:PRS_SUMMARY (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PRS_SUMMARY","realtime":1112000,"start":1767405628000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":74},"utcTime":"2026-01-03T02:19:00Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000109","memory":2147483648,"name":"OWNGENOME:COUPLE_CARRIER (DEMO-001)","process":"OWNGENOME:COUPLE_CARRIER","status":"SUBMITTED","submit":1767402345000,"tag":"DEMO-001","task_id":109},"utcTime":"2026-01-03T01:05:45Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000109","memory":2147483648,"name":"OWNGENOME:COUPLE_CARRIER (DEMO-001)","process":"OWNGENOME:COUPLE_CARRIER","start":1767402346000,"status":"RUNNING","submit":1767402345000,"tag":"DEMO-001","task_id":109},"utcTime":"2026-01-03T01:05:46Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402394000,"cpus":2,"exit":0,"hash":"de/000076","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_GENOTYPE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCESTRY_FINE_GENOTYPE","realtime":99000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":76},"utcTime":"2026-01-03T01:06:34Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000077","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PREPARE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_PREPARE","start":1767402395000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":77},"utcTime":"2026-01-03T01:06:35Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402444000,"cpus":2,"exit":0,"hash":"de/000084","memory":2147483648,"name":"OWNGENOME:Y_POSITIONS (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:Y_POSITIONS","realtime":149000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":84},"utcTime":"2026-01-03T01:07:24Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402444000,"cpus":2,"exit":0,"hash":"de/000098","memory":2147483648,"name":"OWNGENOME:ANCIENT_SITES (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCIENT_SITES","realtime":149000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":98},"utcTime":"2026-01-03T01:07:24Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402444000,"cpus":2,"exit":0,"hash":"de/000105","memory":2147483648,"name":"OWNGENOME:MOCHA_PREP (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:MOCHA_PREP","realtime":149000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":105},"utcTime":"2026-01-03T01:07:24Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000085","memory":2147483648,"name":"OWNGENOME:Y_PILEUP (DEMO-001)","process":"OWNGENOME:Y_PILEUP","start":1767402445000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":85},"utcTime":"2026-01-03T01:07:25Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000099","memory":2147483648,"name":"OWNGENOME:ANCIENT_GENO (DEMO-001)","process":"OWNGENOME:ANCIENT_GENO","start":1767402445000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":99},"utcTime":"2026-01-03T01:07:25Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000106","memory":2147483648,"name":"OWNGENOME:MOCHA_PHASE (DEMO-001)","process":"OWNGENOME:MOCHA_PHASE","start":1767402445000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":106},"utcTime":"2026-01-03T01:07:25Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402494000,"cpus":2,"exit":0,"hash":"de/000077","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PREPARE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCESTRY_FINE_PREPARE","realtime":99000,"start":1767402395000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":77},"utcTime":"2026-01-03T01:08:14Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402494000,"cpus":2,"exit":0,"hash":"de/000089","memory":2147483648,"name":"OWNGENOME:BLOODTYPE_REGIONS (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:BLOODTYPE_REGIONS","realtime":199000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":89},"utcTime":"2026-01-03T01:08:14Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402494000,"cpus":2,"exit":0,"hash":"de/000092","memory":2147483648,"name":"OWNGENOME:TRAITS_SITES (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:TRAITS_SITES","realtime":199000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":92},"utcTime":"2026-01-03T01:08:14Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402494000,"cpus":2,"exit":0,"hash":"de/000095","memory":2147483648,"name":"OWNGENOME:ARCHAIC_GENOTYPES (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ARCHAIC_GENOTYPES","realtime":199000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":95},"utcTime":"2026-01-03T01:08:14Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402494000,"cpus":2,"exit":0,"hash":"de/000102","memory":2147483648,"name":"OWNGENOME:EXOMISER_PREPARE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:EXOMISER_PREPARE","realtime":199000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":102},"utcTime":"2026-01-03T01:08:14Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000078","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_ADMIXTURE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_ADMIXTURE","start":1767402495000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":78},"utcTime":"2026-01-03T01:08:15Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000090","memory":2147483648,"name":"OWNGENOME:BLOODTYPE_DEPTH (DEMO-001)","process":"OWNGENOME:BLOODTYPE_DEPTH","start":1767402495000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":90},"utcTime":"2026-01-03T01:08:15Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000093","memory":2147483648,"name":"OWNGENOME:TRAITS_PHASE (DEMO-001)","process":"OWNGENOME:TRAITS_PHASE","start":1767402495000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":93},"utcTime":"2026-01-03T01:08:15Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000096","memory":2147483648,"name":"OWNGENOME:ARCHAIC_IBDMIX (DEMO-001)","process":"OWNGENOME:ARCHAIC_IBDMIX","start":1767402495000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":96},"utcTime":"2026-01-03T01:08:15Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000103","memory":2147483648,"name":"OWNGENOME:EXOMISER (DEMO-001)","process":"OWNGENOME:EXOMISER","start":1767402495000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":103},"utcTime":"2026-01-03T01:08:15Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402530000,"cpus":2,"exit":0,"hash":"de/000082","memory":2147483648,"name":"OWNGENOME:PYPGX (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PYPGX","realtime":235000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":82},"utcTime":"2026-01-03T01:08:50Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000083","memory":2147483648,"name":"OWNGENOME:CYP2D6_DEPTH (DEMO-001)","process":"OWNGENOME:CYP2D6_DEPTH","start":1767402531000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":83},"utcTime":"2026-01-03T01:08:51Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402594000,"cpus":2,"exit":0,"hash":"de/000078","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_ADMIXTURE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCESTRY_FINE_ADMIXTURE","realtime":99000,"start":1767402495000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":78},"utcTime":"2026-01-03T01:09:54Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402594000,"cpus":2,"exit":0,"hash":"de/000085","memory":2147483648,"name":"OWNGENOME:Y_PILEUP (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:Y_PILEUP","realtime":149000,"start":1767402445000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":85},"utcTime":"2026-01-03T01:09:54Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402594000,"cpus":2,"exit":0,"hash":"de/000099","memory":2147483648,"name":"OWNGENOME:ANCIENT_GENO (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCIENT_GENO","realtime":149000,"start":1767402445000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":99},"utcTime":"2026-01-03T01:09:54Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402594000,"cpus":2,"exit":0,"hash":"de/000106","memory":2147483648,"name":"OWNGENOME:MOCHA_PHASE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:MOCHA_PHASE","realtime":149000,"start":1767402445000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":106},"utcTime":"2026-01-03T01:09:54Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000079","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PHASE (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_PHASE","start":1767402595000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":79},"utcTime":"2026-01-03T01:09:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000086","memory":2147483648,"name":"OWNGENOME:Y_HAPLOGROUP (DEMO-001)","process":"OWNGENOME:Y_HAPLOGROUP","start":1767402595000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":86},"utcTime":"2026-01-03T01:09:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000100","memory":2147483648,"name":"OWNGENOME:ANCIENT_PCA (DEMO-001)","process":"OWNGENOME:ANCIENT_PCA","start":1767402595000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":100},"utcTime":"2026-01-03T01:09:55Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000107","memory":2147483648,"name":"OWNGENOME:MOCHA_CALL (DEMO-001)","process":"OWNGENOME:MOCHA_CALL","start":1767402595000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":107},"utcTime":"2026-01-03T01:09:55Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402694000,"cpus":2,"exit":0,"hash":"de/000079","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PHASE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCESTRY_FINE_PHASE","realtime":99000,"start":1767402595000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":79},"utcTime":"2026-01-03T01:11:34Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402694000,"cpus":2,"exit":0,"hash":"de/000090","memory":2147483648,"name":"OWNGENOME:BLOODTYPE_DEPTH (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:BLOODTYPE_DEPTH","realtime":199000,"start":1767402495000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":90},"utcTime":"2026-01-03T01:11:34Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402694000,"cpus":2,"exit":0,"hash":"de/000093","memory":2147483648,"name":"OWNGENOME:TRAITS_PHASE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:TRAITS_PHASE","realtime":199000,"start":1767402495000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":93},"utcTime":"2026-01-03T01:11:34Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402694000,"cpus":2,"exit":0,"hash":"de/000096","memory":2147483648,"name":"OWNGENOME:ARCHAIC_IBDMIX (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ARCHAIC_IBDMIX","realtime":199000,"start":1767402495000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":96},"utcTime":"2026-01-03T01:11:34Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402694000,"cpus":2,"exit":0,"hash":"de/000103","memory":2147483648,"name":"OWNGENOME:EXOMISER (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:EXOMISER","realtime":199000,"start":1767402495000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":103},"utcTime":"2026-01-03T01:11:34Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000080","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PAINT (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_PAINT","start":1767402695000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":80},"utcTime":"2026-01-03T01:11:35Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000091","memory":2147483648,"name":"OWNGENOME:BLOODTYPE (DEMO-001)","process":"OWNGENOME:BLOODTYPE","start":1767402695000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":91},"utcTime":"2026-01-03T01:11:35Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000094","memory":2147483648,"name":"OWNGENOME:TRAITS (DEMO-001)","process":"OWNGENOME:TRAITS","start":1767402695000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":94},"utcTime":"2026-01-03T01:11:35Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000097","memory":2147483648,"name":"OWNGENOME:ARCHAIC_REPORT (DEMO-001)","process":"OWNGENOME:ARCHAIC_REPORT","start":1767402695000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":97},"utcTime":"2026-01-03T01:11:35Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000104","memory":2147483648,"name":"OWNGENOME:EXOMISER_REPORT (DEMO-001)","process":"OWNGENOME:EXOMISER_REPORT","start":1767402695000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":104},"utcTime":"2026-01-03T01:11:35Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402744000,"cpus":2,"exit":0,"hash":"de/000086","memory":2147483648,"name":"OWNGENOME:Y_HAPLOGROUP (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:Y_HAPLOGROUP","realtime":149000,"start":1767402595000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":86},"utcTime":"2026-01-03T01:12:24Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402744000,"cpus":2,"exit":0,"hash":"de/000100","memory":2147483648,"name":"OWNGENOME:ANCIENT_PCA (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCIENT_PCA","realtime":149000,"start":1767402595000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":100},"utcTime":"2026-01-03T01:12:24Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402744000,"cpus":2,"exit":0,"hash":"de/000107","memory":2147483648,"name":"OWNGENOME:MOCHA_CALL (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:MOCHA_CALL","realtime":149000,"start":1767402595000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":107},"utcTime":"2026-01-03T01:12:24Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000087","memory":2147483648,"name":"OWNGENOME:Y_PRIVATE (DEMO-001)","process":"OWNGENOME:Y_PRIVATE","start":1767402745000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":87},"utcTime":"2026-01-03T01:12:25Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000101","memory":2147483648,"name":"OWNGENOME:ANCIENT_REPORT (DEMO-001)","process":"OWNGENOME:ANCIENT_REPORT","start":1767402745000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":101},"utcTime":"2026-01-03T01:12:25Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000108","memory":2147483648,"name":"OWNGENOME:MOCHA_REPORT (DEMO-001)","process":"OWNGENOME:MOCHA_REPORT","start":1767402745000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":108},"utcTime":"2026-01-03T01:12:25Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402767000,"cpus":2,"exit":0,"hash":"de/000083","memory":2147483648,"name":"OWNGENOME:CYP2D6_DEPTH (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:CYP2D6_DEPTH","realtime":236000,"start":1767402531000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":83},"utcTime":"2026-01-03T01:12:47Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000110","memory":2147483648,"name":"OWNGENOME:PGX_CONSENSUS (DEMO-001)","process":"OWNGENOME:PGX_CONSENSUS","status":"SUBMITTED","submit":1767402767000,"tag":"DEMO-001","task_id":110},"utcTime":"2026-01-03T01:12:47Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000110","memory":2147483648,"name":"OWNGENOME:PGX_CONSENSUS (DEMO-001)","process":"OWNGENOME:PGX_CONSENSUS","start":1767402768000,"status":"RUNNING","submit":1767402767000,"tag":"DEMO-001","task_id":110},"utcTime":"2026-01-03T01:12:48Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402785000,"cpus":2,"exit":0,"hash":"de/000110","memory":2147483648,"name":"OWNGENOME:PGX_CONSENSUS (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PGX_CONSENSUS","realtime":17000,"start":1767402768000,"status":"COMPLETED","submit":1767402767000,"tag":"DEMO-001","task_id":110},"utcTime":"2026-01-03T01:13:05Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000111","memory":2147483648,"name":"OWNGENOME:CPIC_LOOKUP (DEMO-001)","process":"OWNGENOME:CPIC_LOOKUP","status":"SUBMITTED","submit":1767402785000,"tag":"DEMO-001","task_id":111},"utcTime":"2026-01-03T01:13:05Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000111","memory":2147483648,"name":"OWNGENOME:CPIC_LOOKUP (DEMO-001)","process":"OWNGENOME:CPIC_LOOKUP","start":1767402786000,"status":"RUNNING","submit":1767402785000,"tag":"DEMO-001","task_id":111},"utcTime":"2026-01-03T01:13:06Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402794000,"cpus":2,"exit":0,"hash":"de/000080","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_PAINT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCESTRY_FINE_PAINT","realtime":99000,"start":1767402695000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":80},"utcTime":"2026-01-03T01:13:14Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000081","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_REPORT (DEMO-001)","process":"OWNGENOME:ANCESTRY_FINE_REPORT","start":1767402795000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":81},"utcTime":"2026-01-03T01:13:15Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402804000,"cpus":2,"exit":0,"hash":"de/000111","memory":2147483648,"name":"OWNGENOME:CPIC_LOOKUP (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:CPIC_LOOKUP","realtime":18000,"start":1767402786000,"status":"COMPLETED","submit":1767402785000,"tag":"DEMO-001","task_id":111},"utcTime":"2026-01-03T01:13:24Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000081","memory":2147483648,"name":"OWNGENOME:ANCESTRY_FINE_REPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCESTRY_FINE_REPORT","realtime":99000,"start":1767402795000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":81},"utcTime":"2026-01-03T01:14:54Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000087","memory":2147483648,"name":"OWNGENOME:Y_PRIVATE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:Y_PRIVATE","realtime":149000,"start":1767402745000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":87},"utcTime":"2026-01-03T01:14:54Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000088","memory":2147483648,"name":"OWNGENOME:CONSUMER_EXPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:CONSUMER_EXPORT","realtime":599000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":88},"utcTime":"2026-01-03T01:14:54Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000091","memory":2147483648,"name":"OWNGENOME:BLOODTYPE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:BLOODTYPE","realtime":199000,"start":1767402695000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":91},"utcTime":"2026-01-03T01:14:54Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000094","memory":2147483648,"name":"OWNGENOME:TRAITS (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:TRAITS","realtime":199000,"start":1767402695000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":94},"utcTime":"2026-01-03T01:14:54Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000097","memory":2147483648,"name":"OWNGENOME:ARCHAIC_REPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ARCHAIC_REPORT","realtime":199000,"start":1767402695000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":97},"utcTime":"2026-01-03T01:14:54Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000101","memory":2147483648,"name":"OWNGENOME:ANCIENT_REPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:ANCIENT_REPORT","realtime":149000,"start":1767402745000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":101},"utcTime":"2026-01-03T01:14:54Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000104","memory":2147483648,"name":"OWNGENOME:EXOMISER_REPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:EXOMISER_REPORT","realtime":199000,"start":1767402695000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":104},"utcTime":"2026-01-03T01:14:54Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402894000,"cpus":2,"exit":0,"hash":"de/000108","memory":2147483648,"name":"OWNGENOME:MOCHA_REPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:MOCHA_REPORT","realtime":149000,"start":1767402745000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":108},"utcTime":"2026-01-03T01:14:54Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767402945000,"cpus":2,"exit":0,"hash":"de/000109","memory":2147483648,"name":"OWNGENOME:COUPLE_CARRIER (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:COUPLE_CARRIER","realtime":599000,"start":1767402346000,"status":"COMPLETED","submit":1767402345000,"tag":"DEMO-001","task_id":109},"utcTime":"2026-01-03T01:15:45Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767403089000,"cpus":2,"exit":0,"hash":"de/000070","memory":2147483648,"name":"OWNGENOME:CPSR (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:CPSR","realtime":794000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":70},"utcTime":"2026-01-03T01:18:09Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000071","memory":2147483648,"name":"OWNGENOME:CPSR_CDNA_CHECK (DEMO-001)","process":"OWNGENOME:CPSR_CDNA_CHECK","start":1767403090000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":71},"utcTime":"2026-01-03T01:18:10Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767403405000,"cpus":2,"exit":0,"hash":"de/000072","memory":2147483648,"name":"OWNGENOME:PRS_PREPARE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PRS_PREPARE","realtime":1110000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":72},"utcTime":"2026-01-03T01:23:25Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000073","memory":2147483648,"name":"OWNGENOME:PRS_SCORE_SITES (DEMO-001)","process":"OWNGENOME:PRS_SCORE_SITES","start":1767403406000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":73},"utcTime":"2026-01-03T01:23:26Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767403884000,"cpus":2,"exit":0,"hash":"de/000071","memory":2147483648,"name":"OWNGENOME:CPSR_CDNA_CHECK (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:CPSR_CDNA_CHECK","realtime":794000,"start":1767403090000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":71},"utcTime":"2026-01-03T01:31:24Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767404516000,"cpus":2,"exit":0,"hash":"de/000073","memory":2147483648,"name":"OWNGENOME:PRS_SCORE_SITES (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PRS_SCORE_SITES","realtime":1110000,"start":1767403406000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":73},"utcTime":"2026-01-03T01:41:56Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000074","memory":2147483648,"name":"OWNGENOME:PRS (DEMO-001)","process":"OWNGENOME:PRS","start":1767404517000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":74},"utcTime":"2026-01-03T01:41:57Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767405627000,"cpus":2,"exit":0,"hash":"de/000074","memory":2147483648,"name":"OWNGENOME:PRS (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PRS","realtime":1110000,"start":1767404517000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":74},"utcTime":"2026-01-03T02:00:27Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000075","memory":2147483648,"name":"OWNGENOME:PRS_SUMMARY (DEMO-001)","process":"OWNGENOME:PRS_SUMMARY","start":1767405628000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":75},"utcTime":"2026-01-03T02:00:28Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767406740000,"cpus":2,"exit":0,"hash":"de/000075","memory":2147483648,"name":"OWNGENOME:PRS_SUMMARY (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:PRS_SUMMARY","realtime":1112000,"start":1767405628000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":75},"utcTime":"2026-01-03T02:19:00Z"} {"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767410097000,"cpus":4,"exit":0,"hash":"de/000068","memory":8589934592,"name":"OWNGENOME:VEP_NORM (DEMO-001)","peak_rss":3435973836,"process":"OWNGENOME:VEP_NORM","realtime":7802000,"start":1767402295000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":68},"utcTime":"2026-01-03T03:14:57Z"} {"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":4,"hash":"de/000069","memory":8589934592,"name":"OWNGENOME:VEP (DEMO-001)","process":"OWNGENOME:VEP","start":1767410098000,"status":"RUNNING","submit":1767402294000,"tag":"DEMO-001","task_id":69},"utcTime":"2026-01-03T03:14:58Z"} {"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767417900000,"cpus":4,"exit":0,"hash":"de/000069","memory":8589934592,"name":"OWNGENOME:VEP (DEMO-001)","peak_rss":3435973836,"process":"OWNGENOME:VEP","realtime":7802000,"start":1767410098000,"status":"COMPLETED","submit":1767402294000,"tag":"DEMO-001","task_id":69},"utcTime":"2026-01-03T05:25:00Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000111","memory":2147483648,"name":"OWNGENOME:CLINICAL_FILTER (DEMO-001)","process":"OWNGENOME:CLINICAL_FILTER","status":"SUBMITTED","submit":1767417900000,"tag":"DEMO-001","task_id":111},"utcTime":"2026-01-03T05:25:00Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000112","memory":2147483648,"name":"OWNGENOME:VCFANNO (DEMO-001)","process":"OWNGENOME:VCFANNO","status":"SUBMITTED","submit":1767417900000,"tag":"DEMO-001","task_id":112},"utcTime":"2026-01-03T05:25:00Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000113","memory":2147483648,"name":"OWNGENOME:VCFANNO_INDEX (DEMO-001)","process":"OWNGENOME:VCFANNO_INDEX","status":"SUBMITTED","submit":1767417900000,"tag":"DEMO-001","task_id":113},"utcTime":"2026-01-03T05:25:00Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000114","memory":2147483648,"name":"OWNGENOME:SLIVAR_PRIORITIZE (DEMO-001)","process":"OWNGENOME:SLIVAR_PRIORITIZE","status":"SUBMITTED","submit":1767417900000,"tag":"DEMO-001","task_id":114},"utcTime":"2026-01-03T05:25:00Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000115","memory":2147483648,"name":"OWNGENOME:SLIVAR (DEMO-001)","process":"OWNGENOME:SLIVAR","status":"SUBMITTED","submit":1767417900000,"tag":"DEMO-001","task_id":115},"utcTime":"2026-01-03T05:25:00Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000116","memory":2147483648,"name":"OWNGENOME:COMPHET_PHASE (DEMO-001)","process":"OWNGENOME:COMPHET_PHASE","status":"SUBMITTED","submit":1767417900000,"tag":"DEMO-001","task_id":116},"utcTime":"2026-01-03T05:25:00Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000111","memory":2147483648,"name":"OWNGENOME:CLINICAL_FILTER (DEMO-001)","process":"OWNGENOME:CLINICAL_FILTER","start":1767417901000,"status":"RUNNING","submit":1767417900000,"tag":"DEMO-001","task_id":111},"utcTime":"2026-01-03T05:25:01Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000112","memory":2147483648,"name":"OWNGENOME:VCFANNO (DEMO-001)","process":"OWNGENOME:VCFANNO","start":1767417901000,"status":"RUNNING","submit":1767417900000,"tag":"DEMO-001","task_id":112},"utcTime":"2026-01-03T05:25:01Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000114","memory":2147483648,"name":"OWNGENOME:SLIVAR_PRIORITIZE (DEMO-001)","process":"OWNGENOME:SLIVAR_PRIORITIZE","start":1767417901000,"status":"RUNNING","submit":1767417900000,"tag":"DEMO-001","task_id":114},"utcTime":"2026-01-03T05:25:01Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767418042000,"cpus":2,"exit":0,"hash":"de/000114","memory":2147483648,"name":"OWNGENOME:SLIVAR_PRIORITIZE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:SLIVAR_PRIORITIZE","realtime":141000,"start":1767417901000,"status":"COMPLETED","submit":1767417900000,"tag":"DEMO-001","task_id":114},"utcTime":"2026-01-03T05:27:22Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000115","memory":2147483648,"name":"OWNGENOME:SLIVAR (DEMO-001)","process":"OWNGENOME:SLIVAR","start":1767418043000,"status":"RUNNING","submit":1767417900000,"tag":"DEMO-001","task_id":115},"utcTime":"2026-01-03T05:27:23Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767418173000,"cpus":2,"exit":0,"hash":"de/000111","memory":2147483648,"name":"OWNGENOME:CLINICAL_FILTER (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:CLINICAL_FILTER","realtime":272000,"start":1767417901000,"status":"COMPLETED","submit":1767417900000,"tag":"DEMO-001","task_id":111},"utcTime":"2026-01-03T05:29:33Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767418184000,"cpus":2,"exit":0,"hash":"de/000115","memory":2147483648,"name":"OWNGENOME:SLIVAR (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:SLIVAR","realtime":141000,"start":1767418043000,"status":"COMPLETED","submit":1767417900000,"tag":"DEMO-001","task_id":115},"utcTime":"2026-01-03T05:29:44Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000116","memory":2147483648,"name":"OWNGENOME:COMPHET_PHASE (DEMO-001)","process":"OWNGENOME:COMPHET_PHASE","start":1767418185000,"status":"RUNNING","submit":1767417900000,"tag":"DEMO-001","task_id":116},"utcTime":"2026-01-03T05:29:45Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767418200000,"cpus":2,"exit":0,"hash":"de/000112","memory":2147483648,"name":"OWNGENOME:VCFANNO (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:VCFANNO","realtime":299000,"start":1767417901000,"status":"COMPLETED","submit":1767417900000,"tag":"DEMO-001","task_id":112},"utcTime":"2026-01-03T05:30:00Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000113","memory":2147483648,"name":"OWNGENOME:VCFANNO_INDEX (DEMO-001)","process":"OWNGENOME:VCFANNO_INDEX","start":1767418201000,"status":"RUNNING","submit":1767417900000,"tag":"DEMO-001","task_id":113},"utcTime":"2026-01-03T05:30:01Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767418326000,"cpus":2,"exit":0,"hash":"de/000116","memory":2147483648,"name":"OWNGENOME:COMPHET_PHASE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:COMPHET_PHASE","realtime":141000,"start":1767418185000,"status":"COMPLETED","submit":1767417900000,"tag":"DEMO-001","task_id":116},"utcTime":"2026-01-03T05:32:06Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767418500000,"cpus":2,"exit":0,"hash":"de/000113","memory":2147483648,"name":"OWNGENOME:VCFANNO_INDEX (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:VCFANNO_INDEX","realtime":299000,"start":1767418201000,"status":"COMPLETED","submit":1767417900000,"tag":"DEMO-001","task_id":113},"utcTime":"2026-01-03T05:35:00Z"} -{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000117","memory":2147483648,"name":"OWNGENOME:HTML_REPORT (DEMO-001)","process":"OWNGENOME:HTML_REPORT","status":"SUBMITTED","submit":1767418500000,"tag":"DEMO-001","task_id":117},"utcTime":"2026-01-03T05:35:00Z"} -{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000117","memory":2147483648,"name":"OWNGENOME:HTML_REPORT (DEMO-001)","process":"OWNGENOME:HTML_REPORT","start":1767418501000,"status":"RUNNING","submit":1767418500000,"tag":"DEMO-001","task_id":117},"utcTime":"2026-01-03T05:35:01Z"} -{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767419100000,"cpus":2,"exit":0,"hash":"de/000117","memory":2147483648,"name":"OWNGENOME:HTML_REPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:HTML_REPORT","realtime":599000,"start":1767418501000,"status":"COMPLETED","submit":1767418500000,"tag":"DEMO-001","task_id":117},"utcTime":"2026-01-03T05:45:00Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000112","memory":2147483648,"name":"OWNGENOME:CLINICAL_FILTER (DEMO-001)","process":"OWNGENOME:CLINICAL_FILTER","status":"SUBMITTED","submit":1767417900000,"tag":"DEMO-001","task_id":112},"utcTime":"2026-01-03T05:25:00Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000113","memory":2147483648,"name":"OWNGENOME:VCFANNO (DEMO-001)","process":"OWNGENOME:VCFANNO","status":"SUBMITTED","submit":1767417900000,"tag":"DEMO-001","task_id":113},"utcTime":"2026-01-03T05:25:00Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000114","memory":2147483648,"name":"OWNGENOME:VCFANNO_INDEX (DEMO-001)","process":"OWNGENOME:VCFANNO_INDEX","status":"SUBMITTED","submit":1767417900000,"tag":"DEMO-001","task_id":114},"utcTime":"2026-01-03T05:25:00Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000115","memory":2147483648,"name":"OWNGENOME:SLIVAR_PRIORITIZE (DEMO-001)","process":"OWNGENOME:SLIVAR_PRIORITIZE","status":"SUBMITTED","submit":1767417900000,"tag":"DEMO-001","task_id":115},"utcTime":"2026-01-03T05:25:00Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000116","memory":2147483648,"name":"OWNGENOME:SLIVAR (DEMO-001)","process":"OWNGENOME:SLIVAR","status":"SUBMITTED","submit":1767417900000,"tag":"DEMO-001","task_id":116},"utcTime":"2026-01-03T05:25:00Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000117","memory":2147483648,"name":"OWNGENOME:COMPHET_PHASE (DEMO-001)","process":"OWNGENOME:COMPHET_PHASE","status":"SUBMITTED","submit":1767417900000,"tag":"DEMO-001","task_id":117},"utcTime":"2026-01-03T05:25:00Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000112","memory":2147483648,"name":"OWNGENOME:CLINICAL_FILTER (DEMO-001)","process":"OWNGENOME:CLINICAL_FILTER","start":1767417901000,"status":"RUNNING","submit":1767417900000,"tag":"DEMO-001","task_id":112},"utcTime":"2026-01-03T05:25:01Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000113","memory":2147483648,"name":"OWNGENOME:VCFANNO (DEMO-001)","process":"OWNGENOME:VCFANNO","start":1767417901000,"status":"RUNNING","submit":1767417900000,"tag":"DEMO-001","task_id":113},"utcTime":"2026-01-03T05:25:01Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000115","memory":2147483648,"name":"OWNGENOME:SLIVAR_PRIORITIZE (DEMO-001)","process":"OWNGENOME:SLIVAR_PRIORITIZE","start":1767417901000,"status":"RUNNING","submit":1767417900000,"tag":"DEMO-001","task_id":115},"utcTime":"2026-01-03T05:25:01Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767418042000,"cpus":2,"exit":0,"hash":"de/000115","memory":2147483648,"name":"OWNGENOME:SLIVAR_PRIORITIZE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:SLIVAR_PRIORITIZE","realtime":141000,"start":1767417901000,"status":"COMPLETED","submit":1767417900000,"tag":"DEMO-001","task_id":115},"utcTime":"2026-01-03T05:27:22Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000116","memory":2147483648,"name":"OWNGENOME:SLIVAR (DEMO-001)","process":"OWNGENOME:SLIVAR","start":1767418043000,"status":"RUNNING","submit":1767417900000,"tag":"DEMO-001","task_id":116},"utcTime":"2026-01-03T05:27:23Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767418173000,"cpus":2,"exit":0,"hash":"de/000112","memory":2147483648,"name":"OWNGENOME:CLINICAL_FILTER (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:CLINICAL_FILTER","realtime":272000,"start":1767417901000,"status":"COMPLETED","submit":1767417900000,"tag":"DEMO-001","task_id":112},"utcTime":"2026-01-03T05:29:33Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767418184000,"cpus":2,"exit":0,"hash":"de/000116","memory":2147483648,"name":"OWNGENOME:SLIVAR (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:SLIVAR","realtime":141000,"start":1767418043000,"status":"COMPLETED","submit":1767417900000,"tag":"DEMO-001","task_id":116},"utcTime":"2026-01-03T05:29:44Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000117","memory":2147483648,"name":"OWNGENOME:COMPHET_PHASE (DEMO-001)","process":"OWNGENOME:COMPHET_PHASE","start":1767418185000,"status":"RUNNING","submit":1767417900000,"tag":"DEMO-001","task_id":117},"utcTime":"2026-01-03T05:29:45Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767418200000,"cpus":2,"exit":0,"hash":"de/000113","memory":2147483648,"name":"OWNGENOME:VCFANNO (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:VCFANNO","realtime":299000,"start":1767417901000,"status":"COMPLETED","submit":1767417900000,"tag":"DEMO-001","task_id":113},"utcTime":"2026-01-03T05:30:00Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000114","memory":2147483648,"name":"OWNGENOME:VCFANNO_INDEX (DEMO-001)","process":"OWNGENOME:VCFANNO_INDEX","start":1767418201000,"status":"RUNNING","submit":1767417900000,"tag":"DEMO-001","task_id":114},"utcTime":"2026-01-03T05:30:01Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767418326000,"cpus":2,"exit":0,"hash":"de/000117","memory":2147483648,"name":"OWNGENOME:COMPHET_PHASE (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:COMPHET_PHASE","realtime":141000,"start":1767418185000,"status":"COMPLETED","submit":1767417900000,"tag":"DEMO-001","task_id":117},"utcTime":"2026-01-03T05:32:06Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767418500000,"cpus":2,"exit":0,"hash":"de/000114","memory":2147483648,"name":"OWNGENOME:VCFANNO_INDEX (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:VCFANNO_INDEX","realtime":299000,"start":1767418201000,"status":"COMPLETED","submit":1767417900000,"tag":"DEMO-001","task_id":114},"utcTime":"2026-01-03T05:35:00Z"} +{"event":"process_submitted","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000118","memory":2147483648,"name":"OWNGENOME:HTML_REPORT (DEMO-001)","process":"OWNGENOME:HTML_REPORT","status":"SUBMITTED","submit":1767418500000,"tag":"DEMO-001","task_id":118},"utcTime":"2026-01-03T05:35:00Z"} +{"event":"process_started","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"cpus":2,"hash":"de/000118","memory":2147483648,"name":"OWNGENOME:HTML_REPORT (DEMO-001)","process":"OWNGENOME:HTML_REPORT","start":1767418501000,"status":"RUNNING","submit":1767418500000,"tag":"DEMO-001","task_id":118},"utcTime":"2026-01-03T05:35:01Z"} +{"event":"process_completed","runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","trace":{"attempt":1,"complete":1767419100000,"cpus":2,"exit":0,"hash":"de/000118","memory":2147483648,"name":"OWNGENOME:HTML_REPORT (DEMO-001)","peak_rss":858993459,"process":"OWNGENOME:HTML_REPORT","realtime":599000,"start":1767418501000,"status":"COMPLETED","submit":1767418500000,"tag":"DEMO-001","task_id":118},"utcTime":"2026-01-03T05:45:00Z"} {"event":"completed","metadata":{"workflow":{"success":true}},"runId":"00000000-0000-0000-0000-00000000d001","runName":"demo_run","utcTime":"2026-01-03T05:45:30Z"} {"event":"pgp_run_finished","exit":0,"utcTime":"2026-01-03T05:46:00Z"} From 1912e76090a109b23ac1c4d9c36aeb2701ef76f4 Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Sat, 7 Nov 2026 19:41:53 +0100 Subject: [PATCH 5/7] fix(nextflow): keep the interval place line whole, read multi-import aliases The interval table keeps its own place line in HTML_REPORT, so the red control of followups-cn-1 that deletes it still works; the dosage and CYP21A2 tables get a line of their own. The containers check and test_run_state.py read every alias of an include with several imports. write_manifest.sh warns when it cannot read nextflow.config. Bead: pgp-5bja.21 Bead: pgp-5bja.19 Bead: pgp-5bja.26 --- bin/write_manifest.sh | 3 +++ modules/local/html_report/main.nf | 3 ++- scripts/ci/gen-containers-config.sh | 7 ++++--- tests/e2e/followups-nf-1-nf-wiring.sh | 10 +++++----- tests/test_run_state.py | 3 ++- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/bin/write_manifest.sh b/bin/write_manifest.sh index c773c769..72f258f6 100755 --- a/bin/write_manifest.sh +++ b/bin/write_manifest.sh @@ -63,6 +63,9 @@ release=$(awk ' s = $0; sub(/^[^=]*=[[:space:]]*/, "", s); sub(/[[:space:]]*(\/\/.*)?$/, "", s) gsub(/^["\047]|["\047]$/, "", s); print s; exit }' "${PGP_ROOT}/nextflow.config" 2>/dev/null || true) +if [ ! -r "${PGP_ROOT}/nextflow.config" ]; then + echo "WARNING: cannot read ${PGP_ROOT}/nextflow.config: run_manifest.tsv gets no pipeline_version row" >&2 +fi [ -z "$release" ] || row run pipeline_version "$release" [ -z "$DECLARED_SEX" ] || row run declared_sex "$DECLARED_SEX" diff --git a/modules/local/html_report/main.nf b/modules/local/html_report/main.nf index b3ababcf..a7842255 100644 --- a/modules/local/html_report/main.nf +++ b/modules/local/html_report/main.nf @@ -100,7 +100,8 @@ process HTML_REPORT { ${id}_paraphase_copy_number.tsv|${id}_paraphase_variants.tsv|${id}_*_copy_number.tsv) place paralogs "\$f" ;; ${id}.mosdepth.summary.txt|${id}_callability.bed.gz) place coverage "\$f" ;; ${id}_sample_qc.tsv|${id}_read_count.tsv) place qc "\$f" ;; - ${id}_cn_intervals.tsv|${id}_cn_dosage.tsv|${id}_cyp21a2_psv.tsv) place paralogs "\$f" ;; + ${id}_cn_intervals.tsv) place paralogs "\$f" ;; + ${id}_cn_dosage.tsv|${id}_cyp21a2_psv.tsv) place paralogs "\$f" ;; ${id}_prs_summary.tsv) place prs "\$f" ;; ${id}_ancestry.tsv) place ancestry "\$f" ;; ${id}_ancestry_fine.tsv|${id}_painting.png) place ancestry_fine "\$f" ;; diff --git a/scripts/ci/gen-containers-config.sh b/scripts/ci/gen-containers-config.sh index 317a2a70..e94fbe69 100755 --- a/scripts/ci/gen-containers-config.sh +++ b/scripts/ci/gen-containers-config.sh @@ -244,8 +244,8 @@ check() { # Every process, and every alias a workflow includes one under (include { A as B }): # a withName selector matches the alias, not the module's name. procs=$( { cat "${ROOT}"/modules/local/*/main.nf | sed -nE 's/^process[[:space:]]+([A-Za-z0-9_]+).*/\1/p' - cat "${ROOT}"/main.nf "${ROOT}"/workflows/*.nf 2>/dev/null \ - | sed -nE 's/^include[[:space:]]*\{[[:space:]]*[A-Za-z0-9_]+[[:space:]]+as[[:space:]]+([A-Za-z0-9_]+)[[:space:]]*\}.*/\1/p'; } | sort -u) + cat "${ROOT}"/main.nf "${ROOT}"/workflows/*.nf 2>/dev/null | grep -E '^[[:space:]]*include[[:space:]]*\{' \ + | grep -oE '[A-Za-z0-9_]+[[:space:]]+as[[:space:]]+[A-Za-z0-9_]+' | awk '{print $3}' || true; } | sort -u) [ -n "$procs" ] || { echo "FAIL: found no process in modules/local/*/main.nf"; return 1; } sels=$(sed -nE -e "s/^[[:space:]]*withName:[[:space:]]*'([A-Za-z0-9_]+)'[[:space:]]*\{[[:space:]]*container[[:space:]]*=[[:space:]]*'[^']+'[[:space:]]*\}.*/\1/p" \ -e "s/^[[:space:]]*withName:[[:space:]]*'([A-Za-z0-9_]+)'[[:space:]]*\{[[:space:]]*ext\.pipeline_version[[:space:]]*=[[:space:]]*'[^']+'.*/\1/p" \ @@ -360,8 +360,9 @@ self_test() { # A process included under a new alias, which a withName selector must name. copy new-alias - printf '%s\n' "include { ROH as ROH_AGAIN } from '../modules/local/roh/main'" >> "${tmp}/new-alias/workflows/clinical.nf" + printf '%s\n' "include { ROH as ROH_AGAIN; VEP as VEP_AGAIN } from '../modules/local/roh/main'" >> "${tmp}/new-alias/workflows/clinical.nf" expect new-alias '^FAIL: process ROH_AGAIN has no container' + expect new-alias '^FAIL: process VEP_AGAIN has no container' # A selector left behind for a process that no longer exists. copy stray diff --git a/tests/e2e/followups-nf-1-nf-wiring.sh b/tests/e2e/followups-nf-1-nf-wiring.sh index 58581dbf..39628f0f 100755 --- a/tests/e2e/followups-nf-1-nf-wiring.sh +++ b/tests/e2e/followups-nf-1-nf-wiring.sh @@ -8,8 +8,8 @@ # linked as vcf/.g.vcf.gz(.tbi), summary.json carries the CYP21A2 # deletion and the HP count, and its manifest has the run # pipeline_version row with the manifest version of the pipeline's -# config. Red controls: a copy of the module without the two place -# alternatives stops on the CYP21A2 table; a copy without the gVCF and +# config. Red controls: a copy of the module without the place line of +# the two tables stops on the CYP21A2 table; a copy without the gVCF and # release lines links no gVCF and writes no release. # 2. main.nf passes them on: a stub run of the stub pedigree (two partners, # both called by DEEPVARIANT) with clinvar, parascopy, cpsr and @@ -105,11 +105,11 @@ check "the run manifest is not published (run-all.sh writes the full one there)" mkdir -p "${NP}/noplace" "${NP}/nogvcf" # shellcheck disable=SC2016 # the dollar signs are sed text -sed 's/|\${id}_cn_dosage\.tsv|\${id}_cyp21a2_psv\.tsv)/)/' "${REPO}/modules/local/html_report/main.nf" > "${NP}/noplace/main.nf" +sed '/_cn_dosage\.tsv|\${id}_cyp21a2_psv\.tsv) *place paralogs/d' "${REPO}/modules/local/html_report/main.nf" > "${NP}/noplace/main.nf" check_eq "control copy: the module has no place for the two tables" \ - "$(grep -cE '_cn_dosage\.tsv\||_cyp21a2_psv\.tsv\)' "${NP}/noplace/main.nf")" 0 + "$(grep -cE '_cn_dosage\.tsv\|.*place|_cyp21a2_psv\.tsv\)' "${NP}/noplace/main.nf")" 0 report_run report-noplace "${NP}/noplace/main" -check "red: the module without the place alternatives stops (exit ${NF_RC})" test "$NF_RC" -ne 0 +check "red: the module without their place line stops (exit ${NF_RC})" test "$NF_RC" -ne 0 check "and names the table it has no place for" grep -qE "no place for: ${S}_(cyp21a2_psv|cn_dosage)\.tsv" -r "${CASE_TMP}/work-report-noplace" --include=.command.err sed -e 's/^\( *\)ln -s .*\.g\.vcf\.gz.*$/\1true/' -e '/run_manifest\.tsv"$/d' "${REPO}/modules/local/html_report/main.nf" > "${NP}/nogvcf/main.nf" check_eq "control copy: the gVCF links and the release line are gone" \ diff --git a/tests/test_run_state.py b/tests/test_run_state.py index aeb43947..88413682 100755 --- a/tests/test_run_state.py +++ b/tests/test_run_state.py @@ -210,7 +210,8 @@ def module_processes(): # A process a workflow includes under another name (include { A as B }) runs, and is counted, as B for fn in ["main.nf"] + [os.path.join("workflows", f) for f in os.listdir(os.path.join(REPO, "workflows"))]: if fn.endswith(".nf"): - names |= set(re.findall(r"^include\s*\{\s*\w+\s+as\s+([A-Z0-9_]+)\s*\}", open(os.path.join(REPO, fn)).read(), re.M)) + for inc in re.findall(r"^\s*include\s*\{([^}]*)\}", open(os.path.join(REPO, fn)).read(), re.M): + names |= set(re.findall(r"\w+\s+as\s+([A-Z0-9_]+)", inc)) return names From 033d040da23aa50b6b091b3e79154ea7c5960218 Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Sat, 7 Nov 2026 20:07:53 +0100 Subject: [PATCH 6/7] docs(nextflow): name CPSR_CDNA_CHECK in the CPSR module header --- modules/local/cpsr/main.nf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/local/cpsr/main.nf b/modules/local/cpsr/main.nf index cbf0e538..67023d56 100644 --- a/modules/local/cpsr/main.nf +++ b/modules/local/cpsr/main.nf @@ -13,8 +13,9 @@ title then shows that id. The cDNA read check on CPSR's P/LP rows (bin/clip_check.py --cpsr) runs - after it, in CLINVAR_CDNA_CHECK with source 'cpsr' (workflows/clinical.nf), - which gets the BAM and the exons and writes cpsr/_cpsr_cdna_check.tsv. + after it, in CPSR_CDNA_CHECK (CLINVAR_CDNA_CHECK included under that name, + source 'cpsr', workflows/clinical.nf), which gets the BAM and the exons + and writes cpsr/_cpsr_cdna_check.tsv. Equivalent to: scripts/17-cpsr.sh ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 68a0483b9e4c7c9a947788aaa67dff9561fb669c Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:31:49 +0100 Subject: [PATCH 7/7] docs(nextflow): say the Nextflow report and couple screen now read CYP21A2, dosage, gVCF and release data; skip commented include aliases --- docs/24-html-report.md | 2 +- docs/39-couple.md | 2 +- docs/42-traits.md | 2 +- docs/cn-loci.md | 2 +- scripts/ci/gen-containers-config.sh | 14 +++++++++++++- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/24-html-report.md b/docs/24-html-report.md index 5efddee2..bda4afd7 100644 --- a/docs/24-html-report.md +++ b/docs/24-html-report.md @@ -24,7 +24,7 @@ All output directories from previous pipeline steps. The script detects which st Two more files, when present: -- `${SAMPLE}/run_manifest.tsv` (`bin/write_manifest.sh`): the pipeline commit, `versions.env`, the digest of every image, the ClinVar file date, the VEP cache, the PCGR and pypgx bundles, whether pgsc_calc's ancestry panel is installed, the IPD-IMGT/HLA release of the `hla.dat` the run used (`run-all.sh` passes it as `HLA_DAT`; without it the one `setup.sh` installs, then the release in the T1K index folder name, and `unknown` when HLA calls exist but no database is found) and the header of each PGS scoring file. `run-all.sh` writes it when a run starts and again just before this step, so an image pulled during the run gets its digest; this step writes one when the sample has none. +- `${SAMPLE}/run_manifest.tsv` (`bin/write_manifest.sh`): the pipeline commit, the OwnGenome release (the `manifest` version in `nextflow.config`, row `run pipeline_version`), `versions.env`, the digest of every image, the ClinVar file date, the VEP cache, the PCGR and pypgx bundles, whether pgsc_calc's ancestry panel is installed, the IPD-IMGT/HLA release of the `hla.dat` the run used (`run-all.sh` passes it as `HLA_DAT`; without it the one `setup.sh` installs, then the release in the T1K index folder name, and `unknown` when HLA calls exist but no database is found) and the header of each PGS scoring file. `run-all.sh` writes it when a run starts and again just before this step, so an image pulled during the run gets its digest; this step writes one when the sample has none. - `${SAMPLE}/logs/run_status.tsv`: when the latest `run-all.sh` run started, then one line per step. A step it did not start is `skipped ()`, for example `skipped (no BAM)` or `skipped (not in TOOLS)`. Each step it starts gets a `planned` row just before the pipeline starts, which stands until the step's result row replaces it; a `meta finished_utc` row closes the file when `run-all.sh` ends, and a step still `planned` then becomes `not finished` ([Where a run stands](run-state.md)). Once the pipeline has ended, each step it started is one of: - `ok`: the pipeline finished. After a pipeline that another step stopped, a step is still `ok` when each of its processes has a task that completed in this run or came from Nextflow's cache (`-resume`), and none was left unfinished. - `failed`: one of the step's tasks failed. A report-only tool's failure is ignored by the pipeline, which goes on without it. Ancestry (step 26) is computed inside the PRS run, so it is `failed` when PRS is. diff --git a/docs/39-couple.md b/docs/39-couple.md index 6402c026..5644ef26 100644 --- a/docs/39-couple.md +++ b/docs/39-couple.md @@ -25,7 +25,7 @@ Before this step a couple had to compare two ClinVar tables by hand ([Multi-Samp | ClinVar pathogenic or likely pathogenic hit | step 06, `clinvar/_clinvar_hits.vcf` (required) | the genotype carries the alternate allele and ClinVar's `GENEINFO` names a gene of the carrier list | | Deletion | step 19 (Delly), `delly/_sv.vcf.gz` | `SVTYPE=DEL`, `FILTER` PASS and a per-sample `FT` that is not a failed filter, the genotype carries it, it is 50 bp or longer, it removes at least one exon of a listed gene (GENCODE exons), when it is longer than 1,000 bp read depth shows the loss, and it does not match a common deletion (see below) | | SMN1 copy number | step 35 (Parascopy), `paralogs/_smn_copy_number.tsv` | SMN1 exon 7 at 1 copy (a carrier) or 0, with filter PASS and quality 20 or more, by step 35's rule | -| CYP21A2 deletion or conversion | step 35 (depth and six PSV sites), `paralogs/_cyp21a2_psv.tsv` | the table's `finding` is `deletion` or `conversion` (on both copies when a site has no CYP21A2 copy left); unconfirmed, short reads. Step 39 passes it; the Nextflow couple screen does not yet | +| CYP21A2 deletion or conversion | step 35 (depth and six PSV sites), `paralogs/_cyp21a2_psv.tsv` | the table's `finding` is `deletion` or `conversion` (on both copies when a site has no CYP21A2 copy left); unconfirmed, short reads. Step 39 and the Nextflow couple screen (`COUPLE_CARRIER`) both pass it | | FMR1 and FXN repeats | step 09 (ExpansionHunter), `expansion_hunter/_eh.vcf` | an FMR1 allele of 55 CGG or more (a premutation; more than 200 is a full mutation), an FXN allele of 66 GAA or more | Short-read Delly can mark PASS a long deletion, even one of many megabases, that read depth contradicts, and such a call removes an exon of hundreds of listed genes at once. So a deletion longer than 1,000 bp counts only when Delly's own read-depth copy number (`FORMAT/RDCN`, the depth inside the deletion against its flanks) is below a normal region's copies: 1 on a male's chrX or chrY outside the pseudoautosomal regions, 2 everywhere else. When the pedigree gives no sex, every region is judged against 2. Delly infers the sex itself and scales RDCN to it, so a long artefact on an unsexed male's chrX or chrY reads 1 and still counts: give the sex in the pedigree and in the samplesheet. A heterozygous loss reads 1, a homozygous or hemizygous loss 0. A long deletion with RDCN at the normal count or more, or with no estimate (`.` or a negative value, no reads in the flanks), is set aside, and the table of what was assessed gives the count. 1,000 bp is Delly's own line between small and large SVs in its read counts (`indelsize` in Delly's source); a deletion that size or smaller rests on its split reads and read pairs alone. A deletion VCF without the RDCN field (not written by Delly 2.x) is read as before, without the depth check. diff --git a/docs/42-traits.md b/docs/42-traits.md index 2fa79a21..8525ae0a 100644 --- a/docs/42-traits.md +++ b/docs/42-traits.md @@ -108,7 +108,7 @@ The rules today: The six rules after TAS2R38 need no phase. Their sites lie close together on one copy (the two APOL1 G1 changes were in perfect linkage disequilibrium in Genovese et al. 2010; the 9p21 and 17q21.31 tags each mark one haplotype), or, for HFE, a double heterozygote reads as one change on each copy. A copy the rule does not describe, such as a 9p21 copy with only one of the two risk alleles, is `other_haplotype`, not read. What each rule leaves out, said in its note: -- APOL1 G2 (rs71785313) is a 6-base deletion. The rule table reads single-base sites only, so the rule itself reads G1, and a G2 copy reads as G0 there. The HTML and text reports read G2 beside the rule (`bin/genotype_rules_indels.py`, through `bin/collect_summary.py`) from the sample's gVCF, or its VCF when there is no gVCF, and show the G1 plus G2 result under "With G2": G1/G2, G2/G2 and G1/G1 are the high-risk genotype. Two G2 copies read G2/G2 even when the G1 sites were not read. A VCF without reference blocks cannot tell a reference base from a position with no reads, so there a result with no G2 copy is marked `(no G2 call)`. The Nextflow report stages the called VCF only, so a Nextflow run gets that mark where a run-all.sh run, which reads the gVCF, does not. +- APOL1 G2 (rs71785313) is a 6-base deletion. The rule table reads single-base sites only, so the rule itself reads G1, and a G2 copy reads as G0 there. The HTML and text reports read G2 beside the rule (`bin/genotype_rules_indels.py`, through `bin/collect_summary.py`) from the sample's gVCF, or its VCF when there is no gVCF, and show the G1 plus G2 result under "With G2": G1/G2, G2/G2 and G1/G1 are the high-risk genotype. Two G2 copies read G2/G2 even when the G1 sites were not read. A VCF without reference blocks cannot tell a reference base from a position with no reads, so there a result with no G2 copy is marked `(no G2 call)`. The Nextflow report gets the sample's gVCF too (DeepVariant's, or the samplesheet's `gvcf` column), so both runs read the gVCF when there is one. - SERPINA1: M is any copy with neither S nor Z; rarer deficiency and null alleles are not read. A serum level confirms a deficiency. - HFE: the C282Y homozygote is also a secondary finding (`assets/acmg_sf.tsv`, [step 23](23-clinical-filter.md)); the rule gives the reading of every genotype. - GC: the protein levels are those of Powe et al. (2013), whose monoclonal assay was questioned in later letters. A protein type, not a vitamin D deficiency. diff --git a/docs/cn-loci.md b/docs/cn-loci.md index 1d86b9ad..6c31e174 100644 --- a/docs/cn-loci.md +++ b/docs/cn-loci.md @@ -72,7 +72,7 @@ Step 35 (and the PARASCOPY module) runs these three rows one after the other and - **CCL3L1**: the no-ALT reference holds one copy of CCL3L1/CCL3L3 (CCL3L3), so every read of either lands there and the row counts both together. The count goes back to Gonzalez 2005 (PMID 15637236), but the disease links reported for it are disputed, so no reading is given. The test fails when a CCL3L1 reading names a disease. - **DEFB4** has no row. The beta-defensin repeat that carries it (DEFB4B to DEFB103B) lies in the paralog copies of SPAG11A's Parascopy model, so Parascopy owns it under the rule below. The test plants a DEFB4 row there and checks that the owner check catches it. -Both reports show `_cn_dosage.tsv` in step 35's section, one line per locus ([step 35](35-paralogs.md#in-the-reports)). `main.nf` does not pass it to the Nextflow `HTML_REPORT` yet, so there the report says the table is not in the output; step 24 reads it from the sample folder. +Both reports show `_cn_dosage.tsv` in step 35's section, one line per locus ([step 35](35-paralogs.md#in-the-reports)). The Nextflow `HTML_REPORT` gets it from `PARASCOPY`; step 24 reads it from the sample folder. ### The CYP21A2 row diff --git a/scripts/ci/gen-containers-config.sh b/scripts/ci/gen-containers-config.sh index e94fbe69..572001f2 100755 --- a/scripts/ci/gen-containers-config.sh +++ b/scripts/ci/gen-containers-config.sh @@ -242,9 +242,11 @@ check() { fi rm -f "$want" # Every process, and every alias a workflow includes one under (include { A as B }): - # a withName selector matches the alias, not the module's name. + # a withName selector matches the alias, not the module's name. Only the + # list between the braces is read, so a trailing "// x as y" comment is not. procs=$( { cat "${ROOT}"/modules/local/*/main.nf | sed -nE 's/^process[[:space:]]+([A-Za-z0-9_]+).*/\1/p' cat "${ROOT}"/main.nf "${ROOT}"/workflows/*.nf 2>/dev/null | grep -E '^[[:space:]]*include[[:space:]]*\{' \ + | sed -nE 's/^[[:space:]]*include[[:space:]]*\{([^}]*)\}.*/\1/p' \ | grep -oE '[A-Za-z0-9_]+[[:space:]]+as[[:space:]]+[A-Za-z0-9_]+' | awk '{print $3}' || true; } | sort -u) [ -n "$procs" ] || { echo "FAIL: found no process in modules/local/*/main.nf"; return 1; } sels=$(sed -nE -e "s/^[[:space:]]*withName:[[:space:]]*'([A-Za-z0-9_]+)'[[:space:]]*\{[[:space:]]*container[[:space:]]*=[[:space:]]*'[^']+'[[:space:]]*\}.*/\1/p" \ @@ -364,6 +366,16 @@ self_test() { expect new-alias '^FAIL: process ROH_AGAIN has no container' expect new-alias '^FAIL: process VEP_AGAIN has no container' + # A trailing comment that reads like an alias is not one: the copy stays clean. + copy comment-alias + printf '%s\n' "include { ROH } from '../modules/local/roh/main' // ROH as ROH_COMMENT" >> "${tmp}/comment-alias/workflows/clinical.nf" + rc=0; out=$("$0" --check --root "${tmp}/comment-alias" 2>&1) || rc=$? + if [ "$rc" -ne 0 ]; then + echo "self-test: a trailing // comment was read as an alias:"; printf '%s\n' "$out"; fail=1 + else + echo "self-test: a trailing // comment is not read as an alias" + fi + # A selector left behind for a process that no longer exists. copy stray sed -i.bak "s/^process VEP /process VEP_RENAMED /" "${tmp}/stray/modules/local/vep/main.nf"