OSCR

Field strength-dependent sensitivity of chemical exchange saturation transfer: a methodological comparison of 3 Tesla and 7 Tesla in a clinical cohort.

Code ↔ Paper

21 matches 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 21 matches
  1. [1] § Materials and methods › Statistical analysis ↔ Statistical_analysis_3T.m, lines 1–34 · score 0.73 · Holm Bonferroni correction, confidence intervals, linear regression, field strength, CEST amplitude, coefficients
  2. [2] § Materials and methods › Statistical analysis ↔ Statistical_analysis_7T.m, lines 1–35 · score 0.73 · Holm Bonferroni correction, confidence intervals, linear regression, field strength, CEST amplitude, coefficients
  3. [3] § Materials and methods › Statistical analysis ↔ Plot_Result_3T.m, lines 502–527 · score 0.73 · quantifies intra, CEST signals, tissue mask, std, variation, CoVs
  4. [4] § Materials and methods › Statistical analysis ↔ Plot_Result_7T.m, lines 599–628 · score 0.73 · quantifies intra, CEST signals, tissue mask, std, variation, CoVs
  5. [5] § Materials and methods ↔ Plot_Result_7T.m, lines 1–35 · score 0.70 · chemical exchange saturation, glioma patients, Lorentzian fitting, MRI, transfer, pipeline
  6. [6] § Materials and methods › Post-processing › Anatomical segmentation ↔ Plot_Result_3T.m, lines 262–294 · score 0.65 · Segmentation masks, deep grey matter, atlas, hippocampus, SPM, DL
  7. [7] § Materials and methods › Post-processing › Anatomical segmentation ↔ Plot_Result_7T.m, lines 326–362 · score 0.64 · Segmentation masks, deep grey matter, atlas, hippocampus, SPM, DL
  8. [8] § Materials and methods › Statistical analysis ↔ comparison_tumour_3T_7T.m, lines 39–178 · score 0.62 · IDH mutation status, contralateral healthy tissue, mask, tumor, tumours, patients
  9. [9] § Materials and methods ↔ Plot_Result_3T.m, lines 1–31 · score 0.61 · chemical exchange saturation, glioma patients, MRI, transfer, Segmentation, deep
  10. [10] § Materials and methods › 3T acquisition protocol ↔ Plot_Result_7T.m, lines 436–531 · score 0.58 · B1 mapping, tissue segmentation, MPRAGE, space, FLAIR, ppm
  11. [11] § Materials and methods › 7T acquisition protocol ↔ Plot_Result_7T.m, lines 436–531 · score 0.58 · anatomical reference, B1 mapping, MPRAGE, space, FLAIR, ppm
  12. [12] § Results › Age dependence of CEST pools ↔ Statistical_analysis_3T.m, lines 1–34 · score 0.58 · Holm Bonferroni correction, confidence intervals, Linear regressions, CEST amplitude, CEST pool, Age
  13. [13] § Materials and methods › 3T acquisition protocol ↔ Plot_Result_3T.m, lines 372–457 · score 0.56 · B1 mapping, tissue segmentation, space, FLAIR, ppm, B0
  14. [14] § Materials and methods › Post-processing › Quality control and tissue mask definition ↔ Plot_Result_3T.m, lines 297–335 · score 0.56 · uncertainty map, tissue masks, threshold, Quality, GM, WM
  15. [15] § Materials and methods › Post-processing › Quality control and tissue mask definition ↔ Plot_Result_7T.m, lines 365–403 · score 0.56 · uncertainty map, tissue masks, threshold, Quality, GM, WM
  16. [16] § Results › IDH mutation and tumour grading ↔ comparison_tumour_3T_7T.m, lines 1–36 · score 0.55 · IDH mutation status, Lorentzian fitting, CEST amplitudes, CEST pool, grade, tumour
  17. [17] § Results ↔ Plot_Result_7T.m, lines 884–965 · score 0.53 · direct saturation, pool Lorentzian, component, DS, rNOE, spectra
  18. [18] § Results › Age dependence of CEST pools ↔ Statistical_analysis_3T.m, lines 102–141 · score 0.53 · confidence intervals, Linear regressions, diamonds, rNOE, female, CEST pool
  19. [19] § Results ↔ Plot_Result_3T.m, lines 372–457 · score 0.52 · B1 field maps, anatomical images, B0, segmentation, amplitudes, patients
  20. [20] § Materials and methods › Statistical analysis ↔ comparison_tumour_3T_7T.m, lines 471–518 · score 0.52 · Wilcoxon rank sum, tumour
  21. [21] § Results › IDH mutation and tumour grading ↔ comparison_tumour_3T_7T.m, lines 39–178 · score 0.50 · IDH mutation status, Boxplots, rNOE, wildtype, contralateral, CEST pool

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

MATLAB · 1,144 lines · 49 KB · MIT · 7 matches

  1. % =========================================================================
  2. % Plot_Result_7T.m
  3. %
  4. % Description:
  5. % This script processes and visualizes 7T CEST (Chemical Exchange
  6. % Saturation Transfer) MRI data for a cohort of glioma patients.
  7. % Specifically, it:
  8. % 1) Loads per-subject CEST acquisition data and anatomical images.
  9. % 2) Displays tissue segmentation overlays and fitted CEST pool maps.
  10. % 3) Extracts region-of-interest (ROI) metrics for white matter (WM),
  11. % grey matter (GM), deep GM, hippocampus, and tumor tissue.
  12. % 4) Computes the coefficient of variation (CoV) per tissue and pool.
  13. % 5) Exports summary tables for downstream statistical analysis.
  14. %
  15. % Two analysis pipelines are supported, selectable via the 'picae' flag:
  16. % - Lorentzian fitting (default, picae = 0)
  17. % - PICAE deep-learning reconstruction (picae = 1)
  18. %
  19. % Reference manuscript:
  20. % "Field Strength-Dependent Sensitivity of Chemical Exchange Saturation
  21. % Transfer: A Methodological Comparison of 3T and 7T in a Clinical
  22. % Cohort."
  23. %
  24. % Author: Milena Capiglioni, University of Bern, 2025
  25. %
  26. % Notes:
  27. % - Auxiliary functions are expected in a subfolder named 'aux' located
  28. % in the script directory.
  29. % - For patient confidentiality, only co-registered low-resolution
  30. % anatomical images are shared publicly.
  31. % =========================================================================
  32. clear global; clc; clear; close all;
  33. restoredefaultpath;
  34. %% Setup
  35. % -------------------------------------------------------------------------
  36. % Define the script directory and add auxiliary functions to the path.
  37. % Update 'script_dir' to match your local installation.
  38. % -------------------------------------------------------------------------
  39. cd(fileparts(matlab.desktop.editor.getActiveFilename));
  40. script_dir = fileparts(matlab.desktop.editor.getActiveFilename);
  41. addpath(genpath(fullfile(script_dir,'aux_scripts')))
  42. % Toggle to enable/disable saving of figures and output tables.
  43. % Set to 1 to save, 0 to skip saving.
  44. save_stuff = 1;
  45. %% Patient Selection and Path Configuration
  46. % -------------------------------------------------------------------------
  47. % Define data paths and identify patient folders.
  48. % Patient folders are expected to follow the naming convention 'p*'
  49. % (e.g., 'p01', 'p02', ...).
  50. % -------------------------------------------------------------------------
  51. % Root directory containing all 7T patient subdirectories
  52. data_path = '/path/to/folder/where/data/is/';
  53. work_dir_aux_7T = [data_path 'cest_eval_7T' filesep];
  54. cd(work_dir_aux_7T);
  55. files = dir(work_dir_aux_7T);
  56. dirFlag = startsWith({files.name},{'p'})&[files.isdir];
  57. patient_folder = files(dirFlag);
  58. % Load patient metadata table (contains age, sex, WHO grade, IDH status)
  59. load([data_path 'patient_table_share.mat'])
  60. % Segmentation method selector.
  61. % Options:
  62. % 'spm' - SPM-based tissue probability maps
  63. % 'DL' - Deep Learning segmentation with DiReCT co-registration
  64. % Note: Only co-registered low-resolution anatomical images are shared
  65. % publicly due to patient confidentiality constraints.
  66. seg_method = 'DL';
  67. % Flag to optionally compute and display MTR-Rex contrast maps.
  68. % Note: MTR-Rex requires the CEST toolbox from the FAU group.
  69. % Set to 1 to enable.
  70. MTR_analysis = 0;
  71. % Analysis pipeline selector.
  72. % 0 - Lorentzian fitting (standard pipeline)
  73. % 1 - PICAE deep-learning reconstruction
  74. % Note: MTR-Rex is not currently supported for PICAE output.
  75. picae = 0;
  76. if ~picae
  77. out_folder = [data_path 'cest_eval_7T/Output_CEST_paper/'];
  78. else
  79. out_folder = [data_path 'cest_eval_7T/Output_CEST_picae_paper/'];
  80. MTR_analysis = 0; % MTR-Rex generation from PICAE maps is not yet implemented
  81. end
  82. if save_stuff && ~exist(out_folder,'dir')
  83. mkdir(out_folder);
  84. end
  85. %% Per-Subject Loop: Anatomical and CEST Map Visualization
  86. % -------------------------------------------------------------------------
  87. % For each patient, this loop:
  88. % - Loads CEST spectral fit results (Lorentzian or PICAE) and anatomical
  89. % images.
  90. % - Identifies the axial slice with maximum tumor extent.
  91. % - Generates overlay figures showing segmentation and CEST maps.
  92. % - Extracts mean CEST pool amplitudes per tissue ROI.
  93. % -------------------------------------------------------------------------
  94. RF_table = table();
  95. for ii = 1:size(patient_folder,1)
  96. % Build paths to the patient-specific CEST data and segmentation output
  97. work_dir_CEST = [work_dir_aux_7T patient_folder(ii).name filesep];
  98. output_folder = [work_dir_CEST 'results' filesep seg_method '_seg' filesep];
  99. % Verify that the segmentation output folder exists before proceeding
  100. if ~exist(output_folder,'dir')
  101. error('Segmentation folder missing, revise your paths!')
  102. end
  103. %% Load CEST Reference Image
  104. % ---------------------------------------------------------------------
  105. % The reference image is acquired at 720 nT saturation amplitude.
  106. % Two possible naming conventions are checked to accommodate different
  107. % acquisition protocols.
  108. % ---------------------------------------------------------------------
  109. cest_ref = getPathToFileContainingString([work_dir_CEST 'nii' filesep],'720nT_REG','nii');
  110. if isempty(cest_ref)
  111. cest_ref = getPathToFileContainingString([work_dir_CEST 'nii' filesep],'720nT_1Tx_RO_REG','nii');
  112. end
  113. %% Load Fitted CEST Parameters (Lorentzian or PICAE)
  114. % ---------------------------------------------------------------------
  115. % For the Lorentzian pipeline, the B1-corrected fitted Z-spectrum file
  116. % ('Zfitted*B1_*') is located in the Zeval_001 subdirectory, excluding
  117. % any backup files. For PICAE, the output nifti file is located in the
  118. % Zeval_niftis_picae directory.
  119. % ---------------------------------------------------------------------
  120. if ~picae
  121. Zeval_dir = [work_dir_CEST 'Zeval' filesep 'Zeval_001' filesep];
  122. filename = dir(Zeval_dir);
  123. myindices = ~cellfun(@isempty,regexp({filename.name},'Zfitted\w*B1_','match')) & ~contains({filename.name}, "bkup");
  124. else
  125. Zeval_dir = [work_dir_CEST 'Zeval_niftis_picae' filesep];
  126. filename = dir(Zeval_dir);
  127. myindices = ~cellfun(@isempty,regexp({filename.name},'out_PICAE','match'));
  128. end
  129. Zfit_file = filename(myindices);
  130. % Attempt to load the fitted parameters and the reference CEST image.
  131. % If either file is missing, record NaN for all metrics and skip this
  132. % subject.
  133. try
  134. load([Zeval_dir Zfit_file.name]) % Loading may take a while for large files
  135. cest_im = load_nii(cest_ref);
  136. cest_im = cest_im.img;
  137. catch
  138. % Mark all ROI metrics as missing for this subject
  139. age(ii) = nan;
  140. amide_wm(ii) = nan;
  141. amine_wm(ii) = nan;
  142. noe_wm(ii) = nan;
  143. MT_wm(ii) = nan;
  144. amide_gm(ii) = nan;
  145. amine_gm(ii) = nan;
  146. noe_gm(ii) = nan;
  147. MT_gm(ii) = nan;
  148. amide_tumor(ii) = nan;
  149. amine_tumor(ii) = nan;
  150. noe_tumor(ii) = nan;
  151. MT_tumor(ii) = nan;
  152. amide_hip(ii) = nan;
  153. amine_hip(ii) = nan;
  154. noe_hip(ii) = nan;
  155. MT_hip(ii) = nan;
  156. amide_deep_gm(ii) = nan;
  157. amine_deep_gm(ii) = nan;
  158. noe_deep_gm(ii) = nan;
  159. MT_deep_gm(ii) = nan;
  160. amide_global(ii) = nan;
  161. amine_global(ii) = nan;
  162. noe_global(ii) = nan;
  163. MT_global(ii) = nan;
  164. continue;
  165. end
  166. %% Identify Pool Indices and Load Field Maps
  167. % ---------------------------------------------------------------------
  168. % For Lorentzian fitting: pool indices are read from P.FIT.PoolNames.
  169. % Note: The ordering of NOE and MT in P.FIT.PoolNames was verified
  170. % against FAU_7T_1Tx_CEST_Evaluation_IMPI04_MC.m. The commented-out
  171. % layout below shows the expected structure for reference.
  172. %
  173. % For PICAE: pool indices are fixed by convention from the PICAE Python
  174. % output format (verified against the PICAE source code).
  175. %
  176. % In both cases, the five Lorentzian pool parameters are:
  177. % Index 1: Zi (baseline offset)
  178. % Indices 2-4: Water (Amplitude, width, center position)
  179. % Indices 5-7: Amide/APT (Amplitude, width, center position)
  180. % Indices 8-10: MT (Amplitude, width, center position)
  181. % Indices 11-13: NOE (Amplitude, width, center position)
  182. % Indices 14-16: Amine (Amplitude, width, center position)
  183. % ---------------------------------------------------------------------
  184. if ~picae
  185. % Commented reference layout for P.FIT (retained for documentation):
  186. % P.FIT.PoolNames = {'MISC','Water','Water','Water','Amide','Amide','Amide','MT','MT','MT','NOE','NOE','NOE','Amine','Amine','Amine'};
  187. % P.FIT.ParaNames = {'Offset','A','width','w_c','A','width','w_c','A','width','w_c','A','width','w_c','A','width','w_c'};
  188. Amide_pos = find(strcmp(P.FIT.PoolNames, 'Amide')==1); Amide_pos = Amide_pos(1);
  189. Amine_pos = find(strcmp(P.FIT.PoolNames, 'Amine')==1); Amine_pos = Amine_pos(1);
  190. NOE_pos = find(strcmp(P.FIT.PoolNames, 'NOE')==1); NOE_pos = NOE_pos(1);
  191. MT_pos = find(strcmp(P.FIT.PoolNames, 'MT')==1); MT_pos = MT_pos(1);
  192. % Load B0 and B1 field maps from the WASABI-derived file
  193. myindices = ~cellfun(@isempty,regexp({filename.name},'B1_relative','match'));
  194. B1B0_file = filename(myindices);
  195. B0B1 = load([Zeval_dir B1B0_file.name]);
  196. B0_map = B0B1.dB0_stack_int;
  197. B1_map = B0B1.B1map;
  198. else
  199. % PICAE pool index convention (from PICAE Python source):
  200. % 1 = Amide, 2 = NOE, 3 = MT, 4 = Amine
  201. popt = ampls_p72_4d; % Use uncorrected maps: Zeval_PICAE.ampls_uncorr_4d
  202. Amide_pos = 1;
  203. Amine_pos = 4;
  204. NOE_pos = 2;
  205. MT_pos = 3;
  206. % Load B0 and B1 maps from the Lorentzian Zeval directory.
  207. % The brain mask from the Lorentzian fit is used to NaN out
  208. % non-brain voxels in the PICAE output.
  209. Zeval_dir = [work_dir_CEST 'Zeval' filesep 'Zeval_001' filesep];
  210. filename = dir(Zeval_dir);
  211. myindices = ~cellfun(@isempty,regexp({filename.name},'B1_relative','match'));
  212. B1B0_file = filename(myindices);
  213. B0B1 = load([Zeval_dir B1B0_file.name]);
  214. B0_map_Zeval = B0B1.dB0_stack_int;
  215. B0_map = pos_4d(:,:,:,end);
  216. B0_map(isnan(B0_map_Zeval)) = nan;
  217. B1_map = b1_4d;
  218. uncertainty_picae = uncert_4d; % Full-fit uncertainty from PICAE
  219. end
  220. %% Load FLAIR Image
  221. % ---------------------------------------------------------------------
  222. % Load the co-registered FLAIR image for anatomical reference.
  223. % If absent, fall back to the MPRAGE T1-weighted image.
  224. % ---------------------------------------------------------------------
  225. anat = 'flair';
  226. flair_cor_path = getPathToFileContainingString(output_folder,'rflair','.nii');
  227. if ~exist(flair_cor_path,'file')
  228. disp('Corregistered flair missing, check your paths')
  229. flair_im = zeros(size(popt(:,:,:,1)));
  230. anat = 'mprage';
  231. else
  232. flair_im = load_untouch_nii(flair_cor_path);
  233. flair_im = flair_im.img;
  234. end
  235. %% Load T1-Weighted Image and Tissue Segmentation Masks
  236. % ---------------------------------------------------------------------
  237. % Depending on the chosen segmentation method, load the appropriate
  238. % co-registered T1-weighted image and tissue class masks.
  239. % ---------------------------------------------------------------------
  240. if strcmp(seg_method,'spm')
  241. % Locate the T1 folder within the output directory.
  242. % Two common naming conventions are checked; if neither matches,
  243. % the user is prompted to select the folder manually.
  244. foldernames = dir(output_folder);
  245. dirFlag = strcmp({foldernames.name},'t1_mprage_sag_p2_0.6mm_ns')&[foldernames.isdir];
  246. if ~any(dirFlag)
  247. dirFlag = strcmp({foldernames.name},'t1_cs_mp2rage_sag_0.6mm')&[foldernames.isdir];
  248. if ~any(dirFlag)
  249. aux_path = uigetdir(work_dir_anat,'Select T1 folder');
  250. aux = strsplit(aux_path,filesep);
  251. dirFlag = strcmp({foldernames.name},aux{end-1})&[foldernames.isdir];
  252. end
  253. end
  254. % Build paths to the co-registered T1 image and SPM tissue segments
  255. T1_cor_path = getPathToFileContainingString(output_folder,['r' foldernames(dirFlag).name] ,'.nii');
  256. if ~exist(T1_cor_path,'file') && ~exist(T1_seg_cor_path{1},'file')
  257. T1_cor_path = getPathToFileContainingString(output_folder,'t1_cs_mp2rage_sag_0.6mm','.nii');
  258. end
  259. for s = 1:3
  260. T1_seg_cor_path{s} = getPathToFileContainingString(output_folder,['rc' num2str(s) foldernames(dirFlag).name],'.nii');
  261. end
  262. else
  263. % For DL segmentation: check whether co-registered files exist
  264. T1_cor_path = getPathToFileContainingString(output_folder,'rT1w_norm.nii');
  265. T1_seg_cor_path{1} = getPathToFileContainingString(output_folder,'rT1w_norm_seg.nii');
  266. if ~exist(T1_cor_path,'file') && ~exist(T1_seg_cor_path{1},'file')
  267. disp('Corregistered T1-w missing, check your paths')
  268. end
  269. end
  270. T1_im = load_untouch_nii(T1_cor_path);
  271. T1_im = T1_im.img;
  272. % Verify that tumor segmentation files are present
  273. tumor_seg{1} = [output_folder 'rtumor_SCAN2020_class.nii'];
  274. tumor_seg{2} = [output_folder 'rtumor_SCAN2020_unc_whole.nii'];
  275. if ~exist(tumor_seg{1},'file') || ~exist(tumor_seg{2},'file')
  276. disp('Tumor masks missing, check your paths')
  277. end
  278. %% Construct Tissue Masks from Segmentation
  279. % ---------------------------------------------------------------------
  280. % Build binary masks for each tissue class. For SPM, probabilistic
  281. % maps are loaded directly. For DL segmentation, masks are derived
  282. % from a labeled atlas image using standard FreeSurfer label indices.
  283. % ---------------------------------------------------------------------
  284. if strcmp(seg_method,'spm')
  285. gm_mask = load_nii(T1_seg_cor_path{1});
  286. gm_mask = gm_mask.img;
  287. wm_mask = load_nii(T1_seg_cor_path{2});
  288. wm_mask = wm_mask.img;
  289. csf_mask = load_nii(T1_seg_cor_path{3});
  290. csf_mask = csf_mask.img;
  291. deep_gm_mask = uint8(zeros(size(csf_mask)));
  292. else
  293. seg_mask = load_nii(T1_seg_cor_path{1});
  294. % White matter: labels 2 (left WM) and 41 (right WM)
  295. wm_mask = (seg_mask.img == 2) + (seg_mask.img == 41);
  296. % Cortical grey matter: labels 1001-1035 (left) and 2001-2035 (right)
  297. gm_mask = zeros(size(seg_mask.img));
  298. for i = 1:35
  299. gm_mask = gm_mask + (seg_mask.img == 1000+i) + (seg_mask.img == 2000+i) ;
  300. end
  301. % Hippocampus: labels 17 (left) and 53 (right)
  302. hip_mask = (seg_mask.img == 17) + (seg_mask.img == 53);
  303. % Deep grey matter structures (includes hippocampus).
  304. % Label list covers subcortical nuclei as defined by FreeSurfer.
  305. list_gm = [10:13 16:28 49:60];
  306. deep_gm_mask = double(ismember(seg_mask.img, list_gm));
  307. end
  308. % Combined brain mask (used for tumor volume normalization)
  309. brain_mask = wm_mask + gm_mask + deep_gm_mask;
  310. %% Construct and Refine the Tumor Mask
  311. % ---------------------------------------------------------------------
  312. % The primary tumor mask is derived from the SCAN2020 segmentation.
  313. % An uncertainty map is thresholded and added to expand the exclusion
  314. % zone, ensuring that uncertain tumor voxels are also removed from
  315. % healthy tissue masks.
  316. %
  317. % The hippocampus is explicitly excluded from the tumor mask, as the
  318. % segmentation algorithm can misclassify it as tumor tissue due to
  319. % T2 hyperintensities (validated visually in collaboration with a
  320. % radiologist).
  321. %
  322. % Note: This conservative expansion may exclude some healthy brain
  323. % tissue near the tumor boundary, particularly the hippocampus.
  324. % ---------------------------------------------------------------------
  325. tumor_mask = load_nii(tumor_seg{1});
  326. tumor_mask = tumor_mask.img;
  327. tumor_mask_certain = tumor_mask;
  328. tumor_mask(tumor_mask ~= 0) = 1;
  329. % Expand the tumor mask using the uncertainty map.
  330. % Voxels with uncertainty above the threshold are treated as tumor.
  331. threhsold = 10;
  332. tumor_unc = load_nii(tumor_seg{2});
  333. tumor_unc = tumor_unc.img;
  334. tumor_unc(tumor_unc <= threhsold) = 0;
  335. tumor_unc(tumor_unc > threhsold) = 1;
  336. tumor_mask = tumor_mask + tumor_unc;
  337. % Remove hippocampal voxels from the tumor mask to prevent
  338. % misclassification
  339. tumor_mask(hip_mask == 1) = 0;
  340. tumor_mask = double(tumor_mask);
  341. % Compute tumor volume as a percentage of total brain volume
  342. % (WM + cortical GM + deep GM) for quality control
  343. global_size = nnz(wm_mask + gm_mask + deep_gm_mask);
  344. tumor_size = nnz(tumor_mask);
  345. tumor_per(ii) = tumor_size*100/global_size;
  346. %% Identify the Axial Slice with Maximum Tumor Extent
  347. % ---------------------------------------------------------------------
  348. % The tumor slice is the axial slice containing the greatest number
  349. % of non-zero tumor voxels. Edge slices (1, 2, 17, 18) are remapped
  350. % to the nearest valid interior slice to avoid boundary artefacts.
  351. % ---------------------------------------------------------------------
  352. max_nnz = 0;
  353. for s = 1:size(tumor_mask,3)
  354. nnz_values = nnz(tumor_mask(:,:,s));
  355. if nnz_values > max_nnz
  356. max_nnz = nnz_values;
  357. tumor_slice = s;
  358. end
  359. end
  360. % Remap boundary slices to avoid display artefacts
  361. if tumor_slice == 18 || tumor_slice == 17
  362. tumor_slice = 16;
  363. elseif tumor_slice == 1 || tumor_slice == 2
  364. tumor_slice = 3;
  365. end
  366. % Exclude tumor voxels from all healthy tissue masks to prevent
  367. % contamination of healthy-tissue ROI statistics
  368. gm_mask(tumor_mask ~= 0) = 0;
  369. wm_mask(tumor_mask ~= 0) = 0;
  370. csf_mask(tumor_mask ~= 0) = 0;
  371. deep_gm_mask(tumor_mask ~= 0) = 0;
  372. %% Figure 3: Anatomical and CEST Map Overview
  373. % ---------------------------------------------------------------------
  374. % Generates an 8-panel overview figure for each subject showing:
  375. % Panel 1: FLAIR (or MPRAGE if FLAIR is unavailable) at tumor slice
  376. % Panel 2: CEST reference image with tissue segmentation overlays
  377. % (GM = green, WM = blue, deep GM = yellow, tumor = red)
  378. % Panel 3: B0 field map with histogram inset
  379. % Panel 4: B1 field map with histogram inset
  380. % Panels 5-8: CEST pool amplitude maps (amide, rNOE, MT, amine)
  381. % ---------------------------------------------------------------------
  382. ff = figure(3);
  383. t = tiledlayout(2,4,'TileSpacing','compact','Padding','compact');
  384. txt = [ patient_folder(ii).name ' - age ' num2str(patient_table.age(ii)) ' - slice ' num2str(tumor_slice) ' - tumor ' num2str(tumor_per(ii),'%0.2f') ' %'];
  385. if picae
  386. txt = [txt ' - picae'];
  387. end
  388. sgtitle(txt,'interpreter','none');
  389. % Panel 1: Anatomical reference image (FLAIR preferred, MPRAGE fallback)
  390. ax = nexttile(t);
  391. if strcmp(anat,'flair')
  392. imshow(imrotate(flair_im(:,:,tumor_slice),90),[]);
  393. title('FLAIR tumor slice')
  394. else
  395. imshow(imrotate(T1_im(:,:,tumor_slice),90),[]);
  396. title('MPRAGE tumor slice')
  397. end
  398. % Panel 2: CEST reference image with color-coded tissue segmentation
  399. ax2 = nexttile(t);
  400. imshow(imrotate(cest_im(:,:,tumor_slice),90),[]);
  401. % Overlay: cortical GM (green, semi-transparent)
  402. gm_mask_t = imrotate(gm_mask(:,:,tumor_slice),90);
  403. green = cat(3, zeros(size(gm_mask_t)), ones(size(gm_mask_t)), zeros(size(gm_mask_t)));
  404. hold on;
  405. auxim = imshow(green,'Parent',ax2);
  406. hold off;
  407. set(auxim,'AlphaData', 0.2.*double(gm_mask_t./max(gm_mask_t,[],'all')))
  408. % Overlay: white matter (blue, semi-transparent)
  409. wm_mask_t = imrotate(wm_mask(:,:,tumor_slice),90);
  410. blue = cat(3, zeros(size(wm_mask_t)), zeros(size(wm_mask_t)), ones(size(wm_mask_t)));
  411. hold on;
  412. auxim2 = imshow(blue,'Parent',ax2);
  413. hold off;
  414. set(auxim2,'AlphaData', 0.2.*double(wm_mask_t./max(wm_mask_t,[],'all')))
  415. % Overlay: deep GM structures (yellow, semi-transparent)
  416. dgm_mask_t = imrotate(deep_gm_mask(:,:,tumor_slice),90);
  417. yellow = cat(3, ones(size(dgm_mask_t)), ones(size(dgm_mask_t)), zeros(size(dgm_mask_t)));
  418. hold on;
  419. auxim3 = imshow(yellow,'Parent',ax2);
  420. hold off;
  421. set(auxim3,'AlphaData', 0.2.*double(dgm_mask_t./max(dgm_mask_t,[],'all')))
  422. % Overlay: tumor region (red, semi-transparent)
  423. tumor_mask_t = imrotate(tumor_mask(:,:,tumor_slice),90);
  424. red = cat(3, ones(size(tumor_mask_t)), zeros(size(tumor_mask_t)), zeros(size(tumor_mask_t)));
  425. hold on;
  426. auxim4 = imshow(red,'Parent',ax2);
  427. hold off;
  428. set(auxim4,'AlphaData', 0.2.*double(tumor_mask_t./max(tumor_mask_t,[],'all')))
  429. title('Segmented CEST')
  430. % Panel 3: B0 field map (ppm), with quality control percentage
  431. ax3 = nexttile(t);
  432. try
  433. imshow(imrotate(B0_map(:,:,tumor_slice),90),[]);
  434. caxis([-0.4 0.4])
  435. colorbar();
  436. title('B0 Map (ppm)')
  437. % Fraction of voxels exceeding the B0 acceptability threshold (±0.4 ppm)
  438. b0_total = nnz(~isnan(B0_map));
  439. B0_per(ii) = (sum(B0_map > 0.4 | B0_map < -0.4,'all')/b0_total)*100;
  440. catch
  441. title('No B0 in B1_relative.mat')
  442. end
  443. % Panel 4: B1 field map (relative units), with quality control percentage
  444. ax4 = nexttile(t);
  445. try
  446. B1_map(isnan(B0_map)) = nan;
  447. imshow(imrotate(B1_map(:,:,tumor_slice),90),[]);
  448. caxis([0.4 1.6])
  449. colorbar();
  450. title('B1 map (rel)')
  451. % Fraction of voxels outside the B1 acceptability range [0.5, 1.5]
  452. b1_total = nnz(~isnan(B1_map));
  453. B1_per(ii) = (sum(B1_map < 0.5 | B1_map > 1.5,'all')/b1_total)*100;
  454. catch
  455. title('No B1 in B1_relative.mat')
  456. end
  457. %% Extract CEST Pool Amplitude Maps
  458. % ---------------------------------------------------------------------
  459. % Squeeze the fitted parameter array (popt) into 3D maps for each pool.
  460. % For PICAE outputs, non-brain voxels are explicitly set to NaN using
  461. % the brain mask derived from the Lorentzian Zeval output.
  462. % ---------------------------------------------------------------------
  463. amide_map = squeeze(popt(:,:,:,Amide_pos));
  464. amine_map = squeeze(popt(:,:,:,Amine_pos));
  465. NOE_map = squeeze(popt(:,:,:,NOE_pos));
  466. MT_map = squeeze(popt(:,:,:,MT_pos));
  467. if picae
  468. amide_map(isnan(B0_map_Zeval)) = nan;
  469. amine_map(isnan(B0_map_Zeval)) = nan;
  470. NOE_map(isnan(B0_map_Zeval)) = nan;
  471. MT_map(isnan(B0_map_Zeval)) = nan;
  472. end
  473. %% Compute Mean CEST Amplitudes per Tissue ROI
  474. % ---------------------------------------------------------------------
  475. % For each CEST pool (amide/APT, amine, rNOE, MT), compute the mean
  476. % amplitude within each tissue mask across the full 3D volume.
  477. % ---------------------------------------------------------------------
  478. % White matter
  479. amide_wm(ii) = mean(amide_map(logical(wm_mask)),'all','omitnan');
  480. amine_wm(ii) = mean(amine_map(logical(wm_mask)),'all','omitnan');
  481. noe_wm(ii) = mean(NOE_map(logical(wm_mask)),'all','omitnan');
  482. MT_wm(ii) = mean(MT_map(logical(wm_mask)),'all','omitnan');
  483. % Cortical grey matter
  484. amide_gm(ii) = mean(amide_map(logical(gm_mask)),'all','omitnan');
  485. amine_gm(ii) = mean(amine_map(logical(gm_mask)),'all','omitnan');
  486. noe_gm(ii) = mean(NOE_map(logical(gm_mask)),'all','omitnan');
  487. MT_gm(ii) = mean(MT_map(logical(gm_mask)),'all','omitnan');
  488. % Tumor region
  489. amide_tumor(ii) = mean(amide_map(logical(tumor_mask)),'all','omitnan');
  490. amine_tumor(ii) = mean(amine_map(logical(tumor_mask)),'all','omitnan');
  491. noe_tumor(ii) = mean(NOE_map(logical(tumor_mask)),'all','omitnan');
  492. MT_tumor(ii) = mean(MT_map(logical(tumor_mask)),'all','omitnan');
  493. % Store full voxel-level distributions within the tumor for later analysis
  494. pat{ii}.amide_tumor = amide_map(logical(tumor_mask));
  495. pat{ii}.amine_tumor = amine_map(logical(tumor_mask));
  496. pat{ii}.noe_tumor = NOE_map(logical(tumor_mask));
  497. pat{ii}.MT_tumor = MT_map(logical(tumor_mask));
  498. % Hippocampus
  499. amide_hip(ii) = mean(amide_map(logical(hip_mask)),'all','omitnan');
  500. amine_hip(ii) = mean(amide_map(logical(hip_mask)),'all','omitnan');
  501. noe_hip(ii) = mean(NOE_map(logical(hip_mask)),'all','omitnan');
  502. MT_hip(ii) = mean(MT_map(logical(hip_mask)),'all','omitnan');
  503. % Deep grey matter structures
  504. amide_deep_gm(ii) = mean(amide_map(logical(deep_gm_mask)),'all','omitnan');
  505. amine_deep_gm(ii) = mean(amine_map(logical(deep_gm_mask)),'all','omitnan');
  506. noe_deep_gm(ii) = mean(NOE_map(logical(deep_gm_mask)),'all','omitnan');
  507. MT_deep_gm(ii) = mean(MT_map(logical(deep_gm_mask)),'all','omitnan');
  508. % Record number of non-zero deep GM voxels for quality control
  509. ndgm(ii) = nnz(deep_gm_mask);
  510. %% Compute Subject-Level Coefficient of Variation (CoV)
  511. % ---------------------------------------------------------------------
  512. % CoV is computed as 100 * (std / mean) within each tissue mask for
  513. % each CEST pool. This quantifies intra-tissue spatial variability
  514. % of the CEST signal on a per-subject basis.
  515. % ---------------------------------------------------------------------
  516. % White matter CoV
  517. cov_ind.amide_wm(ii) = 100*mean(std(amide_map(logical(wm_mask)),[],'all','omitnan')/mean(amide_map(logical(wm_mask)),'all','omitnan'));
  518. cov_ind.amine_wm(ii) = 100*std(amine_map(logical(wm_mask)),[],'all','omitnan')/mean(amine_map(logical(wm_mask)),'all','omitnan');
  519. cov_ind.noe_wm(ii) = 100*std(NOE_map(logical(wm_mask)),[],'all','omitnan')/mean(NOE_map(logical(wm_mask)),'all','omitnan');
  520. cov_ind.MT_wm(ii) = 100*std(MT_map(logical(wm_mask)),[],'all','omitnan')/mean(MT_map(logical(wm_mask)),'all','omitnan');
  521. % Cortical grey matter CoV
  522. cov_ind.amide_gm(ii) = 100*std(amide_map(logical(gm_mask)),[],'all','omitnan')/mean(amide_map(logical(gm_mask)),'all','omitnan');
  523. cov_ind.amine_gm(ii) = 100*std(amine_map(logical(gm_mask)),[],'all','omitnan')/mean(amine_map(logical(gm_mask)),'all','omitnan');
  524. cov_ind.noe_gm(ii) = 100*std(NOE_map(logical(gm_mask)),[],'all','omitnan')/mean(NOE_map(logical(gm_mask)),'all','omitnan');
  525. cov_ind.MT_gm(ii) = 100*std(MT_map(logical(gm_mask)),[],'all','omitnan')/mean(MT_map(logical(gm_mask)),'all','omitnan');
  526. % Tumor CoV
  527. cov_ind.amide_tumor(ii) = 100*std(amide_map(logical(tumor_mask)),[],'all','omitnan')/mean(amide_map(logical(tumor_mask)),'all','omitnan');
  528. cov_ind.amine_tumor(ii) = 100*std(amine_map(logical(tumor_mask)),[],'all','omitnan')/mean(amine_map(logical(tumor_mask)),'all','omitnan');
  529. cov_ind.noe_tumor(ii) = 100*std(NOE_map(logical(tumor_mask)),[],'all','omitnan')/mean(NOE_map(logical(tumor_mask)),'all','omitnan');
  530. cov_ind.MT_tumor(ii) = 100*std(MT_map(logical(tumor_mask)),[],'all','omitnan')/mean(MT_map(logical(tumor_mask)),'all','omitnan');
  531. % Deep grey matter CoV
  532. cov_ind.amide_deep_gm(ii) = 100*std(amide_map(logical(deep_gm_mask)),[],'all','omitnan')/mean(amide_map(logical(deep_gm_mask)),'all','omitnan');
  533. cov_ind.amine_deep_gm(ii) = 100*std(amine_map(logical(deep_gm_mask)),[],'all','omitnan')/mean(amine_map(logical(deep_gm_mask)),'all','omitnan');
  534. cov_ind.noe_deep_gm(ii) = 100*std(NOE_map(logical(deep_gm_mask)),[],'all','omitnan')/mean(NOE_map(logical(deep_gm_mask)),'all','omitnan');
  535. cov_ind.MT_deep_gm(ii) = 100*std(MT_map(logical(deep_gm_mask)),[],'all','omitnan')/mean(MT_map(logical(deep_gm_mask)),'all','omitnan');
  536. %% Panels 5-8: CEST Pool Amplitude Maps
  537. % ---------------------------------------------------------------------
  538. % Display the amide, rNOE, MT, and amine amplitude maps at the tumor
  539. % slice, using fixed colormap ranges for cross-subject comparison.
  540. % ---------------------------------------------------------------------
  541. % Panel 5: Amide (APT) amplitude map
  542. ax5 = nexttile(t);
  543. min_s = 0.025; max_s = 0.075;
  544. imshow(imrotate(amide_map(:,:,tumor_slice),90),[min_s max_s]);
  545. colormap(ax5,'parula'); colorbar();
  546. title('amide')
  547. % Panel 6: Aliphatic rNOE amplitude map
  548. ax6 = nexttile(t);
  549. min_s = 0.06; max_s = 0.16;
  550. imshow(imrotate(NOE_map(:,:,tumor_slice),90),[min_s max_s]);
  551. colormap(ax6,'parula'); colorbar();
  552. title('rNOE')
  553. % Panel 7: MT amplitude map
  554. ax7 = nexttile(t);
  555. min_s = 0.045; max_s = 0.28;
  556. imshow(imrotate(MT_map(:,:,tumor_slice),90),[min_s max_s]);
  557. colormap(ax7,'parula');colorbar();
  558. title('MT')
  559. % Panel 8: Amine amplitude map
  560. ax8 = nexttile(t);
  561. min_s = 0.01; max_s = 0.075;
  562. imshow(imrotate(amine_map(:,:,tumor_slice),90),[min_s max_s]);
  563. colormap(ax8,'parula'); colorbar();
  564. title('amine')
  565. set(gcf,'Position',[2112 282 1118 551])
  566. %% B0 Histogram Inset
  567. % ---------------------------------------------------------------------
  568. % Add a small histogram inset below the B0 map panel. Dashed red lines
  569. % mark the ±0.2 ppm threshold used for quality assessment.
  570. % ---------------------------------------------------------------------
  571. inset_position = [0.01 -0.01 0.98 0.15]; % [left bottom width height] in normalized tile units
  572. axpos = get(ax3, 'Position');
  573. inset_position_fig = [...
  574. axpos(1) + inset_position(1) * axpos(3),...
  575. axpos(2) + inset_position(2) * axpos(4),...
  576. inset_position(3) * axpos(3),...
  577. inset_position(4) * axpos(4)]; % Convert to figure units
  578. ax_inset = axes('Position', inset_position_fig);
  579. histogram(ax_inset,B0_map,'EdgeColor','none','FaceColor','k','FaceAlpha',1,'BinLimits',[-0.4 0.4]);
  580. xline(ax_inset,[-0.2 0.2],'--r')
  581. set(ax_inset,'yticklabel',[])
  582. %% B1 Histogram Inset
  583. % ---------------------------------------------------------------------
  584. % Add a small histogram inset below the B1 map panel. Dashed red lines
  585. % mark the [0.5, 1.5] range used for quality assessment.
  586. % ---------------------------------------------------------------------
  587. inset_position = [0.01 -0.01 0.98 0.15]; % [left bottom width height] in normalized tile units
  588. axpos = get(ax4, 'Position');
  589. inset_position_fig = [axpos(1) + inset_position(1) * axpos(3),...
  590. axpos(2) + inset_position(2) * axpos(4),...
  591. inset_position(3) * axpos(3),...
  592. inset_position(4) * axpos(4)]; % Convert to figure units
  593. ax_inset = axes('Position', inset_position_fig);
  594. histogram(ax_inset,B1_map,'EdgeColor','none','FaceColor','k','FaceAlpha',1,'BinLimits',[0.4 1.6]);
  595. xline(ax_inset,[0.5 1.5],'--r')
  596. set(ax_inset,'yticklabel',[])
  597. % Save figure (requires button press to allow inspection before saving)
  598. if save_stuff
  599. saveas(ff,[out_folder patient_folder(ii).name],'svg')
  600. end
  601. %% Optional: MTR-Rex Contrast Maps
  602. % ---------------------------------------------------------------------
  603. % If MTR_analysis is enabled, compute and display MTR-Rex maps for
  604. % all four CEST pools (amide, amine, rNOE, MT). MTR-Rex is defined
  605. % as (1/Zlab - 1/Zref) and provides a quantitative measure of
  606. % pool-specific magnetization transfer.
  607. %
  608. % Note: This section requires the CEST toolbox from the FAU group.
  609. % Please contact the corresponding author if interested.
  610. % ---------------------------------------------------------------------
  611. if MTR_analysis
  612. Contrasts = {'MTR_{Rex,Amide}', 'MTR_{Rex,Amine}', 'MTR_{Rex,NOE}', 'MTR_{Rex,MT}'};
  613. Offset_list = P.SEQ.w;
  614. [Zlab, Zref] = get_FIT_LABREF(popt,P,1,P.SEQ.w);
  615. % Amide/APT MTR-Rex at +3.5 ppm
  616. MTR_contrast_spectra = 1./Zlab - 1./Zref.Amide;
  617. [contrast_offset, ~] = find_nearest(Offset_list,3.5);
  618. MTR_contrast{1} = MTR_contrast_spectra(:,:,:,contrast_offset);
  619. colorbar_range = [0.03 0.13];
  620. % Amine MTR-Rex at +2.2 ppm
  621. MTR_contrast_spectra = 1./Zlab - 1./Zref.Amine;
  622. [contrast_offset, ~] = find_nearest(Offset_list,2.2);
  623. MTR_contrast{2} = MTR_contrast_spectra(:,:,:,contrast_offset);
  624. colorbar_range = [0.02 0.17];
  625. % rNOE MTR-Rex at -3.5 ppm
  626. MTR_contrast_spectra = 1./Zlab - 1./Zref.NOE;
  627. [contrast_offset, ~] = find_nearest(Offset_list,-3.5);
  628. MTR_contrast{3} = MTR_contrast_spectra(:,:,:,contrast_offset);
  629. colorbar_range = [0 0.65];
  630. % MT MTR-Rex at -2.0 ppm
  631. MTR_contrast_spectra = 1./Zlab - 1./Zref.MT;
  632. [contrast_offset, ~] = find_nearest(Offset_list,-2);
  633. MTR_contrast{4} = MTR_contrast_spectra(:,:,:,contrast_offset);
  634. colorbar_range = [0 0.65];
  635. % Display MTR-Rex maps for all four pools
  636. MTRex_f = figure(4);
  637. MTRex_t = tiledlayout(1,4);
  638. ax(1) = nexttile(MTRex_t);
  639. imshow(imrotate(MTR_contrast{1}(:,:,tumor_slice),90),[0.03 0.13]);
  640. colormap(ax(1),'parula'); colorbar();
  641. title('amide')
  642. ax(2) = nexttile(MTRex_t);
  643. imshow(imrotate(MTR_contrast{3}(:,:,tumor_slice),90),[0 0.45]);
  644. colormap(ax(2),'parula'); colorbar();
  645. title('aliphatic rNOE')
  646. ax(3) = nexttile(MTRex_t);
  647. imshow(imrotate(MTR_contrast{4}(:,:,tumor_slice),90),[0.09 0.4]);
  648. colormap(ax(3),'parula');colorbar();
  649. title('MT')
  650. ax(4) = nexttile(MTRex_t);
  651. imshow(imrotate(MTR_contrast{2}(:,:,tumor_slice),90),[0.02 0.17]);
  652. colormap(ax(4),'parula'); colorbar();
  653. title('amine')
  654. % Compute mean MTR-Rex per tissue ROI
  655. MTR_amide_wm(ii) = mean(MTR_contrast{1}(logical(wm_mask)),'all','omitnan');
  656. MTR_amine_wm(ii) = mean(MTR_contrast{2}(logical(wm_mask)),'all','omitnan');
  657. MTR_noe_wm(ii) = mean(MTR_contrast{3}(logical(wm_mask)),'all','omitnan');
  658. MTR_MT_wm(ii) = mean(MTR_contrast{4}(logical(wm_mask)),'all','omitnan');
  659. MTR_amide_gm(ii) = mean(MTR_contrast{1}(logical(gm_mask)),'all','omitnan');
  660. MTR_amine_gm(ii) = mean(MTR_contrast{2}(logical(gm_mask)),'all','omitnan');
  661. MTR_noe_gm(ii) = mean(MTR_contrast{3}(logical(gm_mask)),'all','omitnan');
  662. MTR_MT_gm(ii) = mean(MTR_contrast{4}(logical(gm_mask)),'all','omitnan');
  663. MTR_amide_deep_gm(ii) = mean(MTR_contrast{1}(logical(deep_gm_mask)),'all','omitnan');
  664. MTR_amine_deep_gm(ii) = mean(MTR_contrast{2}(logical(deep_gm_mask)),'all','omitnan');
  665. MTR_noe_deep_gm(ii) = mean(MTR_contrast{3}(logical(deep_gm_mask)),'all','omitnan');
  666. MTR_MT_deep_gm(ii) = mean(MTR_contrast{4}(logical(deep_gm_mask)),'all','omitnan');
  667. MTR_amide_tumor(ii) = mean(MTR_contrast{1}(logical(tumor_mask)),'all','omitnan');
  668. MTR_amine_tumor(ii) = mean(MTR_contrast{2}(logical(tumor_mask)),'all','omitnan');
  669. MTR_noe_tumor(ii) = mean(MTR_contrast{3}(logical(tumor_mask)),'all','omitnan');
  670. MTR_MT_tumor(ii) = mean(MTR_contrast{4}(logical(tumor_mask)),'all','omitnan');
  671. % Save MTR-Rex figure
  672. set(MTRex_f,'Position',[ 551 538 1108 254])
  673. if save_stuff
  674. out_folder_MTRRex = [out_folder '/MTRRex/'];
  675. saveas(MTRex_f,[out_folder_MTRRex patient_folder(ii).name '_MTRRex'],'svg')
  676. end
  677. end
  678. %% Contralateral ROI Analysis
  679. % ---------------------------------------------------------------------
  680. % Load manually defined contralateral (healthy) and reduced tumor ROI
  681. % masks for slice-level comparison of CEST metrics between tumor and
  682. % healthy tissue. These masks were defined per subject in a prior
  683. % interactive step.
  684. %
  685. % The commented-out block shows the interactive mask creation workflow
  686. % (move_mask function), retained here for reference.
  687. % ---------------------------------------------------------------------
  688. try
  689. pause(0.05);
  690. load([output_folder 'contralateral_tumor_mask.mat']);
  691. load([output_folder 'tumor_mask_reduced.mat']);
  692. % Display FLAIR image with reduced tumor and contralateral ROI overlays
  693. ft = figure(100);
  694. ax = gca;
  695. imshow(imrotate(flair_im(:,:,tumor_slice),90),[]);
  696. % Overlay: reduced tumor mask (red, semi-transparent)
  697. tumor_mask_t = imrotate(double(tumor_mask_reduced),90);
  698. red = cat(3, ones(size(tumor_mask_t)), zeros(size(tumor_mask_t)), zeros(size(tumor_mask_t)));
  699. hold on;
  700. auxim4 = imshow(red,'Parent',ax);
  701. hold off;
  702. set(auxim4,'AlphaData', 0.2.*double(tumor_mask_t./max(tumor_mask_t,[],'all')))
  703. if save_stuff
  704. pause(0.05);
  705. set(ft,'Position',[2227 389 454 324])
  706. saveas(ft,[out_folder 'reduced_tumor_mask' patient_folder(ii).name],'svg')
  707. end
  708. % Overlay: contralateral healthy ROI (blue, semi-transparent)
  709. healthy_ROI = double(imrotate(new_mask,90));
  710. blue = cat(3, zeros(size(healthy_ROI)), zeros(size(healthy_ROI)), ones(size(healthy_ROI)));
  711. hold on;
  712. auxim2 = imshow(blue,'Parent',ax);
  713. hold off;
  714. set(auxim2,'AlphaData', 0.4.*healthy_ROI)
  715. title('Tumor segmentation CEST')
  716. if save_stuff
  717. pause(0.05)
  718. set(ft,'Position',[2227 389 454 324])
  719. saveas(ft,[out_folder 'tumor_mask_' patient_folder(ii).name],'svg');
  720. end
  721. catch
  722. % Interactive mask creation workflow (disabled; retained for reference):
  723. % if nnz(tumor_mask_certain(:,:,tumor_slice)) > 10
  724. % [new_mask, tumor_mask_reduced] = move_mask(tumor_mask_certain(:,:,tumor_slice),flair_im(:,:,tumor_slice));
  725. % else
  726. % new_mask = zeros(size(tumor_mask_certain(:,:,tumor_slice)));
  727. % tumor_mask_reduced = zeros(size(tumor_mask_certain(:,:,tumor_slice)));
  728. % end
  729. % save([output_folder 'contralateral_tumor_mask'],'new_mask')
  730. % save([output_folder 'tumor_mask_reduced'],'tumor_mask_reduced')
  731. end
  732. % Report ROI sizes for verification
  733. disp(['size new mask = ' num2str(nnz(new_mask))]);
  734. disp(['size tumor mask = ' num2str(nnz(tumor_mask_reduced))]);
  735. % Extract slice-level mean CEST amplitudes for tumor and healthy ROIs
  736. map = amide_map(:,:,tumor_slice);
  737. amide_tum_sli(ii) = mean(map(logical(tumor_mask_reduced)),'all','omitnan');
  738. amide_healthyROI(ii) = mean(map(logical(new_mask)),'all','omitnan');
  739. map = amine_map(:,:,tumor_slice);
  740. amine_tum_sli(ii) = mean(map(logical(tumor_mask_reduced)),'all','omitnan');
  741. amine_healthyROI(ii) = mean(map(logical(new_mask)),'all','omitnan');
  742. map = NOE_map(:,:,tumor_slice);
  743. noe_tum_sli(ii) = mean(map(logical(tumor_mask_reduced)),'all','omitnan');
  744. noe_healthyROI(ii) = mean(map(logical(new_mask)),'all','omitnan');
  745. map = MT_map(:,:,tumor_slice);
  746. MT_tum_sli(ii) = mean(map(logical(tumor_mask_reduced)),'all','omitnan');
  747. MT_healthyROI(ii) = mean(map(logical(new_mask)),'all','omitnan');
  748. %% Optional: Interactive Single-Voxel Z-Spectrum Viewer
  749. % ---------------------------------------------------------------------
  750. % When enabled, displays the corrected Z-spectrum and its Lorentzian
  751. % decomposition for a selected voxel, alongside the CEST image with
  752. % the tumor mask overlaid.
  753. % Also plots the mean Z-spectrum averaged over a combined tissue mask
  754. % (cortical GM + WM + deep GM) at the tumor slice.
  755. %
  756. % This tool is intended for exploratory quality control and is
  757. % disabled by default.
  758. % ---------------------------------------------------------------------
  759. interactive = 0;
  760. if interactive
  761. % Extract the 2D image slice at the selected slice index
  762. image_slice = squeeze(Z_corrExt(:, :, tumor_slice, 1));
  763. close all;
  764. % Color palette for pool-specific Lorentzian components
  765. figure(2);
  766. col = [8 41 84; 224 43 53; 240 197 113; 89 168 156; 165 89 170]./255;
  767. % Left panel: CEST image with selected voxel marker and tumor overlay
  768. ax_aux = subplot(1, 2, 1);
  769. imshow(image_slice, []);
  770. x_pos = 32;
  771. y_pos = 37;
  772. hold on;
  773. plot(x_pos,y_pos,'rx','MarkerSize',6)
  774. hold on
  775. tumor_mask_t = tumor_mask(:,:,tumor_slice);
  776. red = cat(3, ones(size(tumor_mask_t)), zeros(size(tumor_mask_t)), zeros(size(tumor_mask_t)));
  777. hold on;
  778. auxim2 = imshow(red,'Parent',ax_aux);
  779. hold off;
  780. set(auxim2,'AlphaData', 0.2.*double(tumor_mask_t./max(tumor_mask_t,[],'all')))
  781. % Right panel: Z-spectrum and Lorentzian decomposition for selected voxel
  782. subplot(1, 2, 2);
  783. I = squeeze(Z_corrExt(x_pos, y_pos, tumor_slice, :));
  784. spectrum_plot = plot(P.SEQ.w, I,'ok','MarkerSize',4,'MarkerFaceColor','k','DisplayName','Z-Spectra');
  785. xlim([-6 6])
  786. ylim([0 1]);
  787. xlabel('frequency offset (ppm)');
  788. ylabel('I/I_0 (a.u.)')
  789. hold on;
  790. p = popt(x_pos,y_pos,tumor_slice,:);
  791. w = P.SEQ.w;
  792. % Evaluate individual pool Lorentzian contributions.
  793. % The 7T model includes five pools with free center positions:
  794. % pool 1 = water (direct saturation)
  795. % pool 2 = amide
  796. % pool 3 = MT
  797. % pool 4 = NOE
  798. % pool 5 = amine
  799. pool(1,:) = p(2).*p(3).^2./4./(p(3).^2/4+(w-p(4)).^2);
  800. pool(2,:) = p(5).*p(6).^2./4./(p(6).^2./4+(w-p(7)).^2);
  801. pool(3,:) = p(8).*p(9).^2./4./(p(9).^2./4.+(w-p(10)).^2);
  802. pool(4,:) = p(11).*p(12).^2./4./(p(12).^2./4.+(w-p(13)).^2);
  803. pool(5,:) = p(14).*p(15).^2./4./(p(15).^2/4.+(w-p(16)).^2);
  804. amp = p(1);
  805. % Plot individual pool contributions subtracted from baseline
  806. plot(w,amp - pool(2,:),'Linewidth',1.5,'DisplayName','Fitted amide','Color',col(1,:))
  807. plot(w,amp - pool(3,:),'Linewidth',1.5,'DisplayName','Fitted rNOE','Color',col(2,:))
  808. plot(w,amp - pool(4,:),'Linewidth',1.5,'DisplayName','Fitted MT','Color',col(3,:))
  809. plot(w,amp - pool(5,:),'Linewidth',1.5,'DisplayName','Fitted amine','Color',col(5,:))
  810. plot(w,amp - pool(1,:),'Linewidth',1.5,'DisplayName','Fitted DS','Color',col(4,:))
  811. % Plot full five-pool fitted Z-spectrum
  812. plot(P.SEQ.w,lorentzfit5pool(p, w, []),'k','Linewidth',1.5,'DisplayName','Fitted Z');
  813. xlim([-6 6])
  814. ylim([0, 1]);
  815. xlabel('ppm');
  816. ylabel('amplitude (a.u.)')
  817. set(gcf,'Position',[675 685 882 277])
  818. legend();
  819. %% Mean Z-Spectrum Over Combined Tissue Mask
  820. % -----------------------------------------------------------------
  821. % Compute and display the mean Z-spectrum and its Lorentzian
  822. % decomposition, averaged over the combined GM + WM + deep GM mask
  823. % at the tumor slice.
  824. % -----------------------------------------------------------------
  825. % Build combined brain tissue mask (excluding tumor)
  826. aux_mask = gm_mask(:,:,tumor_slice) + wm_mask(:,:,tumor_slice) + deep_gm_mask(:,:,tumor_slice);
  827. mask_idx = find(aux_mask);
  828. figure(3);
  829. % Average Z-spectrum over masked voxels
  830. Z = reshape(Z_corrExt(:,:,tumor_slice,:), [], size(Z_corrExt,4));
  831. I = squeeze(mean(Z(mask_idx, :), 1, 'omitnan'));
  832. spectrum_plot = plot(P.SEQ.w, I./I(1),'ok','MarkerSize',4,'MarkerFaceColor','k','DisplayName','Z-Spectra');
  833. xlim([-6 6])
  834. ylim([-0 1]);
  835. xlabel('frequency offset (ppm)');
  836. ylabel('Amplitude (a.u.)')
  837. hold on;
  838. % Average fitted parameters over masked voxels
  839. popt_slice = reshape(popt(:,:,tumor_slice,:), [], size(popt,4));
  840. p = squeeze(mean(popt_slice(mask_idx, :), 1, 'omitnan'));
  841. w = P.SEQ.w;
  842. pool(1,:) = p(2).*p(3).^2./4./(p(3).^2/4+(w-p(4)).^2);
  843. pool(2,:) = p(5).*p(6).^2./4./(p(6).^2./4+(w-p(7)).^2);
  844. pool(3,:) = p(8).*p(9).^2./4./(p(9).^2./4.+(w-p(10)).^2);
  845. pool(4,:) = p(11).*p(12).^2./4./(p(12).^2./4.+(w-p(13)).^2);
  846. pool(5,:) = p(14).*p(15).^2./4./(p(15).^2/4.+(w-p(16)).^2);
  847. amp = p(1);
  848. % Plot normalized pool contributions and full fit
  849. plot(w,(amp - pool(2,:))./I(1),'Linewidth',1.5,'DisplayName','Fitted amide','Color',col(1,:))
  850. plot(w,(amp - pool(3,:))./I(1),'Linewidth',1.5,'DisplayName','Fitted rNOE','Color',col(2,:))
  851. plot(w,(amp - pool(4,:))./I(1),'Linewidth',1.5,'DisplayName','Fitted MT','Color',col(3,:))
  852. plot(w,(amp - pool(5,:))./I(1),'Linewidth',1.5,'DisplayName','Fitted amine','Color',col(5,:))
  853. plot(w,(amp - pool(1,:))./I(1),'Linewidth',1.5,'DisplayName','Fitted DS','Color',col(4,:))
  854. plot(P.SEQ.w,lorentzfit5pool(p, w, [])./I(1),'k','Linewidth',1.5,'DisplayName','Fitted Z');
  855. xlim([-6 6])
  856. ylim([0, 1]);
  857. xlabel('frequency offset (ppm)');
  858. ylabel('Amplitude (a.u.)')
  859. legend();
  860. end
  861. end % end of per-subject loop
  862. %% Save Intermediate Results
  863. % -------------------------------------------------------------------------
  864. % Save the workspace to disk after the main subject loop. This checkpoint
  865. % allows the exclusion and export steps below to be run independently.
  866. % -------------------------------------------------------------------------
  867. if save_stuff
  868. close all;
  869. save([out_folder '7T_results'])
  870. end
  871. % To reload from checkpoint: load([out_folder '7T_results'])
  872. %% Subject Exclusion
  873. % -------------------------------------------------------------------------
  874. % Subjects are excluded from group analysis based on four criteria:
  875. % 1) Manual exclusion due to poor segmentation quality or acquisition
  876. % issues (exc_sub). Subject 3 was excluded due to a non-standard
  877. % image orientation.
  878. % 2) Excessive tumor volume relative to brain volume (> 25%)
  879. % 3) Excessive B0 inhomogeneity: > 20% of voxels outside ±0.4 ppm
  880. % 4) Excessive B1 inhomogeneity: > 20% of voxels outside [0.5, 1.5]
  881. %
  882. % All metrics for excluded subjects are set to NaN.
  883. % Further details on each exclusion are provided in the paper and in the
  884. % shared patient table.
  885. % -------------------------------------------------------------------------
  886. exc_sub = [3 14 33]; % Subject 3: non-standard orientation
  887. tumor_exc = find(tumor_per > 25);
  888. B0_exc = find(B0_per > 20);
  889. B1_exc = find(B1_per > 20);
  890. exclude = unique([exc_sub B0_exc B1_exc tumor_exc]);
  891. for ii = exclude
  892. patient_table.age(ii) = nan;
  893. amide_wm(ii) = nan;
  894. amine_wm(ii) = nan;
  895. noe_wm(ii) = nan;
  896. MT_wm(ii) = nan;
  897. amide_gm(ii) = nan;
  898. amine_gm(ii) = nan;
  899. noe_gm(ii) = nan;
  900. MT_gm(ii) = nan;
  901. amide_tumor(ii) = nan;
  902. amine_tumor(ii) = nan;
  903. noe_tumor(ii) = nan;
  904. MT_tumor(ii) = nan;
  905. amide_hip(ii) = nan;
  906. amine_hip(ii) = nan;
  907. noe_hip(ii) = nan;
  908. MT_hip(ii) = nan;
  909. amide_deep_gm(ii) = nan;
  910. amine_deep_gm(ii) = nan;
  911. noe_deep_gm(ii) = nan;
  912. MT_deep_gm(ii) = nan;
  913. amide_global(ii) = nan;
  914. amine_global(ii) = nan;
  915. noe_global(ii) = nan;
  916. MT_global(ii) = nan;
  917. end
  918. %% Export Summary Tables
  919. % -------------------------------------------------------------------------
  920. % Assemble and optionally save two output tables:
  921. % 1) table_7T (full): Full tissue-level CEST metrics per subject.
  922. % 2) table_7T (tumor): Slice-level tumor vs. contralateral healthy ROI.
  923. % -------------------------------------------------------------------------
  924. % Table 1: Full ROI summary (all tissue types and CEST pools)
  925. tumor_type = cell2mat(patient_table.WHO_grade)';
  926. varNames = ["age","sex","tumor_type","amide_wm","amine_wm","noe_wm","MT_wm","amide_gm","amine_gm","noe_gm","MT_gm","amide_tumor","amine_tumor","noe_tumor","MT_tumor","amide_deep_gm","amine_deep_gm","noe_deep_gm","MT_deep_gm"];
  927. table_7T = table(patient_table.age,patient_table.sex,tumor_type',amide_wm',amine_wm',noe_wm',MT_wm',amide_gm',amine_gm',noe_gm',MT_gm',amide_tumor',amine_tumor',noe_tumor',MT_tumor',amide_deep_gm',amine_deep_gm',noe_deep_gm',MT_deep_gm','VariableNames',varNames);
  928. if save_stuff
  929. writetable(table_7T,[out_folder,'table_7T'])
  930. end
  931. % Table 2: Tumor slice — tumor ROI vs. contralateral healthy ROI
  932. varNames = ["age","amide_tum","amide_healthy","amine_tum","amine_healthy","noe_tum","noe_healthy","MT_tum","MT_healthy"];
  933. table_7T = table(patient_table.age,amide_tum_sli',amide_healthyROI',amine_tum_sli',amine_healthyROI',noe_tum_sli',noe_healthyROI',MT_tum_sli',MT_healthyROI','VariableNames',varNames);
  934. if save_stuff
  935. writetable(table_7T,[out_folder,'table_tumor_7T'])
  936. end
  937. %% Local Functions
  938. % =========================================================================
  939. function updateSpectrum(src, event, data, slice, spectrum_plot)
  940. % updateSpectrum Update the Z-spectrum display based on the cursor position.
  941. %
  942. % Intended for use as a WindowButtonMotionFcn callback. Updates the
  943. % spectrum_plot line object with the Z-spectrum at the voxel under
  944. % the cursor.
  945. %
  946. % Inputs:
  947. % src - Figure handle (unused, required by callback API)
  948. % event - Event data (unused, required by callback API)
  949. % data - 4D CEST data array [x, y, z, offsets]
  950. % slice - Current axial slice index
  951. % spectrum_plot - Handle to the line object to update
  952. current_point = get(gca, 'CurrentPoint');
  953. x = round(current_point(1, 1));
  954. y = round(current_point(1, 2));
  955. if x >= 1 && x <= size(data, 1) && y >= 1 && y <= size(data, 2)
  956. spectrum = squeeze(data(x, y, slice, :));
  957. set(spectrum_plot, 'YData', spectrum);
  958. title(spectrum_plot.Parent,['Spectrum at (' num2str(x) ', ' num2str(y) ', ' num2str(slice) ')']);
  959. end
  960. end

Plot_Result_7T.m at commit 8997a6f, under MIT · at the source

Overview

Authors: Milena Capiglioni1,2,3, Moritz Simon Fabian4, Stefanie Marti5, Richard McKinley1, Robert Hoepner5, Alejandro León Betancourt5, Johannes Slotboom1,2, Roland Wiest1,2, Moritz Zaiss4,6, Angelika Mennecke4, Piotr Radojewski1,2
  1. Institute for Diagnostic and Interventional Neuroradiology, Support Center for Advanced Neuroimaging, University of Bern, 3010 Bern, Switzerland
  2. Translational Imaging Center (TIC), Sitem-insel, 3010 Bern, Switzerland
  3. Department High-Field Magnetic Resonance, Max Planck Institute for Biological Cybernetics, 72076 Tübingen, Germany
  4. Institute of Neuroradiology, University Hospital Erlangen, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU), 91054 Erlangen, Germany
  5. Department of Neurology, Inselspital, Bern University Hospital and University of Bern, 3010 Bern, Switzerland
  6. Department of Artificial Intelligence in Biomedical Engineering, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU), 91052 Erlangen, Germany
Journal: Brain communications, volume 8, issue 4, article fcag248
Dates: received 25 July 2025; accepted 29 April 2026; published online 30 June 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1093/braincomms/fcag248 · PMID 42428750 · PMCID PMC13348846 · OpenAlex W7166552870
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: human (organism), other condition (population), clinical / translational (subfield)
Methods: Statistics, Preprocessing
Keywords: CEST, ageing biomarker, ultra-high field, glioma, tumour subtyping
Topic: Lanthanide and Transition Metal Complexes (Materials Chemistry, Materials Science), according to OpenAlex
Funding: Swiss National Science Foundation (SNSF-182569, 182569); Swiss Multiple Sclerosis Society (2023-22)
Citations: cited by 1 paper (Europe PMC); 58 references in the paper

Abstract

Chemical exchange saturation transfer (CEST) MRI provides insight into tissue metabolism by detecting low-concentration endogenous molecules. While studies at 7 Tesla (7T) have shown enhanced sensitivity and spectral separation, 3 Tesla (3T) remains the clinical standard, and the relative performance of these field strengths in a direct clinical head-to-head comparison remains unclear. This prospective cohort study provides a direct within-subject comparison of multi-pool CEST imaging at 3T and 7T, using age-related tissue changes and glioma molecular subtypes as representative applications of physiological and pathological CEST sensitivity. Forty-three patients (ages 18–76; 18 female) underwent 3T and 7T CEST MRI prior to surgery due to suspected brain tumour; following quality control, 36 datasets were included at 3T and 32 at 7T. CEST amplitudes from amide, amine, aliphatic relayed nuclear Overhauser effect (rNOE) and magnetization transfer pools were quantified in white matter, grey matter, deep grey matter and tumour tissue. A physics-informed conditional autoencoder (PICAE) was applied at 7T to correct B1 inhomogeneity. Age effects were tested using linear regression; tumour subtype differences were tested using the Wilcoxon rank-sum test. The significance level was set to α = 0.05, and the Holm–Bonferroni procedure was applied to correct for multiple testing. At 7T, amide and rNOE showed robust negative correlations with age in grey matter and deep grey matter, supporting the potential of CEST as an ageing biomarker. Age dependence at 3T was weaker, limited to rNOE (grey matter and deep grey matter) and magnetization transfer (white matter and deep grey matter). In contrast, tumour CEST metrics showed no significant age dependence at either field strength. Trends in relative amide contrast were consistent with prior findings but did not reach statistical significance. Sensitivity to tumour molecular subtype was similar across field strengths. Variability analyses showed that conventional 7T processing introduced higher technical variability than 3T, whereas PICAE substantially reduced variability and improved data quality at 7T. In conclusion, 7T CEST MRI demonstrates higher potential as a non-invasive marker of brain ageing, whereas our simplified pipeline did not yield additional information for tumour subtyping at either field strength. These findings underscore both the enhanced sensitivity and the higher technical demands of 7T, and highlight the importance of advanced correction strategies such as PICAE for robust use of single-transmit 7T CEST.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

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

milecap/GliomaCEST-3T7T

License: MIT
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 8997a6f8110f8441b2024c3cfddf6c37a83b83f1, 20 April 2026
Languages: MATLAB (24)
Size: 32 files, 24 scripts
Software Heritage: not archived
Found in: “Data availability”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
26 files

The paper's code and data availability statement is in the Data section.

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;
  • 24 scripts, each with its path and the digest of its content;
  • 21 matches 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

All raw and processed chemical exchange saturation transfer brain imaging data from this study will be openly available upon publication via the University of Bern data repository: https://doi.org/10.48620/96500. The corresponding processing and analysis code is available at: https://github.com/milecap/GliomaCEST-3T7T.git

Reproduced under the paper's license (CC BY), from the paper cited above.

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, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 11 authors, 5 keywords, 2 funders, 56 references.

Cite

This paper

Capiglioni, M., Fabian, M. S., Marti, S., McKinley, R., Hoepner, R., Betancourt, A. L., Slotboom, J., Wiest, R., Zaiss, M., Mennecke, A., & Radojewski, P. (2026). Field strength-dependent sensitivity of chemical exchange saturation transfer: a methodological comparison of 3 Tesla and 7 Tesla in a clinical cohort. Brain communications, 8(4), fcag248. https://doi.org/10.1093/braincomms/fcag248

BibTeX

@article{capiglioni2026field,
author = {Capiglioni, Milena and Fabian, Moritz Simon and Marti, Stefanie and McKinley, Richard and Hoepner, Robert and Betancourt, Alejandro León and Slotboom, Johannes and Wiest, Roland and Zaiss, Moritz and Mennecke, Angelika and Radojewski, Piotr},
title = {{Field strength-dependent sensitivity of chemical exchange saturation transfer: a methodological comparison of 3 Tesla and 7 Tesla in a clinical cohort}},
journal = {Brain communications},
year = {2026},
month = jun,
volume = {8},
number = {4},
pages = {fcag248},
publisher = {Oxford University Press},
issn = {2632-1297},
doi = {10.1093/braincomms/fcag248},
url = {https://doi.org/10.1093/braincomms/fcag248},
pmid = {42428750},
pmcid = {PMC13348846}
}

RIS

TY - JOUR
AU - Capiglioni, Milena
AU - Fabian, Moritz Simon
AU - Marti, Stefanie
AU - McKinley, Richard
AU - Hoepner, Robert
AU - Betancourt, Alejandro León
AU - Slotboom, Johannes
AU - Wiest, Roland
AU - Zaiss, Moritz
AU - Mennecke, Angelika
AU - Radojewski, Piotr
TI - Field strength-dependent sensitivity of chemical exchange saturation transfer: a methodological comparison of 3 Tesla and 7 Tesla in a clinical cohort
T2 - Brain communications
J2 - Brain Commun
PY - 2026
DA - 2026/06/30
VL - 8
IS - 4
SP - fcag248
SN - 2632-1297
PB - Oxford University Press
DO - 10.1093/braincomms/fcag248
UR - https://doi.org/10.1093/braincomms/fcag248
LA - en
ER -

CSL-JSON

{
"id": "10.1093/braincomms/fcag248",
"type": "article-journal",
"title": "Field strength-dependent sensitivity of chemical exchange saturation transfer: a methodological comparison of 3 Tesla and 7 Tesla in a clinical cohort",
"container-title": "Brain communications",
"author": [
{
"family": "Capiglioni",
"given": "Milena"
},
{
"family": "Fabian",
"given": "Moritz Simon"
},
{
"family": "Marti",
"given": "Stefanie"
},
{
"family": "McKinley",
"given": "Richard"
},
{
"family": "Hoepner",
"given": "Robert"
},
{
"family": "Betancourt",
"given": "Alejandro León"
},
{
"family": "Slotboom",
"given": "Johannes"
},
{
"family": "Wiest",
"given": "Roland"
},
{
"family": "Zaiss",
"given": "Moritz"
},
{
"family": "Mennecke",
"given": "Angelika"
},
{
"family": "Radojewski",
"given": "Piotr"
}
],
"container-title-short": "Brain Commun",
"volume": "8",
"issue": "4",
"page": "fcag248",
"DOI": "10.1093/braincomms/fcag248",
"PMID": "42428750",
"PMCID": "PMC13348846",
"ISSN": "2632-1297",
"publisher": "Oxford University Press",
"URL": "https://doi.org/10.1093/braincomms/fcag248",
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
30
]
]
}
}

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.1002/hbm.70624 [code]
Exploring the Sensitivity Limits of Neuronal Current Imaging With MRI and MEG in the Human Brain.
Journal: Human brain mapping
In common: Tools for NIfTI and ANALYZE image (MATLAB), Image Processing Toolbox, Statistics and Machine Learning Toolbox, author Milena Capiglioni
[2] doi:10.1162/imag.a.1241 [code]
Multispectral 7 Tesla MRI as a potential predictor of dopamine transporter deficiency in Parkinson's disease.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: 2 references, author Moritz Zaiss
[3] doi:10.1002/hbm.70560
Mitigating the Impact of MR Sequence Parameters: Increasing the Robustness of DL-Based Cortical Thickness Estimates.
Journal: Human brain mapping
In common: 1 reference, author Milena Capiglioni
[4] doi:10.7554/elife.107661 [code]
In vivo mapping of striatal neurodegeneration in Huntington's disease with Soma and Neurite Density Imaging.
Journal: eLife
In common: Tools for NIfTI and ANALYZE image (MATLAB), Image Processing Toolbox, Statistics and Machine Learning Toolbox, clinical / translational, other condition
[5] doi:10.1002/hbm.70602 [code]
Neuroimaging Correlates of Post-Stroke Pain After Ischemic Stroke: Secondary Analysis of the INSPiRE-TMS Trial.
Journal: Human brain mapping
In common: Tools for NIfTI and ANALYZE image (MATLAB), Image Processing Toolbox, Statistics and Machine Learning Toolbox, clinical / translational, other condition
[6] doi:10.1038/s41467-026-74099-5 [code]
Right amygdala ablation reduces maladaptive negative interpretation bias and symptoms in a patient with post-traumatic stress disorder.
Journal: Nature communications
In common: Tools for NIfTI and ANALYZE image (MATLAB), Image Processing Toolbox, Statistics and Machine Learning Toolbox, clinical / translational, other condition
[7] doi:10.1080/07853890.2026.2685416 [code]
Pulmonary and cerebral damage in COVID-19 survivors: is there any association?
Journal: Annals of medicine
In common: Tools for NIfTI and ANALYZE image (MATLAB), Image Processing Toolbox, Statistics and Machine Learning Toolbox, clinical / translational, other condition
[8] doi:10.1038/s41586-026-10631-3 [code]
A prognostic human brain network for diffuse midline glioma.
Journal: Nature
In common: Tools for NIfTI and ANALYZE image (MATLAB), Image Processing Toolbox, Statistics and Machine Learning Toolbox, clinical / translational, other condition
[9] doi:10.1016/j.xcrm.2026.102943 [code]
Parent-of-origin effects in Alzheimer's liability dissociate neurocognitive and cardiovascular traits in at-risk individuals.
Journal: Cell reports. Medicine
In common: Tools for NIfTI and ANALYZE image (MATLAB), Image Processing Toolbox, Statistics and Machine Learning Toolbox, clinical / translational
[10] doi:10.1016/j.bbih.2026.101299 [code]
Multimodal approach to identify neuropsychophysiological subgroups in myalgic encephalomyelitis/chronic fatigue syndrome and their relevance for rehabilitation: protocol for a mechanistic cross-sectional and longitudinal study.
Journal: Brain, behavior, & immunity - health
In common: Tools for NIfTI and ANALYZE image (MATLAB), Image Processing Toolbox, Statistics and Machine Learning Toolbox, clinical / translational

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.

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: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

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