added extra page

This commit is contained in:
bolade
2025-11-24 19:37:28 +01:00
parent 580ad5d248
commit 8e8280bcb0
11 changed files with 1073 additions and 61 deletions
+146
View File
@@ -3240,6 +3240,152 @@
"\n",
"The analysis follows the PDF instructions for Train.Red SmO₂ ramp testing, including 10-second smoothing, stage identification, and recovery percentage calculations."
]
},
{
"cell_type": "markdown",
"id": "d8dfb3fa",
"metadata": {},
"source": [
"## Integration with Report Generator\n",
"\n",
"The muscle oxygenation graph generation has been integrated into the report generation system:\n",
"\n",
"1. **GraphGenerator** method: `generate_muscle_oxygenation_chart(oxygenation_df, save_as_base64=True)`\n",
" - Returns: tuple of (base64_chart_string, metrics_dict)\n",
" \n",
"2. **ContextGenerator** now accepts `oxygenation_path` parameter in `load_data()`\n",
"\n",
"3. **Page 12** automatically includes:\n",
" - Full muscle oxygenation chart showing both legs\n",
" - Key metrics for both legs (baseline, minimum, drop, recovery)\n",
" - Heart rate data\n",
" - Summary findings\n",
"\n",
"The system will automatically generate the chart when an oxygenation CSV file is provided during report generation."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "a9064ffe",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Loading oxygenation data...\n",
"✅ Graph generation successful!\n",
"\n",
"Chart size: 871248 characters (base64)\n",
"\n",
"Metrics extracted:\n",
" left_baseline_smo2: 75.4%\n",
" right_baseline_smo2: 82.9%\n",
" left_minimum_smo2: 69.3%\n",
" right_minimum_smo2: 73.7%\n",
" left_minimum_lap: Lap 6\n",
" right_minimum_lap: Lap 6\n",
" left_oxygen_drop: 6.0%\n",
" right_oxygen_drop: 9.3%\n",
" left_drop_percentage: 8% decrease\n",
" right_drop_percentage: 11% decrease\n",
" left_recovery_percentage: 109%\n",
" right_recovery_percentage: 97%\n",
" hr_warmup: 93\n",
" hr_max: 168\n",
" test_duration: ~21 minutes active test\n",
" recovery_assessment: Excellent recovery capacity\n"
]
}
],
"source": [
"# Test the GraphGenerator integration\n",
"import sys\n",
"import os\n",
"import pandas as pd\n",
"\n",
"# Set base_dir if not already defined\n",
"try:\n",
" base_dir\n",
"except NameError:\n",
" base_dir = os.path.dirname(os.path.abspath('.'))\n",
"\n",
"# Load oxygenation data if not already loaded\n",
"try:\n",
" oxygenation_2\n",
"except NameError:\n",
" print(\"Loading oxygenation data...\")\n",
" oxygenation_2 = pd.read_csv(f'{base_dir}/data/muscle_oxygenation.csv', skiprows=445)\n",
"\n",
"sys.path.append(f'{base_dir}/app')\n",
"\n",
"from services.graph_generator import GraphGenerator\n",
"\n",
"# Initialize the graph generator\n",
"graph_gen = GraphGenerator(charts_dir=f'{base_dir}/graphs')\n",
"\n",
"# Generate the chart using the same dataframe\n",
"try:\n",
" chart_b64, metrics = graph_gen.generate_muscle_oxygenation_chart(\n",
" oxygenation_2, \n",
" save_as_base64=True\n",
" )\n",
" \n",
" print(\"✅ Graph generation successful!\")\n",
" print(f\"\\nChart size: {len(chart_b64)} characters (base64)\")\n",
" print(f\"\\nMetrics extracted:\")\n",
" for key, value in metrics.items():\n",
" print(f\" {key}: {value}\")\n",
" \n",
"except Exception as e:\n",
" print(f\"❌ Error: {e}\")\n",
" import traceback\n",
" traceback.print_exc()"
]
},
{
"cell_type": "markdown",
"id": "7886483b",
"metadata": {},
"source": [
"## ✅ Integration Complete!\n",
"\n",
"The muscle oxygenation analysis has been successfully integrated into the report generation system.\n",
"\n",
"### What was implemented:\n",
"\n",
"1. **GraphGenerator Method** (`app/services/graph_generator.py`):\n",
" - Added `generate_muscle_oxygenation_chart()` method\n",
" - Processes Train.Red CSV data (with 10-second smoothing)\n",
" - Generates comprehensive chart with both legs and heart rate\n",
" - Returns both base64 image and extracted metrics dictionary\n",
"\n",
"2. **ContextGenerator Updates** (`app/services/context_generator.py`):\n",
" - Added `oxygenation_df` attribute\n",
" - Updated `load_data()` to accept optional `oxygenation_path` parameter\n",
" - Page 12 context now includes muscle oxygenation chart and all metrics\n",
"\n",
"3. **Page 12 Template** (`app/report_gen/page_12.html`):\n",
" - Replaced two separate leg charts with single comprehensive chart\n",
" - Added side-by-side metric cards for both legs\n",
" - Displays all key values: baseline, minimum, drop, recovery\n",
" - Includes summary findings section\n",
"\n",
"4. **Report Generation Pipeline** (`app/services/report_generator.py`, `app/main.py`):\n",
" - Updated to pass oxygenation CSV path through the system\n",
" - Automatically generates chart when oxygenation data is provided\n",
"\n",
"### How to use:\n",
"\n",
"When generating a report, simply provide the muscle oxygenation CSV file (Train.Red format), and the system will:\n",
"- Automatically load and process the data\n",
"- Generate the comprehensive visualization\n",
"- Extract all key metrics\n",
"- Include everything in Page 12 of the report\n",
"\n",
"No manual intervention required - it's fully automated!"
]
}
],
"metadata": {