File size: 2,267 Bytes
56a6725
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
"""Evidence ranking, deduplication, and truncation."""

SOURCE_PRIORITY = {
    "DMD_ExonSkip_Lookup": -2,
    "Variant_Therapy_Lookup": -2,
    "Supportive_Care_Lookup": -2,
    "ACMG_SF": -1,
    "ACMG_Guideline": -1,
    "CPIC": -1,
    "N1C_Eligibility": -1,
    "FDA": 0,
    "DailyMed": 0,
    "GeneReviews": 1,
    "ClinGen": 1,
    "ClinGen_Validity": 1,
    "ClinVar": 2,
    "Orphanet": 2,
    "GenCC": 2,
    "PharmGKB": 2,
    "HPO_MONDO": 2,
    "ClinicalTrials.gov": 3,
    "Ensembl": 4,
    "Ensembl_VEP": 4,
    "UniProt": 4,
    "ChEMBL": 5,
    "PubMed": 5,
    "PHAROS": 5,
    "DGIdb": 5,
    "Open Targets": 6,
    "OMIM": 7,
    "gnomAD": 8,
}


def _estimate_tokens(text: str) -> int:
    return len(text) // 4


def truncate_evidence(evidence: list[dict], max_tokens: int = 3000) -> list[dict]:
    """Rank, deduplicate, and truncate evidence to fit within token budget."""
    # Deduplicate by URL, keeping the first occurrence — but merge the
    # strongest `_disease_relevance` across duplicates. The same trial can be
    # retrieved by several queries (broad gene search vs. targeted condition
    # search) that score disease-relevance differently; keeping only the first
    # (often a low-relevance gene-query hit) would let a 0.0 duplicate mask a
    # 1.0 hit and wrongly disqualify the right trial (-> spurious "None").
    seen_urls: dict[str, dict] = {}
    unique = []
    for e in evidence:
        url = e["url"]
        if url not in seen_urls:
            seen_urls[url] = e
            unique.append(e)
        elif e.get("_disease_relevance", 0) > seen_urls[url].get("_disease_relevance", 0):
            seen_urls[url]["_disease_relevance"] = e.get("_disease_relevance")

    def sort_key(e):
        base = SOURCE_PRIORITY.get(e["source_name"], 99)
        snippet = e.get("snippet", "")
        if "maps to exon" in snippet or "DOMAIN MATCH" in snippet:
            return (-1, base)
        return (0, base)

    unique.sort(key=sort_key)

    selected = []
    total_tokens = 0
    for e in unique:
        snippet_tokens = _estimate_tokens(e["snippet"])
        if total_tokens + snippet_tokens > max_tokens:
            break
        selected.append(e)
        total_tokens += snippet_tokens

    return selected