Good progress
This commit is contained in:
@@ -707,10 +707,40 @@ class ContextGenerator:
|
||||
formatted_ranges[category] = f"{min_val}-{max_val}bpm"
|
||||
|
||||
return {
|
||||
"age_range": f"{age_range} ({gender[0].upper()})",
|
||||
"age_range": age_range,
|
||||
"ranges": formatted_ranges,
|
||||
"raw_ranges": ranges, # Keep raw ranges for category determination
|
||||
}
|
||||
|
||||
def _determine_rhr_category(self, rhr: float, age: int, gender: str) -> str:
|
||||
"""Determine resting heart rate category based on value, age, and gender (matching notebook logic)"""
|
||||
rhr_table_info = self._calculate_rhr_table_data(age, gender)
|
||||
ranges = rhr_table_info["raw_ranges"]
|
||||
|
||||
# Check Poor category first (open-ended at top)
|
||||
min_val, max_val = ranges["Poor"]
|
||||
if max_val is None and rhr >= min_val:
|
||||
return "Poor"
|
||||
|
||||
# Check other categories from Below Average down to Athlete
|
||||
# For RHR, lower is better, so we check from highest to lowest
|
||||
for category in [
|
||||
"Below Average",
|
||||
"Average",
|
||||
"Above Average",
|
||||
"Good",
|
||||
"Excellent",
|
||||
"Athlete",
|
||||
]:
|
||||
min_val, max_val = ranges[category]
|
||||
# Check if value falls in this range (inclusive of min, exclusive of max)
|
||||
if min_val <= rhr < max_val:
|
||||
return category
|
||||
|
||||
# If value is below all ranges (below Athlete minimum), return Athlete
|
||||
# This handles the case where rhr < min of Athlete
|
||||
return "Athlete"
|
||||
|
||||
def _calculate_zone_metrics(self, pnoe_metrics: Dict) -> Dict:
|
||||
"""Calculate detailed metrics for each heart rate zone based on actual data"""
|
||||
import math
|
||||
@@ -1294,14 +1324,24 @@ class ContextGenerator:
|
||||
self.patient_info["age"], self.patient_info["gender"]
|
||||
)
|
||||
|
||||
gender_label = (
|
||||
"Age (F)"
|
||||
if self.patient_info["gender"].lower().startswith("f")
|
||||
else "Age (M)"
|
||||
# Get resting heart rate value and determine category
|
||||
# Extract numeric value from "53bpm" format (resting_hr_metrics already calculated above)
|
||||
rhr_value_str = resting_hr_metrics.get("resting_heart_rate", "0bpm")
|
||||
rhr_value = float(rhr_value_str.replace("bpm", "").strip())
|
||||
|
||||
category = self._determine_rhr_category(
|
||||
rhr_value,
|
||||
self.patient_info["age"],
|
||||
self.patient_info["gender"],
|
||||
)
|
||||
|
||||
gender_label = (
|
||||
"F" if self.patient_info["gender"].lower().startswith("f") else "M"
|
||||
)
|
||||
age_range_label = f"{rhr_table_info['age_range']} ({gender_label})"
|
||||
|
||||
rhr_columns = [
|
||||
gender_label,
|
||||
"Age",
|
||||
"Poor",
|
||||
"Below Average",
|
||||
"Average",
|
||||
@@ -1312,7 +1352,7 @@ class ContextGenerator:
|
||||
]
|
||||
rhr_data = [
|
||||
[
|
||||
rhr_table_info["age_range"],
|
||||
age_range_label,
|
||||
rhr_table_info["ranges"]["Poor"],
|
||||
rhr_table_info["ranges"]["Below Average"],
|
||||
rhr_table_info["ranges"]["Average"],
|
||||
@@ -1322,13 +1362,13 @@ class ContextGenerator:
|
||||
rhr_table_info["ranges"]["Athlete"],
|
||||
]
|
||||
]
|
||||
rhr_colors = [["#b2ebf2"] + ["#f5f5f5"] * 7]
|
||||
|
||||
contexts["page_11"]["rhr_table"] = (
|
||||
graph_generator.generate_resting_heart_rate_table(
|
||||
data=rhr_data,
|
||||
columns=rhr_columns,
|
||||
cell_colors=rhr_colors,
|
||||
rhr_value=rhr_value,
|
||||
category=category,
|
||||
save_as_base64=True,
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user