PGx: full call detail (PGX-016..020, 027/028, 031), pgx coverage (PGX-009/035), full HGVS
- supporting_variants.tsv, unresolved_variants.tsv, variants_not_covered.tsv with PGX-026 metadata; per-allele supporting/unresolved sites for both alleles of every candidate; variant_change vs top, distant_alternative, unexplained_variants, alleles_impacted_by_no_call, alleles_tested. - simurg pgx coverage: callable / not_covered / masked / equivalent_to per allele and manifest. - HGVS on GRCh38 RefSeq accessions (NC_...:g.). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01814GKVzZVL3FuF3DeiZXhv
This commit is contained in:
1 parent
0215af9c9c
commit
4dafce3f18
10 files changed
+352
-40
No files matched your search
@@ -98,15 +98,24 @@ def run_phenotype(o: PhenoOptions, rep: Reporter) -> int:
|
||||
else:
|
||||
res, per = gene_phenotype(t, feas)
|
||||
flags = list(g.get("flags", [])) + (res.flags if res else [])
|
||||
entry = {"gene": g["gene"], "call_type": "star_allele", "genotype": g["genotype"],
|
||||
top = g["candidates"][0] if g["candidates"] else {}
|
||||
top_alleles = top.get("alleles", [])
|
||||
entry = {"gene": g["gene"], "call_type": g.get("call_type", "star_allele"), "genotype": g["genotype"],
|
||||
"feasible_solutions": g["feasible_solutions"],
|
||||
"activity_score": res.activity_score if res else None,
|
||||
"phenotype": res.phenotype if res else None, "per_solution_phenotypes": per,
|
||||
"score": g["candidates"][0]["score"] if g["candidates"] else None,
|
||||
"raw_score": g["candidates"][0]["raw_score"] if g["candidates"] else None,
|
||||
"score": top.get("score"), "raw_score": top.get("raw_score"),
|
||||
"flags": sorted(set(flags)), "copy_number": g.get("copy_number"),
|
||||
"candidate_solutions": [{"rank": i + 1, **c} for i, c in enumerate(g["candidates"])],
|
||||
"alleles_tested": sorted(tested.get(g["gene"], []), key=_natural)} # fmt: skip
|
||||
"array_equivalent_alleles": [{"allele": a["allele"], "equivalents": a["array_equivalent_alleles"]}
|
||||
for a in top_alleles],
|
||||
"supporting_variants": [v for a in top_alleles for v in a["supporting_variants"]],
|
||||
"variant_no_calls": g.get("variant_no_calls", []),
|
||||
"variants_not_covered": g.get("variants_not_covered", []),
|
||||
"unexplained_variants": g.get("unexplained_variants", []),
|
||||
"candidate_solutions": [{"rank": i + 1, **c, "phenotype": _pheno_of(tables.get(g["gene"]), c)}
|
||||
for i, c in enumerate(g["candidates"])],
|
||||
"alleles_tested": g.get("alleles_tested")
|
||||
or sorted(tested.get(g["gene"], []), key=_natural)} # fmt: skip
|
||||
genes.append(entry)
|
||||
ann_rows.append({"sample_id": s["sample_id"], "sample_name": s.get("sample_name", s["sample_id"]),
|
||||
"gene": g["gene"], "guideline": o.guideline, "genotype": g["genotype"],
|
||||
@@ -126,6 +135,12 @@ def run_phenotype(o: PhenoOptions, rep: Reporter) -> int:
|
||||
return ExitCode.OK
|
||||
|
||||
|
||||
def _pheno_of(t: Any, cand: dict[str, Any]) -> str | None:
|
||||
from simurg.pgx.phenotype import phenotype
|
||||
|
||||
return phenotype(t, tuple(cand["genotype"].split("/"))).phenotype if t is not None else None
|
||||
|
||||
|
||||
def _natural(a: str) -> tuple[Any, ...]:
|
||||
import re
|
||||
|
||||
|
||||
Reference in new issue
Block a user