Cardiovascular Risk Assessment
Overview
Calculate multiple cardiovascular risk scores from FHIR Patient, Observation, Condition, and MedicationRequest resources. Supports CHA2DS2-VASc (stroke risk in atrial fibrillation), HEART Score (acute chest pain evaluation), Framingham Risk Score (10-year CHD risk), ASCVD Pooled Cohort Equations (10-year ASCVD risk), and HAS-BLED (bleeding risk on anticoagulation). Generate a RiskAssessment FHIR resource with findings and treatment-threshold recommendations.
FHIR Resources Used
| Resource | Purpose | Key Fields |
|---|---|---|
| Patient | Age, gender, race | birthDate, gender, extension (us-core-race) |
| Condition | CHF, HTN, DM, stroke, vascular disease, AF | code, clinicalStatus |
| Observation | BP, cholesterol, HDL, glucose, HbA1c, INR | code, valueQuantity, effectiveDateTime |
| MedicationRequest | Antiplatelets, anticoagulants, NSAIDs, antihypertensives | medicationCodeableConcept, status |
| RiskAssessment | Output: risk scores | method, prediction, basis |
Instructions
Step 1: Retrieve Patient Demographics
Tool: fhir_read resourceType: "Patient" id: "[patient-id]"
Extract: age (from birthDate), gender, race (from US Core extension for ASCVD PCE).
Step 2: Retrieve Active Conditions
Tool: fhir_search resourceType: "Condition" queryParams: "patient=[patient-id]&clinical-status=active"
Identify conditions relevant to scoring. Key SNOMED codes:
- •49436004: Atrial fibrillation
- •42343007: Congestive heart failure
- •38341003: Hypertension
- •73211009: Diabetes mellitus
- •230690007: Cerebrovascular accident (stroke)
- •266257000: Transient ischemic attack (TIA)
- •27550009: Vascular disease (peripheral, aortic plaque, prior MI)
- •22298006: Myocardial infarction
- •400047006: Peripheral vascular disease
- •235856003: Hepatic disease
- •709044004: Chronic kidney disease
- •414545008: Ischemic heart disease
Also search historical conditions for stroke/TIA/MI history:
Tool: fhir_search resourceType: "Condition" queryParams: "patient=[patient-id]&code=230690007,266257000,22298006"
Step 3: Retrieve Relevant Observations
Blood Pressure:
Tool: fhir_search resourceType: "Observation" queryParams: "patient=[patient-id]&code=85354-9&_sort=-date&_count=3"
LOINC 85354-9 = Blood pressure panel. Extract systolic (component code 8480-6) and diastolic (8462-4).
Total Cholesterol:
Tool: fhir_search resourceType: "Observation" queryParams: "patient=[patient-id]&code=2093-3&_sort=-date&_count=1"
LOINC 2093-3 = Total cholesterol.
HDL Cholesterol:
Tool: fhir_search resourceType: "Observation" queryParams: "patient=[patient-id]&code=2085-9&_sort=-date&_count=1"
LOINC 2085-9 = HDL cholesterol.
LDL Cholesterol:
Tool: fhir_search resourceType: "Observation" queryParams: "patient=[patient-id]&code=13457-7&_sort=-date&_count=1"
LOINC 13457-7 = LDL cholesterol (calculated).
HbA1c:
Tool: fhir_search resourceType: "Observation" queryParams: "patient=[patient-id]&code=4548-4&_sort=-date&_count=1"
LOINC 4548-4 = HbA1c.
Troponin (for HEART Score):
Tool: fhir_search resourceType: "Observation" queryParams: "patient=[patient-id]&code=6598-7,89579-7&_sort=-date&_count=3"
LOINC 6598-7 = Troponin T; 89579-7 = Troponin I high sensitivity.
INR (for HAS-BLED):
Tool: fhir_search resourceType: "Observation" queryParams: "patient=[patient-id]&code=6301-6&_sort=-date&_count=3"
LOINC 6301-6 = INR.
Creatinine:
Tool: fhir_search resourceType: "Observation" queryParams: "patient=[patient-id]&code=2160-0&_sort=-date&_count=1"
LOINC 2160-0 = Serum creatinine. For renal function assessment.
Step 4: Retrieve Active Medications
Tool: fhir_search resourceType: "MedicationRequest" queryParams: "patient=[patient-id]&status=active"
Identify:
- •Antihypertensives (for HEART Score, CHA2DS2-VASc HTN criterion)
- •Statins (current therapy)
- •Anticoagulants: warfarin, apixaban, rivaroxaban, edoxaban, dabigatran
- •Antiplatelets: aspirin, clopidogrel, prasugrel, ticagrelor
- •NSAIDs (for HAS-BLED)
- •Antidepressants/SSRIs (bleeding risk)
Step 5: Determine Which Scores to Calculate
Select based on clinical context:
- •Atrial fibrillation present -> CHA2DS2-VASc + HAS-BLED
- •Chest pain presentation -> HEART Score
- •Primary prevention / statin candidacy -> ASCVD PCE (age 40-79) and/or Framingham
- •If unclear, calculate all applicable scores
Refer to references/cv-scoring-systems.md for complete scoring criteria.
Step 6: Calculate Scores and Generate Recommendations
Apply scoring criteria from reference tables. Map scores to treatment thresholds per references/acc-aha-guidelines.md.
Step 7: Create RiskAssessment Resource
Tool: fhir_create
resourceType: "RiskAssessment"
resource: {
"resourceType": "RiskAssessment",
"status": "final",
"subject": {"reference": "Patient/[patient-id]"},
"occurrenceDateTime": "[current-datetime]",
"method": {
"coding": [{"system": "http://snomed.info/sct", "code": "225338004", "display": "Risk assessment"}]
},
"prediction": [
{
"outcome": {"text": "[Score name]: [value] - [risk level]"},
"probabilityDecimal": [probability if applicable],
"qualitativeRisk": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/risk-probability", "code": "[low|moderate|high]"}]}
}
],
"basis": [
{"reference": "Condition/[relevant-condition-id]"},
{"reference": "Observation/[relevant-observation-id]"}
],
"note": [{"text": "[Treatment recommendations based on risk level]"}]
}
Step 8: Format Output
CARDIOVASCULAR RISK ASSESSMENT =============================== Patient: [name] | Age: [age] | Sex: [sex] Assessment Date: [datetime] SCORES ------ [Score Name]: [value] - [risk level] Components: [list scored items] Recommendation: [guideline-based recommendation] [Repeat for each calculated score] CURRENT THERAPY --------------- Anticoagulation: [current or none] Antiplatelets: [current or none] Statin: [current or none] Antihypertensives: [current or none] RECOMMENDATIONS --------------- [Prioritized list of guideline-based recommendations]
Examples
Example 1: AFib Patient -- Stroke and Bleeding Risk
User says: "What's the stroke risk for patient 54321? She has AFib."
Actions:
- •
fhir_readPatient/54321 -- 74F - •
fhir_searchCondition active -- AF, HTN, DM, prior TIA - •
fhir_searchObservation BP -- 142/88 - •
fhir_searchObservation INR -- 2.8 (on warfarin) - •
fhir_searchMedicationRequest active -- warfarin, metformin, lisinopril - •Calculate: CHA2DS2-VASc = 6 (age 74 = 2, female = 1, HTN = 1, DM = 1, TIA = 2, minus 1 for overlap... recalculate: age 65-74 = 1, female = 1, HTN = 1, DM = 1, stroke/TIA = 2 = total 6)
- •Calculate: HAS-BLED = 2 (HTN = 1, age >65 = 1)
- •
fhir_createRiskAssessment
Result:
CARDIOVASCULAR RISK ASSESSMENT =============================== Patient: Eleanor Voss | Age: 74 | Sex: Female SCORES ------ CHA2DS2-VASc: 6/9 - HIGH RISK CHF: 0, HTN: 1, Age 65-74: 1, DM: 1, Stroke/TIA: 2, Vascular: 0, Sex (female): 1 Annual stroke risk: ~9.8% Recommendation: Oral anticoagulation strongly indicated HAS-BLED: 2/9 - MODERATE BLEEDING RISK HTN (uncontrolled): 1, Renal/Liver: 0, Stroke: 0, Bleeding hx: 0, Labile INR: 0, Age >65: 1, Drugs/Alcohol: 0 Recommendation: Anticoagulation benefits outweigh bleeding risk. Monitor INR closely. CURRENT THERAPY --------------- Anticoagulation: Warfarin (active) Statin: None RECOMMENDATIONS --------------- 1. Continue anticoagulation -- CHA2DS2-VASc 6 strongly supports OAC 2. Consider DOAC switch (apixaban/rivaroxaban) -- lower intracranial hemorrhage risk vs warfarin 3. Optimize BP control -- SBP 142 exceeds target 4. Evaluate statin candidacy -- age 74 with DM and HTN
Example 2: Chest Pain Evaluation with HEART Score
User says: "Calculate HEART score for patient 99887, presenting with chest pain"
Actions:
- •
fhir_readPatient/99887 -- 58M - •
fhir_searchCondition active -- HTN, hyperlipidemia, prior PCI (2019) - •
fhir_searchObservation troponin -- high-sensitivity troponin I: 45 ng/L (upper limit 26) - •
fhir_searchObservation ECG interpretation -- no specific ST changes - •Calculate: HEART = 7 (History moderately suspicious = 1, ECG non-diagnostic = 1, Age 55-64 = 1, Risk factors >=3 = 2, Troponin 1-3x ULN = 1... recalculate with prior PCI as significant risk = 2)
Result:
HEART Score: 7/10 - HIGH RISK History: 1 (moderately suspicious) ECG: 1 (non-specific repolarization disturbance) Age: 1 (45-64) Risk factors: 2 (HTN, hyperlipidemia, prior PCI) Troponin: 2 (>3x normal limit -- rechecked: 45/26 = 1.7x = 1 point) Corrected total: 6/10 - HIGH RISK Recommendation: HEART >= 7: admit, cardiology consult, early invasive strategy. HEART 4-6: observation unit, serial troponins, stress testing or CCTA. This patient at 6: admit for observation, serial troponins q3h, consider non-invasive testing.
Troubleshooting
Cholesterol Values Not Found for ASCVD Calculation
- •Check alternate LOINC codes: 2093-3 (cholesterol, total), 48620-9 (cholesterol total, calculated). For HDL: 2085-9 or 14646-4 (HDL direct). Expand search window with
&date=ge[date-1-year]to find most recent lipid panel. - •If no lipid values exist, ASCVD PCE cannot be calculated. Recommend ordering fasting lipid panel.
Race Data Not Available for ASCVD PCE
- •ASCVD PCE uses race-specific coefficients (White, African American). Check US Core race extension on Patient resource. If race is not documented or is other than White/African American, use White coefficients and note the limitation. The equations have not been validated in other racial/ethnic groups.
Multiple Conditions Match Same Criterion
- •For CHA2DS2-VASc, each criterion scores once regardless of how many matching conditions exist. Prior stroke + prior TIA = still 2 points (single stroke/TIA category), not 4 points. Deduplicate condition matches per scoring criterion.
Related Skills
- •
clinical-summary-generator-- for full patient context before risk assessment - •
medication-reconciliation-- to verify current anticoagulant/statin therapy - •
drug-interaction-checker-- when recommending new anticoagulant or statin therapy