OSCR

Axon Diameter Mapping From Myelin Water Diffusion MRI.

Code ↔ Paper

16 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 16 matches
  1. [1] § Methods › Diffusion Simulations in Cylindrical Shells With Caliber Variations and Undulations ↔ demo_4_bead_undulation_RD_AD.m, lines 18–156 · score 0.91 · undulation wavelength, bead width, undulation amplitude, axon skeleton, caliber variations, axon length
  2. [2] § Methods › Diffusion Simulations in Cylindrical Shells With Caliber Variations and Undulations ↔ demo_5_bead_undulation_ADM.m, lines 65–107 · score 0.91 · undulation wavelength, bead width, undulation amplitude, axon skeleton, caliber variations, axon length
  3. [3] § Results › Diffusion Simulations of ADM ↔ demo_3_cylinder_shell_ADM.m, lines 493–588 · score 0.74 · log linear, Gamma distribution, axon diameter, inner radius, histology, radii
  4. [4] § Methods › Diffusion Simulations of RD: Two-Dimensional Ring ↔ demo_6_GPA.m, lines 12–102 · score 0.70 · zero thickness, layer thickness, finite thickness, cylindrical surface, cylindrical shell, myelin layer
  5. [5] § Methods › Diffusion Simulations of ADM: Three-Dimensional Shells ↔ demo_3_cylinder_shell_ADM.m, lines 175–246 · score 0.70 · volume weighted, axial diffusivity, narrow pulse solution, gradient directions, wide pulse, spherical
  6. [6] § Methods › Diffusion Simulations of ADM: Three-Dimensional Shells ↔ demo_5_bead_undulation_ADM.m, lines 289–360 · score 0.70 · volume weighted, axial diffusivity, narrow pulse solution, gradient directions, wide pulse, spherical
  7. [7] § Methods › Diffusion Simulations of ADM: Three-Dimensional Shells ↔ demo_3_cylinder_shell_ADM.m, lines 493–588 · score 0.67 · log linear, inner diameter, myelin layers, histological, ratio, outer
  8. [8] § Methods › Diffusion Simulations of ADM: Three-Dimensional Shells ↔ demo_3_cylinder_shell_ADM.m, lines 175–246 · score 0.66 · Rician noise floor, noise ratio, SNR, signals, ADM, Shells
  9. [9] § Methods › Diffusion Simulations of ADM: Three-Dimensional Shells ↔ demo_5_bead_undulation_ADM.m, lines 289–360 · score 0.66 · Rician noise floor, noise ratio, SNR, signals, ADM, Shells
  10. [10] § Methods › Diffusion Simulations in Cylindrical Shells With Caliber Variations and Undulations ↔ lib/rms/main_PGSE_stringbead.cu, lines 484–524 · score 0.65 · periodic boundary, rejection sampling, walkers, membranes, layer
  11. [11] § Methods › Diffusion Simulations in Cylindrical Shells With Caliber Variations and Undulations ↔ demo_4_bead_undulation_RD_AD.m, lines 18–156 · score 0.64 · caliber variations, random walker, intrinsic diffusivity, frustums, undulations, CUDA
  12. [12] § Methods › Diffusion Simulations of RD: One-Dimensional Circle ↔ demo_1_cylindrical_surface_RD.m, lines 9–45 · score 0.60 · Monte Carlo simulations, cylindrical surface, intrinsic diffusivity, walkers, radius
  13. [13] § Results › Diffusion Simulations of RD ↔ demo_6_GPA.m, lines 12–102 · score 0.59 · radius ratio, finite thickness, cylindrical surface, cylindrical shell, narrow pulse, wide pulse
  14. [14] § Methods › Diffusion Simulations of RD: Two-Dimensional Ring ↔ demo_1_cylindrical_surface_RD.m, lines 9–45 · score 0.58 · Monte Carlo simulations, random walker, intrinsic diffusivity, cylindrical, radius
  15. [15] § Methods › Diffusion Simulations of ADM: Three-Dimensional Shells ↔ demo_3_cylinder_shell_ADM.m, lines 18–108 · score 0.56 · permeable membranes, random walkers, intrinsic diffusivity, myelin layer, ADM, Shells
  16. [16] § Methods › Diffusion Simulations of RD: Two-Dimensional Ring ↔ demo_2_cylinder_shell_RD.m, lines 18–105 · score 0.56 · random walker, inner radius, intrinsic diffusivity, myelin layer, CUDA, thickness

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 · 590 lines · 18 KB · MIT · 5 matches

  1. % ********** Setup the directory on your computer **********
  2. % demo 3: MC simulations of SMT in coaxial cylindrical shells of finite
  3. % thickness, permeable membrane
  4. clear
  5. restoredefaultpath
  6. filePath = matlab.desktop.editor.getActiveFilename;
  7. root0 = fileparts(filePath);
  8. addpath(genpath(fullfile(root0,'lib')));
  9. root = fullfile(root0,'data');
  10. root_cuda = fullfile(root0,'lib','rms');
  11. % project name
  12. projname = 'coaxial_cyliner_shell_ADM';
  13. mkdir(fullfile(root,projname));
  14. %% Generate packing, permeable membrane
  15. % inner radius, um
  16. r = 0.1:0.1:5;
  17. % thickness of each myelin layer, um
  18. % myelin layer thickness lm should be larger than the step size sqrt(4*D0*dt)
  19. lm = 12/1e3;
  20. % # myelin layers
  21. C0 = 0.35/lm;
  22. C1 = 0.006/lm;
  23. C2 = 0.024/lm;
  24. Nm = round(C0 + C1*2*r + C2*log(2*r));
  25. % permeability, um/ms
  26. kappa = 6.7e-3;
  27. % pulse width, ms
  28. Td = 6;
  29. % diffusion time, ms
  30. TD = 13;
  31. % b-value, ms/um2
  32. bval = [50 350 800 1500 2400 3450 4750 6000]/1e3;
  33. % gradient direction, 64 directions per b-shell
  34. % requirement: MRtrix3
  35. bvec = dirgen(64);
  36. % simulation parameters
  37. dt = 1e-6; % time step, ms
  38. TN = ceil(max(TD+Td)/dt)+100; % # steps
  39. NPar = 1e4; % # random walkers
  40. D0 = 0.8; % intrinsic diffusivity, um2/ms
  41. threadpb = 256; % thread per block for CUDA
  42. seed = 0;
  43. for i = 1:numel(r)
  44. seed = seed + 1;
  45. target = fullfile(root,projname,sprintf('CoCyl_%04u',seed));
  46. mkdir(target);
  47. % field of view, um
  48. res = 2*(r(i)+Nm(i)*lm)*1.05;
  49. % save simulation parameters
  50. fileID = fopen(fullfile(target,'simParamInput.txt'),'w');
  51. fprintf(fileID,sprintf('%g\n%u\n%u\n%g\n%g\n%u\n%g\n%g\n%u\n%g\n',...
  52. dt, TN, NPar, D0, kappa, threadpb, ...
  53. r(i)/res, lm/res, Nm(i), res));
  54. fclose(fileID);
  55. % save diffusion time and pulse width
  56. NDelta = numel(TD);
  57. DELdel = zeros(NDelta,2);
  58. for iii = 1:numel(TD)
  59. DELdel(iii,:) = [TD(iii), Td(iii)];
  60. end
  61. DELdel = DELdel.';
  62. DELdel = DELdel(:);
  63. fid = fopen(fullfile(target,'gradient_NDelta.txt'),'w');
  64. fprintf(fid,sprintf('%u\n',NDelta));
  65. fclose(fid);
  66. fid = fopen(fullfile(target,'gradient_DELdel.txt'),'w');
  67. fprintf(fid,sprintf('%.8f\n',DELdel));
  68. fclose(fid);
  69. % save b-table
  70. ig = 0;
  71. btab = zeros(numel(bval)*size(bvec,1),4);
  72. for jjj = 1:numel(bval)
  73. bvalj = bval(jjj);
  74. for kkk = 1:size(bvec,1)
  75. ig = ig+1;
  76. bveck = bvec(kkk,:);
  77. btab(ig,:) = [bvalj bveck];
  78. end
  79. end
  80. btab = btab.';
  81. btab = btab(:);
  82. fid = fopen(fullfile(target,'gradient_Nbtab.txt'),'w');
  83. fprintf(fid,sprintf('%u\n',numel(bval)*size(bvec,1)));
  84. fclose(fid);
  85. fid = fopen(fullfile(target,'gradient_btab.txt'),'w');
  86. fprintf(fid,sprintf('%.8f\n',btab));
  87. fclose(fid);
  88. end
  89. %% Create a shell script to run the codes
  90. fileID = fopen(fullfile(root,projname,'job.sh'),'w');
  91. fprintf(fileID,'#!/bin/bash\n');
  92. for j = 1:50
  93. target = fullfile(root,projname,sprintf('CoCyl_%04u',j));
  94. fprintf(fileID,sprintf('cd %s\n',target));
  95. fprintf(fileID,sprintf('cp -a %s .\n',fullfile(root_cuda,'main_PGSE_perm_cuda')));
  96. fprintf(fileID,'./main_PGSE_perm_cuda\n');
  97. end
  98. fclose(fileID);
  99. % Open the terminal window in the project folder and run "sh job.sh"
  100. % You may need to open the terminal in the root_cuda folder and compile the
  101. % CUDA code using "nvcc main_PGSE_perm.cu -o main_PGSE_perm_cuda"
  102. %% Plot simulation results
  103. Nr = 50; % # cylinder radius
  104. Nbval = 8; % # b-value
  105. Nbvec = 64; % # gradient direction
  106. % direction dependent diffusion signals
  107. S_dir = zeros(Nr, Nbval, Nbvec);
  108. for i = 1:Nr
  109. rms = simul3DcoCyl_cuda_pgse_bvec(fullfile(root,projname,sprintf('CoCyl_%04u',i)));
  110. sigi = rms.sig;
  111. bval = unique(rms.bval);
  112. sigi = reshape(sigi,Nbvec,[]);
  113. S_dir(i,:,:) = sigi.';
  114. end
  115. % effective radius of the n-th order, um
  116. % n = 0, <r> mean radius
  117. % n = 1, <r^2>/<r> volume weighted averaged radius
  118. % n = 2, (<r^3>/<r>)^(1/2) effective radius for narrow-pulse
  119. % n = 4, (<r^5>/<r>)^(1/4) effective radius for wide-pulse
  120. n = [0 1 2 4];
  121. r_mom = zeros(Nr, numel(n));
  122. vol = zeros(Nr, 1); % ~volume, um2
  123. Nm = zeros(Nr, 1); % # myelin layer
  124. for i = 1:Nr
  125. rms = simul3DcoCyl_cuda_pgse_bvec(fullfile(root,projname,sprintf('CoCyl_%04u',i)));
  126. % cylindrical shell radius at the middle thickness, um
  127. r = rms.rCir + (1:rms.Nm - 1/2)*rms.lm;
  128. % inner radius, um
  129. ri = rms.rCir;
  130. % outer radius, um
  131. ro = rms.rCir + rms.Nm*rms.lm;
  132. vol(i) = pi*(ro^2 - ri^2);
  133. Nm(i) = rms.Nm;
  134. for k = 1:numel(n)
  135. ni = n(k);
  136. if ni==0
  137. r_mom(i,k) = sum(r);
  138. else
  139. r_mom(i,k) = sum(r.^(ni+1));
  140. end
  141. end
  142. end
  143. %% MyeCaliber
  144. % Gamma distribution for axon radius
  145. ri_mean = (0.25:0.05:1).'; % mean, um
  146. ri_var = (ri_mean/2).^2; % variance, um2
  147. b = ri_var./ri_mean; % scale parameter, um
  148. a = ri_mean./b; % shape parameter
  149. x = (0.1:0.1:5).'; % sampled axon radius, um
  150. Nbval = 8; % # b-value
  151. Nbvec = 64; % # gradient direction per b-shell
  152. SNR = [Inf 50 20 10]; % signal-to-noise ratio for Rician noise
  153. % fitted parameters: radius, axial diffusivity, their standard deviations
  154. r_fit = zeros(numel(ri_mean), numel(SNR), 2);
  155. D_fit = zeros(numel(ri_mean), numel(SNR), 2);
  156. r_std = zeros(numel(ri_mean), numel(SNR), 2);
  157. D_std = zeros(numel(ri_mean), numel(SNR), 2);
  158. % spherical mean signal with noise for the fitting
  159. S_fit = zeros(numel(ri_mean), numel(SNR), Nbval);
  160. % model selection
  161. % narrow: narrow-pulse solution (Canales-Rodriguez et al. 2005)
  162. % wide: wide-pulse solution
  163. pulsetype = {'narrow', 'wide'};
  164. tic;
  165. for j = 1:numel(ri_mean)
  166. % direction-dependent diffusion signals from axons with radii in Gamma
  167. % distribution
  168. Ni = gampdf(x, a(j), b(j));
  169. Si = sum(Ni.*vol.*S_dir)/sum(Ni.*vol);
  170. Si = squeeze(Si);
  171. for i = 1:numel(SNR)
  172. % apply Rician noise to direction-dependent diffusion signals
  173. sigma = 1/SNR(i);
  174. Sj = abs( Si + sigma*randn(Nbval, Nbvec) + 1j*sigma*randn(Nbval, Nbvec) );
  175. % calculate spherical mean signal
  176. Sj = mean(Sj, 2);
  177. % Rician noise floor correction
  178. Sj = sqrt(max(Sj.^2-sigma^2, 0));
  179. % model fitting
  180. S_fit(j,i,:) = Sj;
  181. for k = 1:numel(pulsetype)
  182. [r_fit(j,i,k), D_fit(j,i,k), r_std(j,i,k), D_std(j,i,k)] = myelinADMfit(Sj, bval, rms.del, rms.Del, pulsetype{k});
  183. end
  184. end
  185. end
  186. toc;
  187. % effective radius of the n-th order with axon radius distribution, um
  188. % n = 0, <r> mean radius
  189. % n = 1, <r^2>/<r> volume weighted averaged radius
  190. % n = 2, (<r^3>/<r>)^(1/2) effective radius for narrow-pulse
  191. % n = 4, (<r^5>/<r>)^(1/4) effective radius for wide-pulse
  192. n = [0 1 2 4];
  193. r_eff = zeros(numel(ri_mean), numel(n));
  194. for j = 1:numel(ri_mean)
  195. Ni = gampdf(x, a(j), b(j));
  196. for i = 1:numel(n)
  197. ni = n(i);
  198. if ni==0
  199. r_eff(j,i) = sum(Ni.*r_mom(:,i))/sum(Ni.*Nm);
  200. else
  201. I = find(n==0);
  202. r_eff(j,i) = ( sum(Ni.*r_mom(:,i))/sum(Ni.*r_mom(:,I)) ).^(1/ni);
  203. end
  204. end
  205. end
  206. %% Canales-Rodriguez et al. 2025, full solution fitting
  207. % build training data for random forest regression
  208. rCR = 0.01:0.01:3; % axon radius, um
  209. DCR = 0.01:0.01:1.6; % intrinsic diffusivity, um2/ms
  210. % normalized spherical mean signal
  211. SCR = zeros(numel(bval),numel(rCR),numel(DCR));
  212. option = 'fast';
  213. tic;
  214. if strcmpi(option, 'slow')
  215. for i = 1:numel(bval)
  216. SCR(i,:,:) = myelinADMmodelCR(rCR(:), bval(i), rms.del, rms.Del, DCR(:).','slow');
  217. end
  218. else
  219. for i = 1:numel(bval)
  220. for j = 1:numel(DCR)
  221. SCR(i,:,j) = myelinADMmodelCR(rCR(:), bval(i), rms.del, rms.Del, DCR(j),'fast');
  222. end
  223. end
  224. end
  225. toc;
  226. % random forest regression for each SNR
  227. X = permute(SCR, [2, 3, 1]);
  228. X = reshape(X, [], 8);
  229. Y = repmat(rCR(:),numel(DCR),1);
  230. r_fit_CR = zeros(numel(ri_mean), numel(SNR));
  231. tic;
  232. for i = 1:numel(SNR)
  233. % apply Rician noise
  234. sigma = 1/SNR(i);
  235. Xi = abs( X + sigma*randn([size(X), Nbvec]) + 1j*sigma*randn([size(X), Nbvec]) );
  236. Xi = mean(Xi, 3);
  237. % Rician noise floor correction
  238. Xi = sqrt(max(Xi.^2-sigma^2, 0));
  239. % model fitting
  240. Mdl = TreeBagger(10,Xi,Y,'Method','regression','OOBPrediction','On');
  241. for j = 1:numel(ri_mean)
  242. r_fit_CR(j,i) = predict(Mdl,squeeze(S_fit(j,i,:)).');
  243. end
  244. end
  245. toc;
  246. %% Plot normalized spherical mean signal
  247. figure('unit','inch','position',[0 0 18 4]);
  248. cmap = colormap('lines');
  249. mk = {'o','v','s'};
  250. for i = 1:numel(SNR)
  251. subplot(1,numel(SNR),i)
  252. clear h lgtxt
  253. hold on;
  254. list = [1 numel(ri_mean)];
  255. for j = 1:numel(list)
  256. Si = S_fit(list(j),i,:);
  257. Si = squeeze(Si);
  258. h(j) = plot(1./sqrt(bval), Si, mk{j}, 'markersize', 6, 'linewidth', 1, 'color', cmap(j,:));
  259. bval_plot = 1./linspace(0.01, 5, 1000).^2;
  260. S_WP = myelinADMmodel(r_fit(list(j),i,2), bval_plot, rms.del, rms.Del, D_fit(list(j),i,2), 'wide');
  261. plot(1./sqrt(bval_plot), S_WP, '-' , 'linewidth', 1, 'color', cmap(j,:));
  262. lgtxt{j} = sprintf('$2\\bar{r}_i=$%.1f $\\mu$m', ri_mean(list(j))*2);
  263. end
  264. h(3) = plot(-1, -1, 'k-', 'linewidth', 1);
  265. lgtxt{3} = 'fitting';
  266. xlim([0 2]);
  267. ylim([0 1]);
  268. pbaspect([1 1 1]);
  269. xlabel('$1/\sqrt{b}$, $\mu$m$\cdot$ms$^{-1/2}$', 'interpreter', 'latex', 'fontsize', 20)
  270. if i==1, ylabel('$\bar{S}(b)$', 'interpreter', 'latex', 'fontsize', 20); end
  271. title(sprintf('SNR=%u',SNR(i)),'interpreter','latex','fontsize',20)
  272. box on; grid on;
  273. legend(h, lgtxt,'interpreter','latex','fontsize',16,'box','off','location','southeast')
  274. end
  275. %% Resolution limit
  276. D0 = rms.Din; % intrinsic diffusivity, um2/ms
  277. Da = rms.Din; % axial diffusivity, um2/ms
  278. za = 1.64; % z-score at alpha = 0.05
  279. Nav = 64; % # gradient direction per b-shell
  280. r_min_NP = zeros(numel(SNR), 1)-1; % resolution limit of narrow-pulse
  281. r_min_WP = zeros(numel(SNR), 1)-1; % resolution limit of wide-pulse
  282. for j = 1:numel(SNR)
  283. r_min_NP(j) = myelinADMrmin(max(bval), rms.del, rms.Del, D0, Da, za, SNR(j), Nav, 'narrow');
  284. r_min_WP(j) = myelinADMrmin(max(bval), rms.del, rms.Del, D0, Da, za, SNR(j), Nav, 'wide');
  285. end
  286. %% Plot figure, Canales-Rodriguez et al. 2005, narrow pulse solution
  287. figure('unit','inch','position',[0 0 18 4]);
  288. cmap = colormap('lines');
  289. mk = {'o','v','s','^','d'};
  290. clear h hx lgtxt
  291. for i = 1:numel(n)
  292. subplot(1,4,i)
  293. hold on;
  294. for j = numel(SNR):-1:1
  295. plotstd(2*r_eff(:,i), 2*r_fit(:,j,1), 2*r_std(:,j,1), cmap(j,:), 0.3, 'area');
  296. end
  297. end
  298. for i = 1:numel(n)
  299. subplot(1,4,i)
  300. hold on;
  301. for j = 1:numel(SNR)
  302. if j==3
  303. h(j) = plot(r_eff(:,i)*2, r_fit(:,j,1)*2, mk{j}, 'color', cmap(j,:)*0.85,'linewidth',1);
  304. else
  305. h(j) = plot(r_eff(:,i)*2, r_fit(:,j,1)*2, mk{j}, 'color', cmap(j,:),'linewidth',1);
  306. end
  307. if ~isinf(SNR(j))
  308. if j==3
  309. hx = xline(r_min_NP(j)*2); set(hx, 'color', cmap(j,:)*0.85, 'linestyle', '--','linewidth',1);
  310. else
  311. hx = xline(r_min_NP(j)*2); set(hx, 'color', cmap(j,:), 'linestyle', '--','linewidth',1);
  312. end
  313. end
  314. lgtxt{j} = sprintf('SNR=%u', SNR(j));
  315. end
  316. xlim([0 4]);
  317. ylim([0 4]);
  318. yticks(0:4);
  319. hr = refline(1); set(hr, 'color', 'k');
  320. hl = plot(-1, -1, 'k--', 'linewidth', 1); lgtxt{numel(SNR)+1} = '2$r_{\rm min,NP}$';
  321. hg = legend([h hl], lgtxt, 'interpreter', 'latex', 'location', 'northwest', 'box', 'on', 'fontsize', 12);
  322. box on;
  323. pbaspect([1 1 1])
  324. switch n(i)
  325. case 0
  326. xlabel('2$\langle r\rangle$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  327. case 1
  328. xlabel('2$r_{\rm vwa}$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  329. case 2
  330. xlabel('2$r_{\rm eff, NP}$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  331. case 4
  332. xlabel('2$r_{\rm eff, WP}$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  333. end
  334. if i==1
  335. ylabel('fitted 2$r$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  336. end
  337. end
  338. %% Plot figure, wide-pulse solution
  339. figure('unit','inch','position',[0 0 18 4]);
  340. cmap = colormap('lines');
  341. mk = {'o','v','s','^','d'};
  342. clear h hx lgtxt
  343. for i = 1:numel(n)
  344. subplot(1,4,i)
  345. hold on;
  346. for j = numel(SNR):-1:1
  347. plotstd(2*r_eff(:,i), 2*r_fit(:,j,2), 2*r_std(:,j,2), cmap(j,:), 0.3, 'area');
  348. end
  349. end
  350. for i = 1:numel(n)
  351. subplot(1,4,i)
  352. hold on;
  353. for j = 1:numel(SNR)
  354. if j==3
  355. h(j) = plot(2*r_eff(:,i), 2*r_fit(:,j,2), mk{j}, 'color', cmap(j,:)*0.85,'linewidth',1);
  356. else
  357. h(j) = plot(2*r_eff(:,i), 2*r_fit(:,j,2), mk{j}, 'color', cmap(j,:),'linewidth',1);
  358. end
  359. if ~isinf(SNR(j))
  360. if j==3
  361. hx = xline(2*r_min_WP(j)); set(hx, 'color', cmap(j,:)*0.85, 'linestyle', '--','linewidth',1);
  362. else
  363. hx = xline(2*r_min_WP(j)); set(hx, 'color', cmap(j,:), 'linestyle', '--','linewidth',1);
  364. end
  365. end
  366. lgtxt{j} = sprintf('SNR=%u', SNR(j));
  367. end
  368. xlim([0 4]);
  369. ylim([0 4]);
  370. yticks(0:4);
  371. hr = refline(1); set(hr, 'color', 'k');
  372. hl = plot(-1, -1, 'k--', 'linewidth', 1); lgtxt{numel(SNR)+1} = '2$r_{\rm min,WP}$';
  373. if i==1
  374. hg = legend([h hl], lgtxt, 'interpreter', 'latex', 'location', 'southeast', 'box', 'on', 'fontsize', 12);
  375. else
  376. hg = legend([h hl], lgtxt, 'interpreter', 'latex', 'location', 'northwest', 'box', 'on', 'fontsize', 12);
  377. end
  378. box on;
  379. pbaspect([1 1 1])
  380. switch n(i)
  381. case 0
  382. xlabel('2$\langle r\rangle$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  383. case 1
  384. xlabel('2$r_{\rm vwa}$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  385. case 2
  386. xlabel('2$r_{\rm eff, NP}$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  387. case 4
  388. xlabel('2$r_{\rm eff, WP}$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  389. end
  390. if i==1
  391. ylabel('fitted 2$r$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  392. end
  393. end
  394. %% Plot figure, Canales Rodriguez et al. 2005, narrow-pulse full solution
  395. figure('unit','inch','position',[0 0 18 4]);
  396. cmap = colormap('lines');
  397. mk = {'o','v','s','^','d'};
  398. clear h hx lgtxt
  399. for i = 1:numel(n)
  400. subplot(1,4,i)
  401. hold on;
  402. for j = 1:numel(SNR)
  403. h(j) = plot(2*r_eff(:,i), 2*r_fit_CR(:,j), mk{j}, 'color', cmap(j,:),'linewidth',1);
  404. if ~isinf(SNR(j))
  405. if j==3
  406. hx = xline(2*r_min_NP(j)); set(hx, 'color', cmap(j,:)*0.85, 'linestyle', '--','linewidth',1);
  407. else
  408. hx = xline(2*r_min_NP(j)); set(hx, 'color', cmap(j,:), 'linestyle', '--','linewidth',1);
  409. end
  410. end
  411. lgtxt{j} = sprintf('SNR=%u', SNR(j));
  412. end
  413. xlim([0 4]);
  414. ylim([0 4]);
  415. hr = refline(1); set(hr, 'color', 'k');
  416. hl = plot(-1, -1, 'k--', 'linewidth', 1); lgtxt{numel(SNR)+1} = '2$r_{\rm min,NP}$';
  417. if i==1
  418. hg = legend([h hl], lgtxt, 'interpreter', 'latex', 'location', 'northwest', 'box', 'on', 'fontsize', 12);
  419. else
  420. hg = legend([h hl], lgtxt, 'interpreter', 'latex', 'location', 'northwest', 'box', 'on', 'fontsize', 12);
  421. end
  422. box on;
  423. pbaspect([1 1 1])
  424. switch n(i)
  425. case 0
  426. xlabel('2$\langle r\rangle$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  427. case 1
  428. xlabel('2$r_{\rm vwa}$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  429. case 2
  430. xlabel('2$r_{\rm eff, NP}$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  431. case 4
  432. xlabel('2$r_{\rm eff, WP}$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  433. end
  434. if i==1
  435. ylabel('fitted 2$r$, $\mu$m', 'interpreter', 'latex', 'fontsize',20);
  436. end
  437. end
  438. %% Plot histology information
  439. % inner radius, um
  440. r = 0.1:0.1:5;
  441. r = r(:);
  442. % thickness of myelin layer, um
  443. lm = 12/1e3;
  444. % # myelin layers
  445. C0 = 0.35/lm;
  446. C1 = 0.006/lm;
  447. C2 = 0.024/lm;
  448. Nm = round(C0 + C1*2*r + C2*log(2*r));
  449. % Total myelin thickness, um
  450. Lm = Nm*lm;
  451. % g-ratio: ratio of inner to outer radii
  452. gratio = r./(r+Lm);
  453. figure('unit','inch','position',[0 0 15 5])
  454. % plot inner diameter vs g-ratio
  455. subplot(131)
  456. hold on;
  457. hp = plot(2*r, gratio, 'o', 'linewidth', 1);
  458. xx = linspace(0, 10, 100);
  459. yy = C0 + C1*xx + C2*log(xx);
  460. yy = xx./(xx + 2*yy*lm);
  461. hh = plot(xx, yy, '-', 'linewidth', 1);
  462. legend([hh, hp], {'log-linear', 'numerical phantom'}, 'interpreter', 'latex', ...
  463. 'box', 'off', 'location', 'southeast', 'fontsize', 14)
  464. pbaspect([1 1 1]);
  465. xlabel('inner diameter 2$r_i$, $\mu$m', 'interpreter', 'latex', 'fontsize', 20);
  466. ylabel('$g$-ratio', 'interpreter', 'latex', 'fontsize', 20)
  467. xlim([0 10]);
  468. ylim([0 1]);
  469. yticks(0:0.2:1);
  470. box on;
  471. % plot inner diameter vs # myelin layers
  472. subplot(132)
  473. hold on;
  474. hp = plot(2*r, Nm, 'o', 'linewidth', 1);
  475. xx = linspace(0, 10, 100);
  476. yy = C0 + C1*xx + C2*log(xx);
  477. hh =plot(xx, yy, '-', 'linewidth', 1);
  478. legend([hh, hp], {'log-linear', 'numerical phantom'}, 'interpreter', 'latex', ...
  479. 'box', 'off', 'location', 'southeast', 'fontsize', 14)
  480. pbaspect([1 1 1]);
  481. xlabel('inner diameter 2$r_i$, $\mu$m', 'interpreter', 'latex', 'fontsize', 20);
  482. ylabel('\# myelin layers $N_m$', 'interpreter', 'latex', 'fontsize', 20)
  483. xlim([0 10]); ylim([25 40])
  484. box on;
  485. % plot axon diameter distribution in Gamma distribution
  486. di_mean = 2*(0.25:0.05:1).';
  487. di_var = (di_mean/2).^2;
  488. b = di_var./di_mean;
  489. a = di_mean./b;
  490. di = 2*(0.1:0.1:5); di = di(:);
  491. Ni = zeros(numel(di), numel(di_mean));
  492. for j = 1:numel(di_mean)
  493. Ni(:,j) = gampdf(di, a(j), b(j));
  494. end
  495. ax = subplot(133);
  496. hold on;
  497. plot([2.5 2.5], [0.9 1.9], 'k-', 'linewidth', 1.5)
  498. text(1.5, 1.4, '2$\bar{r}_i$', 'interpreter', 'latex', 'fontsize', 14);
  499. cmap = colormap('parula');
  500. list = 1:numel(di_mean);
  501. Pi = Ni./sum(Ni,1)/mean(diff(di));
  502. clear h lgtxt
  503. for i = 1:numel(list)
  504. h(i) = plot(di, Pi(:,list(i)), '.-', 'color', cmap(i*floor(size(cmap,1)/numel(list)),:));
  505. end
  506. pbaspect([1 1 1]);
  507. box on;
  508. xlabel('inner diameter 2$r_i$, $\mu$m', 'interpreter', 'latex', 'fontsize', 20);
  509. ylabel('PDF, $\mu$m$^{-1}$', 'interpreter', 'latex', 'fontsize', 20)
  510. for i = 1:numel(list)
  511. lgtxt{i} = sprintf('%.2f $\\mu$m', di_mean(list(i)));
  512. end
  513. legend(h, lgtxt, 'interpreter','latex','fontsize',12, 'box', 'off', ...
  514. 'NumColumns',2);
  515. xlim([0 10]);
  516. ylim([0 2]);
  517. yticks(0:5)

demo_3_cylinder_shell_ADM.m at commit 9de680c, under MIT · at the source

Overview

Authors: Hong-Hsi Lee1, Kwok-Shing Chan1, Dmitry S. Novikov2, Els Fieremans2, Susie Y. Huang1
  1. Department of Radiology, Athinoula A. Martinos Center for Biomedical Imaging, Massachusetts General Hospital, Charlestown, MA 02129 USA, and also with the Harvard Medical School, Boston, MA 02115 USA
  2. Center for Advanced Imaging Innovation and Research, New York, NY 10016 USA, and also with the Department of Radiology, New York University School of Medicine, New York, NY 10016 USA
Journal: IEEE transactions on medical imaging, volume 45, issue 6, pages 2883-2896
Dates: published online 1 June 2026; in print June 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1109/tmi.2026.3664328 · PMID 41686667 · PMCID PMC13387500 · OpenAlex W7128810266
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: structural MRI / diffusion (modality), human (organism), cellular / molecular (subfield)
Keywords: Diffusion MRI, axon diameter, myelinated axon, Monte Carlo simulations, microstructure imaging
MeSH: Axons*, Diffusion Magnetic Resonance Imaging*, Image Processing, Computer-Assisted*, Myelin Sheath*, Animals, Computer Simulation, Humans, Monte Carlo Method, Phantoms, Imaging, Water (* major topic)
Topic: Advanced Neuroimaging Techniques and Applications (Radiology, Nuclear Medicine and Imaging, Medicine), according to OpenAlex
Funding: NIBIB NIH HHS (P41 EB030006, U01 EB026996, P41 EB015896, P41 EB017183); National Institute of Health (P41EB015896, R01NS088040, R01NS118187, R21NS081230, P41EB030006, P41EB017183, DP5OD031854, U01EB026996, U24NS137077); NINDS NIH HHS (R01 NS088040, R01 NS118187, U24 NS137077, R21 NS081230); ZonMw (04520232330012); NIH HHS (DP5 OD031854); NWO/ZonMw through the Rubicon (04520232330012)
Citations: not cited yet (Europe PMC); 101 references in the paper

Abstract

Probing diffusion in myelin water using diffusion-weighted T1-/T2-selective MRI acquisitions enables noninvasive measurement of myelinated axon diameter. Its application for in vivo measurements requires numerical verification through diffusion simulations. Here, we propose the theory of myelin water diffusion as measured with a diffusion MRI pulse sequence with wide gradient pulses using the Gaussian phase approximation. We establish its applicability to axonal diameter mapping via Monte Carlo simulations in either infinitely thin cylindrical surfaces or concentric cylindrical shells of finite thickness, mimicking the micro-geometry of myelin sheaths. The estimated diameters are shown to be weighted more toward outer than inner calibers. Simulation results evaluate the theory of myelin water diffusion and axon diameter estimation using spherical mean diffusion signals, demonstrating its applicability at signal-to-noise ratio above 20 on the Connectome 2.0 MRI scanner equipped with maximum gradient strength of 500 mT/m and slew rate of 600 T/m/s. Measuring restricted diffusion of myelin water in-between myelin sheaths using diffusion MRI allows one to measure myelinated axon diameters in vivo. The protocol can potentially be adapted for clinically available high-gradient performance scanners.

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 16 matches between paragraphs and lines of code.

Connectome20/MyCaliber

License: MIT
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 9de680c81bfa1180ab3af722c203496535e405c6, 25 February 2026
Languages: MATLAB (20), CUDA (3)
Size: 30 files, 23 scripts
Software Heritage: not archived
Found in: the text, “Diffusion Simulations in Cylindrical Shells With”
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
25 files

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;
  • 23 scripts, each with its path and the digest of its content;
  • 16 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.

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 2, 28 September 2026

  • Publisher: n/a → Institute of Electrical and Electronics Engineers

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 5 authors, 5 keywords, 10 MeSH terms, 6 funders, 91 references.

Cite

This paper

Lee, H.-H., Chan, K.-S., Novikov, D. S., Fieremans, E., & Huang, S. Y. (2026). Axon Diameter Mapping From Myelin Water Diffusion MRI. IEEE transactions on medical imaging, 45(6), 2883-2896. https://doi.org/10.1109/tmi.2026.3664328

BibTeX

@article{lee2026axon,
author = {Lee, Hong-Hsi and Chan, Kwok-Shing and Novikov, Dmitry S. and Fieremans, Els and Huang, Susie Y.},
title = {{Axon Diameter Mapping From Myelin Water Diffusion MRI}},
journal = {IEEE transactions on medical imaging},
year = {2026},
month = jun,
volume = {45},
number = {6},
pages = {2883--2896},
publisher = {Institute of Electrical and Electronics Engineers},
issn = {0278-0062},
doi = {10.1109/tmi.2026.3664328},
url = {https://doi.org/10.1109/tmi.2026.3664328},
pmid = {41686667},
pmcid = {PMC13387500}
}

RIS

TY - JOUR
AU - Lee, Hong-Hsi
AU - Chan, Kwok-Shing
AU - Novikov, Dmitry S.
AU - Fieremans, Els
AU - Huang, Susie Y.
TI - Axon Diameter Mapping From Myelin Water Diffusion MRI
T2 - IEEE transactions on medical imaging
J2 - IEEE Trans Med Imaging
PY - 2026
DA - 2026/06/01
VL - 45
IS - 6
SP - 2883
EP - 2896
SN - 0278-0062
PB - Institute of Electrical and Electronics Engineers
DO - 10.1109/tmi.2026.3664328
UR - https://doi.org/10.1109/tmi.2026.3664328
LA - en
ER -

CSL-JSON

{
"id": "10.1109/tmi.2026.3664328",
"type": "article-journal",
"title": "Axon Diameter Mapping From Myelin Water Diffusion MRI",
"container-title": "IEEE transactions on medical imaging",
"author": [
{
"family": "Lee",
"given": "Hong-Hsi"
},
{
"family": "Chan",
"given": "Kwok-Shing"
},
{
"family": "Novikov",
"given": "Dmitry S."
},
{
"family": "Fieremans",
"given": "Els"
},
{
"family": "Huang",
"given": "Susie Y."
}
],
"container-title-short": "IEEE Trans Med Imaging",
"volume": "45",
"issue": "6",
"page": "2883-2896",
"DOI": "10.1109/tmi.2026.3664328",
"PMID": "41686667",
"PMCID": "PMC13387500",
"ISSN": "0278-0062",
"publisher": "Institute of Electrical and Electronics Engineers",
"URL": "https://doi.org/10.1109/tmi.2026.3664328",
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
1
]
]
}
}

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.70553 [code]
Axon Diameter Mapping in the Living Human Brain with Ultra-High-Gradient Diffusion MRI at 500 mT/m Gradient Strength.
Journal: Human brain mapping
In common: MRtrix3, Optimization Toolbox, Image Processing Toolbox, 1 other tool, structural MRI / diffusion, 23 references, 2 authors
[2] doi:10.1002/mrm.70490 [code]
Dependence of the Extra-Cellular Diffusion Coefficient on the Fractions of Neurites and Cell Bodies in Gray Matter.
Journal: Magnetic resonance in medicine
In common: structural MRI / diffusion, cellular / molecular, 22 references, author Hong‐Hsi Lee
[3] doi:10.1371/journal.pbio.3003861
Learning engages transient and sustained cellular mechanisms in the human brain.
Journal: PLoS biology
In common: structural MRI / diffusion, cellular / molecular, 10 references
[4] doi:10.1002/mrm.70336 [code]
Offline Reconstruction of Diffusion MRI Acquisitions for Comparison Between Complex PCA-Based and AI-Based Denoising.
Journal: Magnetic resonance in medicine
In common: MRtrix3, Optimization Toolbox, Image Processing Toolbox, 1 other tool, structural MRI / diffusion, 5 references
[5] doi:10.1038/s41598-026-39162-7 [code]
White matter microstructure differences in obstructive sleep apnea severity groups assessed by diffusion tensor metrics and biophysical modeling.
Journal: Scientific reports
In common: MRtrix3, structural MRI / diffusion, 7 references
[6] doi:10.1002/mrm.70378 [code]
Investigating the Sensitivity of the Diffusion MRI Signal to Magnetization Transfer and Permeability via Monte-Carlo Simulations.
Journal: Magnetic resonance in medicine
In common: structural MRI / diffusion, 8 references
[7] doi:10.1038/s41467-026-70018-w [code]
Geometry of the cumulant series in diffusion MRI.
Journal: Nature communications
In common: Statistics and Machine Learning Toolbox, structural MRI / diffusion, 7 references
[8] doi:10.1038/s41598-026-51531-w [code]
Multimodal age-dependent diffusion-MRI analysis of the neocortex in a rat model of cortical dysplasia.
Journal: Scientific reports
In common: MRtrix3, Image Processing Toolbox, Statistics and Machine Learning Toolbox, structural MRI / diffusion, 4 references
[9] doi: [code]
Diffusion-relaxation MRI as virtual histology: separable microstructural signatures of AD pathology in ex vivo human brain
Journal: Research square
In common: Image Processing Toolbox, Statistics and Machine Learning Toolbox, structural MRI / diffusion, cellular / molecular, 3 references
[10] 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: Optimization Toolbox, Image Processing Toolbox, Statistics and Machine Learning Toolbox, structural MRI / diffusion, 3 references

Contribute

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

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

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.