Skip to content

Commit c0a6b4d

Browse files
committed
Fixed results comparison and added duration
1 parent fbde4a5 commit c0a6b4d

File tree

4 files changed

+76
-30
lines changed

4 files changed

+76
-30
lines changed

conftest.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import pathlib
33
import json
44
import csv
5-
import datetime
5+
# import datetime
66

77

88
def pytest_addoption(parser):
@@ -49,6 +49,12 @@ def pytest_addoption(parser):
4949
type=int,
5050
help="Number of fits to perform on the same parameters",
5151
)
52+
parser.addoption(
53+
"--saveDurationFileName",
54+
default="",
55+
type=str,
56+
help="Saved duration results file name",
57+
)
5258

5359

5460
@pytest.fixture(scope="session")
@@ -60,9 +66,25 @@ def save_file(request):
6066
# print(filename)
6167
# filename.unlink(missing_ok=True)
6268
filename = filename.as_posix()
63-
with open(filename, "a") as csv_file:
64-
writer = csv.writer(csv_file, delimiter='#')
65-
writer.writerow(["", datetime.datetime.now()])
69+
with open(filename, "w") as csv_file:
70+
writer = csv.writer(csv_file, delimiter=',')
71+
writer.writerow(("Algorithm", "Region", "SNR", "f", "Dp", "D", "f_fitted", "Dp_fitted", "D_fitted"))
72+
# writer.writerow(["", datetime.datetime.now()])
73+
return filename
74+
75+
@pytest.fixture(scope="session")
76+
def save_duration_file(request):
77+
filename = request.config.getoption("--saveDurationFileName")
78+
if filename:
79+
current_folder = pathlib.Path.cwd()
80+
filename = current_folder / filename
81+
# print(filename)
82+
# filename.unlink(missing_ok=True)
83+
filename = filename.as_posix()
84+
with open(filename, "w") as csv_file:
85+
writer = csv.writer(csv_file, delimiter=',')
86+
writer.writerow(("Algorithm", "Region", "SNR", "Duration [us]", "Count"))
87+
# writer.writerow(["", datetime.datetime.now()])
6688
return filename
6789

6890
@pytest.fixture(scope="session")

src/original/ETP_SRI/LinearFitting.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,20 @@ def ivim_fit(self, bvalues, signal):
6666
gt_cutoff = bvalues >= self.linear_cutoff
6767
linear_signal = np.log(signal)
6868
D = self.linear_fit(bvalues[gt_cutoff], linear_signal[gt_cutoff])
69+
# print(D)
6970
D[1] = max(D[1], 0) # constrain to positive values
7071

7172
if lt_cutoff.sum() > 0:
7273
signal_Dp = linear_signal[lt_cutoff] - gd.linear_signal(D[1], bvalues[lt_cutoff], np.log(D[0]))
73-
74-
Dp_prime = self.linear_fit(bvalues[lt_cutoff], np.log(signal_Dp))
74+
# print(signal_Dp)
75+
signal_valid = signal_Dp > 0
76+
lt_cutoff_dual = np.logical_and(lt_cutoff[:len(signal_Dp)], signal_valid)
77+
# print(lt_cutoff_dual)
78+
Dp_prime = [-1, -1]
79+
if lt_cutoff_dual.sum() > 0:
80+
# print(np.log(signal_Dp[lt_cutoff_dual]))
81+
Dp_prime = self.linear_fit(bvalues[:len(signal_Dp)][lt_cutoff_dual], np.log(signal_Dp[lt_cutoff_dual]))
82+
# print(Dp_prime)
7583

7684
if np.any(np.asarray(Dp_prime) < 0) or not np.all(np.isfinite(Dp_prime)):
7785
print('Perfusion fit failed')

tests/IVIMmodels/unit_tests/analyze.r

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
library(tidyverse)
2-
data <- read.csv("test_output.csv", skip=1, col.names=c("Algorithm", "Region", "SNR", "Truth", "Fitted"))
3-
data<-separate_wider_delim(data, cols = Truth, delim = ",", names = c("f", "D", "Dp"))
4-
data$f <- substring(data$f, 2)
5-
data$Dp <- substring(data$Dp, 1, nchar(data$Dp) - 1)
6-
data<-separate_wider_delim(data, cols = Fitted, delim = ",", names = c("f_fitted", "D_fitted", "Dp_fitted"))
7-
data$f_fitted <- substring(data$f_fitted, 2)
8-
data$Dp_fitted <- substring(data$Dp_fitted, 1, nchar(data$Dp_fitted) - 1)
9-
data[c("Algorithm", "Region")] <- sapply(data[c("Algorithm", "Region")], as.factor)
10-
data[c("SNR", "f", "D", "Dp", "f_fitted", "D_fitted", "Dp_fitted")] <- sapply(data[c("SNR", "f", "D", "Dp", "f_fitted", "D_fitted", "Dp_fitted")], as.numeric)
11-
ggplot(data, aes(x=Algorithm)) + geom_boxplot(aes(y=f_fitted)) + geom_boxplot(color="red", aes(y=f)) + facet_grid(SNR ~ Region) + scale_x_discrete(guide = guide_axis(angle = 90)) + ylim(0, 1) + ggtitle("Perfusion fraction grid") + xlab("Perfusion fraction")
12-
ggsave("f.pdf", width = 50, height = 50, units = "cm")
13-
ggplot(data, aes(x=Algorithm)) + geom_boxplot(aes(y=D_fitted)) + geom_boxplot(color="red", aes(y=D)) + facet_grid(SNR ~ Region) + scale_x_discrete(guide = guide_axis(angle = 90)) + ggtitle("Diffusion grid") + xlab("Diffusion")
14-
ggsave("D.pdf", width = 50, height = 50, units = "cm")
15-
ggplot(data, aes(x=Algorithm)) + geom_boxplot(aes(y=Dp_fitted)) + geom_boxplot(color="red", aes(y=Dp)) + facet_grid(SNR ~ Region) + scale_x_discrete(guide = guide_axis(angle = 90)) + ggtitle("Perfusion grid") + xlab("Perfusion")
16-
ggsave("Dp.pdf", width = 50, height = 50, units = "cm")
17-
#why?
18-
ggplot(data, aes(x=Algorithm)) + geom_boxplot(aes(y=D_fitted)) + geom_boxplot(color="red", aes(y=Dp)) + facet_grid(SNR ~ Region) + scale_x_discrete(guide = guide_axis(angle = 90)) + ggtitle("Diffusion grid") + xlab("Diffusion")
19-
ggsave("D_tweak.pdf", width = 50, height = 50, units = "cm")
20-
ggplot(data, aes(x=Algorithm)) + geom_boxplot(aes(y=Dp_fitted)) + geom_boxplot(color="red", aes(y=D)) + facet_grid(SNR ~ Region) + scale_x_discrete(guide = guide_axis(angle = 90)) + ggtitle("Perfusion grid") + xlab("Perfusion")
21-
ggsave("Dp_tweak.pdf", width = 50, height = 50, units = "cm")
2+
library(plyr)
3+
4+
plot_ivim <- function(data, fileExtension) {
5+
ggplot(data, aes(x=Algorithm)) + geom_boxplot(aes(y=f_fitted)) + geom_boxplot(color="red", aes(y=f)) + facet_grid(SNR ~ Region) + scale_x_discrete(guide = guide_axis(angle = 90)) + ylim(0, 1) + ggtitle("Perfusion fraction grid") + ylab("Perfusion fraction")
6+
ggsave(paste("f", fileExtension, sep=""), width = 50, height = 50, units = "cm")
7+
ggplot(data, aes(x=Algorithm)) + geom_boxplot(aes(y=D_fitted)) + geom_boxplot(color="red", aes(y=D)) + facet_grid(SNR ~ Region) + scale_x_discrete(guide = guide_axis(angle = 90)) + ggtitle("Diffusion grid") + ylab("Diffusion")
8+
ggsave(paste("D", fileExtension, sep=""), width = 50, height = 50, units = "cm")
9+
ggplot(data, aes(x=Algorithm)) + geom_boxplot(aes(y=Dp_fitted)) + geom_boxplot(color="red", aes(y=Dp)) + facet_grid(SNR ~ Region) + scale_x_discrete(guide = guide_axis(angle = 90)) + ylim(0, 0.25) + ggtitle("Perfusion grid") + ylab("Perfusion")
10+
ggsave(paste("Dp", fileExtension, sep=""), width = 50, height = 50, units = "cm")
11+
}
12+
13+
data <- read.csv("test_output.csv")
14+
data <- data %>% mutate_if(is.character, as.factor)
15+
plot_ivim(data, ".pdf")
16+
17+
data_restricted <- data[data$Region %in% c("Liver", "spleen", "Right kydney cortex", "right kidney medulla"),]
18+
plot_ivim(data_restricted, "_limited.pdf")
19+
20+
data_duration <- read.csv("test_duration.csv")
21+
data_duration <- data_duration %>% mutate_if(is.character, as.factor)
22+
data_duration$ms <- data_duration$Duration..us./data_duration$Count/1000
23+
ggplot(data_duration, aes(x=Algorithm, y=ms)) + geom_boxplot() + scale_x_discrete(guide = guide_axis(angle = 90)) + ggtitle("Fit Duration") + ylab("Time (ms)")
24+
ggsave("durations.pdf", width = 20, height = 20, units = "cm")
25+

tests/IVIMmodels/unit_tests/test_ivim_synthetic.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
import os
77
import csv
88
import random
9+
import datetime
910

1011
from src.wrappers.OsipiBase import OsipiBase
1112
from utilities.data_simulation.GenerateData import GenerateData
1213

1314
#run using pytest <path_to_this_file> --saveFileName test_output.txt --SNR 50 100 200
1415
#e.g. pytest -m slow tests/IVIMmodels/unit_tests/test_ivim_synthetic.py --saveFileName test_output.csv --SNR 10 50 100 200 --fitCount 20
1516
@pytest.mark.slow
16-
def test_generated(ivim_algorithm, ivim_data, SNR, rtol, atol, fit_count, save_file):
17+
def test_generated(ivim_algorithm, ivim_data, SNR, rtol, atol, fit_count, save_file, save_duration_file):
1718
# assert save_file == "test"
1819
random.seed(42)
1920
S0 = 1
@@ -23,19 +24,30 @@ def test_generated(ivim_algorithm, ivim_data, SNR, rtol, atol, fit_count, save_f
2324
f = data["f"]
2425
Dp = data["Dp"]
2526
fit = OsipiBase(algorithm=ivim_algorithm)
27+
time_delta = datetime.timedelta()
2628
for idx in range(fit_count):
2729
# if "data" not in data:
2830
signal = gd.ivim_signal(D, Dp, f, S0, bvals, SNR)
2931
# else:
3032
# signal = data["data"]
33+
start_time = datetime.datetime.now()
3134
[f_fit, Dp_fit, D_fit] = fit.osipi_fit(signal, bvals)
35+
time_delta += datetime.datetime.now() - start_time
3236
if save_file:
33-
save_results(save_file, ivim_algorithm, name, SNR, [f, D, Dp], [f_fit, Dp_fit, D_fit])
34-
npt.assert_allclose([f, D, Dp], [f_fit, D_fit, Dp_fit], rtol, atol)
37+
save_results(save_file, ivim_algorithm, name, SNR, [f, Dp, D], [f_fit, Dp_fit, D_fit])
38+
npt.assert_allclose([f, Dp, D], [f_fit, Dp_fit, D_fit], rtol, atol)
39+
if save_duration_file:
40+
save_duration(save_duration_file, ivim_algorithm, name, SNR, time_delta, fit_count)
3541

3642

3743
def save_results(filename, algorithm, name, SNR, truth, fit):
3844
with open(filename, "a") as csv_file:
3945
writer = csv.writer(csv_file, delimiter=',')
40-
data = [algorithm, name, SNR, truth, fit]
46+
data = [algorithm, name, SNR, *truth, *fit]
47+
writer.writerow(data)
48+
49+
def save_duration(filename, algorithm, name, SNR, duration, count):
50+
with open(filename, "a") as csv_file:
51+
writer = csv.writer(csv_file, delimiter=',')
52+
data = [algorithm, name, SNR, duration/datetime.timedelta(microseconds=1), count]
4153
writer.writerow(data)

0 commit comments

Comments
 (0)