[CW-7250] fix up typography

This commit is contained in:
Chris Wright 2026-05-18 15:14:53 +00:00
parent 0bd6f118b5
commit 68809a0147
2 changed files with 329 additions and 297 deletions

View File

@ -4,7 +4,7 @@ import json
import math import math
from pathlib import Path from pathlib import Path
from dominate.tags import div, h3, p, pre, strong from dominate.tags import div, h4, p, pre, strong
from dominate.util import raw from dominate.util import raw
from ezcharts.components import fastcat from ezcharts.components import fastcat
from ezcharts.components.reports import labs from ezcharts.components.reports import labs
@ -317,7 +317,8 @@ def main(args):
DataTable.from_pandas( DataTable.from_pandas(
pd.DataFrame.from_dict(item, orient="index", columns=["Value"]) pd.DataFrame.from_dict(item, orient="index", columns=["Value"])
.reset_index() .reset_index()
.rename(columns={"index": "Field"}) .rename(columns={"index": "Field"}),
use_index=False,
) )
# Load bambu QC statistics # Load bambu QC statistics
@ -362,9 +363,10 @@ def main(args):
pd.DataFrame(seqname_rows, columns=["Check", "Value"]), pd.DataFrame(seqname_rows, columns=["Check", "Value"]),
paging=False, paging=False,
searchable=False, searchable=False,
use_index=False,
) )
with h3("Build and Provider Hints"): h4("Build and Provider Hints")
hint_rows = [ hint_rows = [
( (
"Reference build", "Reference build",
@ -403,11 +405,12 @@ def main(args):
pd.DataFrame(hint_rows, columns=["Evidence", "Hints"]), pd.DataFrame(hint_rows, columns=["Evidence", "Hints"]),
paging=False, paging=False,
searchable=False, searchable=False,
use_index=False,
) )
examples = annotation_summary.get("unstranded_examples") or [] examples = annotation_summary.get("unstranded_examples") or []
if examples: if examples:
with h3("Unstranded Annotation Examples"): h4("Unstranded Annotation Examples")
pre("\n".join(examples)) pre("\n".join(examples))
# Add Bambu QC section with warnings # Add Bambu QC section with warnings
@ -422,8 +425,7 @@ def main(args):
level="warning", level="warning",
) )
# Library size statistics h4("Library Size Statistics")
with h3("Library Size Statistics"):
lib_stats = pd.DataFrame( lib_stats = pd.DataFrame(
[ [
("Samples analyzed", bambu_qc.get("samples", "N/A")), ("Samples analyzed", bambu_qc.get("samples", "N/A")),
@ -460,10 +462,15 @@ def main(args):
], ],
columns=["Metric", "Value"], columns=["Metric", "Value"],
) )
DataTable.from_pandas(lib_stats, paging=False, searchable=False) DataTable.from_pandas(
lib_stats,
paging=False,
searchable=False,
use_index=False,
)
# Transcript discovery statistics # Transcript discovery statistics
with h3("Transcript Discovery"): h4("Transcript Discovery")
discovery_stats = pd.DataFrame( discovery_stats = pd.DataFrame(
[ [
( (
@ -494,11 +501,16 @@ def main(args):
], ],
columns=["Metric", "Value"], columns=["Metric", "Value"],
) )
DataTable.from_pandas(discovery_stats, paging=False, searchable=False) DataTable.from_pandas(
discovery_stats,
paging=False,
searchable=False,
use_index=False,
)
# Per-sample library sizes # Per-sample library sizes
if "library_sizes" in bambu_qc and bambu_qc["library_sizes"]: if "library_sizes" in bambu_qc and bambu_qc["library_sizes"]:
with h3("Per-Sample Library Sizes"): h4("Per-Sample Library Sizes")
lib_size_data = [] lib_size_data = []
for sample, size in bambu_qc["library_sizes"].items(): for sample, size in bambu_qc["library_sizes"].items():
numeric_size = _coerce_float(size) numeric_size = _coerce_float(size)
@ -523,9 +535,19 @@ def main(args):
with report.add_section("Cohort transcriptome", "Cohort"): with report.add_section("Cohort transcriptome", "Cohort"):
cohort_metrics, cohort_classes = _cohort_summary(args.cohort_dir) cohort_metrics, cohort_classes = _cohort_summary(args.cohort_dir)
if cohort_metrics is not None: if cohort_metrics is not None:
DataTable.from_pandas(cohort_metrics, paging=False, searchable=False) DataTable.from_pandas(
cohort_metrics,
paging=False,
searchable=False,
use_index=False,
)
if cohort_classes is not None: if cohort_classes is not None:
DataTable.from_pandas(cohort_classes, paging=False, searchable=False) DataTable.from_pandas(
cohort_classes,
paging=False,
searchable=False,
use_index=False,
)
tx_counts = _read_table(Path(args.cohort_dir) / "transcript_counts.tsv") tx_counts = _read_table(Path(args.cohort_dir) / "transcript_counts.tsv")
if tx_counts is not None and not tx_counts.empty: if tx_counts is not None and not tx_counts.empty:
@ -536,7 +558,12 @@ def main(args):
tabs = Tabs() tabs = Tabs()
for sample, summary_df in _sample_summaries(args.samples_dir).items(): for sample, summary_df in _sample_summaries(args.samples_dir).items():
with tabs.add_tab(sample): with tabs.add_tab(sample):
DataTable.from_pandas(summary_df, paging=False, searchable=False) DataTable.from_pandas(
summary_df,
paging=False,
searchable=False,
use_index=False,
)
if args.alignment_stats_dir and Path(args.alignment_stats_dir).exists(): if args.alignment_stats_dir and Path(args.alignment_stats_dir).exists():
with report.add_section("Alignment statistics", "Alignments"): with report.add_section("Alignment statistics", "Alignments"):
@ -656,7 +683,7 @@ def main(args):
has_warnings = True has_warnings = True
# Experimental design summary # Experimental design summary
with h3("Experimental Design"): h4("Experimental Design")
covariates = _as_string_list(de_qc.get("covariates")) covariates = _as_string_list(de_qc.get("covariates"))
covariates_value = ", ".join(covariates) if covariates else "none" covariates_value = ", ".join(covariates) if covariates else "none"
design_stats = pd.DataFrame( design_stats = pd.DataFrame(
@ -678,11 +705,16 @@ def main(args):
], ],
columns=["Parameter", "Value"], columns=["Parameter", "Value"],
) )
DataTable.from_pandas(design_stats, paging=False, searchable=False) DataTable.from_pandas(
design_stats,
paging=False,
searchable=False,
use_index=False,
)
# Sample sizes per group # Sample sizes per group
if "samples_per_group" in de_qc: if "samples_per_group" in de_qc:
with h3("Sample Sizes per Group"): h4("Sample Sizes per Group")
sample_size_data = [] sample_size_data = []
for group, count in de_qc["samples_per_group"].items(): for group, count in de_qc["samples_per_group"].items():
status = ( status = (
@ -710,7 +742,7 @@ def main(args):
use_index=False, use_index=False,
) )
with h3("Statistical Methods & Warnings"): h4("Statistical Methods & Warnings")
if method_rows: if method_rows:
method_df = pd.DataFrame(method_rows) method_df = pd.DataFrame(method_rows)
DataTable.from_pandas( DataTable.from_pandas(
@ -723,7 +755,7 @@ def main(args):
# Per-contrast summary # Per-contrast summary
if "contrasts" in de_qc: if "contrasts" in de_qc:
with h3("Results Summary by Contrast"): h4("Results Summary by Contrast")
contrast_summary_data = [] contrast_summary_data = []
for contrast_name, contrast_data in de_qc["contrasts"].items(): for contrast_name, contrast_data in de_qc["contrasts"].items():
dtu_genes = ( dtu_genes = (
@ -774,7 +806,7 @@ def main(args):
# Warnings summary table # Warnings summary table
if has_warnings: if has_warnings:
with h3("Quality Warnings Summary"): h4("Quality Warnings Summary")
warnings_data = [] warnings_data = []
if sample_size_warnings: if sample_size_warnings:
warnings_data.append( warnings_data.append(

View File

@ -359,7 +359,7 @@ def test_report_main_renders_statistical_methods_and_warnings(
monkeypatch.setattr(report.fastcat, "SeqSummary", lambda *args, **kwargs: None) monkeypatch.setattr(report.fastcat, "SeqSummary", lambda *args, **kwargs: None)
monkeypatch.setattr( monkeypatch.setattr(
report, report,
"h3", "h4",
lambda label: (headings.append(label), _NullContext())[1], lambda label: (headings.append(label), _NullContext())[1],
) )
monkeypatch.setattr( monkeypatch.setattr(
@ -449,7 +449,7 @@ def test_report_main_tolerates_missing_statistical_fields(monkeypatch, tmp_path)
monkeypatch.setattr(report.fastcat, "SeqSummary", lambda *args, **kwargs: None) monkeypatch.setattr(report.fastcat, "SeqSummary", lambda *args, **kwargs: None)
monkeypatch.setattr( monkeypatch.setattr(
report, report,
"h3", "h4",
lambda label: (headings.append(label), _NullContext())[1], lambda label: (headings.append(label), _NullContext())[1],
) )
monkeypatch.setattr(report, "_create_warning_banner", lambda *args, **kwargs: None) monkeypatch.setattr(report, "_create_warning_banner", lambda *args, **kwargs: None)