mgbam commited on
Commit
a9daa10
·
verified ·
1 Parent(s): c37fc6d

Update genesis/api_clients/umls_api.py

Browse files
Files changed (1) hide show
  1. genesis/api_clients/umls_api.py +55 -24
genesis/api_clients/umls_api.py CHANGED
@@ -3,40 +3,71 @@ import os
3
  import requests
4
 
5
  UMLS_API_KEY = os.getenv("UMLS_API_KEY")
6
- UMLS_AUTH_URL = "https://utslogin.nlm.nih.gov/cas/v1/api-key"
7
- UMLS_SEARCH_URL = "https://uts-ws.nlm.nih.gov/rest/search/current"
8
 
9
- def get_umls_ticket():
 
 
 
10
  """
11
- Get a single-use ticket for UMLS API queries.
12
  """
13
- if not UMLS_API_KEY:
14
- raise ValueError("UMLS_API_KEY is missing in environment variables")
15
-
16
  params = {"apikey": UMLS_API_KEY}
17
- res = requests.post(UMLS_AUTH_URL, data=params)
 
 
 
 
 
 
 
 
 
 
18
  res.raise_for_status()
19
- return res.text.strip()
20
 
21
- def search_umls(term: str, max_results: int = 10):
22
  """
23
- Search UMLS Metathesaurus for concepts related to a term.
24
  """
25
- ticket = get_umls_ticket()
 
 
26
  params = {
27
- "string": term,
28
  "ticket": ticket,
29
- "pageSize": max_results
 
30
  }
31
- res = requests.get(UMLS_SEARCH_URL, params=params)
32
  res.raise_for_status()
33
- data = res.json()
34
 
35
- results = []
36
- for result in data.get("result", {}).get("results", []):
37
- results.append({
38
- "name": result.get("name"),
39
- "ui": result.get("ui"),
40
- "rootSource": result.get("rootSource")
41
- })
42
- return results
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  import requests
4
 
5
  UMLS_API_KEY = os.getenv("UMLS_API_KEY")
6
+ UMLS_AUTH_URL = "https://utslogin.nlm.nih.gov"
7
+ UMLS_API_URL = "https://uts-ws.nlm.nih.gov/rest"
8
 
9
+ if not UMLS_API_KEY:
10
+ raise ValueError("Missing UMLS_API_KEY in environment variables")
11
+
12
+ def get_tgt():
13
  """
14
+ Get a Ticket Granting Ticket (TGT) for UMLS authentication.
15
  """
16
+ url = f"{UMLS_AUTH_URL}/cas/v1/api-key"
 
 
17
  params = {"apikey": UMLS_API_KEY}
18
+ res = requests.post(url, data=params)
19
+ res.raise_for_status()
20
+ # Extract TGT URL from HTML form action
21
+ return res.text.split('action="')[1].split('"')[0]
22
+
23
+ def get_service_ticket(tgt):
24
+ """
25
+ Get a Service Ticket (ST) using TGT.
26
+ """
27
+ params = {"service": "http://umlsks.nlm.nih.gov"}
28
+ res = requests.post(tgt, data=params)
29
  res.raise_for_status()
30
+ return res.text
31
 
32
+ def search_umls(query: str, page: int = 1, page_size: int = 10):
33
  """
34
+ Search for a term in UMLS.
35
  """
36
+ tgt = get_tgt()
37
+ ticket = get_service_ticket(tgt)
38
+ url = f"{UMLS_API_URL}/search/current"
39
  params = {
40
+ "string": query,
41
  "ticket": ticket,
42
+ "pageNumber": page,
43
+ "pageSize": page_size
44
  }
45
+ res = requests.get(url, params=params)
46
  res.raise_for_status()
47
+ return res.json().get("result", {}).get("results", [])
48
 
49
+ def get_cui_details(cui: str):
50
+ """
51
+ Get detailed info for a CUI (Concept Unique Identifier).
52
+ """
53
+ tgt = get_tgt()
54
+ ticket = get_service_ticket(tgt)
55
+ url = f"{UMLS_API_URL}/content/current/CUI/{cui}"
56
+ params = {"ticket": ticket}
57
+ res = requests.get(url, params=params)
58
+ res.raise_for_status()
59
+ return res.json()
60
+
61
+ def map_to_umls(term: str):
62
+ """
63
+ Given a term, return the matching UMLS CUI(s) and definitions.
64
+ """
65
+ matches = search_umls(term)
66
+ return [
67
+ {
68
+ "name": m.get("name"),
69
+ "cui": m.get("ui"),
70
+ "rootSource": m.get("rootSource")
71
+ }
72
+ for m in matches if m.get("ui") != "NONE"
73
+ ]