File size: 2,028 Bytes
1c6cb4b
 
1087a21
1c6cb4b
 
a9daa10
 
1087a21
a9daa10
 
 
 
1087a21
a9daa10
1087a21
a9daa10
1087a21
a9daa10
 
 
 
 
 
 
 
 
 
 
1087a21
a9daa10
1c6cb4b
a9daa10
1087a21
a9daa10
1087a21
a9daa10
 
 
1087a21
a9daa10
1087a21
a9daa10
 
1087a21
a9daa10
1087a21
a9daa10
1c6cb4b
a9daa10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# genesis/api_clients/umls_api.py
import os
import requests

UMLS_API_KEY = os.getenv("UMLS_API_KEY")
UMLS_AUTH_URL = "https://utslogin.nlm.nih.gov"
UMLS_API_URL = "https://uts-ws.nlm.nih.gov/rest"

if not UMLS_API_KEY:
    raise ValueError("Missing UMLS_API_KEY in environment variables")

def get_tgt():
    """
    Get a Ticket Granting Ticket (TGT) for UMLS authentication.
    """
    url = f"{UMLS_AUTH_URL}/cas/v1/api-key"
    params = {"apikey": UMLS_API_KEY}
    res = requests.post(url, data=params)
    res.raise_for_status()
    # Extract TGT URL from HTML form action
    return res.text.split('action="')[1].split('"')[0]

def get_service_ticket(tgt):
    """
    Get a Service Ticket (ST) using TGT.
    """
    params = {"service": "http://umlsks.nlm.nih.gov"}
    res = requests.post(tgt, data=params)
    res.raise_for_status()
    return res.text

def search_umls(query: str, page: int = 1, page_size: int = 10):
    """
    Search for a term in UMLS.
    """
    tgt = get_tgt()
    ticket = get_service_ticket(tgt)
    url = f"{UMLS_API_URL}/search/current"
    params = {
        "string": query,
        "ticket": ticket,
        "pageNumber": page,
        "pageSize": page_size
    }
    res = requests.get(url, params=params)
    res.raise_for_status()
    return res.json().get("result", {}).get("results", [])

def get_cui_details(cui: str):
    """
    Get detailed info for a CUI (Concept Unique Identifier).
    """
    tgt = get_tgt()
    ticket = get_service_ticket(tgt)
    url = f"{UMLS_API_URL}/content/current/CUI/{cui}"
    params = {"ticket": ticket}
    res = requests.get(url, params=params)
    res.raise_for_status()
    return res.json()

def map_to_umls(term: str):
    """
    Given a term, return the matching UMLS CUI(s) and definitions.
    """
    matches = search_umls(term)
    return [
        {
            "name": m.get("name"),
            "cui": m.get("ui"),
            "rootSource": m.get("rootSource")
        }
        for m in matches if m.get("ui") != "NONE"
    ]