Field strength-dependent sensitivity of chemical exchange saturation transfer: a methodological comparison of 3 Tesla and 7 Tesla in a clinical cohort.
The 21 matches
- [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] § 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] § 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] § 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] § Materials and methods ↔ Plot_Result_7T.m, lines 1–35 · score 0.70 · chemical exchange saturation, glioma patients, Lorentzian fitting, MRI, transfer, pipeline
- [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] § 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] § 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] § Materials and methods ↔ Plot_Result_3T.m, lines 1–31 · score 0.61 · chemical exchange saturation, glioma patients, MRI, transfer, Segmentation, deep
- [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] § 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] § 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] § 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] § 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] § 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] § 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] § Results ↔ Plot_Result_7T.m, lines 884–965 · score 0.53 · direct saturation, pool Lorentzian, component, DS, rNOE, spectra
- [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] § Results ↔ Plot_Result_3T.m, lines 372–457 · score 0.52 · B1 field maps, anatomical images, B0, segmentation, amplitudes, patients
- [20] § Materials and methods › Statistical analysis ↔ comparison_tumour_3T_7T.m, lines 471–518 · score 0.52 · Wilcoxon rank sum, tumour
- [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
- % =========================================================================
- % Plot_Result_7T.m
- %
- % Description:
- % This script processes and visualizes 7T CEST (Chemical Exchange
- % Saturation Transfer) MRI data for a cohort of glioma patients.
- % Specifically, it:
- % 1) Loads per-subject CEST acquisition data and anatomical images.
- % 2) Displays tissue segmentation overlays and fitted CEST pool maps.
- % 3) Extracts region-of-interest (ROI) metrics for white matter (WM),
- % grey matter (GM), deep GM, hippocampus, and tumor tissue.
- % 4) Computes the coefficient of variation (CoV) per tissue and pool.
- % 5) Exports summary tables for downstream statistical analysis.
- %
- % Two analysis pipelines are supported, selectable via the 'picae' flag:
- % - Lorentzian fitting (default, picae = 0)
- % - PICAE deep-learning reconstruction (picae = 1)
- %
- % Reference manuscript:
- % "Field Strength-Dependent Sensitivity of Chemical Exchange Saturation
- % Transfer: A Methodological Comparison of 3T and 7T in a Clinical
- % Cohort."
- %
- % Author: Milena Capiglioni, University of Bern, 2025
- %
- % Notes:
- % - Auxiliary functions are expected in a subfolder named 'aux' located
- % in the script directory.
- % - For patient confidentiality, only co-registered low-resolution
- % anatomical images are shared publicly.
- % =========================================================================
- clear global; clc; clear; close all;
- restoredefaultpath;
- %% Setup
- % -------------------------------------------------------------------------
- % Define the script directory and add auxiliary functions to the path.
- % Update 'script_dir' to match your local installation.
- % -------------------------------------------------------------------------
- cd(fileparts(matlab.desktop.editor.getActiveFilename));
- script_dir = fileparts(matlab.desktop.editor.getActiveFilename);
- addpath(genpath(fullfile(script_dir,'aux_scripts')))
- % Toggle to enable/disable saving of figures and output tables.
- % Set to 1 to save, 0 to skip saving.
- save_stuff = 1;
- %% Patient Selection and Path Configuration
- % -------------------------------------------------------------------------
- % Define data paths and identify patient folders.
- % Patient folders are expected to follow the naming convention 'p*'
- % (e.g., 'p01', 'p02', ...).
- % -------------------------------------------------------------------------
- % Root directory containing all 7T patient subdirectories
- data_path = '/path/to/folder/where/data/is/';
- work_dir_aux_7T = [data_path 'cest_eval_7T' filesep];
- cd(work_dir_aux_7T);
- files = dir(work_dir_aux_7T);
- dirFlag = startsWith({files.name},{'p'})&[files.isdir];
- patient_folder = files(dirFlag);
- % Load patient metadata table (contains age, sex, WHO grade, IDH status)
- load([data_path 'patient_table_share.mat'])
- % Segmentation method selector.
- % Options:
- % 'spm' - SPM-based tissue probability maps
- % 'DL' - Deep Learning segmentation with DiReCT co-registration
- % Note: Only co-registered low-resolution anatomical images are shared
- % publicly due to patient confidentiality constraints.
- seg_method = 'DL';
- % Flag to optionally compute and display MTR-Rex contrast maps.
- % Note: MTR-Rex requires the CEST toolbox from the FAU group.
- % Set to 1 to enable.
- MTR_analysis = 0;
- % Analysis pipeline selector.
- % 0 - Lorentzian fitting (standard pipeline)
- % 1 - PICAE deep-learning reconstruction
- % Note: MTR-Rex is not currently supported for PICAE output.
- picae = 0;
- if ~picae
- out_folder = [data_path 'cest_eval_7T/Output_CEST_paper/'];
- else
- out_folder = [data_path 'cest_eval_7T/Output_CEST_picae_paper/'];
- MTR_analysis = 0; % MTR-Rex generation from PICAE maps is not yet implemented
- end
- if save_stuff && ~exist(out_folder,'dir')
- mkdir(out_folder);
- end
- %% Per-Subject Loop: Anatomical and CEST Map Visualization
- % -------------------------------------------------------------------------
- % For each patient, this loop:
- % - Loads CEST spectral fit results (Lorentzian or PICAE) and anatomical
- % images.
- % - Identifies the axial slice with maximum tumor extent.
- % - Generates overlay figures showing segmentation and CEST maps.
- % - Extracts mean CEST pool amplitudes per tissue ROI.
- % -------------------------------------------------------------------------
- RF_table = table();
- for ii = 1:size(patient_folder,1)
- % Build paths to the patient-specific CEST data and segmentation output
- work_dir_CEST = [work_dir_aux_7T patient_folder(ii).name filesep];
- output_folder = [work_dir_CEST 'results' filesep seg_method '_seg' filesep];
- % Verify that the segmentation output folder exists before proceeding
- if ~exist(output_folder,'dir')
- error('Segmentation folder missing, revise your paths!')
- end
- %% Load CEST Reference Image
- % ---------------------------------------------------------------------
- % The reference image is acquired at 720 nT saturation amplitude.
- % Two possible naming conventions are checked to accommodate different
- % acquisition protocols.
- % ---------------------------------------------------------------------
- cest_ref = getPathToFileContainingString([work_dir_CEST 'nii' filesep],'720nT_REG','nii');
- if isempty(cest_ref)
- cest_ref = getPathToFileContainingString([work_dir_CEST 'nii' filesep],'720nT_1Tx_RO_REG','nii');
- end
- %% Load Fitted CEST Parameters (Lorentzian or PICAE)
- % ---------------------------------------------------------------------
- % For the Lorentzian pipeline, the B1-corrected fitted Z-spectrum file
- % ('Zfitted*B1_*') is located in the Zeval_001 subdirectory, excluding
- % any backup files. For PICAE, the output nifti file is located in the
- % Zeval_niftis_picae directory.
- % ---------------------------------------------------------------------
- if ~picae
- Zeval_dir = [work_dir_CEST 'Zeval' filesep 'Zeval_001' filesep];
- filename = dir(Zeval_dir);
- myindices = ~cellfun(@isempty,regexp({filename.name},'Zfitted\w*B1_','match')) & ~contains({filename.name}, "bkup");
- else
- Zeval_dir = [work_dir_CEST 'Zeval_niftis_picae' filesep];
- filename = dir(Zeval_dir);
- myindices = ~cellfun(@isempty,regexp({filename.name},'out_PICAE','match'));
- end
- Zfit_file = filename(myindices);
- % Attempt to load the fitted parameters and the reference CEST image.
- % If either file is missing, record NaN for all metrics and skip this
- % subject.
- try
- load([Zeval_dir Zfit_file.name]) % Loading may take a while for large files
- cest_im = load_nii(cest_ref);
- cest_im = cest_im.img;
- catch
- % Mark all ROI metrics as missing for this subject
- age(ii) = nan;
- amide_wm(ii) = nan;
- amine_wm(ii) = nan;
- noe_wm(ii) = nan;
- MT_wm(ii) = nan;
- amide_gm(ii) = nan;
- amine_gm(ii) = nan;
- noe_gm(ii) = nan;
- MT_gm(ii) = nan;
- amide_tumor(ii) = nan;
- amine_tumor(ii) = nan;
- noe_tumor(ii) = nan;
- MT_tumor(ii) = nan;
- amide_hip(ii) = nan;
- amine_hip(ii) = nan;
- noe_hip(ii) = nan;
- MT_hip(ii) = nan;
- amide_deep_gm(ii) = nan;
- amine_deep_gm(ii) = nan;
- noe_deep_gm(ii) = nan;
- MT_deep_gm(ii) = nan;
- amide_global(ii) = nan;
- amine_global(ii) = nan;
- noe_global(ii) = nan;
- MT_global(ii) = nan;
- continue;
- end
- %% Identify Pool Indices and Load Field Maps
- % ---------------------------------------------------------------------
- % For Lorentzian fitting: pool indices are read from P.FIT.PoolNames.
- % Note: The ordering of NOE and MT in P.FIT.PoolNames was verified
- % against FAU_7T_1Tx_CEST_Evaluation_IMPI04_MC.m. The commented-out
- % layout below shows the expected structure for reference.
- %
- % For PICAE: pool indices are fixed by convention from the PICAE Python
- % output format (verified against the PICAE source code).
- %
- % In both cases, the five Lorentzian pool parameters are:
- % Index 1: Zi (baseline offset)
- % Indices 2-4: Water (Amplitude, width, center position)
- % Indices 5-7: Amide/APT (Amplitude, width, center position)
- % Indices 8-10: MT (Amplitude, width, center position)
- % Indices 11-13: NOE (Amplitude, width, center position)
- % Indices 14-16: Amine (Amplitude, width, center position)
- % ---------------------------------------------------------------------
- if ~picae
- % Commented reference layout for P.FIT (retained for documentation):
- % P.FIT.PoolNames = {'MISC','Water','Water','Water','Amide','Amide','Amide','MT','MT','MT','NOE','NOE','NOE','Amine','Amine','Amine'};
- % P.FIT.ParaNames = {'Offset','A','width','w_c','A','width','w_c','A','width','w_c','A','width','w_c','A','width','w_c'};
- Amide_pos = find(strcmp(P.FIT.PoolNames, 'Amide')==1); Amide_pos = Amide_pos(1);
- Amine_pos = find(strcmp(P.FIT.PoolNames, 'Amine')==1); Amine_pos = Amine_pos(1);
- NOE_pos = find(strcmp(P.FIT.PoolNames, 'NOE')==1); NOE_pos = NOE_pos(1);
- MT_pos = find(strcmp(P.FIT.PoolNames, 'MT')==1); MT_pos = MT_pos(1);
- % Load B0 and B1 field maps from the WASABI-derived file
- myindices = ~cellfun(@isempty,regexp({filename.name},'B1_relative','match'));
- B1B0_file = filename(myindices);
- B0B1 = load([Zeval_dir B1B0_file.name]);
- B0_map = B0B1.dB0_stack_int;
- B1_map = B0B1.B1map;
- else
- % PICAE pool index convention (from PICAE Python source):
- % 1 = Amide, 2 = NOE, 3 = MT, 4 = Amine
- popt = ampls_p72_4d; % Use uncorrected maps: Zeval_PICAE.ampls_uncorr_4d
- Amide_pos = 1;
- Amine_pos = 4;
- NOE_pos = 2;
- MT_pos = 3;
- % Load B0 and B1 maps from the Lorentzian Zeval directory.
- % The brain mask from the Lorentzian fit is used to NaN out
- % non-brain voxels in the PICAE output.
- Zeval_dir = [work_dir_CEST 'Zeval' filesep 'Zeval_001' filesep];
- filename = dir(Zeval_dir);
- myindices = ~cellfun(@isempty,regexp({filename.name},'B1_relative','match'));
- B1B0_file = filename(myindices);
- B0B1 = load([Zeval_dir B1B0_file.name]);
- B0_map_Zeval = B0B1.dB0_stack_int;
- B0_map = pos_4d(:,:,:,end);
- B0_map(isnan(B0_map_Zeval)) = nan;
- B1_map = b1_4d;
- uncertainty_picae = uncert_4d; % Full-fit uncertainty from PICAE
- end
- %% Load FLAIR Image
- % ---------------------------------------------------------------------
- % Load the co-registered FLAIR image for anatomical reference.
- % If absent, fall back to the MPRAGE T1-weighted image.
- % ---------------------------------------------------------------------
- anat = 'flair';
- flair_cor_path = getPathToFileContainingString(output_folder,'rflair','.nii');
- if ~exist(flair_cor_path,'file')
- disp('Corregistered flair missing, check your paths')
- flair_im = zeros(size(popt(:,:,:,1)));
- anat = 'mprage';
- else
- flair_im = load_untouch_nii(flair_cor_path);
- flair_im = flair_im.img;
- end
- %% Load T1-Weighted Image and Tissue Segmentation Masks
- % ---------------------------------------------------------------------
- % Depending on the chosen segmentation method, load the appropriate
- % co-registered T1-weighted image and tissue class masks.
- % ---------------------------------------------------------------------
- if strcmp(seg_method,'spm')
- % Locate the T1 folder within the output directory.
- % Two common naming conventions are checked; if neither matches,
- % the user is prompted to select the folder manually.
- foldernames = dir(output_folder);
- dirFlag = strcmp({foldernames.name},'t1_mprage_sag_p2_0.6mm_ns')&[foldernames.isdir];
- if ~any(dirFlag)
- dirFlag = strcmp({foldernames.name},'t1_cs_mp2rage_sag_0.6mm')&[foldernames.isdir];
- if ~any(dirFlag)
- aux_path = uigetdir(work_dir_anat,'Select T1 folder');
- aux = strsplit(aux_path,filesep);
- dirFlag = strcmp({foldernames.name},aux{end-1})&[foldernames.isdir];
- end
- end
- % Build paths to the co-registered T1 image and SPM tissue segments
- T1_cor_path = getPathToFileContainingString(output_folder,['r' foldernames(dirFlag).name] ,'.nii');
- if ~exist(T1_cor_path,'file') && ~exist(T1_seg_cor_path{1},'file')
- T1_cor_path = getPathToFileContainingString(output_folder,'t1_cs_mp2rage_sag_0.6mm','.nii');
- end
- for s = 1:3
- T1_seg_cor_path{s} = getPathToFileContainingString(output_folder,['rc' num2str(s) foldernames(dirFlag).name],'.nii');
- end
- else
- % For DL segmentation: check whether co-registered files exist
- T1_cor_path = getPathToFileContainingString(output_folder,'rT1w_norm.nii');
- T1_seg_cor_path{1} = getPathToFileContainingString(output_folder,'rT1w_norm_seg.nii');
- if ~exist(T1_cor_path,'file') && ~exist(T1_seg_cor_path{1},'file')
- disp('Corregistered T1-w missing, check your paths')
- end
- end
- T1_im = load_untouch_nii(T1_cor_path);
- T1_im = T1_im.img;
- % Verify that tumor segmentation files are present
- tumor_seg{1} = [output_folder 'rtumor_SCAN2020_class.nii'];
- tumor_seg{2} = [output_folder 'rtumor_SCAN2020_unc_whole.nii'];
- if ~exist(tumor_seg{1},'file') || ~exist(tumor_seg{2},'file')
- disp('Tumor masks missing, check your paths')
- end
- %% Construct Tissue Masks from Segmentation
- % ---------------------------------------------------------------------
- % Build binary masks for each tissue class. For SPM, probabilistic
- % maps are loaded directly. For DL segmentation, masks are derived
- % from a labeled atlas image using standard FreeSurfer label indices.
- % ---------------------------------------------------------------------
- if strcmp(seg_method,'spm')
- gm_mask = load_nii(T1_seg_cor_path{1});
- gm_mask = gm_mask.img;
- wm_mask = load_nii(T1_seg_cor_path{2});
- wm_mask = wm_mask.img;
- csf_mask = load_nii(T1_seg_cor_path{3});
- csf_mask = csf_mask.img;
- deep_gm_mask = uint8(zeros(size(csf_mask)));
- else
- seg_mask = load_nii(T1_seg_cor_path{1});
- % White matter: labels 2 (left WM) and 41 (right WM)
- wm_mask = (seg_mask.img == 2) + (seg_mask.img == 41);
- % Cortical grey matter: labels 1001-1035 (left) and 2001-2035 (right)
- gm_mask = zeros(size(seg_mask.img));
- for i = 1:35
- gm_mask = gm_mask + (seg_mask.img == 1000+i) + (seg_mask.img == 2000+i) ;
- end
- % Hippocampus: labels 17 (left) and 53 (right)
- hip_mask = (seg_mask.img == 17) + (seg_mask.img == 53);
- % Deep grey matter structures (includes hippocampus).
- % Label list covers subcortical nuclei as defined by FreeSurfer.
- list_gm = [10:13 16:28 49:60];
- deep_gm_mask = double(ismember(seg_mask.img, list_gm));
- end
- % Combined brain mask (used for tumor volume normalization)
- brain_mask = wm_mask + gm_mask + deep_gm_mask;
- %% Construct and Refine the Tumor Mask
- % ---------------------------------------------------------------------
- % The primary tumor mask is derived from the SCAN2020 segmentation.
- % An uncertainty map is thresholded and added to expand the exclusion
- % zone, ensuring that uncertain tumor voxels are also removed from
- % healthy tissue masks.
- %
- % The hippocampus is explicitly excluded from the tumor mask, as the
- % segmentation algorithm can misclassify it as tumor tissue due to
- % T2 hyperintensities (validated visually in collaboration with a
- % radiologist).
- %
- % Note: This conservative expansion may exclude some healthy brain
- % tissue near the tumor boundary, particularly the hippocampus.
- % ---------------------------------------------------------------------
- tumor_mask = load_nii(tumor_seg{1});
- tumor_mask = tumor_mask.img;
- tumor_mask_certain = tumor_mask;
- tumor_mask(tumor_mask ~= 0) = 1;
- % Expand the tumor mask using the uncertainty map.
- % Voxels with uncertainty above the threshold are treated as tumor.
- threhsold = 10;
- tumor_unc = load_nii(tumor_seg{2});
- tumor_unc = tumor_unc.img;
- tumor_unc(tumor_unc <= threhsold) = 0;
- tumor_unc(tumor_unc > threhsold) = 1;
- tumor_mask = tumor_mask + tumor_unc;
- % Remove hippocampal voxels from the tumor mask to prevent
- % misclassification
- tumor_mask(hip_mask == 1) = 0;
- tumor_mask = double(tumor_mask);
- % Compute tumor volume as a percentage of total brain volume
- % (WM + cortical GM + deep GM) for quality control
- global_size = nnz(wm_mask + gm_mask + deep_gm_mask);
- tumor_size = nnz(tumor_mask);
- tumor_per(ii) = tumor_size*100/global_size;
- %% Identify the Axial Slice with Maximum Tumor Extent
- % ---------------------------------------------------------------------
- % The tumor slice is the axial slice containing the greatest number
- % of non-zero tumor voxels. Edge slices (1, 2, 17, 18) are remapped
- % to the nearest valid interior slice to avoid boundary artefacts.
- % ---------------------------------------------------------------------
- max_nnz = 0;
- for s = 1:size(tumor_mask,3)
- nnz_values = nnz(tumor_mask(:,:,s));
- if nnz_values > max_nnz
- max_nnz = nnz_values;
- tumor_slice = s;
- end
- end
- % Remap boundary slices to avoid display artefacts
- if tumor_slice == 18 || tumor_slice == 17
- tumor_slice = 16;
- elseif tumor_slice == 1 || tumor_slice == 2
- tumor_slice = 3;
- end
- % Exclude tumor voxels from all healthy tissue masks to prevent
- % contamination of healthy-tissue ROI statistics
- gm_mask(tumor_mask ~= 0) = 0;
- wm_mask(tumor_mask ~= 0) = 0;
- csf_mask(tumor_mask ~= 0) = 0;
- deep_gm_mask(tumor_mask ~= 0) = 0;
- %% Figure 3: Anatomical and CEST Map Overview
- % ---------------------------------------------------------------------
- % Generates an 8-panel overview figure for each subject showing:
- % Panel 1: FLAIR (or MPRAGE if FLAIR is unavailable) at tumor slice
- % Panel 2: CEST reference image with tissue segmentation overlays
- % (GM = green, WM = blue, deep GM = yellow, tumor = red)
- % Panel 3: B0 field map with histogram inset
- % Panel 4: B1 field map with histogram inset
- % Panels 5-8: CEST pool amplitude maps (amide, rNOE, MT, amine)
- % ---------------------------------------------------------------------
- ff = figure(3);
- t = tiledlayout(2,4,'TileSpacing','compact','Padding','compact');
- txt = [ patient_folder(ii).name ' - age ' num2str(patient_table.age(ii)) ' - slice ' num2str(tumor_slice) ' - tumor ' num2str(tumor_per(ii),'%0.2f') ' %'];
- if picae
- txt = [txt ' - picae'];
- end
- sgtitle(txt,'interpreter','none');
- % Panel 1: Anatomical reference image (FLAIR preferred, MPRAGE fallback)
- ax = nexttile(t);
- if strcmp(anat,'flair')
- imshow(imrotate(flair_im(:,:,tumor_slice),90),[]);
- title('FLAIR tumor slice')
- else
- imshow(imrotate(T1_im(:,:,tumor_slice),90),[]);
- title('MPRAGE tumor slice')
- end
- % Panel 2: CEST reference image with color-coded tissue segmentation
- ax2 = nexttile(t);
- imshow(imrotate(cest_im(:,:,tumor_slice),90),[]);
- % Overlay: cortical GM (green, semi-transparent)
- gm_mask_t = imrotate(gm_mask(:,:,tumor_slice),90);
- green = cat(3, zeros(size(gm_mask_t)), ones(size(gm_mask_t)), zeros(size(gm_mask_t)));
- hold on;
- auxim = imshow(green,'Parent',ax2);
- hold off;
- set(auxim,'AlphaData', 0.2.*double(gm_mask_t./max(gm_mask_t,[],'all')))
- % Overlay: white matter (blue, semi-transparent)
- wm_mask_t = imrotate(wm_mask(:,:,tumor_slice),90);
- blue = cat(3, zeros(size(wm_mask_t)), zeros(size(wm_mask_t)), ones(size(wm_mask_t)));
- hold on;
- auxim2 = imshow(blue,'Parent',ax2);
- hold off;
- set(auxim2,'AlphaData', 0.2.*double(wm_mask_t./max(wm_mask_t,[],'all')))
- % Overlay: deep GM structures (yellow, semi-transparent)
- dgm_mask_t = imrotate(deep_gm_mask(:,:,tumor_slice),90);
- yellow = cat(3, ones(size(dgm_mask_t)), ones(size(dgm_mask_t)), zeros(size(dgm_mask_t)));
- hold on;
- auxim3 = imshow(yellow,'Parent',ax2);
- hold off;
- set(auxim3,'AlphaData', 0.2.*double(dgm_mask_t./max(dgm_mask_t,[],'all')))
- % Overlay: tumor region (red, semi-transparent)
- tumor_mask_t = imrotate(tumor_mask(:,:,tumor_slice),90);
- red = cat(3, ones(size(tumor_mask_t)), zeros(size(tumor_mask_t)), zeros(size(tumor_mask_t)));
- hold on;
- auxim4 = imshow(red,'Parent',ax2);
- hold off;
- set(auxim4,'AlphaData', 0.2.*double(tumor_mask_t./max(tumor_mask_t,[],'all')))
- title('Segmented CEST')
- % Panel 3: B0 field map (ppm), with quality control percentage
- ax3 = nexttile(t);
- try
- imshow(imrotate(B0_map(:,:,tumor_slice),90),[]);
- caxis([-0.4 0.4])
- colorbar();
- title('B0 Map (ppm)')
- % Fraction of voxels exceeding the B0 acceptability threshold (±0.4 ppm)
- b0_total = nnz(~isnan(B0_map));
- B0_per(ii) = (sum(B0_map > 0.4 | B0_map < -0.4,'all')/b0_total)*100;
- catch
- title('No B0 in B1_relative.mat')
- end
- % Panel 4: B1 field map (relative units), with quality control percentage
- ax4 = nexttile(t);
- try
- B1_map(isnan(B0_map)) = nan;
- imshow(imrotate(B1_map(:,:,tumor_slice),90),[]);
- caxis([0.4 1.6])
- colorbar();
- title('B1 map (rel)')
- % Fraction of voxels outside the B1 acceptability range [0.5, 1.5]
- b1_total = nnz(~isnan(B1_map));
- B1_per(ii) = (sum(B1_map < 0.5 | B1_map > 1.5,'all')/b1_total)*100;
- catch
- title('No B1 in B1_relative.mat')
- end
- %% Extract CEST Pool Amplitude Maps
- % ---------------------------------------------------------------------
- % Squeeze the fitted parameter array (popt) into 3D maps for each pool.
- % For PICAE outputs, non-brain voxels are explicitly set to NaN using
- % the brain mask derived from the Lorentzian Zeval output.
- % ---------------------------------------------------------------------
- amide_map = squeeze(popt(:,:,:,Amide_pos));
- amine_map = squeeze(popt(:,:,:,Amine_pos));
- NOE_map = squeeze(popt(:,:,:,NOE_pos));
- MT_map = squeeze(popt(:,:,:,MT_pos));
- if picae
- amide_map(isnan(B0_map_Zeval)) = nan;
- amine_map(isnan(B0_map_Zeval)) = nan;
- NOE_map(isnan(B0_map_Zeval)) = nan;
- MT_map(isnan(B0_map_Zeval)) = nan;
- end
- %% Compute Mean CEST Amplitudes per Tissue ROI
- % ---------------------------------------------------------------------
- % For each CEST pool (amide/APT, amine, rNOE, MT), compute the mean
- % amplitude within each tissue mask across the full 3D volume.
- % ---------------------------------------------------------------------
- % White matter
- amide_wm(ii) = mean(amide_map(logical(wm_mask)),'all','omitnan');
- amine_wm(ii) = mean(amine_map(logical(wm_mask)),'all','omitnan');
- noe_wm(ii) = mean(NOE_map(logical(wm_mask)),'all','omitnan');
- MT_wm(ii) = mean(MT_map(logical(wm_mask)),'all','omitnan');
- % Cortical grey matter
- amide_gm(ii) = mean(amide_map(logical(gm_mask)),'all','omitnan');
- amine_gm(ii) = mean(amine_map(logical(gm_mask)),'all','omitnan');
- noe_gm(ii) = mean(NOE_map(logical(gm_mask)),'all','omitnan');
- MT_gm(ii) = mean(MT_map(logical(gm_mask)),'all','omitnan');
- % Tumor region
- amide_tumor(ii) = mean(amide_map(logical(tumor_mask)),'all','omitnan');
- amine_tumor(ii) = mean(amine_map(logical(tumor_mask)),'all','omitnan');
- noe_tumor(ii) = mean(NOE_map(logical(tumor_mask)),'all','omitnan');
- MT_tumor(ii) = mean(MT_map(logical(tumor_mask)),'all','omitnan');
- % Store full voxel-level distributions within the tumor for later analysis
- pat{ii}.amide_tumor = amide_map(logical(tumor_mask));
- pat{ii}.amine_tumor = amine_map(logical(tumor_mask));
- pat{ii}.noe_tumor = NOE_map(logical(tumor_mask));
- pat{ii}.MT_tumor = MT_map(logical(tumor_mask));
- % Hippocampus
- amide_hip(ii) = mean(amide_map(logical(hip_mask)),'all','omitnan');
- amine_hip(ii) = mean(amide_map(logical(hip_mask)),'all','omitnan');
- noe_hip(ii) = mean(NOE_map(logical(hip_mask)),'all','omitnan');
- MT_hip(ii) = mean(MT_map(logical(hip_mask)),'all','omitnan');
- % Deep grey matter structures
- amide_deep_gm(ii) = mean(amide_map(logical(deep_gm_mask)),'all','omitnan');
- amine_deep_gm(ii) = mean(amine_map(logical(deep_gm_mask)),'all','omitnan');
- noe_deep_gm(ii) = mean(NOE_map(logical(deep_gm_mask)),'all','omitnan');
- MT_deep_gm(ii) = mean(MT_map(logical(deep_gm_mask)),'all','omitnan');
- % Record number of non-zero deep GM voxels for quality control
- ndgm(ii) = nnz(deep_gm_mask);
- %% Compute Subject-Level Coefficient of Variation (CoV)
- % ---------------------------------------------------------------------
- % CoV is computed as 100 * (std / mean) within each tissue mask for
- % each CEST pool. This quantifies intra-tissue spatial variability
- % of the CEST signal on a per-subject basis.
- % ---------------------------------------------------------------------
- % White matter CoV
- cov_ind.amide_wm(ii) = 100*mean(std(amide_map(logical(wm_mask)),[],'all','omitnan')/mean(amide_map(logical(wm_mask)),'all','omitnan'));
- cov_ind.amine_wm(ii) = 100*std(amine_map(logical(wm_mask)),[],'all','omitnan')/mean(amine_map(logical(wm_mask)),'all','omitnan');
- cov_ind.noe_wm(ii) = 100*std(NOE_map(logical(wm_mask)),[],'all','omitnan')/mean(NOE_map(logical(wm_mask)),'all','omitnan');
- cov_ind.MT_wm(ii) = 100*std(MT_map(logical(wm_mask)),[],'all','omitnan')/mean(MT_map(logical(wm_mask)),'all','omitnan');
- % Cortical grey matter CoV
- cov_ind.amide_gm(ii) = 100*std(amide_map(logical(gm_mask)),[],'all','omitnan')/mean(amide_map(logical(gm_mask)),'all','omitnan');
- cov_ind.amine_gm(ii) = 100*std(amine_map(logical(gm_mask)),[],'all','omitnan')/mean(amine_map(logical(gm_mask)),'all','omitnan');
- cov_ind.noe_gm(ii) = 100*std(NOE_map(logical(gm_mask)),[],'all','omitnan')/mean(NOE_map(logical(gm_mask)),'all','omitnan');
- cov_ind.MT_gm(ii) = 100*std(MT_map(logical(gm_mask)),[],'all','omitnan')/mean(MT_map(logical(gm_mask)),'all','omitnan');
- % Tumor CoV
- cov_ind.amide_tumor(ii) = 100*std(amide_map(logical(tumor_mask)),[],'all','omitnan')/mean(amide_map(logical(tumor_mask)),'all','omitnan');
- cov_ind.amine_tumor(ii) = 100*std(amine_map(logical(tumor_mask)),[],'all','omitnan')/mean(amine_map(logical(tumor_mask)),'all','omitnan');
- cov_ind.noe_tumor(ii) = 100*std(NOE_map(logical(tumor_mask)),[],'all','omitnan')/mean(NOE_map(logical(tumor_mask)),'all','omitnan');
- cov_ind.MT_tumor(ii) = 100*std(MT_map(logical(tumor_mask)),[],'all','omitnan')/mean(MT_map(logical(tumor_mask)),'all','omitnan');
- % Deep grey matter CoV
- 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');
- 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');
- 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');
- 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');
- %% Panels 5-8: CEST Pool Amplitude Maps
- % ---------------------------------------------------------------------
- % Display the amide, rNOE, MT, and amine amplitude maps at the tumor
- % slice, using fixed colormap ranges for cross-subject comparison.
- % ---------------------------------------------------------------------
- % Panel 5: Amide (APT) amplitude map
- ax5 = nexttile(t);
- min_s = 0.025; max_s = 0.075;
- imshow(imrotate(amide_map(:,:,tumor_slice),90),[min_s max_s]);
- colormap(ax5,'parula'); colorbar();
- title('amide')
- % Panel 6: Aliphatic rNOE amplitude map
- ax6 = nexttile(t);
- min_s = 0.06; max_s = 0.16;
- imshow(imrotate(NOE_map(:,:,tumor_slice),90),[min_s max_s]);
- colormap(ax6,'parula'); colorbar();
- title('rNOE')
- % Panel 7: MT amplitude map
- ax7 = nexttile(t);
- min_s = 0.045; max_s = 0.28;
- imshow(imrotate(MT_map(:,:,tumor_slice),90),[min_s max_s]);
- colormap(ax7,'parula');colorbar();
- title('MT')
- % Panel 8: Amine amplitude map
- ax8 = nexttile(t);
- min_s = 0.01; max_s = 0.075;
- imshow(imrotate(amine_map(:,:,tumor_slice),90),[min_s max_s]);
- colormap(ax8,'parula'); colorbar();
- title('amine')
- set(gcf,'Position',[2112 282 1118 551])
- %% B0 Histogram Inset
- % ---------------------------------------------------------------------
- % Add a small histogram inset below the B0 map panel. Dashed red lines
- % mark the ±0.2 ppm threshold used for quality assessment.
- % ---------------------------------------------------------------------
- inset_position = [0.01 -0.01 0.98 0.15]; % [left bottom width height] in normalized tile units
- axpos = get(ax3, 'Position');
- inset_position_fig = [...
- axpos(1) + inset_position(1) * axpos(3),...
- axpos(2) + inset_position(2) * axpos(4),...
- inset_position(3) * axpos(3),...
- inset_position(4) * axpos(4)]; % Convert to figure units
- ax_inset = axes('Position', inset_position_fig);
- histogram(ax_inset,B0_map,'EdgeColor','none','FaceColor','k','FaceAlpha',1,'BinLimits',[-0.4 0.4]);
- xline(ax_inset,[-0.2 0.2],'--r')
- set(ax_inset,'yticklabel',[])
- %% B1 Histogram Inset
- % ---------------------------------------------------------------------
- % Add a small histogram inset below the B1 map panel. Dashed red lines
- % mark the [0.5, 1.5] range used for quality assessment.
- % ---------------------------------------------------------------------
- inset_position = [0.01 -0.01 0.98 0.15]; % [left bottom width height] in normalized tile units
- axpos = get(ax4, 'Position');
- inset_position_fig = [axpos(1) + inset_position(1) * axpos(3),...
- axpos(2) + inset_position(2) * axpos(4),...
- inset_position(3) * axpos(3),...
- inset_position(4) * axpos(4)]; % Convert to figure units
- ax_inset = axes('Position', inset_position_fig);
- histogram(ax_inset,B1_map,'EdgeColor','none','FaceColor','k','FaceAlpha',1,'BinLimits',[0.4 1.6]);
- xline(ax_inset,[0.5 1.5],'--r')
- set(ax_inset,'yticklabel',[])
- % Save figure (requires button press to allow inspection before saving)
- if save_stuff
- saveas(ff,[out_folder patient_folder(ii).name],'svg')
- end
- %% Optional: MTR-Rex Contrast Maps
- % ---------------------------------------------------------------------
- % If MTR_analysis is enabled, compute and display MTR-Rex maps for
- % all four CEST pools (amide, amine, rNOE, MT). MTR-Rex is defined
- % as (1/Zlab - 1/Zref) and provides a quantitative measure of
- % pool-specific magnetization transfer.
- %
- % Note: This section requires the CEST toolbox from the FAU group.
- % Please contact the corresponding author if interested.
- % ---------------------------------------------------------------------
- if MTR_analysis
- Contrasts = {'MTR_{Rex,Amide}', 'MTR_{Rex,Amine}', 'MTR_{Rex,NOE}', 'MTR_{Rex,MT}'};
- Offset_list = P.SEQ.w;
- [Zlab, Zref] = get_FIT_LABREF(popt,P,1,P.SEQ.w);
- % Amide/APT MTR-Rex at +3.5 ppm
- MTR_contrast_spectra = 1./Zlab - 1./Zref.Amide;
- [contrast_offset, ~] = find_nearest(Offset_list,3.5);
- MTR_contrast{1} = MTR_contrast_spectra(:,:,:,contrast_offset);
- colorbar_range = [0.03 0.13];
- % Amine MTR-Rex at +2.2 ppm
- MTR_contrast_spectra = 1./Zlab - 1./Zref.Amine;
- [contrast_offset, ~] = find_nearest(Offset_list,2.2);
- MTR_contrast{2} = MTR_contrast_spectra(:,:,:,contrast_offset);
- colorbar_range = [0.02 0.17];
- % rNOE MTR-Rex at -3.5 ppm
- MTR_contrast_spectra = 1./Zlab - 1./Zref.NOE;
- [contrast_offset, ~] = find_nearest(Offset_list,-3.5);
- MTR_contrast{3} = MTR_contrast_spectra(:,:,:,contrast_offset);
- colorbar_range = [0 0.65];
- % MT MTR-Rex at -2.0 ppm
- MTR_contrast_spectra = 1./Zlab - 1./Zref.MT;
- [contrast_offset, ~] = find_nearest(Offset_list,-2);
- MTR_contrast{4} = MTR_contrast_spectra(:,:,:,contrast_offset);
- colorbar_range = [0 0.65];
- % Display MTR-Rex maps for all four pools
- MTRex_f = figure(4);
- MTRex_t = tiledlayout(1,4);
- ax(1) = nexttile(MTRex_t);
- imshow(imrotate(MTR_contrast{1}(:,:,tumor_slice),90),[0.03 0.13]);
- colormap(ax(1),'parula'); colorbar();
- title('amide')
- ax(2) = nexttile(MTRex_t);
- imshow(imrotate(MTR_contrast{3}(:,:,tumor_slice),90),[0 0.45]);
- colormap(ax(2),'parula'); colorbar();
- title('aliphatic rNOE')
- ax(3) = nexttile(MTRex_t);
- imshow(imrotate(MTR_contrast{4}(:,:,tumor_slice),90),[0.09 0.4]);
- colormap(ax(3),'parula');colorbar();
- title('MT')
- ax(4) = nexttile(MTRex_t);
- imshow(imrotate(MTR_contrast{2}(:,:,tumor_slice),90),[0.02 0.17]);
- colormap(ax(4),'parula'); colorbar();
- title('amine')
- % Compute mean MTR-Rex per tissue ROI
- MTR_amide_wm(ii) = mean(MTR_contrast{1}(logical(wm_mask)),'all','omitnan');
- MTR_amine_wm(ii) = mean(MTR_contrast{2}(logical(wm_mask)),'all','omitnan');
- MTR_noe_wm(ii) = mean(MTR_contrast{3}(logical(wm_mask)),'all','omitnan');
- MTR_MT_wm(ii) = mean(MTR_contrast{4}(logical(wm_mask)),'all','omitnan');
- MTR_amide_gm(ii) = mean(MTR_contrast{1}(logical(gm_mask)),'all','omitnan');
- MTR_amine_gm(ii) = mean(MTR_contrast{2}(logical(gm_mask)),'all','omitnan');
- MTR_noe_gm(ii) = mean(MTR_contrast{3}(logical(gm_mask)),'all','omitnan');
- MTR_MT_gm(ii) = mean(MTR_contrast{4}(logical(gm_mask)),'all','omitnan');
- MTR_amide_deep_gm(ii) = mean(MTR_contrast{1}(logical(deep_gm_mask)),'all','omitnan');
- MTR_amine_deep_gm(ii) = mean(MTR_contrast{2}(logical(deep_gm_mask)),'all','omitnan');
- MTR_noe_deep_gm(ii) = mean(MTR_contrast{3}(logical(deep_gm_mask)),'all','omitnan');
- MTR_MT_deep_gm(ii) = mean(MTR_contrast{4}(logical(deep_gm_mask)),'all','omitnan');
- MTR_amide_tumor(ii) = mean(MTR_contrast{1}(logical(tumor_mask)),'all','omitnan');
- MTR_amine_tumor(ii) = mean(MTR_contrast{2}(logical(tumor_mask)),'all','omitnan');
- MTR_noe_tumor(ii) = mean(MTR_contrast{3}(logical(tumor_mask)),'all','omitnan');
- MTR_MT_tumor(ii) = mean(MTR_contrast{4}(logical(tumor_mask)),'all','omitnan');
- % Save MTR-Rex figure
- set(MTRex_f,'Position',[ 551 538 1108 254])
- if save_stuff
- out_folder_MTRRex = [out_folder '/MTRRex/'];
- saveas(MTRex_f,[out_folder_MTRRex patient_folder(ii).name '_MTRRex'],'svg')
- end
- end
- %% Contralateral ROI Analysis
- % ---------------------------------------------------------------------
- % Load manually defined contralateral (healthy) and reduced tumor ROI
- % masks for slice-level comparison of CEST metrics between tumor and
- % healthy tissue. These masks were defined per subject in a prior
- % interactive step.
- %
- % The commented-out block shows the interactive mask creation workflow
- % (move_mask function), retained here for reference.
- % ---------------------------------------------------------------------
- try
- pause(0.05);
- load([output_folder 'contralateral_tumor_mask.mat']);
- load([output_folder 'tumor_mask_reduced.mat']);
- % Display FLAIR image with reduced tumor and contralateral ROI overlays
- ft = figure(100);
- ax = gca;
- imshow(imrotate(flair_im(:,:,tumor_slice),90),[]);
- % Overlay: reduced tumor mask (red, semi-transparent)
- tumor_mask_t = imrotate(double(tumor_mask_reduced),90);
- red = cat(3, ones(size(tumor_mask_t)), zeros(size(tumor_mask_t)), zeros(size(tumor_mask_t)));
- hold on;
- auxim4 = imshow(red,'Parent',ax);
- hold off;
- set(auxim4,'AlphaData', 0.2.*double(tumor_mask_t./max(tumor_mask_t,[],'all')))
- if save_stuff
- pause(0.05);
- set(ft,'Position',[2227 389 454 324])
- saveas(ft,[out_folder 'reduced_tumor_mask' patient_folder(ii).name],'svg')
- end
- % Overlay: contralateral healthy ROI (blue, semi-transparent)
- healthy_ROI = double(imrotate(new_mask,90));
- blue = cat(3, zeros(size(healthy_ROI)), zeros(size(healthy_ROI)), ones(size(healthy_ROI)));
- hold on;
- auxim2 = imshow(blue,'Parent',ax);
- hold off;
- set(auxim2,'AlphaData', 0.4.*healthy_ROI)
- title('Tumor segmentation CEST')
- if save_stuff
- pause(0.05)
- set(ft,'Position',[2227 389 454 324])
- saveas(ft,[out_folder 'tumor_mask_' patient_folder(ii).name],'svg');
- end
- catch
- % Interactive mask creation workflow (disabled; retained for reference):
- % if nnz(tumor_mask_certain(:,:,tumor_slice)) > 10
- % [new_mask, tumor_mask_reduced] = move_mask(tumor_mask_certain(:,:,tumor_slice),flair_im(:,:,tumor_slice));
- % else
- % new_mask = zeros(size(tumor_mask_certain(:,:,tumor_slice)));
- % tumor_mask_reduced = zeros(size(tumor_mask_certain(:,:,tumor_slice)));
- % end
- % save([output_folder 'contralateral_tumor_mask'],'new_mask')
- % save([output_folder 'tumor_mask_reduced'],'tumor_mask_reduced')
- end
- % Report ROI sizes for verification
- disp(['size new mask = ' num2str(nnz(new_mask))]);
- disp(['size tumor mask = ' num2str(nnz(tumor_mask_reduced))]);
- % Extract slice-level mean CEST amplitudes for tumor and healthy ROIs
- map = amide_map(:,:,tumor_slice);
- amide_tum_sli(ii) = mean(map(logical(tumor_mask_reduced)),'all','omitnan');
- amide_healthyROI(ii) = mean(map(logical(new_mask)),'all','omitnan');
- map = amine_map(:,:,tumor_slice);
- amine_tum_sli(ii) = mean(map(logical(tumor_mask_reduced)),'all','omitnan');
- amine_healthyROI(ii) = mean(map(logical(new_mask)),'all','omitnan');
- map = NOE_map(:,:,tumor_slice);
- noe_tum_sli(ii) = mean(map(logical(tumor_mask_reduced)),'all','omitnan');
- noe_healthyROI(ii) = mean(map(logical(new_mask)),'all','omitnan');
- map = MT_map(:,:,tumor_slice);
- MT_tum_sli(ii) = mean(map(logical(tumor_mask_reduced)),'all','omitnan');
- MT_healthyROI(ii) = mean(map(logical(new_mask)),'all','omitnan');
- %% Optional: Interactive Single-Voxel Z-Spectrum Viewer
- % ---------------------------------------------------------------------
- % When enabled, displays the corrected Z-spectrum and its Lorentzian
- % decomposition for a selected voxel, alongside the CEST image with
- % the tumor mask overlaid.
- % Also plots the mean Z-spectrum averaged over a combined tissue mask
- % (cortical GM + WM + deep GM) at the tumor slice.
- %
- % This tool is intended for exploratory quality control and is
- % disabled by default.
- % ---------------------------------------------------------------------
- interactive = 0;
- if interactive
- % Extract the 2D image slice at the selected slice index
- image_slice = squeeze(Z_corrExt(:, :, tumor_slice, 1));
- close all;
- % Color palette for pool-specific Lorentzian components
- figure(2);
- col = [8 41 84; 224 43 53; 240 197 113; 89 168 156; 165 89 170]./255;
- % Left panel: CEST image with selected voxel marker and tumor overlay
- ax_aux = subplot(1, 2, 1);
- imshow(image_slice, []);
- x_pos = 32;
- y_pos = 37;
- hold on;
- plot(x_pos,y_pos,'rx','MarkerSize',6)
- hold on
- tumor_mask_t = tumor_mask(:,:,tumor_slice);
- red = cat(3, ones(size(tumor_mask_t)), zeros(size(tumor_mask_t)), zeros(size(tumor_mask_t)));
- hold on;
- auxim2 = imshow(red,'Parent',ax_aux);
- hold off;
- set(auxim2,'AlphaData', 0.2.*double(tumor_mask_t./max(tumor_mask_t,[],'all')))
- % Right panel: Z-spectrum and Lorentzian decomposition for selected voxel
- subplot(1, 2, 2);
- I = squeeze(Z_corrExt(x_pos, y_pos, tumor_slice, :));
- spectrum_plot = plot(P.SEQ.w, I,'ok','MarkerSize',4,'MarkerFaceColor','k','DisplayName','Z-Spectra');
- xlim([-6 6])
- ylim([0 1]);
- xlabel('frequency offset (ppm)');
- ylabel('I/I_0 (a.u.)')
- hold on;
- p = popt(x_pos,y_pos,tumor_slice,:);
- w = P.SEQ.w;
- % Evaluate individual pool Lorentzian contributions.
- % The 7T model includes five pools with free center positions:
- % pool 1 = water (direct saturation)
- % pool 2 = amide
- % pool 3 = MT
- % pool 4 = NOE
- % pool 5 = amine
- pool(1,:) = p(2).*p(3).^2./4./(p(3).^2/4+(w-p(4)).^2);
- pool(2,:) = p(5).*p(6).^2./4./(p(6).^2./4+(w-p(7)).^2);
- pool(3,:) = p(8).*p(9).^2./4./(p(9).^2./4.+(w-p(10)).^2);
- pool(4,:) = p(11).*p(12).^2./4./(p(12).^2./4.+(w-p(13)).^2);
- pool(5,:) = p(14).*p(15).^2./4./(p(15).^2/4.+(w-p(16)).^2);
- amp = p(1);
- % Plot individual pool contributions subtracted from baseline
- plot(w,amp - pool(2,:),'Linewidth',1.5,'DisplayName','Fitted amide','Color',col(1,:))
- plot(w,amp - pool(3,:),'Linewidth',1.5,'DisplayName','Fitted rNOE','Color',col(2,:))
- plot(w,amp - pool(4,:),'Linewidth',1.5,'DisplayName','Fitted MT','Color',col(3,:))
- plot(w,amp - pool(5,:),'Linewidth',1.5,'DisplayName','Fitted amine','Color',col(5,:))
- plot(w,amp - pool(1,:),'Linewidth',1.5,'DisplayName','Fitted DS','Color',col(4,:))
- % Plot full five-pool fitted Z-spectrum
- plot(P.SEQ.w,lorentzfit5pool(p, w, []),'k','Linewidth',1.5,'DisplayName','Fitted Z');
- xlim([-6 6])
- ylim([0, 1]);
- xlabel('ppm');
- ylabel('amplitude (a.u.)')
- set(gcf,'Position',[675 685 882 277])
- legend();
- %% Mean Z-Spectrum Over Combined Tissue Mask
- % -----------------------------------------------------------------
- % Compute and display the mean Z-spectrum and its Lorentzian
- % decomposition, averaged over the combined GM + WM + deep GM mask
- % at the tumor slice.
- % -----------------------------------------------------------------
- % Build combined brain tissue mask (excluding tumor)
- aux_mask = gm_mask(:,:,tumor_slice) + wm_mask(:,:,tumor_slice) + deep_gm_mask(:,:,tumor_slice);
- mask_idx = find(aux_mask);
- figure(3);
- % Average Z-spectrum over masked voxels
- Z = reshape(Z_corrExt(:,:,tumor_slice,:), [], size(Z_corrExt,4));
- I = squeeze(mean(Z(mask_idx, :), 1, 'omitnan'));
- spectrum_plot = plot(P.SEQ.w, I./I(1),'ok','MarkerSize',4,'MarkerFaceColor','k','DisplayName','Z-Spectra');
- xlim([-6 6])
- ylim([-0 1]);
- xlabel('frequency offset (ppm)');
- ylabel('Amplitude (a.u.)')
- hold on;
- % Average fitted parameters over masked voxels
- popt_slice = reshape(popt(:,:,tumor_slice,:), [], size(popt,4));
- p = squeeze(mean(popt_slice(mask_idx, :), 1, 'omitnan'));
- w = P.SEQ.w;
- pool(1,:) = p(2).*p(3).^2./4./(p(3).^2/4+(w-p(4)).^2);
- pool(2,:) = p(5).*p(6).^2./4./(p(6).^2./4+(w-p(7)).^2);
- pool(3,:) = p(8).*p(9).^2./4./(p(9).^2./4.+(w-p(10)).^2);
- pool(4,:) = p(11).*p(12).^2./4./(p(12).^2./4.+(w-p(13)).^2);
- pool(5,:) = p(14).*p(15).^2./4./(p(15).^2/4.+(w-p(16)).^2);
- amp = p(1);
- % Plot normalized pool contributions and full fit
- plot(w,(amp - pool(2,:))./I(1),'Linewidth',1.5,'DisplayName','Fitted amide','Color',col(1,:))
- plot(w,(amp - pool(3,:))./I(1),'Linewidth',1.5,'DisplayName','Fitted rNOE','Color',col(2,:))
- plot(w,(amp - pool(4,:))./I(1),'Linewidth',1.5,'DisplayName','Fitted MT','Color',col(3,:))
- plot(w,(amp - pool(5,:))./I(1),'Linewidth',1.5,'DisplayName','Fitted amine','Color',col(5,:))
- plot(w,(amp - pool(1,:))./I(1),'Linewidth',1.5,'DisplayName','Fitted DS','Color',col(4,:))
- plot(P.SEQ.w,lorentzfit5pool(p, w, [])./I(1),'k','Linewidth',1.5,'DisplayName','Fitted Z');
- xlim([-6 6])
- ylim([0, 1]);
- xlabel('frequency offset (ppm)');
- ylabel('Amplitude (a.u.)')
- legend();
- end
- end % end of per-subject loop
- %% Save Intermediate Results
- % -------------------------------------------------------------------------
- % Save the workspace to disk after the main subject loop. This checkpoint
- % allows the exclusion and export steps below to be run independently.
- % -------------------------------------------------------------------------
- if save_stuff
- close all;
- save([out_folder '7T_results'])
- end
- % To reload from checkpoint: load([out_folder '7T_results'])
- %% Subject Exclusion
- % -------------------------------------------------------------------------
- % Subjects are excluded from group analysis based on four criteria:
- % 1) Manual exclusion due to poor segmentation quality or acquisition
- % issues (exc_sub). Subject 3 was excluded due to a non-standard
- % image orientation.
- % 2) Excessive tumor volume relative to brain volume (> 25%)
- % 3) Excessive B0 inhomogeneity: > 20% of voxels outside ±0.4 ppm
- % 4) Excessive B1 inhomogeneity: > 20% of voxels outside [0.5, 1.5]
- %
- % All metrics for excluded subjects are set to NaN.
- % Further details on each exclusion are provided in the paper and in the
- % shared patient table.
- % -------------------------------------------------------------------------
- exc_sub = [3 14 33]; % Subject 3: non-standard orientation
- tumor_exc = find(tumor_per > 25);
- B0_exc = find(B0_per > 20);
- B1_exc = find(B1_per > 20);
- exclude = unique([exc_sub B0_exc B1_exc tumor_exc]);
- for ii = exclude
- patient_table.age(ii) = nan;
- amide_wm(ii) = nan;
- amine_wm(ii) = nan;
- noe_wm(ii) = nan;
- MT_wm(ii) = nan;
- amide_gm(ii) = nan;
- amine_gm(ii) = nan;
- noe_gm(ii) = nan;
- MT_gm(ii) = nan;
- amide_tumor(ii) = nan;
- amine_tumor(ii) = nan;
- noe_tumor(ii) = nan;
- MT_tumor(ii) = nan;
- amide_hip(ii) = nan;
- amine_hip(ii) = nan;
- noe_hip(ii) = nan;
- MT_hip(ii) = nan;
- amide_deep_gm(ii) = nan;
- amine_deep_gm(ii) = nan;
- noe_deep_gm(ii) = nan;
- MT_deep_gm(ii) = nan;
- amide_global(ii) = nan;
- amine_global(ii) = nan;
- noe_global(ii) = nan;
- MT_global(ii) = nan;
- end
- %% Export Summary Tables
- % -------------------------------------------------------------------------
- % Assemble and optionally save two output tables:
- % 1) table_7T (full): Full tissue-level CEST metrics per subject.
- % 2) table_7T (tumor): Slice-level tumor vs. contralateral healthy ROI.
- % -------------------------------------------------------------------------
- % Table 1: Full ROI summary (all tissue types and CEST pools)
- tumor_type = cell2mat(patient_table.WHO_grade)';
- 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"];
- 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);
- if save_stuff
- writetable(table_7T,[out_folder,'table_7T'])
- end
- % Table 2: Tumor slice — tumor ROI vs. contralateral healthy ROI
- varNames = ["age","amide_tum","amide_healthy","amine_tum","amine_healthy","noe_tum","noe_healthy","MT_tum","MT_healthy"];
- 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);
- if save_stuff
- writetable(table_7T,[out_folder,'table_tumor_7T'])
- end
- %% Local Functions
- % =========================================================================
- function updateSpectrum(src, event, data, slice, spectrum_plot)
- % updateSpectrum Update the Z-spectrum display based on the cursor position.
- %
- % Intended for use as a WindowButtonMotionFcn callback. Updates the
- % spectrum_plot line object with the Z-spectrum at the voxel under
- % the cursor.
- %
- % Inputs:
- % src - Figure handle (unused, required by callback API)
- % event - Event data (unused, required by callback API)
- % data - 4D CEST data array [x, y, z, offsets]
- % slice - Current axial slice index
- % spectrum_plot - Handle to the line object to update
- current_point = get(gca, 'CurrentPoint');
- x = round(current_point(1, 1));
- y = round(current_point(1, 2));
- if x >= 1 && x <= size(data, 1) && y >= 1 && y <= size(data, 2)
- spectrum = squeeze(data(x, y, slice, :));
- set(spectrum_plot, 'YData', spectrum);
- title(spectrum_plot.Parent,['Spectrum at (' num2str(x) ', ' num2str(y) ', ' num2str(slice) ')']);
- end
- end
Plot_Result_7T.m at commit 8997a6f, under MIT · at the source
Overview
- Institute for Diagnostic and Interventional Neuroradiology, Support Center for Advanced Neuroimaging, University of Bern, 3010 Bern, Switzerland
- Translational Imaging Center (TIC), Sitem-insel, 3010 Bern, Switzerland
- Department High-Field Magnetic Resonance, Max Planck Institute for Biological Cybernetics, 72076 Tübingen, Germany
- Institute of Neuroradiology, University Hospital Erlangen, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU), 91054 Erlangen, Germany
- Department of Neurology, Inselspital, Bern University Hospital and University of Bern, 3010 Bern, Switzerland
- Department of Artificial Intelligence in Biomedical Engineering, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU), 91052 Erlangen, Germany
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
8997a6f8110f8441b2024c3cfddf6c37a83b83f1, 20 April 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
26 files
- Plot_Result_3T.m, MATLAB, 1,064 lines, 6 matches
- Plot_Result_7T.m, MATLAB, 1,144 lines, 7 matches
- Statistical_analysis_3T.
m , MATLAB, 494 lines, 3 matches - Statistical_analysis_7T.
m , MATLAB, 458 lines, 1 match - aux_scripts/
getPathToFileContainingS , MATLAB, 44 linestring.m - aux_scripts/
lorentzfit5pool.m , MATLAB, 5 lines - aux_scripts/
nii_func/ , MATLAB, 138 linesload_nii.m - aux_scripts/
nii_func/ , MATLAB, 148 linesload_nii_ext.m - aux_scripts/
nii_func/ , MATLAB, 320 linesload_nii_hdr.m - aux_scripts/
nii_func/ , MATLAB, 385 linesload_nii_img.m - aux_scripts/
nii_func/ , MATLAB, 200 linesload_untouch0_nii_hdr.m - aux_scripts/
nii_func/ , MATLAB, 191 linesload_untouch_nii.m - aux_scripts/
nii_func/ , MATLAB, 217 linesload_untouch_nii_hdr.m - aux_scripts/
nii_func/ , MATLAB, 468 linesload_untouch_nii_img.m - aux_scripts/
nii_func/ , MATLAB, 218 linesmake_nii.m - aux_scripts/
nii_func/ , MATLAB, 234 linessave_nii.m - aux_scripts/
nii_func/ , MATLAB, 235 linessave_nii_ck.m - aux_scripts/
nii_func/ , MATLAB, 38 linessave_nii_ext.m - aux_scripts/
nii_func/ , MATLAB, 239 linessave_nii_hdr.m - aux_scripts/
nii_func/ , MATLAB, 219 linessave_untouch0_nii_hdr.m - aux_scripts/
nii_func/ , MATLAB, 232 linessave_untouch_nii.m - aux_scripts/
nii_func/ , MATLAB, 207 linessave_untouch_nii_hdr.m - aux_scripts/
nii_func/ , MATLAB, 45 linesverify_nii_ext.m - comparison_tumour_3T_7T.
m , MATLAB, 559 lines, 4 matches - LICENSE, License, 21 lines
- README.md, Text, 52 lines
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://
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://
BibTeX
@article{capiglioni2026f
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/
url = {https://
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/
VL - 8
IS - 4
SP - fcag248
SN - 2632-1297
PB - Oxford University Press
DO - 10.1093/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1093/
"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":
"volume": "8",
"issue": "4",
"page": "fcag248",
"DOI": "10.1093/
"PMID": "42428750",
"PMCID": "PMC13348846",
"ISSN": "2632-1297",
"publisher": "Oxford University Press",
"URL": "https://
"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 mappingIn 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 mappingIn 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: eLifeIn 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 mappingIn 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 communicationsIn 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 medicineIn 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: NatureIn 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. MedicineIn 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 - healthIn 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.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 24 scripts, and 21 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:df211ba4996f558a…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
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.
