Skip to content

Commit 0e14d23

Browse files
committed
Add upper and lower range sliders.
1 parent 745829b commit 0e14d23

File tree

2 files changed

+171
-56
lines changed

2 files changed

+171
-56
lines changed

dashboard_website/index.html

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,21 @@ <h1 class="bar-title">IVIM MRI Algorithm Fitting Dashboard</h1>
4040
</select>
4141

4242
<div class="slider-container">
43-
<span class="slider-label">Range:</span>
43+
<span class="slider-label">Upper Range:</span>
44+
<span class="slider-value">0</span>
4445
<button id="decrement-range" class="slider-button">-</button>
45-
<input type="range" id="range-slider" class="slider" min="2" max="100" step="2" value="2">
46+
<input type="range" id="range-slider" class="slider" min="2" max="100" step="1" value="2">
4647
<button id="increment-range" class="slider-button">+</button>
47-
<span id="range-value" class="slider-value">2</span><span>x</span>
48+
<span id="range-value" class="slider-value">2</span>
4849
</div>
50+
<div class="slider-container">
51+
<span class="slider-label">Lower Range:</span>
52+
<span class="slider-value">0</span>
53+
<button id="decrement-lower-range" class="slider-button">-</button>
54+
<input type="range" id="lower-range-slider" class="slider" min="2" max="100" step="2" value="2">
55+
<button id="increment-lower-range" class="slider-button">+</button>
56+
<span id="lower-range-value" class="slider-value">2</span>
57+
</div>
4958
</div>
5059
<div class="chart-card" id="myDiv">
5160
<!-- Chart will be rendered here -->
@@ -72,12 +81,20 @@ <h1 class="bar-title">IVIM MRI Algorithm Fitting Dashboard</h1>
7281
</select>
7382

7483
<div class="slider-container">
75-
<span class="slider-label">Range:</span>
84+
<span class="slider-label">Upper Range:</span>
7685
<button id="decrement-range-region" class="slider-button">-</button>
7786
<input type="range" id="range-slider-region" class="slider" min="2" max="100" step="2" value="2">
7887
<button id="increment-range-region" class="slider-button">+</button>
79-
<span id="range-value-region" class="slider-value">2</span><span>x</span>
88+
<span id="range-value-region" class="slider-value">2</span>
8089
</div>
90+
<div class="slider-container">
91+
<span class="slider-label">Lower Range:</span>
92+
<span class="slider-value">0</span>
93+
<button id="decrement-lower-range-region" class="slider-button">-</button>
94+
<input type="range" id="lower-range-slider-region" class="slider" min="2" max="100" step="2" value="2">
95+
<button id="increment-lower-range-region" class="slider-button">+</button>
96+
<span id="lower-range-value-region" class="slider-value">2</span>
97+
</div>
8198
</div>
8299
<div class="chart-card" id="regionDiv">
83100
<!-- New chart will be rendered here -->

dashboard_website/index.js

Lines changed: 149 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,18 @@ document.addEventListener('DOMContentLoaded', function() {
33
let selectedAlgorithm = 'ETP_SRI_LinearFitting';
44
let selectedSNR = '10';
55
let selectedType = 'D_fitted';
6-
let selectedRange = 2;
6+
let selectedRange = 10;
7+
let selectedRangeLower = 2;
78
let selectedRegion = 'Liver';
89
let selectedSNRRegion = '10';
910
let selectedTypeRegion = 'D_fitted';
10-
let selectedRangeRegion = 2;
11+
let selectedRangeRegion = 10;
12+
let selectedRangeLowerRegion = 2;
13+
const type = {
14+
"D_fitted": "Diffusion",
15+
"Dp_fitted": "Perfusion",
16+
"f_fitted": "Perfusion Fraction"
17+
};
1118

1219
const loadingOverlay = document.getElementById('loadingOverlay');
1320
const mainContent = document.getElementsByTagName('main')[0];
@@ -25,24 +32,27 @@ document.addEventListener('DOMContentLoaded', function() {
2532
const algorithmSelect = document.getElementById('algorithm-select');
2633
algorithmSelect.addEventListener('change', function(event) {
2734
selectedAlgorithm = event.target.value;
28-
updateRange('2')
29-
drawBoxPlot(data, selectedAlgorithm, selectedSNR, selectedType, selectedRange);
35+
updateRange('10')
36+
updateRangeLower('2')
37+
drawBoxPlot();
3038
});
3139

3240
// Add event listener to SNR select
3341
const snrSelect = document.getElementById('snr-select');
3442
snrSelect.addEventListener('change', function(event) {
3543
selectedSNR = event.target.value;
36-
updateRange('2')
37-
drawBoxPlot(data, selectedAlgorithm, selectedSNR, selectedType, selectedRange);
44+
updateRange('10')
45+
updateRangeLower('2')
46+
drawBoxPlot();
3847
});
3948

4049
// Add event listener to type select
4150
const typeSelect = document.getElementById('type-select');
4251
typeSelect.addEventListener('change', function(event) {
4352
selectedType = event.target.value;
44-
updateRange('2')
45-
drawBoxPlot(data, selectedAlgorithm, selectedSNR, selectedType, selectedRange);
53+
updateRange('10')
54+
updateRangeLower('2')
55+
drawBoxPlot();
4656
});
4757

4858
// Add event listeners to range slider and buttons
@@ -52,9 +62,9 @@ document.addEventListener('DOMContentLoaded', function() {
5262
const incrementRange = document.getElementById('increment-range');
5363
function updateRange(value) {
5464
selectedRange = value;
55-
rangeValue.textContent = value;
65+
//rangeValue.textContent = value;
5666
rangeSlider.value = value
57-
drawBoxPlot(data, selectedAlgorithm, selectedSNR, selectedType, selectedRange);
67+
drawBoxPlot();
5868
}
5969

6070
rangeSlider.addEventListener('input', function(event) {
@@ -77,28 +87,63 @@ document.addEventListener('DOMContentLoaded', function() {
7787
}
7888
});
7989

90+
// Add event listeners to range slider and buttons
91+
const rangeSliderLower = document.getElementById('lower-range-slider');
92+
const rangeValueLower = document.getElementById('lower-range-value');
93+
const decrementRangeLower = document.getElementById('decrement-lower-range');
94+
const incrementRangeLower = document.getElementById('increment-lower-range');
95+
function updateRangeLower(value) {
96+
selectedRangeLower = value;
97+
//rangeValue.textContent = value;
98+
rangeSliderLower.value = value
99+
drawBoxPlot();
100+
}
101+
102+
rangeSliderLower.addEventListener('input', function(event) {
103+
updateRangeLower(event.target.value);
104+
});
105+
106+
decrementRangeLower.addEventListener('click', function() {
107+
let newValue = parseInt(rangeSlider.value) - 2;
108+
if (newValue >= 2) {
109+
rangeSliderLower.value = newValue;
110+
updateRangeLower(newValue);
111+
}
112+
});
113+
114+
incrementRangeLower.addEventListener('click', function() {
115+
let newValue = parseInt(rangeSliderLower.value) + 2;
116+
if (newValue <= rangeSliderLower.max) {
117+
rangeSliderLower.value = newValue;
118+
updateRangeLower(newValue);
119+
}
120+
});
121+
80122
// Add event listener to region select
81123
const regionSelect = document.getElementById('region-select');
82124
regionSelect.addEventListener('change', function(event) {
83125
selectedRegion = event.target.value;
84-
updateRangeRegion('2')
85-
drawRegionBoxPlot(data, selectedRegion, selectedSNRRegion, selectedTypeRegion, selectedRangeRegion);
126+
updateRangeRegion('10')
127+
updateRangeLowerRegion('2')
128+
drawRegionBoxPlot();
86129
});
87130

88131
// Add event listener to SNR select
89132
const snrRegionSelect = document.getElementById('snr-region-select');
90133
snrRegionSelect.addEventListener('change', function(event) {
91134
selectedSNRRegion = event.target.value;
92-
updateRangeRegion('2')
93-
drawRegionBoxPlot(data, selectedRegion, selectedSNRRegion, selectedTypeRegion, selectedRangeRegion);
135+
updateRangeRegion('10')
136+
updateRangeLowerRegion('2')
137+
drawRegionBoxPlot();
94138
});
95139

96140
// Add event listener to type select
97141
const typeRegionSelect = document.getElementById('type-region-select');
98142
typeRegionSelect.addEventListener('change', function(event) {
99143
selectedTypeRegion = event.target.value;
100-
updateRangeRegion('2')
101-
drawRegionBoxPlot(data, selectedRegion, selectedSNRRegion, selectedTypeRegion, selectedRangeRegion);
144+
updateRangeRegion('10')
145+
updateRangeLowerRegion('2')
146+
drawRegionBoxPlot();
102147
});
103148

104149
// Add event listeners to range region slider and buttons
@@ -109,9 +154,9 @@ document.addEventListener('DOMContentLoaded', function() {
109154

110155
function updateRangeRegion(value) {
111156
selectedRangeRegion = value;
112-
rangeValueRegion.textContent = value;
157+
//rangeValueRegion.textContent = value;
113158
rangeSliderRegion.value = value
114-
drawRegionBoxPlot(data, selectedRegion, selectedSNRRegion, selectedTypeRegion, selectedRangeRegion);
159+
drawRegionBoxPlot();
115160
}
116161

117162
rangeSliderRegion.addEventListener('input', function(event) {
@@ -134,6 +179,38 @@ document.addEventListener('DOMContentLoaded', function() {
134179
}
135180
});
136181

182+
// Add event listeners to range slider and buttons for region
183+
const rangeSliderLowerRegion = document.getElementById('lower-range-slider-region');
184+
const rangeValueLowerRegion = document.getElementById('lower-range-value-region');
185+
const decrementRangeLowerRegion = document.getElementById('decrement-lower-range-region');
186+
const incrementRangeLowerRegion = document.getElementById('increment-lower-range-region');
187+
function updateRangeLowerRegion(value) {
188+
selectedRangeLowerRegion = value;
189+
//rangeValue.textContent = value;
190+
rangeSliderLowerRegion.value = value
191+
drawRegionBoxPlot();
192+
}
193+
194+
rangeSliderLowerRegion.addEventListener('input', function(event) {
195+
updateRangeLowerRegion(event.target.value);
196+
});
197+
198+
decrementRangeLowerRegion.addEventListener('click', function() {
199+
let newValue = parseInt(rangeSliderRegion.value) - 2;
200+
if (newValue >= 2) {
201+
rangeSliderLowerRegion.value = newValue;
202+
updateRangeLowerRegion(newValue);
203+
}
204+
});
205+
206+
incrementRangeLowerRegion.addEventListener('click', function() {
207+
let newValue = parseInt(rangeSliderLowerRegion.value) + 2;
208+
if (newValue <= rangeSliderLowerRegion.max) {
209+
rangeSliderLowerRegion.value = newValue;
210+
updateRangeLowerRegion(newValue);
211+
}
212+
});
213+
137214
showLoading();
138215

139216
Papa.parse('test_output.csv', {
@@ -143,8 +220,8 @@ document.addEventListener('DOMContentLoaded', function() {
143220
data = results;
144221
hideLoading();
145222
populateOptions(data);
146-
drawBoxPlot(data, selectedAlgorithm, selectedSNR, selectedType, selectedRange);
147-
drawRegionBoxPlot(data, selectedRegion, selectedSNRRegion, selectedTypeRegion, selectedRangeRegion);
223+
drawBoxPlot();
224+
drawRegionBoxPlot();
148225

149226
}
150227
});
@@ -194,32 +271,37 @@ document.addEventListener('DOMContentLoaded', function() {
194271

195272
}
196273

197-
function drawBoxPlot(data, selectedAlgorithm, selectedSNR, selectedType, selectedRange) {
274+
function drawBoxPlot() {
198275
let jsonData = data.data.filter(obj => obj.Algorithm === selectedAlgorithm);
199-
const type = {
200-
"D_fitted": "Diffusion",
201-
"Dp_fitted": "Perfusion",
202-
"f_fitted": "Perfusion Fraction"
203-
};
204276

205277
const allD_fittedValues = jsonData
206278
.filter(obj => obj.SNR === selectedSNR)
207279
.map(obj => obj[selectedType]);
208280

209-
const maxValue = Math.max(...allD_fittedValues.map(Math.abs));
281+
const maxValue = Math.max(...allD_fittedValues);
282+
const minValue = Math.min(...allD_fittedValues);
210283
const groundTruthList = jsonData
211-
.filter(obj => obj.SNR === selectedSNR)
212-
.map(obj => obj[selectedType.slice(0, -7)]);
284+
.filter(obj => obj.SNR === selectedSNR)
285+
.map(obj => obj[selectedType.slice(0, -7)]);
213286
let estimatedRange = Math.abs(maxValue) / Math.min(...groundTruthList)
214-
rangeSlider.max = Math.round(estimatedRange / 2) * 2
287+
let estimatedRangeLower = Math.abs(minValue) / Math.min(...groundTruthList)
288+
if (minValue < 0) {
289+
rangeValueLower.textContent = minValue.toFixed(4)
290+
}
291+
else {
292+
rangeValueLower.textContent = '0.0000'
293+
selectedRangeLower = 0;
294+
}
295+
rangeValue.textContent = maxValue.toFixed(4)
296+
rangeSlider.max = Math.round(estimatedRange / 2) * 2
297+
rangeSliderLower.max = Math.round(estimatedRangeLower / 2) * 2
215298
let plots = [];
216299
const regions = new Set(jsonData.map(obj => obj.Region));
217300
const uniqueRegionsArray = Array.from(regions);
218301
uniqueRegionsArray.forEach(region => {
219302
const D_fittedValues = jsonData
220303
.filter(obj => obj.Region === region)
221304
.filter(obj => obj.SNR === selectedSNR)
222-
.filter(obj => Math.abs(obj[selectedType]) < (Math.abs(obj[selectedType.slice(0, -7)]) * selectedRange))
223305
.map(obj => obj[selectedType]);
224306
var plot = {
225307
y: D_fittedValues,
@@ -250,54 +332,65 @@ document.addEventListener('DOMContentLoaded', function() {
250332
});
251333

252334
var layout = {
253-
title: `${type[selectedType]} Box Plots for ${selectedAlgorithm} algorithm with ${selectedSNR} SNR`
335+
title: `${type[selectedType]} Box Plots for ${selectedAlgorithm} algorithm with ${selectedSNR} SNR`,
336+
yaxis: {
337+
autorange: false,
338+
range: [-Math.min(...groundTruthList) * selectedRangeLower, Math.min(...groundTruthList) * selectedRange],
339+
type: 'linear'
340+
}
254341
};
255342

256343
Plotly.newPlot('myDiv', plots, layout);
257344
}
258345

259-
function drawRegionBoxPlot(data, selectedRegion, selectedSNR, selectedType, selectedRange) {
346+
function drawRegionBoxPlot() {
260347
let jsonData = data.data.filter(obj => obj.Region === selectedRegion);
261-
const type = {
262-
"D_fitted": "Diffusion",
263-
"Dp_fitted": "Perfusion",
264-
"f_fitted": "Perfusion Fraction"
265-
};
266348

267349
const allD_fittedValues = jsonData
268-
.filter(obj => obj.SNR === selectedSNR)
269-
.map(obj => obj[selectedType]);
350+
.filter(obj => obj.SNR === selectedSNRRegion)
351+
.map(obj => obj[selectedTypeRegion]);
352+
353+
const maxValue = Math.max(...allD_fittedValues);
354+
const minValue = Math.min(...allD_fittedValues);
270355

271-
const maxValue = Math.max(...allD_fittedValues.map(Math.abs));
272356
const groundTruthList = jsonData
273-
.filter(obj => obj.SNR === selectedSNR)
274-
.map(obj => obj[selectedType.slice(0, -7)]);
357+
.filter(obj => obj.SNR === selectedSNRRegion)
358+
.map(obj => obj[selectedTypeRegion.slice(0, -7)]);
275359
let estimatedRange = Math.abs(maxValue) / Math.min(...groundTruthList)
276-
rangeSliderRegion.max = Math.round(estimatedRange / 2) * 2
360+
let estimatedRangeLower = Math.abs(minValue) / Math.min(...groundTruthList)
361+
if (minValue < 0) {
362+
rangeValueLowerRegion.textContent = minValue.toFixed(4)
363+
}
364+
else {
365+
rangeValueLowerRegion.textContent = '0.0000'
366+
selectedRangeLowerRegion = 0;
367+
}
368+
rangeValueRegion.textContent = maxValue.toFixed(4)
369+
rangeSliderRegion.max = Math.round(estimatedRange / 2) * 2
370+
rangeSliderLowerRegion.max = Math.round(estimatedRangeLower / 2) * 2
277371

278372
let plots = [];
279373
const algorithms = new Set(jsonData.map(obj => obj.Algorithm));
280374
const uniqueAlgorithmsArray = Array.from(algorithms);
281375
uniqueAlgorithmsArray.forEach(algorithm => {
282376
const D_fittedValues = jsonData
283377
.filter(obj => obj.Algorithm === algorithm)
284-
.filter(obj => obj.SNR === selectedSNR)
285-
.filter(obj => Math.abs(obj[selectedType]) < (Math.abs(obj[selectedType.slice(0, -7)]) * selectedRange))
286-
.map(obj => obj[selectedType]);
378+
.filter(obj => obj.SNR === selectedSNRRegion)
379+
.map(obj => obj[selectedTypeRegion]);
287380
var plot = {
288381
y: D_fittedValues,
289382
type: 'box',
290383
name: algorithm,
291384
marker: {
292-
outliercolor: 'white)',
385+
outliercolor: 'white',
293386
},
294387
boxpoints: 'Outliers'
295388
};
296389
plots.push(plot);
297390
const groundTruth = jsonData
298391
.filter(obj => obj.Algorithm === algorithm)
299-
.filter(obj => obj.SNR === selectedSNR)
300-
.map(obj => obj[selectedType.slice(0, -7)]);
392+
.filter(obj => obj.SNR === selectedSNRRegion)
393+
.map(obj => obj[selectedTypeRegion.slice(0, -7)]);
301394
var constantPoint = {
302395
x: [algorithm],
303396
y: groundTruth,
@@ -313,7 +406,12 @@ document.addEventListener('DOMContentLoaded', function() {
313406
});
314407

315408
var layout = {
316-
title: `${type[selectedType]} Box Plots for ${selectedRegion} region with ${selectedSNR} SNR`
409+
title: `${type[selectedTypeRegion]} Box Plots for ${selectedRegion} region with ${selectedSNR} SNR`,
410+
yaxis: {
411+
autorange: false,
412+
range: [-Math.min(...groundTruthList) * selectedRangeLowerRegion, Math.min(...groundTruthList) * selectedRangeRegion],
413+
type: 'linear'
414+
}
317415
};
318416

319417
Plotly.newPlot('regionDiv', plots, layout);

0 commit comments

Comments
 (0)