Skip to content

Commit f4f5ac5

Browse files
committed
Add the fit evaluation graphs on the frontend.
1 parent 187f976 commit f4f5ac5

File tree

4 files changed

+71
-1
lines changed

4 files changed

+71
-1
lines changed

.github/workflows/website.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,14 @@ jobs:
4646
with:
4747
name: 'Data'
4848

49+
- name: Run the test that generates the plots report.
50+
run: |
51+
pytest tests/IVIMmodels/unit_tests/test_ivim_fit.py
52+
4953
- name: move data to the dashboard folder
5054
run: |
5155
mv test_output.csv website/dashboard
56+
mv test_results_report.json website/dashboard
5257
5358
- name: Build documentation
5459
run: |

tests/IVIMmodels/unit_tests/test_ivim_fit.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def to_list_if_needed(value):
8888
test_result['status'] = "XFAILED"
8989

9090
test_results.append(test_result)
91-
with open('plots_data.json', 'w') as f:
91+
with open('test_results_report.json', 'w') as f:
9292
json.dump({"results": test_results, "rtol": tolerances["rtol"],
9393
"atol": tolerances["atol"], }, f, indent=4)
9494
npt.assert_allclose(data['f'], f_fit, rtol=tolerances["rtol"]["f"], atol=tolerances["atol"]["f"])

website/dashboard/index.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<script src="https://cdn.plot.ly/plotly-2.30.0.min.js"></script>
1010
<script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.3.0/papaparse.min.js"></script>
1111
<script src="index.js"></script>
12+
<script src="test_plots.js"></script>
1213
<link rel="stylesheet" href="index.css">
1314
</head>
1415
<body>
@@ -96,6 +97,12 @@ <h1 class="bar-title">IVIM MRI Algorithm Fitting Dashboard</h1>
9697
<div class="chart-card" id="regionDiv">
9798
<!-- New chart will be rendered here -->
9899
</div>
100+
<h1>Validation Data Plots</h1>
101+
<div style="display: flex; flex-direction: column; gap: 1rem;">
102+
<div class="chart-card" id="plot_f_fit" "></div>
103+
<div class="chart-card" id="plot_Dp_fit" "></div>
104+
<div class="chart-card" id="plot_D_fit" "></div>
105+
</div>
99106

100107

101108
</main>

website/dashboard/test_plots.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
document.addEventListener('DOMContentLoaded', function() {
2+
fetch('test_results_report.json')
3+
.then(response => response.json())
4+
.then(data => {
5+
var rtol = data['rtol']
6+
7+
var atol = data['atol']
8+
9+
function createPlot(container, parameter, rtol_value, atol_value) {
10+
var reference_values = data['results'].map(d => d[parameter]); // Assuming fit values are the reference
11+
var fit_values = data['results'].map(d => d[parameter + '_fit']);
12+
var errors = fit_values.map((d, i) => d - reference_values[i]);
13+
14+
var tolerance = reference_values.map(d => atol_value + rtol_value * d);
15+
var negative_tolerance = reference_values.map(d => -(atol_value + rtol_value * d));
16+
17+
var scatter_trace = {
18+
x: reference_values,
19+
y: errors,
20+
mode: 'markers',
21+
type: 'scatter',
22+
name: parameter.toUpperCase() + ' Fit Errors'
23+
};
24+
25+
var tolerance_trace = {
26+
x: reference_values,
27+
y: tolerance,
28+
mode: 'lines',
29+
type: 'scatter',
30+
line: { dash: 'dash', color: 'red' },
31+
name: 'Positive Tolerance'
32+
};
33+
34+
var negative_tolerance_trace = {
35+
x: reference_values,
36+
y: negative_tolerance,
37+
mode: 'lines',
38+
type: 'scatter',
39+
line: { dash: 'dash', color: 'green' },
40+
name: 'Negative Tolerance'
41+
};
42+
43+
var layout = {
44+
title: `Error Plot for ${parameter.toUpperCase()}_fit with Tolerance Bands`,
45+
xaxis: { title: `Reference ${parameter.toUpperCase()} Values` },
46+
yaxis: { title: `Error (${parameter}_fit - Reference ${parameter})` }
47+
};
48+
49+
var plot_data = [scatter_trace, tolerance_trace, negative_tolerance_trace];
50+
51+
Plotly.newPlot(container, plot_data, layout);
52+
}
53+
54+
createPlot('plot_f_fit', 'f', rtol.f, atol.f);
55+
createPlot('plot_Dp_fit', 'Dp', rtol.Dp, atol.Dp);
56+
createPlot('plot_D_fit', 'D', rtol.D, atol.D);
57+
});
58+
});

0 commit comments

Comments
 (0)