Skip to content

Commit cc8c918

Browse files
committed
HRT-0001: graph fudge factor efficacy trend on view chart
1 parent 68aa505 commit cc8c918

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

crates/web/src/charts/view.rs

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,38 @@ use crate::utils::{
1414
convert_progesterone_to_ng_ml, convert_testosterone_to_ng_dl, fmt_blood_value, fmt_date_label,
1515
hormone_unit_label,
1616
};
17-
use hrt_shared::types::{DosageHistoryEntry, HormoneUnits, HrtData, Settings};
17+
use hrt_shared::types::{BloodTest, DosageHistoryEntry, HormoneUnits, HrtData, Settings};
18+
19+
fn inferred_fudge_factor(test: &BloodTest) -> Option<f64> {
20+
if let Some(value) = test.fudgeFactor {
21+
if value.is_finite() && value > 0.0 {
22+
return Some(value);
23+
}
24+
}
25+
26+
let measured = test.estradiolLevel?;
27+
if !measured.is_finite() {
28+
return None;
29+
}
30+
let measured_pg_ml = if test.estradiolUnit == Some(HormoneUnits::E2PmolL) {
31+
measured / 3.671
32+
} else {
33+
measured
34+
};
35+
if !measured_pg_ml.is_finite() {
36+
return None;
37+
}
38+
39+
let predicted = test
40+
.estrannaiseNumber
41+
.filter(|value| value.is_finite() && *value > 0.0)?;
42+
let ratio = measured_pg_ml / predicted;
43+
if ratio.is_finite() && ratio > 0.0 {
44+
Some((ratio * 1000.0).round() / 1000.0)
45+
} else {
46+
None
47+
}
48+
}
1849

1950
#[derive(Clone, Debug, PartialEq)]
2051
pub struct ViewChartPoint {
@@ -53,6 +84,7 @@ pub fn compute_view_chart_state(
5384
show_prolactin: bool,
5485
show_shbg: bool,
5586
show_fai: bool,
87+
show_fudge_factor: bool,
5688
) -> ViewChartState {
5789
let now = js_sys::Date::now() as i64;
5890
let start_time = now - time_range_days * 24 * 60 * 60 * 1000;
@@ -267,6 +299,25 @@ pub fn compute_view_chart_state(
267299
has_data = true;
268300
}
269301
}
302+
if show_fudge_factor {
303+
if let Some(fudge_factor) = inferred_fudge_factor(test) {
304+
let efficacy_percent = fudge_factor * 100.0;
305+
let tooltip = format!(
306+
"Efficacy (FF): {}% ({}x) ({})",
307+
fmt_blood_value(efficacy_percent),
308+
fmt_blood_value(fudge_factor),
309+
date_short
310+
);
311+
points.push(ViewChartPoint {
312+
x,
313+
y: efficacy_percent,
314+
label: tooltip,
315+
color: RGBColor(255, 99, 132),
316+
});
317+
all_values.push(efficacy_percent);
318+
has_data = true;
319+
}
320+
}
270321
}
271322

272323
let mut dosage_points = Vec::new();

crates/web/src/pages/view.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ pub fn ViewPage() -> impl IntoView {
136136
let show_prolactin = create_rw_signal(false);
137137
let show_shbg = create_rw_signal(false);
138138
let show_fai = create_rw_signal(false);
139+
let show_fudge_factor = create_rw_signal(true);
139140
let view_zoom = create_rw_signal(ViewZoom::default());
140141
let view_tooltip = create_rw_signal(None::<ChartTooltip>);
141142

@@ -158,6 +159,7 @@ pub fn ViewPage() -> impl IntoView {
158159
show_prolactin.get(),
159160
show_shbg.get(),
160161
show_fai.get(),
162+
show_fudge_factor.get(),
161163
)
162164
}
163165
});
@@ -1244,6 +1246,12 @@ pub fn ViewPage() -> impl IntoView {
12441246
<button class:active=move || show_fai.get() on:click=move |_| show_fai.set(!show_fai.get())>
12451247
"FAI"
12461248
</button>
1249+
<button
1250+
class:active=move || show_fudge_factor.get()
1251+
on:click=move |_| show_fudge_factor.set(!show_fudge_factor.get())
1252+
>
1253+
"FF %"
1254+
</button>
12471255
</div>
12481256

12491257
<div class="chart-toolbar view-dosage-group">
@@ -1287,6 +1295,9 @@ pub fn ViewPage() -> impl IntoView {
12871295
<Show when=move || !store.data.get().bloodTests.is_empty()>
12881296
<p>"* Hormone measurements are normalized to display units for charting; hover shows recorded units."</p>
12891297
</Show>
1298+
<Show when=move || show_fudge_factor.get()>
1299+
<p>"* FF is shown as efficacy percent (fudge factor x 100)."</p>
1300+
</Show>
12901301
</div>
12911302
</div>
12921303
</div>

0 commit comments

Comments
 (0)