OSCR

A frontotemporal free water signature associated to interleukin-8 and cognitive impairment in schizophrenia with comorbidity of metabolic syndrome.

Code ↔ Paper

1 match between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 1 match
  1. [1] § Methods › Imaging data acquisition and processing ↔ code/nls.py, lines 540 to 659 · score 0.74 · Diffusion tensor, elimination model, Free Water, transformation, uniform, voxel · Report a mismatch

Paper

Loaded from Europe PMC by your browser; OSCR does not store it: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 966 lines · 38 KB · BSD-3-Clause · 1 match

  1. """ Classes and functions for fitting tensors without free water
  2. contamination """
  3. from __future__ import division, print_function, absolute_import
  4. import warnings
  5. import numpy as np
  6. import scipy.optimize as opt
  7. from dipy.reconst.base import ReconstModel
  8. from dipy.reconst.dti import (TensorFit, design_matrix, decompose_tensor,
  9. _decompose_tensor_nan, from_lower_triangular,
  10. lower_triangular, ols_fit_tensor,
  11. fractional_anisotropy, mean_diffusivity)
  12. from dipy.reconst.dki import _positive_evals
  13. from dipy.reconst.vec_val_sum import vec_val_vect
  14. from dipy.core.ndindex import ndindex
  15. from dipy.core.gradients import check_multi_b, gradient_table
  16. from dipy.reconst.multi_voxel import multi_voxel_fit
  17. def fwdti_prediction(params, gtab, S0=1, Diso=3.0e-3):
  18. r""" Signal prediction given the free water DTI model parameters.
  19. Parameters
  20. ----------
  21. params : (..., 13) ndarray
  22. Model parameters. The last dimension should have the 12 tensor
  23. parameters (3 eigenvalues, followed by the 3 corresponding
  24. eigenvectors) and the volume fraction of the free water compartment.
  25. gtab : a GradientTable class instance
  26. The gradient table for this prediction
  27. S0 : float or ndarray
  28. The non diffusion-weighted signal in every voxel, or across all
  29. voxels. Default: 1
  30. Diso : float, optional
  31. Value of the free water isotropic diffusion. Default is set to 3e-3
  32. $mm^{2}.s^{-1}$. Please adjust this value if you are assuming different
  33. units of diffusion.
  34. Returns
  35. --------
  36. S : (..., N) ndarray
  37. Simulated signal based on the free water DTI model
  38. Notes
  39. -----
  40. The predicted signal is given by:
  41. $S(\theta, b) = S_0 * [(1-f) * e^{-b ADC} + f * e^{-b D_{iso}]$, where
  42. $ADC = \theta Q \theta^T$, $\theta$ is a unit vector pointing at any
  43. direction on the sphere for which a signal is to be predicted, $b$ is the b
  44. value provided in the GradientTable input for that direction, $Q$ is the
  45. quadratic form of the tensor determined by the input parameters, $f$ is the
  46. free water diffusion compartment, $D_{iso}$ is the free water diffusivity
  47. which is equal to $3 * 10^{-3} mm^{2}s^{-1} [1]_.
  48. References
  49. ----------
  50. .. [1] Henriques, R.N., Rokem, A., Garyfallidis, E., St-Jean, S.,
  51. Peterson E.T., Correia, M.M., 2017. [Re] Optimization of a free
  52. water elimination two-compartment model for diffusion tensor
  53. imaging. ReScience volume 3, issue 1, article number 2
  54. """
  55. evals = params[..., :3]
  56. evecs = params[..., 3:-1].reshape(params.shape[:-1] + (3, 3))
  57. f = params[..., 12]
  58. qform = vec_val_vect(evecs, evals)
  59. lower_dt = lower_triangular(qform, S0)
  60. lower_diso = lower_dt.copy()
  61. lower_diso[..., 0] = lower_diso[..., 2] = lower_diso[..., 5] = Diso
  62. lower_diso[..., 1] = lower_diso[..., 3] = lower_diso[..., 4] = 0
  63. D = design_matrix(gtab)
  64. pred_sig = np.zeros(f.shape + (gtab.bvals.shape[0],))
  65. mask = _positive_evals(evals[..., 0], evals[..., 1], evals[..., 2])
  66. index = ndindex(f.shape)
  67. for v in index:
  68. if mask[v]:
  69. pred_sig[v] = (1 - f[v]) * np.exp(np.dot(lower_dt[v], D.T)) + \
  70. f[v] * np.exp(np.dot(lower_diso[v], D.T))
  71. return pred_sig
  72. class FreeWaterTensorModel_mod(ReconstModel):
  73. """ Class for the Free Water Elimination Diffusion Tensor Model """
  74. def __init__(self, gtab, fit_method="NLS", *args, **kwargs):
  75. """ Free Water Diffusion Tensor Model [1]_.
  76. Parameters
  77. ----------
  78. gtab : GradientTable class instance
  79. fit_method : str or callable
  80. str can be one of the following:
  81. 'WLS' for weighted linear least square fit according to [1]_
  82. :func:`fwdti.wls_iter`
  83. 'NLS' for non-linear least square fit according to [1]_
  84. :func:`fwdti.nls_iter`
  85. callable has to have the signature:
  86. fit_method(design_matrix, data, *args, **kwargs)
  87. args, kwargs : arguments and key-word arguments passed to the
  88. fit_method. See fwdti.wls_iter, fwdti.nls_iter for
  89. details
  90. References
  91. ----------
  92. .. [1] Henriques, R.N., Rokem, A., Garyfallidis, E., St-Jean, S.,
  93. Peterson E.T., Correia, M.M., 2017. [Re] Optimization of a free
  94. water elimination two-compartment model for diffusion tensor
  95. imaging. ReScience volume 3, issue 1, article number 2
  96. """
  97. ReconstModel.__init__(self, gtab)
  98. if not callable(fit_method):
  99. try:
  100. fit_method = common_fit_methods[fit_method]
  101. except KeyError:
  102. e_s = '"' + str(fit_method) + '" is not a known fit '
  103. e_s += 'method, the fit method should either be a '
  104. e_s += 'function or one of the common fit methods'
  105. raise ValueError(e_s)
  106. self.fit_method = fit_method
  107. self.design_matrix = design_matrix(self.gtab)
  108. self.args = args
  109. self.kwargs = kwargs
  110. # Check if at least three b-values are given
  111. enough_b = check_multi_b(self.gtab, 3, non_zero=False)
  112. if not enough_b:
  113. mes = "fwDTI requires at least 3 b-values (which can include b=0)"
  114. raise ValueError(mes)
  115. @multi_voxel_fit
  116. def fit(self, data, mask=None):
  117. """ Fit method of the free water elimination DTI model class
  118. Parameters
  119. ----------
  120. data : array
  121. The measured signal from one voxel.
  122. mask : array
  123. A boolean array used to mark the coordinates in the data that
  124. should be analyzed that has the shape data.shape[:-1]
  125. """
  126. S0 = np.mean(data[self.gtab.b0s_mask])
  127. fwdti_params, init_params = self.fit_method(self.design_matrix,
  128. self.gtab, data, S0,
  129. *self.args, **self.kwargs)
  130. fit = FreeWaterTensorFit(self, fwdti_params)
  131. fit.initial_guess = init_params
  132. return fit
  133. def predict(self, fwdti_params, S0=1):
  134. """ Predict a signal for this TensorModel class instance given
  135. parameters.
  136. Parameters
  137. ----------
  138. fwdti_params : (..., 13) ndarray
  139. The last dimension should have 13 parameters: the 12 tensor
  140. parameters (3 eigenvalues, followed by the 3 corresponding
  141. eigenvectors) and the free water volume fraction.
  142. S0 : float or ndarray
  143. The non diffusion-weighted signal in every voxel, or across all
  144. voxels. Default: 1
  145. Returns
  146. --------
  147. S : (..., N) ndarray
  148. Simulated signal based on the free water DTI model
  149. """
  150. return fwdti_prediction(fwdti_params, self.gtab, S0=S0)
  151. class FreeWaterTensorFit(TensorFit):
  152. """ Class for fitting the Free Water Tensor Model """
  153. def __init__(self, model, model_params):
  154. """ Initialize a FreeWaterTensorFit class instance.
  155. Since the free water tensor model is an extension of DTI, class
  156. instance is defined as subclass of the TensorFit from dti.py
  157. Parameters
  158. ----------
  159. model : FreeWaterTensorModel Class instance
  160. Class instance containing the free water tensor model for the fit
  161. model_params : ndarray (x, y, z, 13) or (n, 13)
  162. All parameters estimated from the free water tensor model.
  163. Parameters are ordered as follows:
  164. 1) Three diffusion tensor's eigenvalues
  165. 2) Three lines of the eigenvector matrix each containing the
  166. first, second and third coordinates of the eigenvector
  167. 3) The volume fraction of the free water compartment
  168. References
  169. ----------
  170. .. [1] Henriques, R.N., Rokem, A., Garyfallidis, E., St-Jean, S.,
  171. Peterson E.T., Correia, M.M., 2017. [Re] Optimization of a free
  172. water elimination two-compartment model for diffusion tensor
  173. imaging. ReScience volume 3, issue 1, article number 2
  174. """
  175. TensorFit.__init__(self, model, model_params)
  176. @property
  177. def f(self):
  178. """ Returns the free water diffusion volume fraction f """
  179. return self.model_params[..., 12]
  180. @property
  181. def f0(self):
  182. return self.initial_guess[..., 12]
  183. @property
  184. def fa0(self):
  185. return fractional_anisotropy(self.initial_guess[..., 0:3])
  186. @property
  187. def md0(self):
  188. return mean_diffusivity(self.initial_guess[..., 0:3])
  189. def predict(self, gtab, S0=1):
  190. r""" Given a free water tensor model fit, predict the signal on the
  191. vertices of a gradient table
  192. Parameters
  193. ----------
  194. gtab : a GradientTable class instance
  195. The gradient table for this prediction
  196. S0 : float array
  197. The mean non-diffusion weighted signal in each voxel. Default: 1 in
  198. all voxels.
  199. Returns
  200. --------
  201. S : (..., N) ndarray
  202. Simulated signal based on the free water DTI model
  203. """
  204. return fwdti_prediction(self.model_params, gtab, S0=S0)
  205. def wls_iter(design_matrix, sig, S0, Diso=3e-3, mdreg=2.7e-3,
  206. min_signal=1.0e-6, piterations=3):
  207. """ Applies weighted linear least squares fit of the water free elimination
  208. model to single voxel signals.
  209. Parameters
  210. ----------
  211. design_matrix : array (g, 7)
  212. Design matrix holding the covariants used to solve for the regression
  213. coefficients.
  214. sig : array (g, )
  215. Diffusion-weighted signal for a single voxel data.
  216. S0 : float
  217. Non diffusion weighted signal (i.e. signal for b-value=0).
  218. Diso : float, optional
  219. Value of the free water isotropic diffusion. Default is set to 3e-3
  220. $mm^{2}.s^{-1}$. Please adjust this value if you are assuming different
  221. units of diffusion.
  222. mdreg : float, optimal
  223. DTI's mean diffusivity regularization threshold. If standard DTI
  224. diffusion tensor's mean diffusivity is almost near the free water
  225. diffusion value, the diffusion signal is assumed to be only free water
  226. diffusion (i.e. volume fraction will be set to 1 and tissue's diffusion
  227. parameters are set to zero). Default md_reg is 2.7e-3 $mm^{2}.s^{-1}$
  228. (corresponding to 90% of the free water diffusion value).
  229. min_signal : float
  230. The minimum signal value. Needs to be a strictly positive
  231. number. Default: minimal signal in the data provided to `fit`.
  232. piterations : inter, optional
  233. Number of iterations used to refine the precision of f. Default is set
  234. to 3 corresponding to a precision of 0.01.
  235. Returns
  236. -------
  237. All parameters estimated from the free water tensor model.
  238. Parameters are ordered as follows:
  239. 1) Three diffusion tensor's eigenvalues
  240. 2) Three lines of the eigenvector matrix each containing the
  241. first, second and third coordinates of the eigenvector
  242. 3) The volume fraction of the free water compartment
  243. """
  244. W = design_matrix
  245. # DTI ordinary linear least square solution
  246. log_s = np.log(np.maximum(sig, min_signal))
  247. # Define weights
  248. S2 = np.diag(sig**2)
  249. # DTI weighted linear least square solution
  250. WTS2 = np.dot(W.T, S2)
  251. inv_WT_S2_W = np.linalg.pinv(np.dot(WTS2, W))
  252. invWTS2W_WTS2 = np.dot(inv_WT_S2_W, WTS2)
  253. params = np.dot(invWTS2W_WTS2, log_s)
  254. md = (params[0] + params[2] + params[5]) / 3
  255. # Process voxel if it has significant signal from tissue
  256. if md < mdreg and np.mean(sig) > min_signal and S0 > min_signal:
  257. # General free-water signal contribution
  258. fwsig = np.exp(np.dot(design_matrix,
  259. np.array([Diso, 0, Diso, 0, 0, Diso, 0])))
  260. df = 1 # initialize precision
  261. flow = 0 # lower f evaluated
  262. fhig = 1 # higher f evaluated
  263. ns = 9 # initial number of samples per iteration
  264. for p in range(piterations):
  265. df = df * 0.1
  266. fs = np.linspace(flow+df, fhig-df, num=ns) # sampling f
  267. SFW = np.array([fwsig, ]*ns) # repeat contributions for all values
  268. FS, SI = np.meshgrid(fs, sig)
  269. SA = SI - FS*S0*SFW.T
  270. # SA < 0 means that the signal components from the free water
  271. # component is larger than the total fiber. This cases are present
  272. # for inappropriate large volume fractions (given the current S0
  273. # value estimated). To overcome this issue negative SA are replaced
  274. # by data's min positive signal.
  275. SA[SA <= 0] = min_signal
  276. y = np.log(SA / (1-FS))
  277. all_new_params = np.dot(invWTS2W_WTS2, y)
  278. # Select params for lower F2
  279. SIpred = (1-FS)*np.exp(np.dot(W, all_new_params)) + FS*S0*SFW.T
  280. F2 = np.sum(np.square(SI - SIpred), axis=0)
  281. Mind = np.argmin(F2)
  282. params = all_new_params[:, Mind]
  283. f = fs[Mind] # Updated f
  284. flow = f - df # refining precision
  285. fhig = f + df
  286. ns = 19
  287. evals, evecs = decompose_tensor(from_lower_triangular(params))
  288. fw_params = np.concatenate((evals, evecs[0], evecs[1], evecs[2],
  289. np.array([f])), axis=0)
  290. else:
  291. fw_params = np.zeros(13)
  292. if md > mdreg:
  293. fw_params[12] = 1.0
  294. return fw_params
  295. def wls_fit_tensor(gtab, data, Diso=3e-3, mask=None, min_signal=1.0e-6,
  296. piterations=3, mdreg=2.7e-3):
  297. r""" Computes weighted least squares (WLS) fit to calculate self-diffusion
  298. tensor using a linear regression model [1]_.
  299. Parameters
  300. ----------
  301. gtab : a GradientTable class instance
  302. The gradient table containing diffusion acquisition parameters.
  303. data : ndarray ([X, Y, Z, ...], g)
  304. Data or response variables holding the data. Note that the last
  305. dimension should contain the data. It makes no copies of data.
  306. Diso : float, optional
  307. Value of the free water isotropic diffusion. Default is set to 3e-3
  308. $mm^{2}.s^{-1}$. Please adjust this value if you are assuming different
  309. units of diffusion.
  310. mask : array, optional
  311. A boolean array used to mark the coordinates in the data that should
  312. be analyzed that has the shape data.shape[:-1]
  313. min_signal : float
  314. The minimum signal value. Needs to be a strictly positive
  315. number. Default: 1.0e-6.
  316. piterations : inter, optional
  317. Number of iterations used to refine the precision of f. Default is set
  318. to 3 corresponding to a precision of 0.01.
  319. mdreg : float, optimal
  320. DTI's mean diffusivity regularization threshold. If standard DTI
  321. diffusion tensor's mean diffusivity is almost near the free water
  322. diffusion value, the diffusion signal is assumed to be only free water
  323. diffusion (i.e. volume fraction will be set to 1 and tissue's diffusion
  324. parameters are set to zero). Default md_reg is 2.7e-3 $mm^{2}.s^{-1}$
  325. (corresponding to 90% of the free water diffusion value).
  326. Returns
  327. -------
  328. fw_params : ndarray (x, y, z, 13)
  329. Matrix containing in the last dimension the free water model parameters
  330. in the following order:
  331. 1) Three diffusion tensor's eigenvalues
  332. 2) Three lines of the eigenvector matrix each containing the
  333. first, second and third coordinates of the eigenvector
  334. 3) The volume fraction of the free water compartment.
  335. References
  336. ----------
  337. .. [1] Henriques, R.N., Rokem, A., Garyfallidis, E., St-Jean, S.,
  338. Peterson E.T., Correia, M.M., 2017. [Re] Optimization of a free
  339. water elimination two-compartment model for diffusion tensor
  340. imaging. ReScience volume 3, issue 1, article number 2
  341. """
  342. fw_params = np.zeros(data.shape[:-1] + (13,))
  343. W = design_matrix(gtab)
  344. # Prepare mask
  345. if mask is None:
  346. mask = np.ones(data.shape[:-1], dtype=bool)
  347. else:
  348. if mask.shape != data.shape[:-1]:
  349. raise ValueError("Mask is not the same shape as data.")
  350. mask = np.array(mask, dtype=bool, copy=False)
  351. # Prepare S0
  352. S0 = np.mean(data[:, :, :, gtab.b0s_mask], axis=-1)
  353. index = ndindex(mask.shape)
  354. for v in index:
  355. if mask[v]:
  356. params = wls_iter(W, data[v], S0[v], min_signal=min_signal,
  357. Diso=3e-3, piterations=piterations, mdreg=mdreg)
  358. fw_params[v] = params
  359. return fw_params
  360. def _nls_err_func(tensor_elements, design_matrix, data, Diso=3e-3,
  361. weighting=None, sigma=None, cholesky=False,
  362. f_transform=False):
  363. """ Error function for the non-linear least-squares fit of the tensor water
  364. elimination model.
  365. Parameters
  366. ----------
  367. tensor_elements : array (8, )
  368. The six independent elements of the diffusion tensor followed by
  369. -log(S0) and the volume fraction f of the water elimination
  370. compartment. Note that if cholesky is set to true, tensor elements are
  371. assumed to be written as Cholesky's decomposition elements. If
  372. f_transform is true, volume fraction f has to be converted to
  373. ft = arcsin(2*f - 1) + pi/2
  374. design_matrix : array
  375. The design matrix
  376. data : array
  377. The voxel signal in all gradient directions
  378. Diso : float, optional
  379. Value of the free water isotropic diffusion. Default is set to 3e-3
  380. $mm^{2}.s^{-1}$. Please adjust this value if you are assuming different
  381. units of diffusion.
  382. weighting : str (optional).
  383. Whether to use the Geman-McClure weighting criterion (see [1]_
  384. for details)
  385. sigma : float or float array (optional)
  386. If 'sigma' weighting is used, we will weight the error function
  387. according to the background noise estimated either in aggregate over
  388. all directions (when a float is provided), or to an estimate of the
  389. noise in each diffusion-weighting direction (if an array is
  390. provided). If 'gmm', the Geman-Mclure M-estimator is used for
  391. weighting.
  392. cholesky : bool, optional
  393. If true, the diffusion tensor elements were decomposed using Cholesky
  394. decomposition. See fwdti.nls_fit_tensor
  395. Default: False
  396. f_transform : bool, optional
  397. If true, the water volume fraction was converted to
  398. ft = arcsin(2*f - 1) + pi/2, insuring f estimates between 0 and 1.
  399. See fwdti.nls_fit_tensor
  400. Default: True
  401. """
  402. tensor = np.copy(tensor_elements)
  403. if cholesky:
  404. tensor[:6] = cholesky_to_lower_triangular(tensor[:6])
  405. if f_transform:
  406. f = 0.5 * (1 + np.sin(tensor[7] - np.pi/2))
  407. else:
  408. f = tensor[7]
  409. # This is the predicted signal given the params:
  410. y = (1-f) * np.exp(np.dot(design_matrix, tensor[:7])) + \
  411. f * np.exp(np.dot(design_matrix,
  412. np.array([Diso, 0, Diso, 0, 0, Diso, tensor[6]])))
  413. # Compute the residuals
  414. residuals = data - y
  415. # If we don't want to weight the residuals, we are basically done:
  416. if weighting is None:
  417. # And we return the SSE:
  418. return residuals
  419. se = residuals ** 2
  420. # If the user provided a sigma (e.g 1.5267 * std(background_noise), as
  421. # suggested by Chang et al.) we will use it:
  422. if weighting == 'sigma':
  423. if sigma is None:
  424. e_s = "Must provide sigma value as input to use this weighting"
  425. e_s += " method"
  426. raise ValueError(e_s)
  427. w = 1/(sigma**2)
  428. elif weighting == 'gmm':
  429. # We use the Geman-McClure M-estimator to compute the weights on the
  430. # residuals:
  431. C = 1.4826 * np.median(np.abs(residuals - np.median(residuals)))
  432. with warnings.catch_warnings():
  433. warnings.simplefilter("ignore")
  434. w = 1/(se + C**2)
  435. # The weights are normalized to the mean weight (see p. 1089):
  436. w = w/np.mean(w)
  437. # Return the weighted residuals:
  438. with warnings.catch_warnings():
  439. warnings.simplefilter("ignore")
  440. return np.sqrt(w * se)
  441. def _nls_jacobian_func(tensor_elements, design_matrix, data, Diso=3e-3,
  442. weighting=None, sigma=None, cholesky=False,
  443. f_transform=False):
  444. """The Jacobian is the first derivative of the least squares error
  445. function.
  446. Parameters
  447. ----------
  448. tensor_elements : array (8, )
  449. The six independent elements of the diffusion tensor followed by
  450. -log(S0) and the volume fraction f of the water elimination
  451. compartment. Note that if f_transform is true, volume fraction f is
  452. converted to ft = arcsin(2*f - 1) + pi/2
  453. design_matrix : array
  454. The design matrix
  455. Diso : float, optional
  456. Value of the free water isotropic diffusion. Default is set to 3e-3
  457. $mm^{2}.s^{-1}$. Please adjust this value if you are assuming different
  458. units of diffusion.
  459. f_transform : bool, optional
  460. If true, the water volume fraction was converted to
  461. ft = arcsin(2*f - 1) + pi/2, insuring f estimates between 0 and 1.
  462. See fwdti.nls_fit_tensor
  463. Default: True
  464. """
  465. tensor = np.copy(tensor_elements)
  466. if f_transform:
  467. f = 0.5 * (1 + np.sin(tensor[7] - np.pi/2))
  468. else:
  469. f = tensor[7]
  470. t = np.exp(np.dot(design_matrix, tensor[:7]))
  471. s = np.exp(np.dot(design_matrix,
  472. np.array([Diso, 0, Diso, 0, 0, Diso, tensor[6]])))
  473. T = (f-1.0) * t[:, None] * design_matrix
  474. S = np.zeros(design_matrix.shape)
  475. S[:, 6] = f * s
  476. if f_transform:
  477. df = (t-s) * (0.5*np.cos(tensor[7]-np.pi/2))
  478. else:
  479. df = (t-s)
  480. return np.concatenate((T - S, df[:, None]), axis=1)
  481. def nls_iter(design_matrix, gtab, sig, S0, Diso=3e-3, mdreg=2.7e-3,
  482. min_signal=1.0e-6, cholesky=False, f_transform=True, jac=False,
  483. weighting=None, sigma=None, Stissue=50, Swater=100):
  484. """ Applies non linear least squares fit of the water free elimination
  485. model to single voxel signals.
  486. Parameters
  487. ----------
  488. design_matrix : array (g, 7)
  489. Design matrix holding the covariants used to solve for the regression
  490. coefficients.
  491. sig : array (g, )
  492. Diffusion-weighted signal for a single voxel data.
  493. S0 : float
  494. Non diffusion weighted signal (i.e. signal for b-value=0).
  495. Diso : float, optional
  496. Value of the free water isotropic diffusion. Default is set to 3e-3
  497. $mm^{2}.s^{-1}$. Please adjust this value if you are assuming different
  498. units of diffusion.
  499. mdreg : float, optimal
  500. DTI's mean diffusivity regularization threshold. If standard DTI
  501. diffusion tensor's mean diffusivity is almost near the free water
  502. diffusion value, the diffusion signal is assumed to be only free water
  503. diffusion (i.e. volume fraction will be set to 1 and tissue's diffusion
  504. parameters are set to zero). Default md_reg is 2.7e-3 $mm^{2}.s^{-1}$
  505. (corresponding to 90% of the free water diffusion value).
  506. min_signal : float
  507. The minimum signal value. Needs to be a strictly positive
  508. number.
  509. cholesky : bool, optional
  510. If true it uses Cholesky decomposition to insure that diffusion tensor
  511. is positive define.
  512. Default: False
  513. f_transform : bool, optional
  514. If true, the water volume fractions is converted during the convergence
  515. procedure to ft = arcsin(2*f - 1) + pi/2, insuring f estimates between
  516. 0 and 1.
  517. Default: True
  518. jac : bool
  519. Use the Jacobian? Default: False
  520. weighting: str, optional
  521. the weighting scheme to use in considering the
  522. squared-error. Default behavior is to use uniform weighting. Other
  523. options: 'sigma' 'gmm'
  524. sigma: float, optional
  525. If the 'sigma' weighting scheme is used, a value of sigma needs to be
  526. provided here. According to [Chang2005]_, a good value to use is
  527. 1.5267 * std(background_noise), where background_noise is estimated
  528. from some part of the image known to contain no signal (only noise).
  529. Returns
  530. -------
  531. All parameters estimated from the free water tensor model.
  532. Parameters are ordered as follows:
  533. 1) Three diffusion tensor's eigenvalues
  534. 2) Three lines of the eigenvector matrix each containing the
  535. first, second and third coordinates of the eigenvector
  536. 3) The volume fraction of the free water compartment.
  537. """
  538. # Initial guess
  539. # params = wls_iter(design_matrix, sig, S0,
  540. # min_signal=min_signal, Diso=Diso, mdreg=mdreg)
  541. # hybrid initial guess based on S0 and MD
  542. params0 = param_init_hybrid(gtab, sig, S0, min_signal=min_signal,
  543. Diso=Diso, Stissue=Stissue, Swater=Swater)
  544. md_tissue = np.mean(params0[:3])
  545. if md_tissue > 1.5e-3 and np.mean(sig) > min_signal and S0 > min_signal:
  546. params0[:3] = 0.1e-3 # set diffusivities to ver small values
  547. params0[:-1] = 0
  548. params0[-1] = 1 # set FW to 1
  549. params = params0.copy()
  550. # Process voxel if it has significant signal from tissue
  551. if params[12] < 0.99 and np.mean(sig) > min_signal and S0 > min_signal:
  552. # converting evals and evecs to diffusion tensor elements
  553. evals = params[:3]
  554. evecs = params[3:12].reshape((3, 3))
  555. dt = lower_triangular(vec_val_vect(evecs, evals))
  556. # Cholesky decomposition if requested
  557. if cholesky:
  558. dt = lower_triangular_to_cholesky(dt)
  559. # f transformation if requested
  560. if f_transform:
  561. f = np.arcsin(2*params[12] - 1) + np.pi/2
  562. else:
  563. f = params[12]
  564. # Use the Levenberg-Marquardt algorithm wrapped in opt.leastsq
  565. start_params = np.concatenate((dt, [-np.log(S0), f]), axis=0)
  566. if jac:
  567. this_tensor, status = opt.leastsq(_nls_err_func, start_params[:8],
  568. args=(design_matrix, sig, Diso,
  569. weighting, sigma, cholesky,
  570. f_transform),
  571. Dfun=_nls_jacobian_func)
  572. else:
  573. this_tensor, status = opt.leastsq(_nls_err_func, start_params[:8],
  574. args=(design_matrix, sig, Diso,
  575. weighting, sigma, cholesky,
  576. f_transform))
  577. # Process tissue diffusion tensor
  578. if cholesky:
  579. this_tensor[:6] = cholesky_to_lower_triangular(this_tensor[:6])
  580. evals, evecs = _decompose_tensor_nan(
  581. from_lower_triangular(this_tensor[:6]),
  582. from_lower_triangular(start_params[:6]))
  583. # Process water volume fraction f
  584. f = this_tensor[7]
  585. if f_transform:
  586. f = 0.5 * (1 + np.sin(f - np.pi/2))
  587. params = np.concatenate((evals, evecs[0], evecs[1], evecs[2],
  588. np.array([f])), axis=0)
  589. return params, params0
  590. def nls_fit_tensor(gtab, data, mask=None, Diso=3e-3, mdreg=2.7e-3,
  591. min_signal=1.0e-6, f_transform=True, cholesky=False,
  592. jac=False, weighting=None, sigma=None, Stissue=50,
  593. Swater=100):
  594. """
  595. Fit the water elimination tensor model using the non-linear least-squares.
  596. Parameters
  597. ----------
  598. gtab : a GradientTable class instance
  599. The gradient table containing diffusion acquisition parameters.
  600. data : ndarray ([X, Y, Z, ...], g)
  601. Data or response variables holding the data. Note that the last
  602. dimension should contain the data. It makes no copies of data.
  603. mask : array, optional
  604. A boolean array used to mark the coordinates in the data that should
  605. be analyzed that has the shape data.shape[:-1]
  606. Diso : float, optional
  607. Value of the free water isotropic diffusion. Default is set to 3e-3
  608. $mm^{2}.s^{-1}$. Please adjust this value if you are assuming different
  609. units of diffusion.
  610. mdreg : float, optimal
  611. DTI's mean diffusivity regularization threshold. If standard DTI
  612. diffusion tensor's mean diffusivity is almost near the free water
  613. diffusion value, the diffusion signal is assumed to be only free water
  614. diffusion (i.e. volume fraction will be set to 1 and tissue's diffusion
  615. parameters are set to zero). Default md_reg is 2.7e-3 $mm^{2}.s^{-1}$
  616. (corresponding to 90% of the free water diffusion value).
  617. min_signal : float
  618. The minimum signal value. Needs to be a strictly positive
  619. number. Default: 1.0e-6.
  620. f_transform : bool, optional
  621. If true, the water volume fractions is converted during the convergence
  622. procedure to ft = arcsin(2*f - 1) + pi/2, insuring f estimates between
  623. 0 and 1.
  624. Default: True
  625. cholesky : bool, optional
  626. If true it uses Cholesky decomposition to insure that diffusion tensor
  627. is positive define.
  628. Default: False
  629. jac : bool
  630. Use the Jacobian? Default: False
  631. weighting: str, optional
  632. the weighting scheme to use in considering the
  633. squared-error. Default behavior is to use uniform weighting. Other
  634. options: 'sigma' 'gmm'
  635. sigma: float, optional
  636. If the 'sigma' weighting scheme is used, a value of sigma needs to be
  637. provided here. According to [Chang2005]_, a good value to use is
  638. 1.5267 * std(background_noise), where background_noise is estimated
  639. from some part of the image known to contain no signal (only noise).
  640. Returns
  641. -------
  642. fw_params : ndarray (x, y, z, 13)
  643. Matrix containing in the dimension the free water model parameters in
  644. the following order:
  645. 1) Three diffusion tensor's eigenvalues
  646. 2) Three lines of the eigenvector matrix each containing the
  647. first, second and third coordinates of the eigenvector
  648. 3) The volume fraction of the free water compartment
  649. """
  650. fw_params = np.zeros(data.shape[:-1] + (13,))
  651. W = design_matrix(gtab)
  652. # Prepare mask
  653. if mask is None:
  654. mask = np.ones(data.shape[:-1], dtype=bool)
  655. else:
  656. if mask.shape != data.shape[:-1]:
  657. raise ValueError("Mask is not the same shape as data.")
  658. mask = np.array(mask, dtype=bool, copy=False)
  659. # Prepare S0
  660. S0 = np.mean(data[:, :, :, gtab.b0s_mask], axis=-1)
  661. index = ndindex(mask.shape)
  662. for v in index:
  663. if mask[v]:
  664. params = nls_iter(W, data[v], S0[v], Diso=Diso, mdreg=mdreg,
  665. min_signal=min_signal, f_transform=f_transform,
  666. cholesky=cholesky, jac=jac, weighting=weighting,
  667. sigma=sigma, Stissue=Stissue, Swater=Swater)
  668. fw_params[v] = params
  669. return fw_params
  670. def lower_triangular_to_cholesky(tensor_elements):
  671. """ Performs Cholesky decomposition of the diffusion tensor
  672. Parameters
  673. ----------
  674. tensor_elements : array (6,)
  675. Array containing the six elements of diffusion tensor's lower
  676. triangular.
  677. Returns
  678. -------
  679. cholesky_elements : array (6,)
  680. Array containing the six Cholesky's decomposition elements
  681. (R0, R1, R2, R3, R4, R5) [1]_.
  682. References
  683. ----------
  684. .. [1] Koay, C.G., Carew, J.D., Alexander, A.L., Basser, P.J.,
  685. Meyerand, M.E., 2006. Investigation of anomalous estimates of
  686. tensor-derived quantities in diffusion tensor imaging. Magnetic
  687. Resonance in Medicine, 55(4), 930-936. doi:10.1002/mrm.20832
  688. """
  689. R0 = np.sqrt(tensor_elements[0])
  690. R3 = tensor_elements[1] / R0
  691. R1 = np.sqrt(tensor_elements[2] - R3**2)
  692. R5 = tensor_elements[3] / R0
  693. R4 = (tensor_elements[4] - R3*R5) / R1
  694. R2 = np.sqrt(tensor_elements[5] - R4**2 - R5**2)
  695. return np.array([R0, R1, R2, R3, R4, R5])
  696. def cholesky_to_lower_triangular(R):
  697. """ Convert Cholesky decompostion elements to the diffusion tensor elements
  698. Parameters
  699. ----------
  700. R : array (6,)
  701. Array containing the six Cholesky's decomposition elements
  702. (R0, R1, R2, R3, R4, R5) [1]_.
  703. Returns
  704. -------
  705. tensor_elements : array (6,)
  706. Array containing the six elements of diffusion tensor's lower
  707. triangular.
  708. References
  709. ----------
  710. .. [1] Koay, C.G., Carew, J.D., Alexander, A.L., Basser, P.J.,
  711. Meyerand, M.E., 2006. Investigation of anomalous estimates of
  712. tensor-derived quantities in diffusion tensor imaging. Magnetic
  713. Resonance in Medicine, 55(4), 930-936. doi:10.1002/mrm.20832
  714. """
  715. Dxx = R[0]**2
  716. Dxy = R[0]*R[3]
  717. Dyy = R[1]**2 + R[3]**2
  718. Dxz = R[0]*R[5]
  719. Dyz = R[1]*R[4] + R[3]*R[5]
  720. Dzz = R[2]**2 + R[4]**2 + R[5]**2
  721. return np.array([Dxx, Dxy, Dyy, Dxz, Dyz, Dzz])
  722. def get_attenuations(signal, gtab):
  723. MAX_DIFFFUSIVITY = 5e-3
  724. MIN_DIFFUSIVITY = 0.01e-3
  725. # Averaging S0 and getting normalized attenuations
  726. b0_inds = gtab.b0s_mask
  727. S0 = np.mean(signal[..., b0_inds], axis=-1)
  728. Sk = signal[..., ~b0_inds]
  729. Ak = Sk / S0[..., None]
  730. # Correcting non realistic attenuations
  731. bvals = gtab.bvals[~b0_inds]
  732. bvecs = gtab.bvecs[~b0_inds]
  733. Amin = np.exp(-bvals * MAX_DIFFFUSIVITY)
  734. Amin = np.tile(Amin, Ak.shape[:-1] + (1, ))
  735. Amax = np.exp(-bvals * MIN_DIFFUSIVITY)
  736. Amax = np.tile(Amax, Ak.shape[:-1] + (1, ))
  737. np.clip(Ak, Amin, Amax, out=Ak)
  738. # Adding 'dummy' b0 zero data to attenuations and gtab
  739. bvals = np.insert(bvals, 0 , 0)
  740. bvecs = np.insert(bvecs, 0, np.array([0, 0, 0]), axis=0)
  741. this_gtab = gradient_table(bvals, bvecs)
  742. this_Ak = np.ones(Ak.shape[:-1] + (Ak.shape[-1] + 1, ))
  743. this_gtab = gradient_table(bvals, bvecs, b0_threshold=0)
  744. this_Ak[..., 1:] = Ak
  745. return (this_Ak, this_gtab)
  746. def fraction_init_s0(signal, gtab, Diso=3e-3, Stissue=50, Swater=100,
  747. min_tissue_diff=0.001e-3, max_tissue_diff=2.5e-3):
  748. S0 = np.mean(signal[..., gtab.b0s_mask], axis=-1)
  749. # Normalized attenuations
  750. Ak, this_gtab = get_attenuations(signal, gtab)
  751. Ak = Ak[..., 1:]
  752. bvals = this_gtab.bvals[1:] # non zero bvals
  753. Awater = np.exp(-bvals * Diso)
  754. Awater = np.tile(Awater, Ak.shape[:-1] + (1, ))
  755. # Min and Max attenuations expected in tissue
  756. Atissue_min = np.exp(-bvals * max_tissue_diff)
  757. Atissue_max = np.exp(-bvals * min_tissue_diff)
  758. # Initial volume fraction
  759. f0 = 1 - np.log(S0 / Stissue) / np.log(Swater / Stissue)
  760. # Min and Max volume fraction
  761. fmin = np.min(Ak - Awater, axis=-1) / np.max(Atissue_max - Awater, axis=-1)
  762. fmax = np.max(Ak - Awater, axis=-1) / np.min(Atissue_min - Awater, axis=-1)
  763. fmin = np.clip(fmin, 0.0001, 1 - 0.0001)
  764. fmax = np.clip(fmax, 0.0001, 1 - 0.0001)
  765. return (f0, fmin, fmax)
  766. def fraction_init_md(signal, gtab, Diso=3e-3, tissue_MD=0.6e-3):
  767. # bvals = gtab.bvals[~gtab.b0s_mask]
  768. bvals = gtab.bvals
  769. bvecs = gtab.bvecs
  770. mean_bval = np.max(bvals)
  771. mbvals = bvals[np.logical_or(bvals==0, bvals==mean_bval)]
  772. mbvecs = bvecs[np.logical_or(bvals==0, bvals==mean_bval), :]
  773. mgtab = gradient_table(mbvals, mbvecs, b0_threshold=0)
  774. msignal = signal[..., np.logical_or(bvals==0, bvals==mean_bval)]
  775. # Conventional DTI
  776. dti_params = ols_fit_tensor(design_matrix(mgtab), msignal)
  777. eigvals = dti_params[..., 0:3]
  778. MD = np.mean(eigvals, axis=-1) # mean diffusivity
  779. # Initial volume fraction
  780. Awater = np.exp(-mean_bval * Diso)
  781. Atissue = np.exp(-mean_bval * tissue_MD)
  782. f0 = (np.exp(-mean_bval * MD) - Awater) / (Atissue - Awater)
  783. # Min and Max volume fractions
  784. fmin = 0.0001
  785. fmax = (1 - 0.0001)
  786. return (f0, fmin, fmax)
  787. def fraction_init_hybrid(signal, gtab, Diso=3e-3, Stissue=50, Swater=100,
  788. min_tissue_diff=0.001e-3, max_tissue_diff=2.5e-3,
  789. tissue_MD=0.6e-3):
  790. f_S0, fmin, fmax = fraction_init_s0(signal, gtab, Diso=Diso,
  791. Stissue=Stissue, Swater=Swater,
  792. min_tissue_diff=min_tissue_diff,
  793. max_tissue_diff=max_tissue_diff)
  794. f_MD, _, _ = fraction_init_md(signal, gtab, Diso=Diso,
  795. tissue_MD=tissue_MD)
  796. # hybrid initialization
  797. alpha = np.copy(f_S0)
  798. alpha = np.clip(alpha, 0.0001, 0.9999)
  799. f_S0 = np.clip(f_S0, fmin, fmax)
  800. f_MD = np.clip(f_MD, 0.0001, 0.9999)
  801. f0 = f_MD**alpha * f_S0**(1 - alpha)
  802. return (f0, fmin, fmax)
  803. def tensor_init(signal, gtab, fraction, Diso=3, min_tissue_diff=0.001,
  804. max_tissue_diff=2.5):
  805. Ak, this_gtab = get_attenuations(signal, gtab)
  806. # nonzero bvals and bvecs
  807. bvals = this_gtab.bvals
  808. bvecs = this_gtab.bvecs
  809. # Min and Max attenuations expected in tissue
  810. Atissue_min = np.exp(-bvals * max_tissue_diff)
  811. Atissue_min = np.tile(Atissue_min, Ak.shape[:-1] + (1, ))
  812. Atissue_max = np.exp(-bvals * min_tissue_diff)
  813. Atissue_max = np.tile(Atissue_max, Ak.shape[:-1] + (1, ))
  814. # correcting the attenuations for free water
  815. f = fraction[..., None]
  816. Awater = np.exp(-bvals * Diso)
  817. Awater = np.tile(Awater, Ak.shape[:-1] + (1, ))
  818. Atissue = (Ak - (1-f) * Awater) / f
  819. # np.clip(Atissue, Atissue_min, Atissue_max, out=Atissue)
  820. np.clip(Atissue, 0.0001, 0.9999, out=Atissue)
  821. # applying standard DTI to corrected signal
  822. dti_params = ols_fit_tensor(design_matrix(this_gtab), Atissue)
  823. return dti_params
  824. def param_init_hybrid(gtab, sig, S0, min_signal=1.0e-6,
  825. Diso=3.0e-3, Stissue=50, Swater=100):
  826. # Initializing tissue volume fraction
  827. sig = np.maximum(sig, min_signal)
  828. f0, fmin, fmax = fraction_init_hybrid(sig, gtab, Diso=Diso,
  829. Stissue=Stissue, Swater=Swater,
  830. min_tissue_diff=0.001e-3,
  831. max_tissue_diff=2.5e-3,
  832. tissue_MD=0.6e-3)
  833. f0 = np.clip(f0, fmin, fmax)
  834. # Initializing tissue tensor
  835. init_params = tensor_init(sig, gtab, f0, min_tissue_diff=0.001e-3,
  836. max_tissue_diff=2.5e-3, Diso=Diso)
  837. init_params = np.concatenate((init_params, np.array([1 - f0])), axis=0)
  838. return init_params
  839. common_fit_methods = {'WLLS': wls_iter,
  840. 'WLS': wls_iter,
  841. 'NLLS': nls_iter,
  842. 'NLS': nls_iter,
  843. }

nls.py at commit d589d58, under BSD-3-Clause · at the source

Overview

Authors: Jingyu Zhou1,2,3, Sisi Jiang1, Huan Huang1, Xiaoying Sun1, Guofeng Ye1, Yingjie Tang1, Xueguo Wang4, Hongyuan Deng4, Hui He1,5, Xianmei Luo1,5, Chao Mu1,5, Mingjun Duan1,5, María Luisa Bringas Vega3,6, Gang Yao1,5, Dezhong Yao1,2,3, Cheng Luo1,2,3
  1. The Clinical Hospital of Chengdu Brain Science Institute, School of Life Sciences and Technology, University of Electronic Science and Technology of China, Chengdu, 610056, China
  2. Research Unit of Neuroinformation (2019RU035), Chinese Academy of Medical Sciences, Chengdu, 610072, China
  3. China-Cuba Belt and Road Joint Laboratory on Neurotechnology and Brain-Apparatus Communication, University of Electronic Science and Technology of China, Chengdu, 610054, China
  4. The Third People's Hospital of Wenjiang District, Chengdu, China
  5. Department of Psychiatry, The Clinical Hospital of Chengdu Brain Science Institute, University of Electronic Science and Technology of China, Chengdu, 610056, China
  6. Cuban Neuroscience Center, La Habana, Cuba
Journal: Brain, behavior, & immunity - health, volume 53, article 101220
Dates: received 6 November 2025; accepted 24 March 2026; published online 28 March 2026
Type: Research article · Language: English
License: CC BY-NC-ND
Identifiers: DOI 10.1016/j.bbih.2026.101220 · PMID 42007038 · PMCID PMC13083637 · OpenAlex W7142424317
Open access: gold, a free copy (OpenAlex)
Status: code verified (how the code is found and verified)
Categories: human (organism), schizophrenia / psychosis (population), cognitive (subfield)
Methods: Statistics, fMRI & imaging, Preprocessing
Keywords: Schizophrenia, Metabolic syndrome, Free water, Cognitive function
Journal subjects: Full Length Article
Topic: Tryptophan and brain disorders (Biological Psychiatry, Neuroscience), according to OpenAlex
Funding: National Key Research and Development Program of China (2024YFE0215100); STI (2030-Major); National Natural Science Foundation of China (62401124, 62201133, 82371560); Natural Science Foundation of Sichuan Province (2023NSFSC0037); CAMS Innovation Fund for Medical Sciences (CIFMS (2019-I2M-5-039); Science and Technology Department of Hainan Province (ZDYF2021SHFZ095); Health Commission of Sichuan Province (24QNMP095)
Citations: not cited yet (Europe PMC); 60 references in the paper

Abstract

The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.

Repository

Its files are read in the Code ↔ Paper reader above, with 1 match between paragraphs and lines of code.

mvgolub/FW-DTI-Beltrami

License: BSD-3-Clause
State: the link answers, verified on 31 October 2026
Evidence: files inventoried
Commit: d589d58032330a7697c57392fe354e981cb1fc64, 11 April 2023
Languages: Python (11)
Size: 35 files, 11 scripts
Software Heritage: not archived
Found in: “Code availability”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Tools: DIPY (11 files), NumPy (11 files), Matplotlib (10 files), NiBabel (5 files), SciPy (1 file)
Availability: 2 checks, the latest on 31 October 2026: the link answers
  • 31 October 2026: the link answers
  • 30 September 2026: the link answers
13 files

Code availability statement

The paper has a code availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

Read it in the paper: doi.org/10.1016/j.bbih.2026.101220.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 11 scripts, each with its path and the digest of its content;
  • 1 match between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

No dataset and no data link were found in the paper.

Data availability statement

The paper has a data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

  • it says that the data are available on request

Read it in the paper: doi.org/10.1016/j.bbih.2026.101220.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 30 September 2026: the first record

Recorded: type, language, journal, volume, pages, dates, 16 authors, 4 keywords, 7 funders, 59 references.

Cite

This paper

Zhou, J., Jiang, S., Huang, H., Sun, X., Ye, G., Tang, Y., Wang, X., Deng, H., He, H., Luo, X., Mu, C., Duan, M., Bringas Vega, M. L., Yao, G., Yao, D., & Luo, C. (2026). A frontotemporal free water signature associated to interleukin-8 and cognitive impairment in schizophrenia with comorbidity of metabolic syndrome. Brain, behavior, & immunity - health, 53, 101220. https://doi.org/10.1016/j.bbih.2026.101220

BibTeX

@article{zhou2026frontotemporal,
author = {Zhou, Jingyu and Jiang, Sisi and Huang, Huan and Sun, Xiaoying and Ye, Guofeng and Tang, Yingjie and Wang, Xueguo and Deng, Hongyuan and He, Hui and Luo, Xianmei and Mu, Chao and Duan, Mingjun and Bringas Vega, María Luisa and Yao, Gang and Yao, Dezhong and Luo, Cheng},
title = {{A frontotemporal free water signature associated to interleukin-8 and cognitive impairment in schizophrenia with comorbidity of metabolic syndrome}},
journal = {Brain, behavior, \& immunity - health},
year = {2026},
month = mar,
volume = {53},
pages = {101220},
publisher = {Elsevier},
issn = {2666-3546},
doi = {10.1016/j.bbih.2026.101220},
url = {https://doi.org/10.1016/j.bbih.2026.101220},
pmid = {42007038},
pmcid = {PMC13083637}
}

RIS

TY - JOUR
AU - Zhou, Jingyu
AU - Jiang, Sisi
AU - Huang, Huan
AU - Sun, Xiaoying
AU - Ye, Guofeng
AU - Tang, Yingjie
AU - Wang, Xueguo
AU - Deng, Hongyuan
AU - He, Hui
AU - Luo, Xianmei
AU - Mu, Chao
AU - Duan, Mingjun
AU - Bringas Vega, María Luisa
AU - Yao, Gang
AU - Yao, Dezhong
AU - Luo, Cheng
TI - A frontotemporal free water signature associated to interleukin-8 and cognitive impairment in schizophrenia with comorbidity of metabolic syndrome
T2 - Brain, behavior, & immunity - health
J2 - Brain Behav Immun Health
PY - 2026
DA - 2026/03/28
VL - 53
SP - 101220
SN - 2666-3546
PB - Elsevier
DO - 10.1016/j.bbih.2026.101220
UR - https://doi.org/10.1016/j.bbih.2026.101220
LA - en
ER -

CSL-JSON

{
"id": "10.1016/j.bbih.2026.101220",
"type": "article-journal",
"title": "A frontotemporal free water signature associated to interleukin-8 and cognitive impairment in schizophrenia with comorbidity of metabolic syndrome",
"container-title": "Brain, behavior, & immunity - health",
"author": [
{
"family": "Zhou",
"given": "Jingyu"
},
{
"family": "Jiang",
"given": "Sisi"
},
{
"family": "Huang",
"given": "Huan"
},
{
"family": "Sun",
"given": "Xiaoying"
},
{
"family": "Ye",
"given": "Guofeng"
},
{
"family": "Tang",
"given": "Yingjie"
},
{
"family": "Wang",
"given": "Xueguo"
},
{
"family": "Deng",
"given": "Hongyuan"
},
{
"family": "He",
"given": "Hui"
},
{
"family": "Luo",
"given": "Xianmei"
},
{
"family": "Mu",
"given": "Chao"
},
{
"family": "Duan",
"given": "Mingjun"
},
{
"family": "Bringas Vega",
"given": "María Luisa"
},
{
"family": "Yao",
"given": "Gang"
},
{
"family": "Yao",
"given": "Dezhong"
},
{
"family": "Luo",
"given": "Cheng"
}
],
"container-title-short": "Brain Behav Immun Health",
"volume": "53",
"page": "101220",
"DOI": "10.1016/j.bbih.2026.101220",
"PMID": "42007038",
"PMCID": "PMC13083637",
"ISSN": "2666-3546",
"publisher": "Elsevier",
"URL": "https://doi.org/10.1016/j.bbih.2026.101220",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
28
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1038/s41597-024-03058-w [code]
Harmonized diffusion MRI data and white matter measures from the Adolescent Brain Cognitive Development Study.
Journal: Scientific data
In common: DIPY, NiBabel, SciPy, 2 other tools, 5 references
[2] doi:10.1038/s41597-024-03624-2 [code]
A diffusion MRI tractography atlas for concurrent white matter mapping across Eastern and Western populations.
Journal: Scientific data
In common: DIPY, NiBabel, SciPy, 2 other tools, 5 references
[3] doi:10.1017/s0033291724000229 [code]
Executive functioning, behavior, and white matter microstructure in the chronic phase after pediatric mild traumatic brain injury: results from the adolescent brain cognitive development study.
Journal: Psychological medicine
In common: DIPY, NiBabel, SciPy, 2 other tools, 3 references
[4] doi:10.1162/netn_a_00368 [code]
Modeling the impact of MRI acquisition bias on structural connectomes: Harmonizing structural connectomes.
Journal: Network neuroscience (Cambridge, Mass.)
In common: DIPY, NiBabel, SciPy, 2 other tools, 4 references
[5] doi:10.1073/pnas.2217232120 [code]
Brain imaging and neuropsychological assessment of individuals recovered from a mild to moderate SARS-CoV-2 infection.
Journal: Proceedings of the National Academy of Sciences of the United States of America
In common: DIPY, NiBabel, SciPy, 2 other tools, 3 references
[6] doi:10.1002/hbm.26761 [code]
Changes of brain parenchyma free water fraction reflect tissue damage and impaired processing speed in multiple sclerosis.
Journal: Human brain mapping
In common: DIPY, NiBabel, SciPy, 2 other tools, 4 references
[7] doi:10.1186/s12987-024-00559-z [code]
Cerebrospinal fluid-based spatial statistics: towards quantitative analysis of cerebrospinal fluid pseudodiffusivity.
Journal: Fluids and barriers of the CNS
In common: DIPY, NiBabel, SciPy, 2 other tools, 3 references
[8] doi:10.1017/neu.2023.44 [code]
Structural impairment in superficial and deep white matter in schizophrenia.
Journal: Acta neuropsychiatrica
In common: DIPY, NiBabel, SciPy, 2 other tools, schizophrenia / psychosis, 2 references
[9] doi:10.1038/s42003-025-08053-4 [code]
Fronto-occipital dyscommunication associates with brain hierarchy in schizophrenia.
Journal: Communications biology
In common: NiBabel, SciPy, Matplotlib, 1 other tool, schizophrenia / psychosis, author Cheng Luo
[10] doi:10.1016/j.bpsc.2022.12.007 [code]
Free-Water Diffusion Magnetic Resonance Imaging Differentiates Suicidal Ideation From Suicide Attempt in Treatment-Resistant Depression.
Journal: Biological psychiatry. Cognitive neuroscience and neuroimaging
In common: DIPY, NiBabel, SciPy, 2 other tools, 3 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Add the badge to the code's README

OSCR: the badge of this paper

If you are an author or a maintainer of this paper's code, you can add this badge. It says what OSCR knows of the paper (its code, its validated tracing map) and links the code to this page. Paste one of these snippets under the README's title. Keep the two marks around it, so that the badge can be replaced in place and is never added twice. OSCR changes nothing in your repository.

Markdown
<!-- oscr-badge:start -->
[![OSCR](https://openscicode.org/badge/doi/10.1016/j.bbih.2026.101220.svg)](https://openscicode.org/badge/doi/10.1016/j.bbih.2026.101220)
<!-- oscr-badge:end -->
reStructuredText
.. oscr-badge:start

.. image:: https://openscicode.org/badge/doi/10.1016/j.bbih.2026.101220.svg
   :target: https://openscicode.org/badge/doi/10.1016/j.bbih.2026.101220
   :alt: OSCR

.. oscr-badge:end
HTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.1016/j.bbih.2026.101220"><img src="https://openscicode.org/badge/doi/10.1016/j.bbih.2026.101220.svg" alt="OSCR"></a>
<!-- oscr-badge:end -->

On GitHub, open the README, choose Edit (the pencil), paste the snippet under the title, then "Commit changes".

If you choose to, you can have the badge kept up to date for you, with oscr badge --write from the command line or with the GitHub Action in your repository's workflows. Every other form and option (a card, AsciiDoc, LaTeX, shields.io) is on the badge page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: code errors and mismatches between the code and the paper about this paper and its code, from readers and its authors, beside the paper and its tracing map.

Report a mismatch between the code and the paper · Report a code error (signed in)

Reproductions: reports from readers who ran the authors' code and did not get the paper's result, what they ran, with which environment, commit and data.

Report a reproduction failure (signed in)

Versions of its code: the releases of its code tied to a version of this paper (the preprint, the accepted manuscript, the version of record…), each with the tracing map versioned with it.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.