Codex Codex commited on
Commit
1c301da
·
1 Parent(s): 11adb6c

Expand lab knowledge graph markers and videos

Browse files

Co-authored-by: Codex <chatgpt-codex-connector[bot]@users.noreply.github.com>

kb/cbc_knowledge_graph.json CHANGED
The diff for this file is too large to render. See raw diff
 
kb/knowledge_base.py CHANGED
@@ -115,6 +115,21 @@ KB: dict[str, MarkerKB] = {
115
  low="A low reticulocyte count in anemia suggests the marrow is not keeping up with red-cell need.",
116
  questions=("Is my body replacing red cells appropriately?",),
117
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  # --- Metabolic panel ---
119
  "Glucose": MarkerKB(
120
  high="An elevated fasting glucose can indicate prediabetes or diabetes, or simply that the sample was not fasting.",
@@ -206,6 +221,11 @@ KB: dict[str, MarkerKB] = {
206
  low="A low TIBC may appear with inflammation or iron overload.",
207
  questions=("Does TIBC fit with my ferritin and transferrin saturation?",),
208
  ),
 
 
 
 
 
209
  "Transferrin Saturation": MarkerKB(
210
  high="A high saturation may suggest iron overload or excess intake.",
211
  low="A low saturation is common in iron deficiency.",
@@ -236,6 +256,11 @@ KB: dict[str, MarkerKB] = {
236
  low="A low homocysteine is generally favorable.",
237
  questions=("Should we check B12 and folate?",),
238
  ),
 
 
 
 
 
239
  "Cystatin C": MarkerKB(
240
  high="A high cystatin C suggests reduced kidney filtration, similar to creatinine but less muscle-dependent.",
241
  low="A low cystatin C is usually not a concern.",
@@ -251,6 +276,21 @@ KB: dict[str, MarkerKB] = {
251
  low="A low beta-2 microglobulin is not typically significant.",
252
  questions=("Should this be interpreted with kidney function?",),
253
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  # --- Liver enzymes ---
255
  "ALT": MarkerKB(
256
  high="ALT is fairly liver-specific; elevations can follow fatty liver, alcohol, medications, or viral hepatitis.",
@@ -364,6 +404,16 @@ KB: dict[str, MarkerKB] = {
364
  low="A negative or low Anti-TPO is expected in most people without autoimmune thyroid disease.",
365
  questions=("Could this explain my thyroid symptoms or TSH changes?",),
366
  ),
 
 
 
 
 
 
 
 
 
 
367
  # --- Vitamins / iron ---
368
  "Vitamin D": MarkerKB(
369
  high="A very high vitamin D is uncommon and usually from supplements.",
@@ -380,6 +430,31 @@ KB: dict[str, MarkerKB] = {
380
  low="A low ferritin is the most specific sign of low iron stores and a common cause of anemia.",
381
  questions=("Does my ferritin explain my hemoglobin and MCV?", "Should we look for a source of iron loss?"),
382
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
383
  "HbA1c": MarkerKB(
384
  high="A high HbA1c reflects higher average blood sugar over ~3 months and is used to screen for prediabetes and diabetes.",
385
  low="A low HbA1c is generally not a concern.",
@@ -447,12 +522,42 @@ KB: dict[str, MarkerKB] = {
447
  low="A negative rheumatoid factor does not rule out arthritis.",
448
  questions=("Do my joints hurt or swell, especially in the morning?",),
449
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
450
  # --- Cardiac ---
451
  "BNP": MarkerKB(
452
  high="A high BNP suggests the heart is under strain, as in heart failure or fluid overload.",
453
  low="A low BNP makes significant heart failure less likely.",
454
  questions=("Do I have shortness of breath or leg swelling?",),
455
  ),
 
 
 
 
 
456
  "Troponin I": MarkerKB(
457
  high="A high troponin indicates heart-muscle injury and needs urgent clinical evaluation.",
458
  low="A low troponin is expected when there is no heart injury.",
@@ -468,6 +573,11 @@ KB: dict[str, MarkerKB] = {
468
  low="A low CK-MB is expected without heart injury.",
469
  questions=("Was this checked because of chest symptoms?",),
470
  ),
 
 
 
 
 
471
  # --- Hormones ---
472
  "Cortisol": MarkerKB(
473
  high="A high cortisol may reflect stress, steroids, Cushing syndrome, or lab timing.",
@@ -519,6 +629,26 @@ KB: dict[str, MarkerKB] = {
519
  low="A low ACTH may appear with steroid use or pituitary causes of low cortisol.",
520
  questions=("Should ACTH be read with cortisol?",),
521
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
522
  "SHBG": MarkerKB(
523
  high="A high SHBG binds more testosterone and estrogen, lowering their free fractions.",
524
  low="A low SHBG is linked to insulin resistance and higher free androgen activity.",
@@ -535,6 +665,31 @@ KB: dict[str, MarkerKB] = {
535
  low="A low PSA is expected and does not rule out all prostate conditions.",
536
  questions=("Could recent exercise or infection have raised PSA?", "Is repeat testing planned?"),
537
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
538
  "Folate": MarkerKB(
539
  high="A high folate is usually from supplements or fortified foods.",
540
  low="A low folate can cause anemia similar to B12 deficiency and affects DNA synthesis.",
 
115
  low="A low reticulocyte count in anemia suggests the marrow is not keeping up with red-cell need.",
116
  questions=("Is my body replacing red cells appropriately?",),
117
  ),
118
+ "Haptoglobin": MarkerKB(
119
+ high="A high haptoglobin may rise with inflammation because it is an acute-phase protein.",
120
+ low="A low haptoglobin supports red-cell breakdown when interpreted with LDH, bilirubin, and reticulocytes.",
121
+ questions=("Does this fit with LDH, bilirubin, and reticulocyte count?",),
122
+ ),
123
+ "G6PD": MarkerKB(
124
+ high="A high G6PD level is usually not clinically important by itself.",
125
+ low="A low G6PD level can predispose red cells to hemolysis after certain infections, foods, or medications.",
126
+ questions=("Should I avoid any oxidant medications or foods?",),
127
+ ),
128
+ "Erythropoietin": MarkerKB(
129
+ high="A high erythropoietin may reflect the body's response to anemia or low oxygen levels.",
130
+ low="A low or inappropriately normal erythropoietin can contribute to anemia in kidney disease.",
131
+ questions=("Is this appropriate for my hemoglobin level?",),
132
+ ),
133
  # --- Metabolic panel ---
134
  "Glucose": MarkerKB(
135
  high="An elevated fasting glucose can indicate prediabetes or diabetes, or simply that the sample was not fasting.",
 
221
  low="A low TIBC may appear with inflammation or iron overload.",
222
  questions=("Does TIBC fit with my ferritin and transferrin saturation?",),
223
  ),
224
+ "Transferrin": MarkerKB(
225
+ high="A high transferrin often appears when the body is trying to transport more iron during iron deficiency.",
226
+ low="A low transferrin may appear with inflammation, liver disease, malnutrition, or iron overload.",
227
+ questions=("Does transferrin fit with ferritin, serum iron, and TIBC?",),
228
+ ),
229
  "Transferrin Saturation": MarkerKB(
230
  high="A high saturation may suggest iron overload or excess intake.",
231
  low="A low saturation is common in iron deficiency.",
 
256
  low="A low homocysteine is generally favorable.",
257
  questions=("Should we check B12 and folate?",),
258
  ),
259
+ "Methylmalonic Acid": MarkerKB(
260
+ high="A high methylmalonic acid supports functional vitamin B12 deficiency, especially when B12 is borderline.",
261
+ low="A low methylmalonic acid is usually not a concern.",
262
+ questions=("Does this clarify whether my B12 level is truly low?",),
263
+ ),
264
  "Cystatin C": MarkerKB(
265
  high="A high cystatin C suggests reduced kidney filtration, similar to creatinine but less muscle-dependent.",
266
  low="A low cystatin C is usually not a concern.",
 
276
  low="A low beta-2 microglobulin is not typically significant.",
277
  questions=("Should this be interpreted with kidney function?",),
278
  ),
279
+ "C-Peptide": MarkerKB(
280
+ high="A high C-peptide means the pancreas is making more insulin and may appear with insulin resistance or insulin-producing tumors.",
281
+ low="A low C-peptide suggests reduced natural insulin production, especially when glucose is high.",
282
+ questions=("Was glucose measured at the same time?",),
283
+ ),
284
+ "Fructosamine": MarkerKB(
285
+ high="A high fructosamine suggests higher average blood sugar over the prior two to three weeks.",
286
+ low="A low fructosamine is usually not a concern but can be affected by low blood proteins.",
287
+ questions=("Is this being used because HbA1c may be unreliable for me?",),
288
+ ),
289
+ "Beta-Hydroxybutyrate": MarkerKB(
290
+ high="A high beta-hydroxybutyrate indicates increased ketone production and can be important in diabetes or prolonged fasting.",
291
+ low="A low beta-hydroxybutyrate is expected when ketone production is not increased.",
292
+ questions=("Could this relate to diabetes, fasting, or a low-carbohydrate diet?",),
293
+ ),
294
  # --- Liver enzymes ---
295
  "ALT": MarkerKB(
296
  high="ALT is fairly liver-specific; elevations can follow fatty liver, alcohol, medications, or viral hepatitis.",
 
404
  low="A negative or low Anti-TPO is expected in most people without autoimmune thyroid disease.",
405
  questions=("Could this explain my thyroid symptoms or TSH changes?",),
406
  ),
407
+ "TSH Receptor Antibodies": MarkerKB(
408
+ high="A high TSH receptor antibody result supports autoimmune Graves-type thyroid stimulation in the right thyroid pattern.",
409
+ low="A low result makes TSH-receptor antibody activity less likely.",
410
+ questions=("Does this fit with my TSH, Free T4, and Free T3?",),
411
+ ),
412
+ "Thyroglobulin Antibodies": MarkerKB(
413
+ high="A high thyroglobulin antibody result may support autoimmune thyroid disease and can interfere with thyroglobulin monitoring.",
414
+ low="A low result is expected when these antibodies are absent.",
415
+ questions=("Could this interfere with thyroglobulin interpretation?",),
416
+ ),
417
  # --- Vitamins / iron ---
418
  "Vitamin D": MarkerKB(
419
  high="A very high vitamin D is uncommon and usually from supplements.",
 
430
  low="A low ferritin is the most specific sign of low iron stores and a common cause of anemia.",
431
  questions=("Does my ferritin explain my hemoglobin and MCV?", "Should we look for a source of iron loss?"),
432
  ),
433
+ "Zinc": MarkerKB(
434
+ high="A high zinc level is uncommon and may reflect excess supplementation.",
435
+ low="A low zinc level may relate to poor intake, malabsorption, inflammation, or increased losses.",
436
+ questions=("Am I taking zinc or other mineral supplements?",),
437
+ ),
438
+ "Copper": MarkerKB(
439
+ high="A high copper level can rise with inflammation, pregnancy, estrogen therapy, or copper disorders.",
440
+ low="A low copper level may cause anemia or nerve problems and can occur with excess zinc intake.",
441
+ questions=("Should copper be interpreted with ceruloplasmin and zinc?",),
442
+ ),
443
+ "Ceruloplasmin": MarkerKB(
444
+ high="A high ceruloplasmin may rise with inflammation, pregnancy, or estrogen therapy.",
445
+ low="A low ceruloplasmin can appear in copper deficiency or Wilson disease workups.",
446
+ questions=("Does this fit with copper and liver tests?",),
447
+ ),
448
+ "Selenium": MarkerKB(
449
+ high="A high selenium level is usually related to excess supplementation and can be toxic.",
450
+ low="A low selenium level may reflect poor intake, malabsorption, or severe illness.",
451
+ questions=("Am I taking selenium-containing supplements?",),
452
+ ),
453
+ "Vitamin E": MarkerKB(
454
+ high="A high vitamin E level is usually supplement-related and may affect bleeding risk at high intakes.",
455
+ low="A low vitamin E level may occur with fat malabsorption and can affect nerves and red cells.",
456
+ questions=("Could fat absorption or supplements explain this?",),
457
+ ),
458
  "HbA1c": MarkerKB(
459
  high="A high HbA1c reflects higher average blood sugar over ~3 months and is used to screen for prediabetes and diabetes.",
460
  low="A low HbA1c is generally not a concern.",
 
522
  low="A negative rheumatoid factor does not rule out arthritis.",
523
  questions=("Do my joints hurt or swell, especially in the morning?",),
524
  ),
525
+ "Anti-CCP Antibodies": MarkerKB(
526
+ high="A high anti-CCP result is more specific for rheumatoid arthritis than rheumatoid factor in the right symptom pattern.",
527
+ low="A low anti-CCP result makes anti-CCP-positive rheumatoid arthritis less likely.",
528
+ questions=("Does this match joint symptoms or imaging?",),
529
+ ),
530
+ "Immunoglobulin G": MarkerKB(
531
+ high="A high IgG may reflect chronic inflammation, infection, autoimmune disease, liver disease, or monoclonal protein.",
532
+ low="A low IgG may reflect immune deficiency, protein loss, or treatment effects.",
533
+ questions=("Should this be read with serum protein electrophoresis or vaccine responses?",),
534
+ ),
535
+ "Immunoglobulin A": MarkerKB(
536
+ high="A high IgA may reflect inflammation, liver disease, mucosal immune activation, or monoclonal protein.",
537
+ low="A low IgA can be selective and may affect interpretation of some celiac tests.",
538
+ questions=("Does low IgA affect any antibody tests I had?",),
539
+ ),
540
+ "Immunoglobulin M": MarkerKB(
541
+ high="A high IgM may appear with recent immune stimulation or some monoclonal protein disorders.",
542
+ low="A low IgM may reflect immune deficiency or treatment effects.",
543
+ questions=("Is this a persistent pattern across immunoglobulins?",),
544
+ ),
545
+ "Immunoglobulin E": MarkerKB(
546
+ high="A high IgE is commonly associated with allergies, eczema, asthma, or parasite exposure.",
547
+ low="A low IgE is usually not clinically significant.",
548
+ questions=("Could allergy or asthma explain this?",),
549
+ ),
550
  # --- Cardiac ---
551
  "BNP": MarkerKB(
552
  high="A high BNP suggests the heart is under strain, as in heart failure or fluid overload.",
553
  low="A low BNP makes significant heart failure less likely.",
554
  questions=("Do I have shortness of breath or leg swelling?",),
555
  ),
556
+ "NT-proBNP": MarkerKB(
557
+ high="A high NT-proBNP suggests heart strain or heart failure, but age, kidney function, and rhythm affect interpretation.",
558
+ low="A low NT-proBNP makes heart failure less likely in the right clinical context.",
559
+ questions=("How should this be interpreted with my age and kidney function?",),
560
+ ),
561
  "Troponin I": MarkerKB(
562
  high="A high troponin indicates heart-muscle injury and needs urgent clinical evaluation.",
563
  low="A low troponin is expected when there is no heart injury.",
 
573
  low="A low CK-MB is expected without heart injury.",
574
  questions=("Was this checked because of chest symptoms?",),
575
  ),
576
+ "Myoglobin": MarkerKB(
577
+ high="A high myoglobin may reflect skeletal or heart muscle injury and is less specific than troponin.",
578
+ low="A low myoglobin is expected without recent muscle injury.",
579
+ questions=("Could exercise, trauma, or muscle symptoms explain this?",),
580
+ ),
581
  # --- Hormones ---
582
  "Cortisol": MarkerKB(
583
  high="A high cortisol may reflect stress, steroids, Cushing syndrome, or lab timing.",
 
629
  low="A low ACTH may appear with steroid use or pituitary causes of low cortisol.",
630
  questions=("Should ACTH be read with cortisol?",),
631
  ),
632
+ "DHEA-S": MarkerKB(
633
+ high="A high DHEA-S suggests increased adrenal androgen production and may appear in PCOS or adrenal disorders.",
634
+ low="A low DHEA-S can occur with adrenal insufficiency, aging, or steroid exposure.",
635
+ questions=("Does this fit with testosterone and symptoms?",),
636
+ ),
637
+ "Androstenedione": MarkerKB(
638
+ high="A high androstenedione may reflect increased adrenal or ovarian androgen production.",
639
+ low="A low androstenedione is usually interpreted only in endocrine context.",
640
+ questions=("Should this be paired with DHEA-S and testosterone?",),
641
+ ),
642
+ "Anti-Mullerian Hormone": MarkerKB(
643
+ high="A high AMH may appear with a high ovarian follicle count, including some PCOS patterns.",
644
+ low="A low AMH may suggest lower ovarian reserve for age, but it does not predict natural fertility by itself.",
645
+ questions=("How should this be interpreted for my age and fertility goals?",),
646
+ ),
647
+ "Beta-hCG": MarkerKB(
648
+ high="A high beta-hCG most commonly reflects pregnancy, but it is also used in some pregnancy complications and tumor monitoring.",
649
+ low="A low or negative beta-hCG makes pregnancy less likely at the time tested.",
650
+ questions=("Should this be repeated to assess the trend?",),
651
+ ),
652
  "SHBG": MarkerKB(
653
  high="A high SHBG binds more testosterone and estrogen, lowering their free fractions.",
654
  low="A low SHBG is linked to insulin resistance and higher free androgen activity.",
 
665
  low="A low PSA is expected and does not rule out all prostate conditions.",
666
  questions=("Could recent exercise or infection have raised PSA?", "Is repeat testing planned?"),
667
  ),
668
+ "CEA": MarkerKB(
669
+ high="A high CEA may be followed in some cancers but can also rise with smoking, inflammation, or liver disease.",
670
+ low="A low CEA is expected and is most useful when compared with prior values during monitoring.",
671
+ questions=("Is this being used for monitoring rather than screening?",),
672
+ ),
673
+ "CA-125": MarkerKB(
674
+ high="A high CA-125 may be followed in ovarian cancer care but can also rise with benign gynecologic or inflammatory conditions.",
675
+ low="A low CA-125 is expected and does not rule out disease by itself.",
676
+ questions=("What trend or imaging is this being compared with?",),
677
+ ),
678
+ "CA 19-9": MarkerKB(
679
+ high="A high CA 19-9 may be followed in pancreaticobiliary cancer care but can also rise with bile duct blockage or inflammation.",
680
+ low="A low CA 19-9 is expected; some people do not make this marker even with disease.",
681
+ questions=("Is bilirubin or bile duct blockage affecting this result?",),
682
+ ),
683
+ "Alpha-Fetoprotein": MarkerKB(
684
+ high="A high AFP may be used in liver or germ-cell tumor evaluation and can also rise in pregnancy or liver disease.",
685
+ low="A low AFP is expected outside pregnancy and monitoring contexts.",
686
+ questions=("Should this be interpreted with liver imaging or pregnancy status?",),
687
+ ),
688
+ "CA 15-3": MarkerKB(
689
+ high="A high CA 15-3 may be used to monitor some breast cancers but is not specific enough to diagnose cancer alone.",
690
+ low="A low CA 15-3 is expected and is mainly useful as a trend during monitoring.",
691
+ questions=("Is this being compared with prior values?",),
692
+ ),
693
  "Folate": MarkerKB(
694
  high="A high folate is usually from supplements or fortified foods.",
695
  low="A low folate can cause anemia similar to B12 deficiency and affects DNA synthesis.",
kb/marker_videos.json CHANGED
@@ -2,119 +2,175 @@
2
  "schema_version": "1.0",
3
  "description": "Curated educational YouTube links per lab marker. Closest-topic fallbacks are noted in notes.",
4
  "videos": {
5
- "hemoglobin": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
6
- "rbc": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
7
- "hct": "https://www.youtube.com/watch?v=yF22BfXEO5g",
8
- "mcv": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
9
- "mch": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
10
- "mchc": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
11
- "rdw_cv": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
12
- "rdw_sd": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
13
- "wbc": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
14
- "neu_percent": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
15
- "lym_percent": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
16
- "mon_percent": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
17
- "eos_percent": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
18
- "bas_percent": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
19
- "lym_absolute": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
20
- "gra_absolute": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
21
- "plt": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
22
- "esr": "https://www.youtube.com/watch?v=MMsvv4P2eOM",
23
- "mpv": "https://www.youtube.com/watch?v=JVmPu8o2ycc",
24
- "neu_absolute": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
25
- "mon_absolute": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
26
- "eos_absolute": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
27
- "bas_absolute": "https://www.youtube.com/watch?v=mzPu7q6GNQA",
28
- "reticulocyte_count": "https://www.youtube.com/watch?v=MRzxsX5YG94",
29
- "glucose": "https://www.youtube.com/watch?v=-B-RVybvffU",
30
- "creatinine": "https://www.youtube.com/watch?v=z0LTY-im8iY",
31
- "egfr": "https://www.youtube.com/watch?v=z0LTY-im8iY",
32
- "bun": "https://www.youtube.com/watch?v=z0LTY-im8iY",
33
- "sodium": "https://www.youtube.com/watch?v=ZQ-sQU9wNxU",
34
- "potassium": "https://www.youtube.com/watch?v=ZQ-sQU9wNxU",
35
- "chloride": "https://www.youtube.com/watch?v=T_pCeQkpNX8",
36
- "calcium": "https://www.youtube.com/watch?v=ZQ-sQU9wNxU",
37
- "albumin": "https://www.youtube.com/watch?v=JiaMJaA34Jg",
38
- "total_protein": "https://www.youtube.com/watch?v=JiaMJaA34Jg",
39
- "globulin": "https://www.youtube.com/watch?v=JiaMJaA34Jg",
40
- "bicarbonate": "https://www.youtube.com/watch?v=-Ahjxv5FK0A",
41
- "anion_gap": "https://www.youtube.com/watch?v=G2NFzqdRWcU",
42
- "magnesium": "https://www.youtube.com/watch?v=ZQ-sQU9wNxU",
43
- "phosphate": "https://www.youtube.com/watch?v=ZQ-sQU9wNxU",
44
- "uric_acid": "https://www.youtube.com/watch?v=bznoU5bke4U",
45
- "serum_iron": "https://www.youtube.com/watch?v=6RbuFyt5Wpo",
46
- "tibc": "https://www.youtube.com/watch?v=6RbuFyt5Wpo",
47
- "transferrin_saturation": "https://www.youtube.com/watch?v=6RbuFyt5Wpo",
48
- "ldh": "https://www.youtube.com/watch?v=XpAO_0-dTAQ",
49
- "osmolality": "https://www.youtube.com/watch?v=VofGdSeafTA",
50
  "ammonia": "https://www.youtube.com/watch?v=kHB5e-4q7l8",
51
- "lactate": "https://www.youtube.com/watch?v=XuGPoQWzIco",
52
- "homocysteine": "https://www.youtube.com/watch?v=CUh5Flt4n1k",
53
- "cystatin_c": "https://www.youtube.com/watch?v=fv53QZRk4hs",
54
- "prealbumin": "https://www.youtube.com/watch?v=JiaMJaA34Jg",
55
- "beta_2_microglobulin": "https://www.youtube.com/watch?v=fv53QZRk4hs",
56
- "hba1c": "https://www.youtube.com/watch?v=-B-RVybvffU",
57
- "alt": "https://www.youtube.com/watch?v=JiaMJaA34Jg",
58
- "ast": "https://www.youtube.com/watch?v=JiaMJaA34Jg",
59
- "alp": "https://www.youtube.com/watch?v=JiaMJaA34Jg",
60
- "ggt": "https://www.youtube.com/watch?v=JiaMJaA34Jg",
61
- "total_bilirubin": "https://www.youtube.com/watch?v=JiaMJaA34Jg",
62
- "direct_bilirubin": "https://www.youtube.com/watch?v=JiaMJaA34Jg",
63
- "lipase": "https://www.youtube.com/watch?v=XpAO_0-dTAQ",
64
- "amylase": "https://www.youtube.com/watch?v=XpAO_0-dTAQ",
65
- "total_cholesterol": "https://www.youtube.com/watch?v=nurZ2nNovp8",
66
- "ldl_cholesterol": "https://www.youtube.com/watch?v=nurZ2nNovp8",
67
- "hdl_cholesterol": "https://www.youtube.com/watch?v=nurZ2nNovp8",
68
- "triglycerides": "https://www.youtube.com/watch?v=TrbQ5r31phk",
69
- "non_hdl_cholesterol": "https://www.youtube.com/watch?v=nurZ2nNovp8",
70
- "apolipoprotein_b": "https://www.youtube.com/watch?v=TrbQ5r31phk",
71
- "apolipoprotein_a1": "https://www.youtube.com/watch?v=TrbQ5r31phk",
72
- "lipoprotein_a": "https://www.youtube.com/watch?v=TrbQ5r31phk",
73
- "tsh": "https://www.youtube.com/watch?v=RuwM6M5ohW4",
74
- "free_t4": "https://www.youtube.com/watch?v=RuwM6M5ohW4",
75
- "free_t3": "https://www.youtube.com/watch?v=RuwM6M5ohW4",
76
- "total_t4": "https://www.youtube.com/watch?v=-naOgnjJlz0",
77
- "total_t3": "https://www.youtube.com/watch?v=-naOgnjJlz0",
78
- "anti_tpo_antibodies": "https://www.youtube.com/watch?v=ZaxjJ_c0J6o",
79
- "vitamin_d": "https://www.youtube.com/watch?v=YEnxruA-bsk",
80
- "vitamin_b12": "https://www.youtube.com/watch?v=CUh5Flt4n1k",
81
- "ferritin": "https://www.youtube.com/watch?v=6RbuFyt5Wpo",
82
- "folate": "https://www.youtube.com/watch?v=mYhb4470rCw",
83
- "vitamin_a": "https://www.youtube.com/watch?v=3G_e0tILSmM",
84
- "prothrombin_time": "https://www.youtube.com/watch?v=7sGGlvNeXkk",
85
- "inr": "https://www.youtube.com/watch?v=7sGGlvNeXkk",
86
- "aptt": "https://www.youtube.com/watch?v=7sGGlvNeXkk",
87
- "fibrinogen": "https://www.youtube.com/watch?v=SGzp9wqeu84",
88
- "d_dimer": "https://www.youtube.com/watch?v=XHbOxEMHeqc",
89
- "crp": "https://www.youtube.com/watch?v=MMsvv4P2eOM",
90
- "hs_crp": "https://www.youtube.com/watch?v=MMsvv4P2eOM",
91
- "procalcitonin": "https://www.youtube.com/watch?v=XuGPoQWzIco",
92
- "complement_c3": "https://www.youtube.com/watch?v=I_HoX_uM8EE",
93
- "complement_c4": "https://www.youtube.com/watch?v=I_HoX_uM8EE",
94
- "rheumatoid_factor": "https://www.youtube.com/watch?v=EB5zxdAQGzU",
95
- "bnp": "https://www.youtube.com/watch?v=ypYI_lmLD7g",
96
- "troponin_i": "https://www.youtube.com/watch?v=TBG9Jw3yd9I",
97
- "creatine_kinase": "https://www.youtube.com/watch?v=TBG9Jw3yd9I",
98
- "ck_mb": "https://www.youtube.com/watch?v=TBG9Jw3yd9I",
99
  "cortisol": "https://www.youtube.com/watch?v=rk2b3X6CU4w",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
  "insulin": "https://www.youtube.com/watch?v=w4jHtPUNg6E",
101
- "testosterone": "https://www.youtube.com/watch?v=mjROZrxBdv4",
102
- "estradiol": "https://www.youtube.com/watch?v=pzgUbyD6mCM",
103
- "prolactin": "https://www.youtube.com/watch?v=9VsI3UKvLiw",
104
- "fsh": "https://www.youtube.com/watch?v=h36poEtEbi4",
105
- "lh": "https://www.youtube.com/watch?v=h36poEtEbi4",
106
- "progesterone": "https://www.youtube.com/watch?v=pzgUbyD6mCM",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  "pth": "https://www.youtube.com/watch?v=y64aXKCkHk4",
108
- "acth": "https://www.youtube.com/watch?v=rk2b3X6CU4w",
109
- "shbg": "https://www.youtube.com/watch?v=9VsI3UKvLiw",
110
- "igf_1": "https://www.youtube.com/watch?v=_LKdNhF2WhI",
111
- "psa": "https://www.youtube.com/watch?v=bTgS0DuhaUU"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  },
113
  "notes": {
114
- "rdw_sd": "CBC overview discusses RDW percent; RDW-SD is not named separately.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  "mpv": "FBC/CBC guide covers platelets; MPV is not discussed in detail.",
116
- "gra_absolute": "ANC overview; granulocyte absolute combines neutrophils, eosinophils, and basophils.",
117
- "prealbumin": "LFT video discusses albumin; prealbumin is not covered directly.",
118
- "procalcitonin": "Sepsis lecture focuses on lactate; PCT is not the primary topic."
 
 
 
 
 
 
 
119
  }
120
  }
 
2
  "schema_version": "1.0",
3
  "description": "Curated educational YouTube links per lab marker. Closest-topic fallbacks are noted in notes.",
4
  "videos": {
5
+ "acth": "https://www.youtube.com/watch?v=rk2b3X6CU4w",
6
+ "albumin": "https://www.youtube.com/watch?v=z1LhGUAUsDg",
7
+ "alp": "https://www.youtube.com/watch?v=4E9KXGXUXcs",
8
+ "alpha_fetoprotein": "https://www.youtube.com/watch?v=CKp-TnOWDOg",
9
+ "alt": "https://www.youtube.com/watch?v=ZDGfAuQHA-w",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  "ammonia": "https://www.youtube.com/watch?v=kHB5e-4q7l8",
11
+ "amylase": "https://www.youtube.com/watch?v=gTbimcKKlKQ",
12
+ "androstenedione": "https://www.youtube.com/watch?v=BmIKhnE-G04",
13
+ "anion_gap": "https://www.youtube.com/watch?v=G2NFzqdRWcU",
14
+ "anti_ccp_antibodies": "https://www.youtube.com/watch?v=EB5zxdAQGzU",
15
+ "anti_mullerian_hormone": "https://www.youtube.com/watch?v=HiZSaDr2cBY",
16
+ "anti_tpo_antibodies": "https://www.youtube.com/watch?v=kg9fQ3A9IOA",
17
+ "apolipoprotein_a1": "https://www.youtube.com/watch?v=ckkpnuqDyLA",
18
+ "apolipoprotein_b": "https://www.youtube.com/watch?v=V7ywq_s7ATk",
19
+ "aptt": "https://www.youtube.com/watch?v=uiFicYWMZL0",
20
+ "ast": "https://www.youtube.com/watch?v=7_-ZtM0TieA",
21
+ "bas_absolute": "https://www.youtube.com/watch?v=sRIjKEkjWmU",
22
+ "bas_percent": "https://www.youtube.com/watch?v=VUAVvLkcN0M",
23
+ "beta_2_microglobulin": "https://www.youtube.com/watch?v=i2-_4wk30po",
24
+ "beta_hcg": "https://www.youtube.com/watch?v=rM3FVuamrVA",
25
+ "beta_hydroxybutyrate": "https://www.youtube.com/watch?v=-B-RVybvffU",
26
+ "bicarbonate": "https://www.youtube.com/watch?v=-Ahjxv5FK0A",
27
+ "bnp": "https://www.youtube.com/watch?v=QEt2lvWoMxA",
28
+ "bun": "https://www.youtube.com/watch?v=Q7odN31HK_Y",
29
+ "c_peptide": "https://www.youtube.com/watch?v=JHFQljIJGzM",
30
+ "ca_125": "https://www.youtube.com/watch?v=3VmLWc-F3rA",
31
+ "ca_15_3": "https://www.youtube.com/watch?v=JeV_T32QBv8",
32
+ "ca_19_9": "https://www.youtube.com/watch?v=gTCxRhgnj-Q",
33
+ "calcium": "https://www.youtube.com/watch?v=hj-Y4eZ0dkM",
34
+ "cea": "https://www.youtube.com/watch?v=uJNw9v6UUjE",
35
+ "ceruloplasmin": "https://www.youtube.com/watch?v=42kduAhoYlw",
36
+ "chloride": "https://www.youtube.com/watch?v=5Fuav99clbE",
37
+ "ck_mb": "https://www.youtube.com/watch?v=udVccTOnmrM",
38
+ "complement_c3": "https://www.youtube.com/watch?v=r_f5cvxwS6w",
39
+ "complement_c4": "https://www.youtube.com/watch?v=r_f5cvxwS6w",
40
+ "copper": "https://www.youtube.com/watch?v=42kduAhoYlw",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  "cortisol": "https://www.youtube.com/watch?v=rk2b3X6CU4w",
42
+ "creatine_kinase": "https://www.youtube.com/watch?v=loBxjfuUVj0",
43
+ "creatinine": "https://www.youtube.com/watch?v=l2tf-Pxc0wU",
44
+ "crp": "https://www.youtube.com/watch?v=zTFDB_dk_Gk",
45
+ "cystatin_c": "https://www.youtube.com/watch?v=upJcuKQ9ppQ",
46
+ "d_dimer": "https://www.youtube.com/watch?v=uTYlwmDSFvA",
47
+ "dhea_s": "https://www.youtube.com/watch?v=XWn-DVX_QVE",
48
+ "direct_bilirubin": "https://www.youtube.com/watch?v=9RixUyMPhO0",
49
+ "egfr": "https://www.youtube.com/watch?v=fFn0ygOOBuI",
50
+ "eos_absolute": "https://www.youtube.com/watch?v=7gmKTpODT8o",
51
+ "eos_percent": "https://www.youtube.com/watch?v=rtnfv_2HSak",
52
+ "erythropoietin": "https://www.youtube.com/watch?v=wqMQjsf1YD4",
53
+ "esr": "https://www.youtube.com/watch?v=-ulccBGAvbY",
54
+ "estradiol": "https://www.youtube.com/watch?v=pOaUnf3MKs8",
55
+ "ferritin": "https://www.youtube.com/watch?v=aPSfIPtho08",
56
+ "fibrinogen": "https://www.youtube.com/watch?v=HqmRkEoUe-8",
57
+ "folate": "https://www.youtube.com/watch?v=dO0aUSqZ_bs",
58
+ "free_t3": "https://www.youtube.com/watch?v=oz8HFUqwDgw",
59
+ "free_t4": "https://www.youtube.com/watch?v=IHaH9mlCdVY",
60
+ "fructosamine": "https://www.youtube.com/watch?v=tXW-qGeTNFk",
61
+ "fsh": "https://www.youtube.com/watch?v=UL0PFu5fPKA",
62
+ "g6pd": "https://www.youtube.com/watch?v=iTh-hUU5mxE",
63
+ "ggt": "https://www.youtube.com/watch?v=c0uISl0fna0",
64
+ "globulin": "https://www.youtube.com/watch?v=EBf97p7AeZc",
65
+ "glucose": "https://www.youtube.com/watch?v=V4PJ7n-RDf8",
66
+ "gra_absolute": "https://www.youtube.com/watch?v=VUAVvLkcN0M",
67
+ "haptoglobin": "https://www.youtube.com/watch?v=QR_hcSow4OI",
68
+ "hba1c": "https://www.youtube.com/watch?v=V4PJ7n-RDf8",
69
+ "hct": "https://www.youtube.com/watch?v=D5PVCKWLgXU",
70
+ "hdl_cholesterol": "https://www.youtube.com/watch?v=KeoZck3T824",
71
+ "hemoglobin": "https://www.youtube.com/watch?v=E7c4zr-FHcA",
72
+ "homocysteine": "https://www.youtube.com/watch?v=XbX9K1OtFFs",
73
+ "hs_crp": "https://www.youtube.com/watch?v=eRNFtwzyyCo",
74
+ "igf_1": "https://www.youtube.com/watch?v=_LKdNhF2WhI",
75
+ "immunoglobulin_a": "https://www.youtube.com/watch?v=pkn3qA7s-NI",
76
+ "immunoglobulin_e": "https://www.youtube.com/watch?v=z95-fg7bzLA",
77
+ "immunoglobulin_g": "https://www.youtube.com/watch?v=d_3VZ5vDiHI",
78
+ "immunoglobulin_m": "https://www.youtube.com/watch?v=0ztF-419fac",
79
+ "inr": "https://www.youtube.com/watch?v=kCz5Rde9Gp0",
80
  "insulin": "https://www.youtube.com/watch?v=w4jHtPUNg6E",
81
+ "lactate": "https://www.youtube.com/watch?v=XuGPoQWzIco",
82
+ "ldh": "https://www.youtube.com/watch?v=cr0cnpUEYSM",
83
+ "ldl_cholesterol": "https://www.youtube.com/watch?v=EfdwqypYAlU",
84
+ "lh": "https://www.youtube.com/watch?v=JvadRkqsuvQ",
85
+ "lipase": "https://www.youtube.com/watch?v=gTbimcKKlKQ",
86
+ "lipoprotein_a": "https://www.youtube.com/watch?v=VSCtsOjQEkk",
87
+ "lym_absolute": "https://www.youtube.com/watch?v=RBdWjr0BNj8",
88
+ "lym_percent": "https://www.youtube.com/watch?v=VUAVvLkcN0M",
89
+ "magnesium": "https://www.youtube.com/watch?v=AE0_1dIgVQc",
90
+ "mch": "https://www.youtube.com/watch?v=WiuD3wUXHgA",
91
+ "mchc": "https://www.youtube.com/watch?v=cZXr-91hNr8",
92
+ "mcv": "https://www.youtube.com/watch?v=OQoV-QpRnLk",
93
+ "methylmalonic_acid": "https://www.youtube.com/watch?v=ky-Mu5yVyuU",
94
+ "mon_absolute": "https://www.youtube.com/watch?v=se5Jy1BIJCU",
95
+ "mon_percent": "https://www.youtube.com/watch?v=VUAVvLkcN0M",
96
+ "mpv": "https://www.youtube.com/watch?v=gvmOvYazV40",
97
+ "myoglobin": "https://www.youtube.com/watch?v=udVccTOnmrM",
98
+ "neu_absolute": "https://www.youtube.com/watch?v=Fju2R0gDTf8",
99
+ "neu_percent": "https://www.youtube.com/watch?v=VUAVvLkcN0M",
100
+ "non_hdl_cholesterol": "https://www.youtube.com/watch?v=eoUR7J0J1cA",
101
+ "nt_probnp": "https://www.youtube.com/watch?v=QEt2lvWoMxA",
102
+ "osmolality": "https://www.youtube.com/watch?v=VofGdSeafTA",
103
+ "phosphate": "https://www.youtube.com/watch?v=I0-ltFTa0Sc",
104
+ "plt": "https://www.youtube.com/watch?v=_1ckWNEwSDA",
105
+ "potassium": "https://www.youtube.com/watch?v=obJk-dUbQR8",
106
+ "prealbumin": "https://www.youtube.com/watch?v=UP7Waa6xrCY",
107
+ "procalcitonin": "https://www.youtube.com/watch?v=XgvB_s-xlaQ",
108
+ "progesterone": "https://www.youtube.com/watch?v=A1uPKIHS4Cs",
109
+ "prolactin": "https://www.youtube.com/watch?v=GE85xI4WoAc",
110
+ "prothrombin_time": "https://www.youtube.com/watch?v=tY28cQSBy3g",
111
+ "psa": "https://www.youtube.com/watch?v=bTgS0DuhaUU",
112
  "pth": "https://www.youtube.com/watch?v=y64aXKCkHk4",
113
+ "rbc": "https://www.youtube.com/watch?v=Ho_hsOrdBQQ",
114
+ "rdw_cv": "https://www.youtube.com/watch?v=fdlLgdgywlU",
115
+ "rdw_sd": "https://www.youtube.com/watch?v=fdlLgdgywlU",
116
+ "reticulocyte_count": "https://www.youtube.com/watch?v=vfw2rPn_SuM",
117
+ "rheumatoid_factor": "https://www.youtube.com/watch?v=EB5zxdAQGzU",
118
+ "selenium": "https://www.youtube.com/watch?v=BSeV79orP6I",
119
+ "serum_iron": "https://www.youtube.com/watch?v=KnKTgmAu0Pc",
120
+ "shbg": "https://www.youtube.com/watch?v=MBhQR-WzqUg",
121
+ "sodium": "https://www.youtube.com/watch?v=Qzct2Qmjo8c",
122
+ "testosterone": "https://www.youtube.com/watch?v=MBhQR-WzqUg",
123
+ "thyroglobulin_antibodies": "https://www.youtube.com/watch?v=q6LzDINcqDM",
124
+ "tibc": "https://www.youtube.com/watch?v=YczPj71BFPY",
125
+ "total_bilirubin": "https://www.youtube.com/watch?v=Aew1gWVLYNU",
126
+ "total_cholesterol": "https://www.youtube.com/watch?v=_SGyJU9BL6o",
127
+ "total_protein": "https://www.youtube.com/watch?v=V-yepa6wLT4",
128
+ "total_t3": "https://www.youtube.com/watch?v=SVth4eAKlY8",
129
+ "total_t4": "https://www.youtube.com/watch?v=0QrcY2IV7No",
130
+ "transferrin": "https://www.youtube.com/watch?v=j9mR9luWBQY",
131
+ "transferrin_saturation": "https://www.youtube.com/watch?v=_ziD0NbFjkM",
132
+ "triglycerides": "https://www.youtube.com/watch?v=rOiLRsWhwsQ",
133
+ "troponin_i": "https://www.youtube.com/watch?v=udVccTOnmrM",
134
+ "tsh": "https://www.youtube.com/watch?v=Udaqw1gtKvc",
135
+ "tsh_receptor_antibodies": "https://www.youtube.com/watch?v=lKIhKsljksk",
136
+ "uric_acid": "https://www.youtube.com/watch?v=bznoU5bke4U",
137
+ "vitamin_a": "https://www.youtube.com/watch?v=QcsiBH_j2MA",
138
+ "vitamin_b12": "https://www.youtube.com/watch?v=CUh5Flt4n1k",
139
+ "vitamin_d": "https://www.youtube.com/watch?v=YEnxruA-bsk",
140
+ "vitamin_e": "https://www.youtube.com/watch?v=QcsiBH_j2MA",
141
+ "wbc": "https://www.youtube.com/watch?v=VUAVvLkcN0M",
142
+ "zinc": "https://www.youtube.com/watch?v=BSeV79orP6I"
143
  },
144
  "notes": {
145
+ "alpha_fetoprotein": "Tumor-marker overview covers AFP with other markers.",
146
+ "androstenedione": "PCOS lab overview includes androgen-marker context.",
147
+ "anti_ccp_antibodies": "Rheumatoid arthritis overview; anti-CCP is correlated through RA evaluation.",
148
+ "anti_mullerian_hormone": "Fertility hormone-testing overview includes AMH and ovarian-reserve timing.",
149
+ "ast": "AST/ALT lab-values video covers AST directly alongside ALT.",
150
+ "beta_hcg": "Reproductive-cycle overview is a broad pregnancy/reproductive hormone context; beta-hCG is not the primary topic.",
151
+ "beta_hydroxybutyrate": "Diabetes/DKA overview covers ketone production; beta-hydroxybutyrate is not the only focus.",
152
+ "ca_125": "Tumor-marker overview covers CA-125 with other markers.",
153
+ "ca_15_3": "Direct CA 15-3 blood-test video; marker is for monitoring context rather than diagnosis.",
154
+ "cea": "Tumor-marker overview covers CEA with other markers.",
155
+ "ceruloplasmin": "Trace-mineral/copper overview; ceruloplasmin is linked to copper interpretation.",
156
+ "copper": "Trace-mineral lab overview covering copper among other minerals.",
157
+ "free_t3": "Free T3/Free T4 video focuses on free thyroid hormones together.",
158
+ "fructosamine": "Diabetes overview; fructosamine is a shorter-term glycemic marker and is not the primary topic.",
159
+ "gra_absolute": "WBC differential overview; granulocyte absolute combines neutrophils, eosinophils, and basophils.",
160
+ "hct": "Hemoglobin/Hematocrit lab-values video covers hematocrit directly alongside hemoglobin.",
161
+ "hdl_cholesterol": "HDL/LDL cholesterol video focuses on HDL in direct lipid-marker context.",
162
+ "immunoglobulin_m": "IgG/IgM antibody-testing video covers IgM directly alongside IgG.",
163
+ "mcv": "Anemia interpretation video uses MCV directly; also discusses MCH context.",
164
  "mpv": "FBC/CBC guide covers platelets; MPV is not discussed in detail.",
165
+ "myoglobin": "Cardiac biomarker overview covers myoglobin with troponin and CK-MB.",
166
+ "nt_probnp": "Heart-failure overview; NT-proBNP is a heart-strain marker like BNP but not the primary title.",
167
+ "procalcitonin": "Sepsis lecture focuses on lactate; PCT is not the primary topic.",
168
+ "selenium": "Trace-mineral lab overview covering selenium among other minerals.",
169
+ "serum_iron": "Iron blood-test video covers serum iron with related iron-panel markers.",
170
+ "total_cholesterol": "Total cholesterol lab-values video also covers triglycerides, but total cholesterol is a primary topic.",
171
+ "total_t4": "T3/T4 lab-values video covers total thyroid hormones together.",
172
+ "tsh_receptor_antibodies": "Graves/hyperthyroidism overview; TRAb is discussed as thyroid autoimmunity context rather than as a standalone lab lecture.",
173
+ "vitamin_e": "Fat-soluble vitamin overview covering vitamin E with vitamins A/D/K.",
174
+ "zinc": "Trace-mineral lab overview covering zinc among other minerals."
175
  }
176
  }
scripts/expand_lab_knowledge_graph.py CHANGED
@@ -30,6 +30,9 @@ MARKER_IDS: dict[str, str] = {
30
  "Absolute Eosinophil Count": "eos_absolute",
31
  "Absolute Basophil Count": "bas_absolute",
32
  "Reticulocyte Count": "reticulocyte_count",
 
 
 
33
  "Glucose": "glucose",
34
  "Creatinine": "creatinine",
35
  "eGFR": "egfr",
@@ -48,15 +51,20 @@ MARKER_IDS: dict[str, str] = {
48
  "Uric Acid": "uric_acid",
49
  "Serum Iron": "serum_iron",
50
  "TIBC": "tibc",
 
51
  "Transferrin Saturation": "transferrin_saturation",
52
  "LDH": "ldh",
53
  "Osmolality": "osmolality",
54
  "Ammonia": "ammonia",
55
  "Lactate": "lactate",
56
  "Homocysteine": "homocysteine",
 
57
  "Cystatin C": "cystatin_c",
58
  "Prealbumin": "prealbumin",
59
  "Beta-2 Microglobulin": "beta_2_microglobulin",
 
 
 
60
  "HbA1c": "hba1c",
61
  "ALT": "alt",
62
  "AST": "ast",
@@ -80,9 +88,16 @@ MARKER_IDS: dict[str, str] = {
80
  "Total T4": "total_t4",
81
  "Total T3": "total_t3",
82
  "Anti-TPO Antibodies": "anti_tpo_antibodies",
 
 
83
  "Vitamin D": "vitamin_d",
84
  "Vitamin B12": "vitamin_b12",
85
  "Ferritin": "ferritin",
 
 
 
 
 
86
  "Prothrombin Time": "prothrombin_time",
87
  "INR": "inr",
88
  "aPTT": "aptt",
@@ -95,10 +110,17 @@ MARKER_IDS: dict[str, str] = {
95
  "Complement C3": "complement_c3",
96
  "Complement C4": "complement_c4",
97
  "Rheumatoid Factor": "rheumatoid_factor",
 
 
 
 
 
98
  "BNP": "bnp",
 
99
  "Troponin I": "troponin_i",
100
  "Creatine Kinase": "creatine_kinase",
101
  "CK-MB": "ck_mb",
 
102
  "Cortisol": "cortisol",
103
  "Insulin": "insulin",
104
  "Testosterone": "testosterone",
@@ -109,15 +131,24 @@ MARKER_IDS: dict[str, str] = {
109
  "Progesterone": "progesterone",
110
  "Parathyroid Hormone": "pth",
111
  "ACTH": "acth",
 
 
 
 
112
  "SHBG": "shbg",
113
  "IGF-1": "igf_1",
114
  "PSA": "psa",
 
 
 
 
 
115
  "Folate": "folate",
116
  "Vitamin A": "vitamin_a",
117
  }
118
 
119
  EXTRA_ALIAS_UPDATES: dict[str, list[str]] = {
120
- "gra_absolute": ["ANC", "Absolute Neutrophil Count", "Abs Neutrophils", "Neutrophils Absolute"],
121
  "neu_absolute": ["ANC", "Absolute Neutrophil Count", "Abs Neutrophils", "Neutrophils Absolute"],
122
  "mon_absolute": ["AMC", "Absolute Monocyte Count", "Abs Monocytes", "Monocytes Absolute"],
123
  "eos_absolute": ["AEC", "Absolute Eosinophil Count", "Abs Eosinophils", "Eosinophils Absolute"],
@@ -335,9 +366,9 @@ def _why_important(name: str, kb_entry: Any) -> str:
335
  return f"Abnormal {name} values can be clinically meaningful and should be interpreted with symptoms, history, and related tests."
336
  parts = []
337
  if kb_entry.high:
338
- parts.append(f"A high value may be associated with {kb_entry.high[0].lower()}{kb_entry.high[1:]}")
339
  if kb_entry.low:
340
- parts.append(f"A low value may be associated with {kb_entry.low[0].lower()}{kb_entry.low[1:]}")
341
  return " ".join(parts) if parts else f"{name} helps clinicians evaluate related organ systems and disease patterns."
342
 
343
 
@@ -376,6 +407,27 @@ def _merge_aliases(test: dict[str, Any], extra: list[str]) -> None:
376
  test["aliases"] = aliases
377
 
378
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
379
  def main() -> None:
380
  import sys
381
 
@@ -396,7 +448,7 @@ def main() -> None:
396
  kb_entry = KB.get(marker.name)
397
  if test_id in existing_by_id:
398
  test = existing_by_id[test_id]
399
- test["video_url"] = video_url
400
  _merge_aliases(test, list(marker.aliases))
401
  continue
402
  existing_by_id[test_id] = _build_test(marker, test_id, video_url, kb_entry)
@@ -406,6 +458,17 @@ def main() -> None:
406
  if legacy_id in existing_by_id:
407
  existing_by_id[legacy_id]["video_url"] = videos.get(legacy_id, existing_by_id[legacy_id].get("video_url", ""))
408
  _merge_aliases(existing_by_id[legacy_id], EXTRA_ALIAS_UPDATES.get(legacy_id, []))
 
 
 
 
 
 
 
 
 
 
 
409
 
410
  for test_id, extra_aliases in EXTRA_ALIAS_UPDATES.items():
411
  if test_id in existing_by_id:
 
30
  "Absolute Eosinophil Count": "eos_absolute",
31
  "Absolute Basophil Count": "bas_absolute",
32
  "Reticulocyte Count": "reticulocyte_count",
33
+ "Haptoglobin": "haptoglobin",
34
+ "G6PD": "g6pd",
35
+ "Erythropoietin": "erythropoietin",
36
  "Glucose": "glucose",
37
  "Creatinine": "creatinine",
38
  "eGFR": "egfr",
 
51
  "Uric Acid": "uric_acid",
52
  "Serum Iron": "serum_iron",
53
  "TIBC": "tibc",
54
+ "Transferrin": "transferrin",
55
  "Transferrin Saturation": "transferrin_saturation",
56
  "LDH": "ldh",
57
  "Osmolality": "osmolality",
58
  "Ammonia": "ammonia",
59
  "Lactate": "lactate",
60
  "Homocysteine": "homocysteine",
61
+ "Methylmalonic Acid": "methylmalonic_acid",
62
  "Cystatin C": "cystatin_c",
63
  "Prealbumin": "prealbumin",
64
  "Beta-2 Microglobulin": "beta_2_microglobulin",
65
+ "C-Peptide": "c_peptide",
66
+ "Fructosamine": "fructosamine",
67
+ "Beta-Hydroxybutyrate": "beta_hydroxybutyrate",
68
  "HbA1c": "hba1c",
69
  "ALT": "alt",
70
  "AST": "ast",
 
88
  "Total T4": "total_t4",
89
  "Total T3": "total_t3",
90
  "Anti-TPO Antibodies": "anti_tpo_antibodies",
91
+ "TSH Receptor Antibodies": "tsh_receptor_antibodies",
92
+ "Thyroglobulin Antibodies": "thyroglobulin_antibodies",
93
  "Vitamin D": "vitamin_d",
94
  "Vitamin B12": "vitamin_b12",
95
  "Ferritin": "ferritin",
96
+ "Zinc": "zinc",
97
+ "Copper": "copper",
98
+ "Ceruloplasmin": "ceruloplasmin",
99
+ "Selenium": "selenium",
100
+ "Vitamin E": "vitamin_e",
101
  "Prothrombin Time": "prothrombin_time",
102
  "INR": "inr",
103
  "aPTT": "aptt",
 
110
  "Complement C3": "complement_c3",
111
  "Complement C4": "complement_c4",
112
  "Rheumatoid Factor": "rheumatoid_factor",
113
+ "Anti-CCP Antibodies": "anti_ccp_antibodies",
114
+ "Immunoglobulin G": "immunoglobulin_g",
115
+ "Immunoglobulin A": "immunoglobulin_a",
116
+ "Immunoglobulin M": "immunoglobulin_m",
117
+ "Immunoglobulin E": "immunoglobulin_e",
118
  "BNP": "bnp",
119
+ "NT-proBNP": "nt_probnp",
120
  "Troponin I": "troponin_i",
121
  "Creatine Kinase": "creatine_kinase",
122
  "CK-MB": "ck_mb",
123
+ "Myoglobin": "myoglobin",
124
  "Cortisol": "cortisol",
125
  "Insulin": "insulin",
126
  "Testosterone": "testosterone",
 
131
  "Progesterone": "progesterone",
132
  "Parathyroid Hormone": "pth",
133
  "ACTH": "acth",
134
+ "DHEA-S": "dhea_s",
135
+ "Androstenedione": "androstenedione",
136
+ "Anti-Mullerian Hormone": "anti_mullerian_hormone",
137
+ "Beta-hCG": "beta_hcg",
138
  "SHBG": "shbg",
139
  "IGF-1": "igf_1",
140
  "PSA": "psa",
141
+ "CEA": "cea",
142
+ "CA-125": "ca_125",
143
+ "CA 19-9": "ca_19_9",
144
+ "Alpha-Fetoprotein": "alpha_fetoprotein",
145
+ "CA 15-3": "ca_15_3",
146
  "Folate": "folate",
147
  "Vitamin A": "vitamin_a",
148
  }
149
 
150
  EXTRA_ALIAS_UPDATES: dict[str, list[str]] = {
151
+ "gra_absolute": ["Absolute Granulocyte Count", "Granulocytes Absolute", "Abs Granulocytes"],
152
  "neu_absolute": ["ANC", "Absolute Neutrophil Count", "Abs Neutrophils", "Neutrophils Absolute"],
153
  "mon_absolute": ["AMC", "Absolute Monocyte Count", "Abs Monocytes", "Monocytes Absolute"],
154
  "eos_absolute": ["AEC", "Absolute Eosinophil Count", "Abs Eosinophils", "Eosinophils Absolute"],
 
366
  return f"Abnormal {name} values can be clinically meaningful and should be interpreted with symptoms, history, and related tests."
367
  parts = []
368
  if kb_entry.high:
369
+ parts.append(kb_entry.high)
370
  if kb_entry.low:
371
+ parts.append(kb_entry.low)
372
  return " ".join(parts) if parts else f"{name} helps clinicians evaluate related organ systems and disease patterns."
373
 
374
 
 
407
  test["aliases"] = aliases
408
 
409
 
410
+ def _remove_aliases(test: dict[str, Any], stale: set[str]) -> None:
411
+ test["aliases"] = [alias for alias in test.get("aliases", []) if alias.casefold() not in stale]
412
+
413
+
414
+ def _refresh_generated_fields(test: dict[str, Any], marker: Any, test_id: str, video_url: str, kb_entry: Any) -> None:
415
+ rebuilt = _build_test(marker, test_id, video_url, kb_entry)
416
+ for key in (
417
+ "display_name",
418
+ "category",
419
+ "unit",
420
+ "description",
421
+ "why_important",
422
+ "sex_significance",
423
+ "instructions_to_improve",
424
+ "statistics_per_group_age",
425
+ "video_url",
426
+ ):
427
+ test[key] = rebuilt[key]
428
+ _merge_aliases(test, rebuilt["aliases"])
429
+
430
+
431
  def main() -> None:
432
  import sys
433
 
 
448
  kb_entry = KB.get(marker.name)
449
  if test_id in existing_by_id:
450
  test = existing_by_id[test_id]
451
+ _refresh_generated_fields(test, marker, test_id, video_url, kb_entry)
452
  _merge_aliases(test, list(marker.aliases))
453
  continue
454
  existing_by_id[test_id] = _build_test(marker, test_id, video_url, kb_entry)
 
458
  if legacy_id in existing_by_id:
459
  existing_by_id[legacy_id]["video_url"] = videos.get(legacy_id, existing_by_id[legacy_id].get("video_url", ""))
460
  _merge_aliases(existing_by_id[legacy_id], EXTRA_ALIAS_UPDATES.get(legacy_id, []))
461
+ if legacy_id == "gra_absolute":
462
+ _remove_aliases(
463
+ existing_by_id[legacy_id],
464
+ {
465
+ "anc",
466
+ "anc when neutrophil-dominant",
467
+ "absolute neutrophil count",
468
+ "abs neutrophils",
469
+ "neutrophils absolute",
470
+ },
471
+ )
472
 
473
  for test_id, extra_aliases in EXTRA_ALIAS_UPDATES.items():
474
  if test_id in existing_by_id:
src/markers.py CHANGED
@@ -69,6 +69,9 @@ MARKERS: tuple[Marker, ...] = (
69
  Marker("Absolute Eosinophil Count", "10^3/uL", 0, 0.5, "CBC", "count of allergy and parasite-related white cells", ("AEC", "Eosinophils Absolute", "Abs Eosinophils")),
70
  Marker("Absolute Basophil Count", "10^3/uL", 0, 0.2, "CBC", "count of histamine-related white cells", ("ABC", "Basophils Absolute", "Abs Basophils")),
71
  Marker("Reticulocyte Count", "%", 0.5, 2.5, "CBC", "young red cells recently released from bone marrow", ("Retic Count", "Retics")),
 
 
 
72
  # --- Metabolic panel ---
73
  Marker("Glucose", "mg/dL", 70, 99, "Metabolic", "blood sugar level", ("Fasting Glucose", "GLU", "Blood Sugar", "FBS", "RBS", "Fasting Blood Sugar")),
74
  Marker("Creatinine", "mg/dL", 0.7, 1.3, "Metabolic", "kidney-function waste product", ("Cr", "Serum Creatinine")),
@@ -88,15 +91,20 @@ MARKERS: tuple[Marker, ...] = (
88
  Marker("Uric Acid", "mg/dL", 3.5, 7.2, "Metabolic", "breakdown product of purines; linked to gout", ("UA", "Urate")),
89
  Marker("Serum Iron", "mcg/dL", 60, 170, "Metabolic", "circulating iron available for red-cell production", ("Iron", "Fe", "Iron, Serum")),
90
  Marker("TIBC", "mcg/dL", 250, 450, "Metabolic", "blood's capacity to bind and transport iron", ("Total Iron Binding Capacity", "Iron Binding Capacity")),
 
91
  Marker("Transferrin Saturation", "%", 20, 50, "Metabolic", "percent of iron-binding sites occupied", ("TSAT", "Iron Saturation")),
92
  Marker("LDH", "U/L", 140, 280, "Metabolic", "enzyme released when cells are damaged", ("Lactate Dehydrogenase",)),
93
  Marker("Osmolality", "mOsm/kg", 275, 295, "Metabolic", "concentration of particles in the blood", ("Serum Osmolality",)),
94
  Marker("Ammonia", "mcg/dL", 15, 45, "Metabolic", "waste product processed by the liver", ("NH3", "Blood Ammonia")),
95
  Marker("Lactate", "mmol/L", 0.5, 2.0, "Metabolic", "byproduct of anaerobic metabolism", ("Lactic Acid", "Lactate, Blood")),
96
  Marker("Homocysteine", "umol/L", 5, 15, "Metabolic", "amino acid linked to B-vitamin status and vascular risk", ("Hcy",)),
 
97
  Marker("Cystatin C", "mg/L", 0.53, 0.95, "Metabolic", "kidney-function marker less affected by muscle mass", ("CysC",)),
98
  Marker("Prealbumin", "mg/dL", 20, 40, "Metabolic", "short-lived protein reflecting recent nutrition", ("Transthyretin",)),
99
  Marker("Beta-2 Microglobulin", "mg/L", 0.7, 1.8, "Metabolic", "small protein from cell turnover; kidney and immune marker", ("B2M", "β2-Microglobulin")),
 
 
 
100
  # --- Liver enzymes ---
101
  Marker("ALT", "U/L", 7, 56, "Liver", "liver enzyme released when liver cells are stressed", ("Alanine Aminotransferase", "SGPT")),
102
  Marker("AST", "U/L", 10, 40, "Liver", "enzyme from liver and muscle cells", ("Aspartate Aminotransferase", "SGOT")),
@@ -122,10 +130,17 @@ MARKERS: tuple[Marker, ...] = (
122
  Marker("Total T4", "mcg/dL", 4.5, 12.0, "Thyroid", "total thyroxine including bound and free", ("T4", "Thyroxine")),
123
  Marker("Total T3", "ng/dL", 80, 200, "Thyroid", "total triiodothyronine including bound and free", ("T3", "Triiodothyronine")),
124
  Marker("Anti-TPO Antibodies", "IU/mL", None, 35, "Thyroid", "antibodies against thyroid peroxidase", ("TPO Antibodies", "Thyroid Peroxidase Antibodies", "Anti-TPO")),
 
 
125
  # --- Vitamins / iron ---
126
  Marker("Vitamin D", "ng/mL", 30, 100, "Vitamin", "vitamin for bone and immune health", ("25-OH Vitamin D", "25-Hydroxyvitamin D", "Vit D")),
127
  Marker("Vitamin B12", "pg/mL", 200, 900, "Vitamin", "vitamin for nerves and red-cell production", ("B12", "Cobalamin")),
128
  Marker("Ferritin", "ng/mL", 30, 400, "Vitamin", "stored-iron protein", ("FERR",)),
 
 
 
 
 
129
  Marker("HbA1c", "%", 4.0, 5.6, "Metabolic", "average blood sugar over ~3 months", ("A1c", "Hemoglobin A1c", "Glycated Hemoglobin")),
130
  # --- Coagulation ---
131
  Marker("Prothrombin Time", "seconds", 11, 13.5, "Coagulation", "time for the clotting cascade to form fibrin", ("PT",)),
@@ -141,11 +156,18 @@ MARKERS: tuple[Marker, ...] = (
141
  Marker("Complement C3", "mg/dL", 90, 180, "Inflammation", "complement protein in immune activation", ("C3",)),
142
  Marker("Complement C4", "mg/dL", 10, 40, "Inflammation", "complement protein in immune activation", ("C4",)),
143
  Marker("Rheumatoid Factor", "IU/mL", None, 14, "Inflammation", "antibody sometimes seen in autoimmune arthritis", ("RF",)),
 
 
 
 
 
144
  # --- Cardiac ---
145
  Marker("BNP", "pg/mL", None, 100, "Cardiac", "hormone released when the heart is stretched", ("B-Type Natriuretic Peptide", "Brain Natriuretic Peptide")),
 
146
  Marker("Troponin I", "ng/mL", None, 0.04, "Cardiac", "heart-muscle protein released with injury", ("TnI", "High-Sensitivity Troponin I")),
147
  Marker("Creatine Kinase", "U/L", 30, 200, "Cardiac", "enzyme from muscle including heart and skeletal", ("CK", "CPK", "Creatine Phosphokinase")),
148
  Marker("CK-MB", "ng/mL", None, 5, "Cardiac", "heart-enriched fraction of creatine kinase", ("CKMB", "Creatine Kinase-MB")),
 
149
  # --- Hormones ---
150
  Marker("Cortisol", "mcg/dL", 6, 18, "Hormone", "stress hormone from the adrenal glands", ("AM Cortisol", "Serum Cortisol")),
151
  Marker("Insulin", "uIU/mL", 2.6, 24.9, "Hormone", "hormone that lowers blood sugar", ("Fasting Insulin",)),
@@ -157,10 +179,19 @@ MARKERS: tuple[Marker, ...] = (
157
  Marker("Progesterone", "ng/mL", 0.2, 25, "Hormone", "hormone that supports the uterine lining", ("P4",)),
158
  Marker("Parathyroid Hormone", "pg/mL", 15, 65, "Hormone", "hormone that regulates blood calcium", ("PTH", "Intact PTH")),
159
  Marker("ACTH", "pg/mL", 7, 63, "Hormone", "pituitary signal that drives cortisol production", ("Adrenocorticotropic Hormone",)),
 
 
 
 
160
  Marker("SHBG", "nmol/L", 10, 80, "Hormone", "protein that binds sex hormones in the blood", ("Sex Hormone Binding Globulin",)),
161
  Marker("IGF-1", "ng/mL", 115, 355, "Hormone", "growth factor reflecting growth-hormone activity", ("Insulin-Like Growth Factor 1", "Somatomedin C")),
162
  # --- Oncology / screening ---
163
  Marker("PSA", "ng/mL", None, 4.0, "Oncology", "prostate-specific protein used in screening", ("Prostate Specific Antigen",)),
 
 
 
 
 
164
  # --- Vitamins / iron (continued) ---
165
  Marker("Folate", "ng/mL", 3, 20, "Vitamin", "B vitamin needed for DNA and red-cell production", ("Folic Acid", "Serum Folate")),
166
  Marker("Vitamin A", "mcg/dL", 30, 65, "Vitamin", "fat-soluble vitamin for vision and immunity", ("Retinol",)),
 
69
  Marker("Absolute Eosinophil Count", "10^3/uL", 0, 0.5, "CBC", "count of allergy and parasite-related white cells", ("AEC", "Eosinophils Absolute", "Abs Eosinophils")),
70
  Marker("Absolute Basophil Count", "10^3/uL", 0, 0.2, "CBC", "count of histamine-related white cells", ("ABC", "Basophils Absolute", "Abs Basophils")),
71
  Marker("Reticulocyte Count", "%", 0.5, 2.5, "CBC", "young red cells recently released from bone marrow", ("Retic Count", "Retics")),
72
+ Marker("Haptoglobin", "mg/dL", 30, 200, "CBC", "protein that binds free hemoglobin after red-cell breakdown", ("HP",)),
73
+ Marker("G6PD", "U/g Hb", 5.5, 20.5, "CBC", "red-cell enzyme that protects against oxidative stress", ("Glucose-6-Phosphate Dehydrogenase", "G6PDH")),
74
+ Marker("Erythropoietin", "mIU/mL", 4, 27, "CBC", "kidney hormone that stimulates red-cell production", ("EPO",)),
75
  # --- Metabolic panel ---
76
  Marker("Glucose", "mg/dL", 70, 99, "Metabolic", "blood sugar level", ("Fasting Glucose", "GLU", "Blood Sugar", "FBS", "RBS", "Fasting Blood Sugar")),
77
  Marker("Creatinine", "mg/dL", 0.7, 1.3, "Metabolic", "kidney-function waste product", ("Cr", "Serum Creatinine")),
 
91
  Marker("Uric Acid", "mg/dL", 3.5, 7.2, "Metabolic", "breakdown product of purines; linked to gout", ("UA", "Urate")),
92
  Marker("Serum Iron", "mcg/dL", 60, 170, "Metabolic", "circulating iron available for red-cell production", ("Iron", "Fe", "Iron, Serum")),
93
  Marker("TIBC", "mcg/dL", 250, 450, "Metabolic", "blood's capacity to bind and transport iron", ("Total Iron Binding Capacity", "Iron Binding Capacity")),
94
+ Marker("Transferrin", "mg/dL", 200, 360, "Metabolic", "main blood protein that transports iron", ("TRF",)),
95
  Marker("Transferrin Saturation", "%", 20, 50, "Metabolic", "percent of iron-binding sites occupied", ("TSAT", "Iron Saturation")),
96
  Marker("LDH", "U/L", 140, 280, "Metabolic", "enzyme released when cells are damaged", ("Lactate Dehydrogenase",)),
97
  Marker("Osmolality", "mOsm/kg", 275, 295, "Metabolic", "concentration of particles in the blood", ("Serum Osmolality",)),
98
  Marker("Ammonia", "mcg/dL", 15, 45, "Metabolic", "waste product processed by the liver", ("NH3", "Blood Ammonia")),
99
  Marker("Lactate", "mmol/L", 0.5, 2.0, "Metabolic", "byproduct of anaerobic metabolism", ("Lactic Acid", "Lactate, Blood")),
100
  Marker("Homocysteine", "umol/L", 5, 15, "Metabolic", "amino acid linked to B-vitamin status and vascular risk", ("Hcy",)),
101
+ Marker("Methylmalonic Acid", "nmol/L", None, 378, "Metabolic", "functional marker of vitamin B12 activity", ("MMA",)),
102
  Marker("Cystatin C", "mg/L", 0.53, 0.95, "Metabolic", "kidney-function marker less affected by muscle mass", ("CysC",)),
103
  Marker("Prealbumin", "mg/dL", 20, 40, "Metabolic", "short-lived protein reflecting recent nutrition", ("Transthyretin",)),
104
  Marker("Beta-2 Microglobulin", "mg/L", 0.7, 1.8, "Metabolic", "small protein from cell turnover; kidney and immune marker", ("B2M", "β2-Microglobulin")),
105
+ Marker("C-Peptide", "ng/mL", 0.5, 2.0, "Metabolic", "pancreatic insulin production marker", ("C Peptide", "Connecting Peptide")),
106
+ Marker("Fructosamine", "umol/L", 205, 285, "Metabolic", "shorter-term average blood sugar marker", ("Glycated Serum Protein",)),
107
+ Marker("Beta-Hydroxybutyrate", "mmol/L", 0, 0.4, "Metabolic", "main blood ketone body", ("BHB", "β-Hydroxybutyrate", "3-Hydroxybutyrate")),
108
  # --- Liver enzymes ---
109
  Marker("ALT", "U/L", 7, 56, "Liver", "liver enzyme released when liver cells are stressed", ("Alanine Aminotransferase", "SGPT")),
110
  Marker("AST", "U/L", 10, 40, "Liver", "enzyme from liver and muscle cells", ("Aspartate Aminotransferase", "SGOT")),
 
130
  Marker("Total T4", "mcg/dL", 4.5, 12.0, "Thyroid", "total thyroxine including bound and free", ("T4", "Thyroxine")),
131
  Marker("Total T3", "ng/dL", 80, 200, "Thyroid", "total triiodothyronine including bound and free", ("T3", "Triiodothyronine")),
132
  Marker("Anti-TPO Antibodies", "IU/mL", None, 35, "Thyroid", "antibodies against thyroid peroxidase", ("TPO Antibodies", "Thyroid Peroxidase Antibodies", "Anti-TPO")),
133
+ Marker("TSH Receptor Antibodies", "IU/L", None, 1.75, "Thyroid", "antibodies that can stimulate or block the TSH receptor", ("TRAb", "TSH-R Ab")),
134
+ Marker("Thyroglobulin Antibodies", "IU/mL", None, 4, "Thyroid", "antibodies against thyroglobulin", ("TgAb", "Anti-Thyroglobulin Antibodies")),
135
  # --- Vitamins / iron ---
136
  Marker("Vitamin D", "ng/mL", 30, 100, "Vitamin", "vitamin for bone and immune health", ("25-OH Vitamin D", "25-Hydroxyvitamin D", "Vit D")),
137
  Marker("Vitamin B12", "pg/mL", 200, 900, "Vitamin", "vitamin for nerves and red-cell production", ("B12", "Cobalamin")),
138
  Marker("Ferritin", "ng/mL", 30, 400, "Vitamin", "stored-iron protein", ("FERR",)),
139
+ Marker("Zinc", "mcg/dL", 60, 130, "Vitamin", "trace mineral involved in immunity and wound healing", ("Zn",)),
140
+ Marker("Copper", "mcg/dL", 70, 140, "Vitamin", "trace mineral involved in blood, nerves, and enzymes", ("Cu",)),
141
+ Marker("Ceruloplasmin", "mg/dL", 20, 35, "Vitamin", "copper-carrying protein made by the liver", ("CP",)),
142
+ Marker("Selenium", "mcg/L", 70, 150, "Vitamin", "trace mineral used in antioxidant and thyroid-related enzymes", ("Se",)),
143
+ Marker("Vitamin E", "mg/L", 5.5, 17, "Vitamin", "fat-soluble antioxidant vitamin", ("Alpha-Tocopherol", "Tocopherol")),
144
  Marker("HbA1c", "%", 4.0, 5.6, "Metabolic", "average blood sugar over ~3 months", ("A1c", "Hemoglobin A1c", "Glycated Hemoglobin")),
145
  # --- Coagulation ---
146
  Marker("Prothrombin Time", "seconds", 11, 13.5, "Coagulation", "time for the clotting cascade to form fibrin", ("PT",)),
 
156
  Marker("Complement C3", "mg/dL", 90, 180, "Inflammation", "complement protein in immune activation", ("C3",)),
157
  Marker("Complement C4", "mg/dL", 10, 40, "Inflammation", "complement protein in immune activation", ("C4",)),
158
  Marker("Rheumatoid Factor", "IU/mL", None, 14, "Inflammation", "antibody sometimes seen in autoimmune arthritis", ("RF",)),
159
+ Marker("Anti-CCP Antibodies", "U/mL", None, 20, "Inflammation", "autoantibodies associated with rheumatoid arthritis", ("Anti CCP", "CCP Antibodies", "Cyclic Citrullinated Peptide Antibodies")),
160
+ Marker("Immunoglobulin G", "mg/dL", 700, 1600, "Inflammation", "major circulating antibody class", ("IgG",)),
161
+ Marker("Immunoglobulin A", "mg/dL", 70, 400, "Inflammation", "antibody class important at mucosal surfaces", ("IgA",)),
162
+ Marker("Immunoglobulin M", "mg/dL", 40, 230, "Inflammation", "early-response antibody class", ("IgM",)),
163
+ Marker("Immunoglobulin E", "IU/mL", None, 100, "Inflammation", "antibody class linked to allergy and parasite responses", ("IgE",)),
164
  # --- Cardiac ---
165
  Marker("BNP", "pg/mL", None, 100, "Cardiac", "hormone released when the heart is stretched", ("B-Type Natriuretic Peptide", "Brain Natriuretic Peptide")),
166
+ Marker("NT-proBNP", "pg/mL", None, 125, "Cardiac", "heart-stretch peptide used in heart failure assessment", ("N-terminal pro-BNP", "NT pro BNP")),
167
  Marker("Troponin I", "ng/mL", None, 0.04, "Cardiac", "heart-muscle protein released with injury", ("TnI", "High-Sensitivity Troponin I")),
168
  Marker("Creatine Kinase", "U/L", 30, 200, "Cardiac", "enzyme from muscle including heart and skeletal", ("CK", "CPK", "Creatine Phosphokinase")),
169
  Marker("CK-MB", "ng/mL", None, 5, "Cardiac", "heart-enriched fraction of creatine kinase", ("CKMB", "Creatine Kinase-MB")),
170
+ Marker("Myoglobin", "ng/mL", 25, 72, "Cardiac", "oxygen-binding muscle protein released with muscle injury", ("Mb",)),
171
  # --- Hormones ---
172
  Marker("Cortisol", "mcg/dL", 6, 18, "Hormone", "stress hormone from the adrenal glands", ("AM Cortisol", "Serum Cortisol")),
173
  Marker("Insulin", "uIU/mL", 2.6, 24.9, "Hormone", "hormone that lowers blood sugar", ("Fasting Insulin",)),
 
179
  Marker("Progesterone", "ng/mL", 0.2, 25, "Hormone", "hormone that supports the uterine lining", ("P4",)),
180
  Marker("Parathyroid Hormone", "pg/mL", 15, 65, "Hormone", "hormone that regulates blood calcium", ("PTH", "Intact PTH")),
181
  Marker("ACTH", "pg/mL", 7, 63, "Hormone", "pituitary signal that drives cortisol production", ("Adrenocorticotropic Hormone",)),
182
+ Marker("DHEA-S", "mcg/dL", 35, 430, "Hormone", "adrenal androgen precursor", ("Dehydroepiandrosterone Sulfate", "DHEAS")),
183
+ Marker("Androstenedione", "ng/dL", 30, 200, "Hormone", "androgen precursor made by adrenal glands and gonads", ("A4",)),
184
+ Marker("Anti-Mullerian Hormone", "ng/mL", 1, 4, "Hormone", "ovarian reserve-related hormone", ("AMH", "Anti Mullerian Hormone")),
185
+ Marker("Beta-hCG", "mIU/mL", None, 5, "Hormone", "pregnancy-associated hormone also used in some tumor monitoring", ("β-hCG", "Human Chorionic Gonadotropin", "hCG")),
186
  Marker("SHBG", "nmol/L", 10, 80, "Hormone", "protein that binds sex hormones in the blood", ("Sex Hormone Binding Globulin",)),
187
  Marker("IGF-1", "ng/mL", 115, 355, "Hormone", "growth factor reflecting growth-hormone activity", ("Insulin-Like Growth Factor 1", "Somatomedin C")),
188
  # --- Oncology / screening ---
189
  Marker("PSA", "ng/mL", None, 4.0, "Oncology", "prostate-specific protein used in screening", ("Prostate Specific Antigen",)),
190
+ Marker("CEA", "ng/mL", None, 3.0, "Oncology", "tumor marker often followed in colorectal and other cancers", ("Carcinoembryonic Antigen",)),
191
+ Marker("CA-125", "U/mL", None, 35, "Oncology", "tumor marker often followed in ovarian and related conditions", ("Cancer Antigen 125", "CA 125")),
192
+ Marker("CA 19-9", "U/mL", None, 37, "Oncology", "tumor marker often followed in pancreaticobiliary conditions", ("CA19-9", "Carbohydrate Antigen 19-9")),
193
+ Marker("Alpha-Fetoprotein", "ng/mL", None, 10, "Oncology", "tumor marker used in liver and germ-cell tumor follow-up", ("AFP",)),
194
+ Marker("CA 15-3", "U/mL", None, 30, "Oncology", "tumor marker sometimes followed in breast cancer care", ("CA15-3", "Cancer Antigen 15-3")),
195
  # --- Vitamins / iron (continued) ---
196
  Marker("Folate", "ng/mL", 3, 20, "Vitamin", "B vitamin needed for DNA and red-cell production", ("Folic Acid", "Serum Folate")),
197
  Marker("Vitamin A", "mcg/dL", 30, 65, "Vitamin", "fat-soluble vitamin for vision and immunity", ("Retinol",)),