Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions WrapImage/nifti_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ def loop_over_first_n_minus_1_dimensions(arr):

# Pass additional arguments to the algorithm

fit = OsipiBase(algorithm=args.algorithm)
fit = OsipiBase(algorithm=args.algorithm, bvalues=bvals)
f_image = []
Dp_image = []
D_image = []
Expand All @@ -109,7 +109,7 @@ def loop_over_first_n_minus_1_dimensions(arr):
n = data.ndim
total_iteration = np.prod(data.shape[:n-1])
for idx, view in tqdm(loop_over_first_n_minus_1_dimensions(data), desc=f"{args.algorithm} is fitting", dynamic_ncols=True, total=total_iteration):
fit_result = fit.osipi_fit(view, bvals)
fit_result = fit.osipi_fit(view)
f_image.append(fit_result["f"])
Dp_image.append(fit_result["Dp"])
D_image.append(fit_result["D"])
Expand Down
4 changes: 2 additions & 2 deletions WrapImage/nifti_wrapper_kaapana.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ def load_config():
affine = np.array(affine_override).reshape(4, 4)

# Initialize model
fit = OsipiBase(algorithm=algorithm)
fit = OsipiBase(algorithm=algorithm, bvalues=bvals)

# Preallocate output arrays
shape = data.shape[:data.ndim - 1]
Expand All @@ -142,7 +142,7 @@ def load_config():
loop_over_first_n_minus_1_dimensions(data),
desc="Fitting IVIM model", dynamic_ncols=True, total=total_iteration
):
fit_result = fit.osipi_fit(view, bvals)
fit_result = fit.osipi_fit(view)
f_image[idx] = fit_result["f"]
Dp_image[idx] = fit_result["Dp"]
D_image[idx] = fit_result["D"]
Expand Down
5 changes: 2 additions & 3 deletions src/standardized/ASD_MemorialSloanKettering_QAMPER_IVIM.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,11 @@ def algorithm(self,dwi_arr, bval_arr, LB0, UB0, x0in):
(f_arr, D_arr, Dx_arr, s0_arr, fitted_dwi_arr, RSS, rms_val, chi, AIC, BIC, R_sq) = results
return D_arr/1000, f_arr, Dx_arr/1000, s0_arr

def ivim_fit(self, signals, bvalues, **kwargs):
def ivim_fit(self, signals, **kwargs):
"""Perform the IVIM fit

Args:
signals (array-like)
bvalues (array-like, optional): b-values for the signals. If None, self.bvalues will be used. Default is None.

Returns:
_type_: _description_
Expand All @@ -81,7 +80,7 @@ def ivim_fit(self, signals, bvalues, **kwargs):

initial_guess = [self.initial_guess["D"], self.initial_guess["f"], self.initial_guess["Dp"], self.initial_guess["S0"]]

bvalues=np.array(bvalues)
bvalues=np.array(self.bvalues)
LB = np.array(bounds[0])[[1,0,2,3]]
UB = np.array(bounds[1])[[1,0,2,3]]

Expand Down
5 changes: 2 additions & 3 deletions src/standardized/DT_IIITN_WLS.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,17 +66,16 @@ def __init__(self, bvalues=None, thresholds=None,
)
self.method = method.upper()

def ivim_fit(self, signals, bvalues, **kwargs):
def ivim_fit(self, signals, **kwargs):
"""Perform the IVIM fit using the selected method (WLS or RLM).

Args:
signals (array-like): Signal intensities at each b-value.
bvalues (array-like, optional): b-values for the signals.

Returns:
dict: Dictionary with keys "D", "f", "Dp".
"""
bvalues = np.array(bvalues)
bvalues = np.array(self.bvalues)

# Use threshold as cutoff if available
cutoff = 200
Expand Down
6 changes: 2 additions & 4 deletions src/standardized/ETP_SRI_LinearFitting.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,20 +59,18 @@ def __init__(self, bvalues=None, thresholds=None, bounds=None, initial_guess=Non
# Check the inputs


def ivim_fit(self, signals, bvalues=None, linear_fit_option=False, **kwargs):
def ivim_fit(self, signals, linear_fit_option=False, **kwargs):
"""Perform the IVIM fit

Args:
signals (array-like)
bvalues (array-like, optional): b-values for the signals. If None, self.bvalues will be used. Default is None.
linear_fit_option (bool, optional): This fit has an option to only run a linear fit. Defaults to False.

Returns:
_type_: _description_
"""
signals[signals<0.0000001]=0.0000001
if bvalues is None:
bvalues = self.bvalues
bvalues = self.bvalues

if self.thresholds is None:
ETP_object = LinearFit()
Expand Down
17 changes: 5 additions & 12 deletions src/standardized/IAR_LU_biexp.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,11 @@ def __init__(self, bvalues=None, thresholds=None, bounds=None, initial_guess=Non
self.IAR_algorithm = None


def ivim_fit(self, signals, bvalues, **kwargs):
def ivim_fit(self, signals, **kwargs):
"""Perform the IVIM fit

Args:
signals (array-like)
bvalues (array-like, optional): b-values for the signals. If None, self.bvalues will be used. Default is None.

Returns:
_type_: _description_
Expand All @@ -88,10 +87,7 @@ def ivim_fit(self, signals, bvalues, **kwargs):
initial_guess = [self.initial_guess["S0"], self.initial_guess["f"], self.initial_guess["Dp"], self.initial_guess["D"]]

if self.IAR_algorithm is None:
if bvalues is None:
bvalues = self.bvalues
else:
bvalues = np.asarray(bvalues)
bvalues = np.asarray(self.bvalues)

bvec = np.zeros((bvalues.size, 3))
bvec[:,2] = 1
Expand All @@ -110,12 +106,11 @@ def ivim_fit(self, signals, bvalues, **kwargs):
return results


def ivim_fit_full_volume(self, signals, bvalues, **kwargs):
def ivim_fit_full_volume(self, signals, **kwargs):
"""Perform the IVIM fit

Args:
signals (array-like)
bvalues (array-like, optional): b-values for the signals. If None, self.bvalues will be used. Default is None.

Returns:
_type_: _description_
Expand All @@ -125,16 +120,14 @@ def ivim_fit_full_volume(self, signals, bvalues, **kwargs):
[self.bounds["S0"][1], self.bounds["f"][1], self.bounds["Dp"][1], self.bounds["D"][1]]]
initial_guess = [self.initial_guess["S0"], self.initial_guess["f"], self.initial_guess["Dp"], self.initial_guess["D"]]
if self.IAR_algorithm is None:
if bvalues is None:
bvalues = self.bvalues
else:
bvalues = np.asarray(bvalues)
bvalues = np.asarray(self.bvalues)

bvec = np.zeros((bvalues.size, 3))
bvec[:,2] = 1
gtab = gradient_table(bvalues, bvecs=bvec, b0_threshold=0)

self.IAR_algorithm = IvimModelBiExp(gtab, bounds=bounds, initial_guess=initial_guess)
bvalues = np.asarray(self.bvalues)
b0_index = np.where(bvalues == 0)[0][0]
mask = signals[...,b0_index]>0
fit_results = self.IAR_algorithm.fit(signals, mask=mask)
Expand Down
8 changes: 2 additions & 6 deletions src/standardized/IAR_LU_modified_mix.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,11 @@ def __init__(self, bvalues=None, thresholds=None, bounds=None, initial_guess=Non
self.IAR_algorithm = None


def ivim_fit(self, signals, bvalues, **kwargs):
def ivim_fit(self, signals, **kwargs):
"""Perform the IVIM fit

Args:
signals (array-like)
bvalues (array-like, optional): b-values for the signals. If None, self.bvalues will be used. Default is None.

Returns:
_type_: _description_
Expand All @@ -83,10 +82,7 @@ def ivim_fit(self, signals, bvalues, **kwargs):
[self.bounds["f"][1], self.bounds["Dp"][1]*1000, self.bounds["D"][1]*1000]]

if self.IAR_algorithm is None:
if bvalues is None:
bvalues = self.bvalues
else:
bvalues = np.asarray(bvalues)
bvalues = np.asarray(self.bvalues)

bvec = np.zeros((bvalues.size, 3))
bvec[:,2] = 1
Expand Down
8 changes: 2 additions & 6 deletions src/standardized/IAR_LU_modified_topopro.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,11 @@ def __init__(self, bvalues=None, thresholds=None, bounds=None, initial_guess=Non
self.IAR_algorithm = None


def ivim_fit(self, signals, bvalues, **kwargs):
def ivim_fit(self, signals, **kwargs):
"""Perform the IVIM fit

Args:
signals (array-like)
bvalues (array-like, optional): b-values for the signals. If None, self.bvalues will be used. Default is None.

Returns:
_type_: _description_
Expand All @@ -86,10 +85,7 @@ def ivim_fit(self, signals, bvalues, **kwargs):
[self.bounds["f"][1], self.bounds["Dp"][1]*1000, self.bounds["D"][1]*1000]]

if self.IAR_algorithm is None:
if bvalues is None:
bvalues = self.bvalues
else:
bvalues = np.asarray(bvalues)
bvalues = np.asarray(self.bvalues)

bvec = np.zeros((bvalues.size, 3))
bvec[:,2] = 1
Expand Down
8 changes: 2 additions & 6 deletions src/standardized/IAR_LU_segmented_2step.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,11 @@ def __init__(self, bvalues=None, thresholds=None, bounds=None, initial_guess=Non
self.IAR_algorithm = None


def ivim_fit(self, signals, bvalues, thresholds=None, **kwargs):
def ivim_fit(self, signals, **kwargs):
"""Perform the IVIM fit

Args:
signals (array-like)
bvalues (array-like, optional): b-values for the signals. If None, self.bvalues will be used. Default is None.

Returns:
_type_: _description_
Expand All @@ -90,10 +89,7 @@ def ivim_fit(self, signals, bvalues, thresholds=None, **kwargs):
initial_guess = [self.initial_guess["S0"], self.initial_guess["f"], self.initial_guess["Dp"], self.initial_guess["D"]]

if self.IAR_algorithm is None:
if bvalues is None:
bvalues = self.bvalues
else:
bvalues = np.asarray(bvalues)
bvalues = np.asarray(self.bvalues)

bvec = np.zeros((bvalues.size, 3))
bvec[:,2] = 1
Expand Down
8 changes: 2 additions & 6 deletions src/standardized/IAR_LU_segmented_3step.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,12 +75,11 @@ def __init__(self, bvalues=None, thresholds=None, bounds=None, initial_guess=Non
self.IAR_algorithm = None


def ivim_fit(self, signals, bvalues, **kwargs):
def ivim_fit(self, signals, **kwargs):
"""Perform the IVIM fit

Args:
signals (array-like)
bvalues (array-like, optional): b-values for the signals. If None, self.bvalues will be used. Default is None.

Returns:
_type_: _description_
Expand All @@ -93,10 +92,7 @@ def ivim_fit(self, signals, bvalues, **kwargs):
initial_guess = [self.initial_guess["S0"], self.initial_guess["f"], self.initial_guess["Dp"], self.initial_guess["D"]]

if self.IAR_algorithm is None:
if bvalues is None:
bvalues = self.bvalues
else:
bvalues = np.asarray(bvalues)
bvalues = np.asarray(self.bvalues)

bvec = np.zeros((bvalues.size, 3))
bvec[:,2] = 1
Expand Down
8 changes: 2 additions & 6 deletions src/standardized/IAR_LU_subtracted.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,11 @@ def __init__(self, bvalues=None, thresholds=None, bounds=None, initial_guess=Non
self.IAR_algorithm = None


def ivim_fit(self, signals, bvalues, **kwargs):
def ivim_fit(self, signals, **kwargs):
"""Perform the IVIM fit

Args:
signals (array-like)
bvalues (array-like, optional): b-values for the signals. If None, self.bvalues will be used. Default is None.

Returns:
_type_: _description_
Expand All @@ -90,10 +89,7 @@ def ivim_fit(self, signals, bvalues, **kwargs):
initial_guess = [self.initial_guess["S0"], self.initial_guess["f"], self.initial_guess["Dp"], self.initial_guess["D"]]

if self.IAR_algorithm is None:
if bvalues is None:
bvalues = self.bvalues
else:
bvalues = np.asarray(bvalues)
bvalues = np.asarray(self.bvalues)

bvec = np.zeros((bvalues.size, 3))
bvec[:,2] = 1
Expand Down
10 changes: 2 additions & 8 deletions src/standardized/IVIM_NEToptim.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,18 +89,15 @@ def initialize(self, bounds, initial_guess, fitS0, traindata, SNR, n):
self.algorithm =lambda data: deep.predict_IVIM(data, self.bvalues, self.net, self.arg)


def ivim_fit(self, signals, bvalues, **kwargs):
def ivim_fit(self, signals, **kwargs):
"""Perform the IVIM fit

Args:
signals (array-like)
bvalues (array-like): b-values for the signals. If None, self.bvalues will be used. Default is None.

Returns:
_type_: _description_
"""
if not np.array_equal(bvalues, self.bvalues):
raise ValueError("bvalue list at fitting must be identical as the one at initiation, otherwise it will not run")

paramsNN = deep.predict_IVIM(signals, self.bvalues, self.net, self.arg)

Expand All @@ -112,18 +109,15 @@ def ivim_fit(self, signals, bvalues, **kwargs):
return results


def ivim_fit_full_volume(self, signals, bvalues, retrain_on_input_data=False, **kwargs):
def ivim_fit_full_volume(self, signals, retrain_on_input_data=False, **kwargs):
"""Perform the IVIM fit

Args:
signals (array-like)
bvalues (array-like): b-values for the signals. If None, self.bvalues will be used. Default is None.

Returns:
_type_: _description_
"""
if not np.array_equal(bvalues, self.bvalues):
raise ValueError("bvalue list at fitting must be identical as the one at initiation, otherwise it will not run")
minimum_bvalue = np.min(self.bvalues) # We normalize the signal to the minimum bvalue. Should be 0 or very close to 0.
b0_indices = np.where(self.bvalues == minimum_bvalue)[0]
normalization_factor = np.mean(signals[..., b0_indices],axis=-1)
Expand Down
11 changes: 5 additions & 6 deletions src/standardized/OGC_AmsterdamUMC_Bayesian_biexp.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,12 +73,11 @@ def initialize(self, bounds=None, initial_guess=None, fitS0=True, prior_in=None,
self.neg_log_prior = empirical_neg_log_prior(prior_in[0], prior_in[1], prior_in[2])
self.fitS0=fitS0

def ivim_fit(self, signals, bvalues, initial_guess=None, **kwargs):
def ivim_fit(self, signals, initial_guess=None, **kwargs):
"""Perform the IVIM fit

Args:
signals (array-like)
bvalues (array-like, optional): b-values for the signals. If None, self.bvalues will be used. Default is None.

Returns:
_type_: _description_
Expand All @@ -88,7 +87,7 @@ def ivim_fit(self, signals, bvalues, initial_guess=None, **kwargs):

initial_guess = [self.initial_guess["D"], self.initial_guess["f"], self.initial_guess["Dp"], self.initial_guess["S0"]]

bvalues=np.array(bvalues)
bvalues=np.array(self.bvalues)

epsilon = 0.000001
fit_results = fit_segmented(bvalues, signals, bounds=bounds, cutoff=self.thresholds, p0=initial_guess)
Expand All @@ -105,11 +104,10 @@ def ivim_fit(self, signals, bvalues, initial_guess=None, **kwargs):

return results

def ivim_fit_full_volume(self, signals, bvalues, njobs=4, **kwargs):
def ivim_fit_full_volume(self, signals, njobs=4, **kwargs):
"""Perform the IVIM fit
Args:
signals (array-like)
bvalues (array-like, optional): b-values for the signals. If None, self.bvalues will be used. Default is None.
Returns:
_type_: _description_
"""
Expand All @@ -122,6 +120,7 @@ def ivim_fit_full_volume(self, signals, bvalues, njobs=4, **kwargs):
# Get index of b=0
shape=np.shape(signals)

bvalues=np.array(self.bvalues)
b0_index = np.where(bvalues == 0)[0][0]
# Mask of voxels where signal at b=0 >= 0.5
valid_mask = signals[..., b0_index] >= 0
Expand All @@ -133,7 +132,7 @@ def ivim_fit_full_volume(self, signals, bvalues, njobs=4, **kwargs):
normalization_factor = np.mean(signals[..., b0_indices],axis=-1)
signals = signals / np.repeat(normalization_factor[...,np.newaxis],np.shape(signals)[-1],-1)

bvalues=np.array(bvalues)
bvalues=np.array(self.bvalues)

epsilon = 0.000001
fit_results = np.array(fit_segmented_array(bvalues, signals, bounds=bounds, cutoff=self.thresholds, p0=initial_guess))
Expand Down
Loading
Loading