added extra page
This commit is contained in:
@@ -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": {
|
||||
|
||||
Reference in New Issue
Block a user