OSCR

Functional dual-slope frequency-domain near-infrared spectroscopy data interpreted with two- and three-layer models.

Code ↔ Paper

10 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 10 matches · 3 of them tie a paragraph to a whole file without given lines: weak matches, whose lines are not tinted
  1. [1] § Methods › Data Collection › In silico simulations of two- and three-layered media ↔ TwoLayerSpectroscopy/R_2L_withPreCom.m, the whole file · a weak match · score 0.67 · angular modulation frequency, absorption coefficient, speed, photons, refractive, Sec · Report a mismatch
  2. [2] § Methods › Data Analysis › Measure of functional brain activation with data type M (maximum at 830 nm) ↔ DualRatio_FluorescenceFlowCytometry/221101Data/NEUprocessed/two_probe__4_pmt_preProc.m, lines 30 to 147 · score 0.61 · standard deviation, fibers, peak, window, threshold, SNR · Report a mismatch
  3. [3] § Methods › Data Collection › In silico simulations of two- and three-layered media ↔ TwoLayerSpectroscopy/R_2L_withPreCom.m, the whole file · a weak match · score 0.59 · reduced scattering coefficient, radius, zero, photons, diffusive, refractive · Report a mismatch
  4. [4] § Biographies ↔ PulseOxSpectralLinewidth/LEDspecColor_forPUB.m, lines 1 to 35 · score 0.58 · Biomedical Optics, Sergio Fantini, Optical · Report a mismatch
  5. [5] § Methods › Data Collection › In silico simulations of two- and three-layered media ↔ TwoLayer/TwoLayerReflectance.m, the whole file · a weak match · score 0.57 · angular modulation frequency, speed, photons, refractive, coefficient, Sec · Report a mismatch
  6. [6] § Methods › Data Analysis › Changes in absorption coefficient ( ) ↔ PulseOxSpectralLinewidth/LEDspecColor_forPUB.m, lines 219 to 246 · score 0.57 · deoxy hemoglobin, Beer, law, wavelengths, concentration, coefficient · Report a mismatch
  7. [7] § Methods › Data Collection › In vivo brain measurements › Equipment and human subjects ↔ PulseOxSpectralLinewidth/LEDspecColor_forPUB.m, lines 37 to 61 · score 0.54 · laser diodes, skin, wavelengths, setup, dual, tissue · Report a mismatch
  8. [8] § Methods › Data Collection › In vivo brain measurements › Equipment and human subjects ↔ DualSlope/DSdmua.m, lines 1 to 115 · score 0.54 · dual slope, human, modulated, Tufts, brain, intensity · Report a mismatch
  9. [9] § Biographies ↔ PulseOxSpectralLinewidth/LEDspecColor_forPUB.m, lines 1 to 35 · score 0.51 · optical measurements, Giles Blaney, optics, Biomedical · Report a mismatch
  10. [10] § Methods › Data Analysis › Changes in absorption coefficient ( ) ↔ CHS/time-domain CHS/Example.m, lines 52 to 110 · score 0.50 · deoxy hemoglobin · Report a mismatch

Paper

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

The paper is loaded when this pane is shown.

The authors' code

MATLAB · 778 lines · 25 KB · no license · 4 matches

  1. %% Giles Blaney, PhD; Spring 2026
  2. % Please cite
  3. % Giles Blaney, Sergio Fantini "Broad-linewidth sources result in a skin-tone
  4. % bias in noninvasive optical measurement of oxygen saturation,"
  5. % Journal of Biomedical Optics 31(7), 070501 (9 Jul 2026)
  6. % https://doi.org/10.1117/1.JBO.31.7.070501
  7. % for anything regarding this code.
  8. clear; home;
  9. % Nominal RED and IR wavelengths & full width half maxes
  10. lamRED = 660; %nm
  11. lamIR = 880; %nm
  12. LEDfwhm_all = linspace(10,100, 10); %nm
  13. % Melanin volume fractions
  14. Mfrac_all = linspace(0,0.43,10);
  15. % Pulsatile hemoglobin perturbation & arterial oxygen saturation
  16. dTart = 1; %uM
  17. SaO2_all = linspace(0.7,1,100);
  18. % Wavelengths to simulate
  19. lam = (550:1050).'; %nm
  20. % Set if we assume constant epidermis thickness (useMCpathlen=false) or use
  21. % path-lengths from Monte-Carlo (useMCpathlen=true)
  22. useMCpathlen = true;
  23. % Thickness and source detector distance
  24. s = 10; %mm
  25. rho = s; % Detector is directly opposite source
  26. % Number of terms in diffusion theory solution to sum
  27. m_max = 100;
  28. %% ########## Setup #######################################################
  29. % Load results from Monte Carlo based on the model in:
  30. % G. Blaney, J. Frias, F. Tavakoli, A. Sassaroli, and S. Fantini,
  31. % "Dual-ratio approach to pulse oximetry and the effect of skin tone,"
  32. % JBO, vol. 29, no. S3, p. S33311, Oct. 2024,
  33. % doi: 10.1117/1.JBO.29.S3.S33311
  34. if useMCpathlen
  35. MCavg = load('deps/MCout_avg.mat');
  36. end
  37. % Find indexes of the nominal RED and IR wavelengths
  38. [~,iRED] = min(abs(lam-lamRED));
  39. [~,iIR] = min(abs(lam-lamIR));
  40. % Create Laser Diode (LD) emission spectrum
  41. P0red_LD = zeros(size(lam));
  42. P0red_LD(iRED) = 1; %power/nm
  43. P0ir_LD = zeros(size(lam));
  44. P0ir_LD(iIR) = 1; %power/nm
  45. % Generate bulk tissue optical property spectra
  46. [muspTIS, muaTIS, nTIS] = tissueOptProps_func(lam);
  47. % Generate matrix of extinction coefficients for oxy- and deoxy-hemoglobin
  48. E_OD = makeE('OD',lam); %(1/mm)/uM
  49. %% ########## Calculate total path-length in bulk tissue <L> ##############
  50. % Infinitesimal perturbation for numerical derivative
  51. dmua_numDer = 1e-6; %1/mm
  52. % Initialize optical property structure
  53. optProp.nin=[];
  54. optProp.nout=1;
  55. optProp.musp=[]; %1/mm
  56. optProp.mua=[]; %1/mm
  57. % Loop through wavelength and calculate <L> for each
  58. L = NaN(size(lam));
  59. for i = 1:length(lam)
  60. % Set refractive index and reduced scattering coefficient
  61. optProp.nin=nTIS(i);
  62. optProp.musp=muspTIS(i); %1/mm
  63. % Calculate transmittance Green's function with a symmetric
  64. % infinitesimal perturbation
  65. optProp.mua=muaTIS(i)-dmua_numDer/2; %1/mm
  66. Tgrn_0 = Tslab(rho, s, optProp, m_max); %1/mm^2
  67. optProp.mua=muaTIS(i)+dmua_numDer/2; %1/mm
  68. Tgrn_1 = Tslab(rho, s, optProp, m_max); %1/mm^2
  69. % Find <L> via numerical derivative
  70. L(i) = -(log(Tgrn_1)-log(Tgrn_0))/dmua_numDer; %mm
  71. end
  72. %% ########## Loop over all arterial oxygen saturations ###################
  73. % Variable initialization (below)
  74. % Intensity spectra emitted from tissue for illumination from the RED or
  75. % IR LED (wavelength,SaO2,Melanin,FWHM)
  76. IredLED = NaN(length(lam),length(SaO2_all),length(Mfrac_all), ...
  77. length(LEDfwhm_all));
  78. IirLED = NaN(length(lam),length(SaO2_all),length(Mfrac_all), ...
  79. length(LEDfwhm_all));
  80. % Ratio-of-ratios for LDs or LEDs (SaO2,Melanin,FWHM)
  81. RoR_LD = NaN(length(SaO2_all),length(Mfrac_all),length(LEDfwhm_all));
  82. RoR_LED = NaN(length(SaO2_all),length(Mfrac_all),length(LEDfwhm_all));
  83. % Recovered arterial oxygen saturations for LDs, LEDs with nominal
  84. % extinction coefficients, or LEDs with weighted extinction coefficients
  85. % (SaO2,Melanin,FWHM)
  86. sat_LD_rec = NaN(length(SaO2_all),length(Mfrac_all),length(LEDfwhm_all));
  87. sat_LED_rec = NaN(length(SaO2_all),length(Mfrac_all),length(LEDfwhm_all));
  88. satw_LED_rec = NaN(length(SaO2_all),length(Mfrac_all),length(LEDfwhm_all));
  89. % SaO2 loop
  90. for SaO2ind = 1:length(SaO2_all)
  91. % Calculate changes in absorption given total-hemoglobin concentration
  92. % and arterial oxygen saturation
  93. dO = dTart*SaO2_all(SaO2ind); %uM
  94. dD = dTart-dO; %uM
  95. dmua = E_OD*[dO;dD]; %1/mm
  96. %% ########## Transmittance Green's functions #########################
  97. % Loop through wavelength and calculate Green's function during
  98. % systolic and diastolic phases for each wavelength
  99. Tgrn_sys = NaN(size(lam));
  100. Tgrn_dia = NaN(size(lam));
  101. for i = 1:length(lam)
  102. % Set refractive index and reduced scattering coefficient
  103. optProp.nin=nTIS(i);
  104. optProp.musp=muspTIS(i); %1/mm
  105. % Calculate transmittance Green's function with a symmetric
  106. % blood volume perturbation
  107. optProp.mua=muaTIS(i)+dmua(i)/2; %1/mm
  108. Tgrn_sys(i) = Tslab(rho, s, optProp, m_max); %1/mm^2
  109. optProp.mua=muaTIS(i)-dmua(i)/2; %1/mm
  110. Tgrn_dia(i) = Tslab(rho, s, optProp, m_max); %1/mm^2
  111. end
  112. %% ########## Loop through melanin concentrations #####################
  113. for melInd = 1:length(Mfrac_all)
  114. % Absorption of epidermis from melanosomes using Equation 8 in:
  115. % S. L. Jacques, "Optical properties of biological tissues: a
  116. % review," PMB, vol. 58, no. 11, pp. R37–R61, May 2013,
  117. % doi: 10.1088/0031-9155/58/11/r37
  118. muaEPI = Mfrac_all(melInd) * 51.9*(lam/500).^-3.5; %1/mm
  119. %% Determine length through epidermal melanin filter
  120. if useMCpathlen
  121. % Find index of closest melanin concentration in Monte Carlo
  122. % data
  123. [~,iM_MC] = min(abs( MCavg.Mfracs - Mfrac_all(melInd) ));
  124. % Map partial path-lengths from Monte Carlo onto the simulated
  125. % wavelengths
  126. tmpLam = movmean(MCavg.lams, 10); %nm
  127. tmpL = movmean(MCavg.l(iM_MC,:,1), 10); %mm
  128. d = interp1(tmpLam, tmpL, lam, ...
  129. 'linear','extrap'); %mm
  130. else
  131. % Assume 0.25 mm thick on each side
  132. d = 0.25*2; %mm
  133. end
  134. %% ########## Loop through FWHM cases #############################
  135. for fwhmInd = 1:length(LEDfwhm_all)
  136. % Generate LED emission spectra
  137. P0red_LED = LEDspec_func(lam, lamRED, LEDfwhm_all(fwhmInd));
  138. P0ir_LED = LEDspec_func(lam, lamIR, LEDfwhm_all(fwhmInd));
  139. %% ########## Model spectra reaching the detector #############
  140. % Spectra for LD and systolic or diastolic cases (will be the
  141. % same for every FWHM loop iteration)
  142. IredLD_sys = P0red_LD .* exp(-muaEPI.*d) .* Tgrn_sys;
  143. IirLD_sys = P0ir_LD .* exp(-muaEPI.*d) .* Tgrn_sys;
  144. IredLD_dia = P0red_LD .* exp(-muaEPI.*d) .* Tgrn_dia;
  145. IirLD_dia = P0ir_LD .* exp(-muaEPI.*d) .* Tgrn_dia;
  146. % Spectra for LED and systolic or diastolic cases (will depend
  147. % on FWHM loop iteration)
  148. IredLED_sys = P0red_LED .* exp(-muaEPI.*d) .* Tgrn_sys;
  149. IirLED_sys = P0ir_LED .* exp(-muaEPI.*d) .* Tgrn_sys;
  150. IredLED_dia = P0red_LED .* exp(-muaEPI.*d) .* Tgrn_dia;
  151. IirLED_dia = P0ir_LED .* exp(-muaEPI.*d) .* Tgrn_dia;
  152. % Find average spectra reaching the detectors for the LED case
  153. IredLED(:,SaO2ind,melInd,fwhmInd) = ...
  154. (IredLED_sys+IredLED_dia)/2;
  155. IirLED(:,SaO2ind,melInd,fwhmInd) = ...
  156. (IirLED_sys+IirLED_dia)/2;
  157. %% ########## Find detected signals ###########################
  158. % Sum spectra reaching the detectors to find detected signal
  159. % for LDs during systolic and diastolic phases (will be the
  160. % same for every FWHM loop iteration)
  161. IredLD_sys_det = sum(IredLD_sys);
  162. IirLD_sys_det = sum(IirLD_sys);
  163. IredLD_dia_det = sum(IredLD_dia);
  164. IirLD_dia_det = sum(IirLD_dia);
  165. % Sum spectra reaching the detectors to find detected signal
  166. % for LEDs during systolic and diastolic phases (will depend
  167. % on FWHM loop iteration)
  168. IredLED_sys_det = sum(IredLED_sys);
  169. IirLED_sys_det = sum(IirLED_sys);
  170. IredLED_dia_det = sum(IredLED_dia);
  171. IirLED_dia_det = sum(IirLED_dia);
  172. %% ########## Calculate ratio-of-ratios #######################
  173. RoR_LD(SaO2ind,melInd,fwhmInd) = ...
  174. ((IredLD_sys_det-IredLD_dia_det)/IredLD_dia_det)/...
  175. ((IirLD_sys_det-IirLD_dia_det)/IirLD_dia_det);
  176. RoR_LED(SaO2ind,melInd,fwhmInd) = ...
  177. ((IredLED_sys_det-IredLED_dia_det)/IredLED_dia_det)/...
  178. ((IirLED_sys_det-IirLED_dia_det)/IirLED_dia_det);
  179. %% ########## Apply modified Beer Lambert law #################
  180. % Generate matrix of extinction coefficients for oxy- and
  181. % deoxy-hemoglobin only at the nominal wavelengths
  182. E_mBLL = makeE('OD', [lamRED,lamIR]);
  183. % Calculate recovered absorption changes for LDs
  184. dmuaRED_LD = -log(IredLD_sys_det/IredLD_dia_det)/L(iRED);
  185. dmuaIR_LD = -log(IirLD_sys_det/IirLD_dia_det)/L(iIR);
  186. % Convert absorption to concentration and calculate recovered
  187. % oxygen saturation for LDs
  188. dC_LD = E_mBLL\[dmuaRED_LD;dmuaIR_LD];
  189. dO_LD_rec = dC_LD(1);
  190. dD_LD_rec = dC_LD(2);
  191. sat_LD_rec(SaO2ind,melInd,fwhmInd) = ...
  192. dO_LD_rec / (dO_LD_rec+dD_LD_rec);
  193. % Calculate recovered absorption changes for LEDs
  194. dmuaRED_LED = -log(IredLED_sys_det/IredLED_dia_det)/L(iRED);
  195. dmuaIR_LED = -log(IirLED_sys_det/IirLED_dia_det)/L(iIR);
  196. % Convert absorption to concentration and calculate recovered
  197. % oxygen saturation for LDs
  198. dC_LED = E_mBLL\[dmuaRED_LED;dmuaIR_LED];
  199. dO_LED_rec = dC_LED(1);
  200. dD_LED_rec = dC_LED(2);
  201. sat_LED_rec(SaO2ind,melInd,fwhmInd) = ...
  202. dO_LED_rec / (dO_LED_rec+dD_LED_rec);
  203. %% ########## Implement weighted extinction coefficients ######
  204. % Generate extinction spectra for oxy- and deoxy-hemoglobin
  205. extO = makeE('O',lam);
  206. extD = makeE('D',lam);
  207. % Weight extinction coefficients by the spectra reaching the
  208. % detectors
  209. Wred = IredLED(:,SaO2ind,melInd,fwhmInd);
  210. Wir = IirLED(:,SaO2ind,melInd,fwhmInd);
  211. extOred = sum(Wred.*extO)/sum(Wred);
  212. extDred = sum(Wred.*extD)/sum(Wred);
  213. extOir = sum(Wir.*extO)/sum(Wir);
  214. extDir = sum(Wir.*extD)/sum(Wir);
  215. % Convert absorption to concentration and calculate recovered
  216. % oxygen saturation considering weighted coefficients for LEDs
  217. Ew_mBLL = [
  218. extOred, extDred;
  219. extOir, extDir
  220. ];
  221. dCw_LED = Ew_mBLL\[dmuaRED_LED;dmuaIR_LED];
  222. dOw_LED_rec = dCw_LED(1);
  223. dDw_LED_rec = dCw_LED(2);
  224. satw_LED_rec(SaO2ind,melInd,fwhmInd) = ...
  225. dOw_LED_rec / (dOw_LED_rec+dDw_LED_rec);
  226. end
  227. end
  228. end
  229. %% ########## Plot -- Modeled Spectra #####################################
  230. cols = lines(7);
  231. Mind = length(Mfrac_all);
  232. [~,satInd] = min(abs(SaO2_all-0.95));
  233. [~,fwhmInd] = min(abs(LEDfwhm_all-50));
  234. figure(101); clf;
  235. % -------------------------------------------------------------------------
  236. subplot(2,1,1); hold on;
  237. plot(lam, LEDspec_func(lam, lamRED, LEDfwhm_all(fwhmInd)), '-',...
  238. 'Color',cols(7,:));
  239. xlim([-100,100]+lamRED);
  240. ylim([0,1]);
  241. ylabel('$P/P_{max}$');
  242. xlabel('Wavelength (nm)');
  243. title('Red LED');
  244. pos = get(gca,"Position");
  245. legend( ...
  246. 'Source Emission', ...
  247. 'Orientation','horizontal', ...
  248. 'Location','northoutside');
  249. set(gca, "Position",pos);
  250. % -------------------------------------------------------------------------
  251. subplot(2,1,2); hold on;
  252. plot(lam, LEDspec_func(lam, lamRED, LEDfwhm_all(fwhmInd)), '--',...
  253. 'Color',cols(7,:));
  254. tmp = IredLED(:,satInd,Mind,fwhmInd);
  255. plot(lam, tmp/max(tmp), '-',...
  256. 'Color',cols(7,:));
  257. xlim([-100,100]+lamRED);
  258. ylim([0,1]);
  259. ylabel('$I/I_{max}$');
  260. xlabel('Wavelength (nm)');
  261. title('Red LED');
  262. pos = get(gca,"Position");
  263. legend( ...
  264. 'Source Emission', ...
  265. 'Detected Spectrum', ...
  266. 'Orientation','vertical', ...
  267. 'Location','northoutside');
  268. set(gca, "Position",pos);
  269. % -------------------------------------------------------------------------
  270. % Absorption of epidermis from melanosomes using Equation 8 in:
  271. % S. L. Jacques, "Optical properties of biological tissues: a
  272. % review," PMB, vol. 58, no. 11, pp. R37–R61, May 2013,
  273. % doi: 10.1088/0031-9155/58/11/r37
  274. muaEPI = Mfrac_all(Mind) * 51.9*(lam/500).^-3.5; %1/mm
  275. [~,iM_MC] = min(abs( MCavg.Mfracs - Mfrac_all(Mind) ));
  276. tmpLam = movmean(MCavg.lams, 10);
  277. tmpL = movmean(MCavg.l(iM_MC,:,1), 10);
  278. d = interp1(tmpLam, tmpL, lam, ...
  279. 'linear','extrap');
  280. figure(102); clf;
  281. yyaxis left;
  282. plot(lam, muaEPI);
  283. ylabel('$\mu_a$ (mm$^{-1}$)');
  284. yyaxis right;
  285. plot(lam, d);
  286. ylabel('$\langle \ell \rangle$ (mm)', ...
  287. 'Interpreter','latex');
  288. xlim(lam([1,end]));
  289. xlabel('Wavelength (nm)');
  290. title('Epidermis Properties');
  291. % -------------------------------------------------------------------------
  292. figure(103); clf;
  293. yyaxis left;
  294. plot(lam, muaTIS);
  295. ylabel('$\mu_a$ (mm$^{-1}$)');
  296. yyaxis right;
  297. plot(lam, L);
  298. ylabel('$\langle L \rangle$ (mm)');
  299. xlim(lam([1,end]));
  300. xlabel('Wavelength (nm)');
  301. title('Bulk Tissue Properties');
  302. %% ########## Plot -- SaO2 vs. RoR ########################################
  303. colsM=flipud(copper(length(Mfrac_all)));
  304. [~,fwhmInd] = min(abs(LEDfwhm_all-50));
  305. figure(200); clf;
  306. % -------------------------------------------------------------------------
  307. ax1 = subplot(2,2,1);
  308. slp_LD = NaN(size(Mfrac_all));
  309. for i = 1:length(Mfrac_all)
  310. plot(RoR_LD(:,i,fwhmInd), SaO2_all,'-',...
  311. 'Color',colsM(i,:));
  312. hold on;
  313. p = polyfit(RoR_LD(:,i,fwhmInd),SaO2_all,1);
  314. slp_LD(i) = p(1);
  315. end
  316. xlabel('Recovered Ratio-of-Ratios');
  317. ylabel('Modeled SaO$_2$');
  318. title('(a) LDs');
  319. % -------------------------------------------------------------------------
  320. ax2 = subplot(2,2,2);
  321. slp_LED = NaN(size(Mfrac_all));
  322. for i = 1:length(Mfrac_all)
  323. plot(RoR_LED(:,i,fwhmInd), SaO2_all,'-',...
  324. 'Color',colsM(i,:));
  325. hold on;
  326. p = polyfit(RoR_LED(:,i,fwhmInd),SaO2_all,1);
  327. slp_LED(i) = p(1);
  328. end
  329. xlabel('Recovered Ratio-of-Ratios');
  330. ylabel('Modeled SaO$_2$');
  331. title('(b) LEDs');
  332. linkaxes([ax1,ax2], 'xy');
  333. xlim([0.3,1.3]);
  334. % -------------------------------------------------------------------------
  335. ax3 = subplot(2,2,3);
  336. plot(Mfrac_all,slp_LD, '-k'); hold on;
  337. for i = 1:length(Mfrac_all)
  338. plot(Mfrac_all(i),slp_LD(i), 'o', 'Color',colsM(i,:));
  339. end
  340. xlabel('Melanin Volume Fraction');
  341. ylabel('Slope of (a)');
  342. title('(c) LDs');
  343. % -------------------------------------------------------------------------
  344. ax4 = subplot(2,2,4);
  345. plot(Mfrac_all,slp_LED, '-k'); hold on;
  346. for i = 1:length(Mfrac_all)
  347. plot(Mfrac_all(i),slp_LED(i), 'o', 'Color',colsM(i,:));
  348. end
  349. xlabel('Melanin Volume Fraction');
  350. ylabel('Slope of (b)');
  351. title('(d) LEDs');
  352. linkaxes([ax3,ax4], 'xy');
  353. ylim([-0.38,-0.3]);
  354. %% ########## Plot -- Application of weighted extinction coefficients #####
  355. colsM = flipud(copper(length(Mfrac_all)));
  356. [~,fwhmInd] = min(abs(LEDfwhm_all-50));
  357. figure(300); clf;
  358. % -------------------------------------------------------------------------
  359. ax1 = subplot(2,2,1);
  360. for i = 1:length(Mfrac_all)
  361. plot(SaO2_all, sat_LD_rec(:,i,fwhmInd)-SaO2_all.', '-', ...
  362. 'Color',colsM(i,:)); hold on;
  363. end
  364. xlabel('Modeled SaO$_2$');
  365. ylabel('SaO$_{2,recovered}$ $-$ SaO$_{2,modeled}$');
  366. title('(a) LDs with Assumed $\epsilon$s');
  367. % -------------------------------------------------------------------------
  368. ax2 = subplot(2,2,2);
  369. for i = 1:length(Mfrac_all)
  370. plot(SaO2_all, sat_LED_rec(:,i,fwhmInd)-SaO2_all.', '-', ...
  371. 'Color',colsM(i,:)); hold on;
  372. end
  373. xlabel('Modeled SaO$_2$');
  374. ylabel('SaO$_{2,recovered}$ $-$ SaO$_{2,modeled}$');
  375. title('(b) LEDs with Assumed $\epsilon$s');
  376. % -------------------------------------------------------------------------
  377. subplot(2,2,3);
  378. cb = colorbar;
  379. cb.Limits = Mfrac_all([1,end]);
  380. cb.Ticks = round(Mfrac_all,2);
  381. cb.Label.String = 'Melanin Volume Fraction';
  382. cb.Position = cb.Position + [-0.1, 0, 0.01, 0];
  383. clim(Mfrac_all([1,end]));
  384. colormap(colsM);
  385. axis off;
  386. % -------------------------------------------------------------------------
  387. ax4 = subplot(2,2,4);
  388. for i = 1:length(Mfrac_all)
  389. plot(SaO2_all, satw_LED_rec(:,i,fwhmInd)-SaO2_all.', '-', ...
  390. 'Color',colsM(i,:)); hold on;
  391. end
  392. xlabel('Modeled SaO$_2$');
  393. ylabel('SaO$_{2,recovered}$ $-$ SaO$_{2,modeled}$');
  394. title('(c) LEDs with Weighted $\epsilon$s');
  395. linkaxes([ax1,ax2,ax4], 'xy');
  396. %% ########## Plot -- Dependance on LED FWHM ##############################
  397. colsM = flipud(copper(length(Mfrac_all)));
  398. figure(400); clf;
  399. % -------------------------------------------------------------------------
  400. ax1 = subplot(1,2,1);
  401. for i = 1:length(Mfrac_all)
  402. plot([0,LEDfwhm_all], ...
  403. [squeeze(rms(sat_LD_rec(:,i,1) - SaO2_all.'));...
  404. squeeze(rms(sat_LED_rec(:,i,:) - SaO2_all.'))], '-', ...
  405. 'Color',colsM(i,:)); hold on;
  406. end
  407. xlabel('Source FWHM (nm)');
  408. ylabel('SaO$_2$ RMS Error');
  409. title('(a) Assumed $\epsilon$s');
  410. % -------------------------------------------------------------------------
  411. ax2 = subplot(1,2,2);
  412. for i = 1:length(Mfrac_all)
  413. plot([0,LEDfwhm_all], ...
  414. [squeeze(rms(sat_LD_rec(:,i,1) - SaO2_all.'));...
  415. squeeze(rms(satw_LED_rec(:,i,:) - SaO2_all.'))], '-', ...
  416. 'Color',colsM(i,:)); hold on;
  417. end
  418. xlabel('Source FWHM (nm)');
  419. ylabel('SaO$_2$ RMS Error');
  420. title('(b) Weighted $\epsilon$s');
  421. pos = get(gca,'Position');
  422. cb = colorbar;
  423. cb.Limits = Mfrac_all([1,end]);
  424. cb.Ticks = round(Mfrac_all,2);
  425. cb.Label.String = 'Melanin Volume Fraction';
  426. clim(Mfrac_all([1,end]));
  427. colormap(colsM);
  428. set(gca,'Position',pos);
  429. linkaxes([ax1,ax2],'xy');
  430. %% ########################################################################
  431. %% ########## Functions ###################################################
  432. %% ########################################################################
  433. % =============== LED Spectra =============================================
  434. function [P0_LED] = LEDspec_func(lam, lamPK, lamFWHM)
  435. % Generate Gaussian and normalize
  436. P0_LED = normpdf(lam, ...
  437. lamPK, lamFWHM/(2*sqrt(2*log(2))));
  438. P0_LED = P0_LED/max(P0_LED);
  439. end
  440. % =============== Tissue Optical Properties ===============================
  441. function [muspTIS, muaTIS, nTIS] = tissueOptProps_func(lam, NVA)
  442. % Tissue optical properties based on:
  443. % S. L. Jacques, "Optical properties of biological tissues: a
  444. % review," PMB, vol. 58, no. 11, pp. R37–R61, May 2013,
  445. % doi: 10.1088/0031-9155/58/11/r37
  446. % By default use relative tissue volumes from model in:
  447. % G. Blaney, J. Frias, F. Tavakoli, A. Sassaroli, and S. Fantini,
  448. % "Dual-ratio approach to pulse oximetry and the effect of skin tone,"
  449. % JBO, vol. 29, no. S3, p. S33311, Oct. 2024,
  450. % doi: 10.1117/1.JBO.29.S3.S33311
  451. % Thus V_tisTyp/V_tot,noEpi are:
  452. % Bone = 0.119
  453. % Muscle = 0.457
  454. % Fat = 0.228
  455. % Dermis = 0.196
  456. arguments
  457. lam (:,1) double; %nm
  458. NVA.T (1,1) double = ...
  459. 69.8*0.119 + 117*0.457 + 12.5*0.228 + 4.70*0.196; %uM
  460. NVA.S (1,1) double = ...
  461. 0.875*0.119 + 0.641*0.457 + 0.760*0.228 + 0.390*0.196;
  462. NVA.W (1,1) double = ...
  463. 0.318*0.119 + 0.795*0.457 + 0.110*0.228 + 0.650*0.196;
  464. NVA.L (1,1) double = ...
  465. 0.00*0.119 + 0.00*0.457 + 0.69*0.228 + 0.00*0.196;
  466. NVA.ap (1,1) double = ...
  467. 15.3*0.119 + 13.0*0.457 + 34.2*0.228 + 43.6*0.196; %1/cm
  468. NVA.fray (1,1) double = ...
  469. 0.022*0.119 + 0.000*0.457 + 0.260*0.228 + 0.410*0.196;
  470. NVA.bMie (1,1) double = ...
  471. 0.326*0.119 + 0.926*0.457 + 0.567*0.228 + 0.562*0.196;
  472. end
  473. %% musp
  474. ap = NVA.ap; % 1/cm
  475. fRay = NVA.fray;
  476. bMie = NVA.bMie;
  477. % Combination of Rayleigh and Mie scattering
  478. muspTIS = ap*0.1*(fRay*(lam/500).^-4 ...
  479. + (1-fRay)*(lam/500).^-bMie); %1/mm
  480. %% mua
  481. T = NVA.T; % uM
  482. S = NVA.S;
  483. W = NVA.W;
  484. L = NVA.L;
  485. % Beer's law
  486. E_ODWL = makeE('ODWL', lam);
  487. muaTIS = E_ODWL * [T*S; T*(1-S); W; L];
  488. %% n
  489. % https://www.engineersedge.com/physics/refraction_for_water__15690.htm
  490. % at 40 deg C
  491. n_waterRef=[...
  492. 226.50, 361.05, 404.41, 589.00, 632.80, 1013.98;
  493. 1.39046, 1.34540, 1.34065, 1.33095, 1.32972, 1.32296].';
  494. n_water=interp1(n_waterRef(:, 1), n_waterRef(:, 2), lam, ...
  495. 'linear', 'extrap');
  496. % Equation 3 in:
  497. % S. L. Jacques, "Optical properties of biological tissues: a
  498. % review," PMB, vol. 58, no. 11, pp. R37–R61, May 2013,
  499. % doi: 10.1088/0031-9155/58/11/r37
  500. n_dry = 1.514;
  501. nTIS = n_dry - (n_dry - n_water) * W;
  502. end
  503. % =============== Transmittance Green's Function ==========================
  504. function T = Tslab(rho, s, optProp, m_max)
  505. % Transmitance for a slab with extrapolated boundary
  506. % Equation 4.35 in:
  507. % F. Martelli, S. Del Bianco, A. Ismaelli, and G. Zaccanti, Light
  508. % Propagation through Biological Tissue and Other Diffusive Media.
  509. % 1000 20th Street, Bellingham, WA 98227-0010 USA: SPIE, 2010.
  510. % doi: 10.1117/3.824746
  511. arguments (Input)
  512. rho (1,1) double; %mm -- Source detector distance
  513. s (1,1) double; %mm -- Slab thickness
  514. optProp struct = [];
  515. m_max (1,1) double = 100;
  516. end
  517. arguments (Output)
  518. T (1,1) double; %1/mm^2 -- Transmittance Green's function
  519. end
  520. % Set default optical properties if input not given
  521. if isempty(optProp)
  522. clear optProp;
  523. optProp.nin=1.4;
  524. optProp.nout=1;
  525. optProp.musp=1.1; %1/mm
  526. optProp.mua=0.011; %1/mm
  527. warning('Default optical properties used');
  528. end
  529. mua = optProp.mua; %1/mm
  530. D = 1/(3*optProp.musp); %mm
  531. zs = 1/optProp.musp; %mm
  532. A = n2A(optProp.nin,optProp.nout);
  533. ze = 2*A*D; %mm
  534. m = (-m_max:m_max).';
  535. z1m = (1-2*m)*s - 4*m*ze - zs; %mm
  536. z2m = (1-2*m)*s - (4*m-2)*ze + zs; %mm
  537. T = (1/(4*pi)) * sum( ...
  538. z1m.*(rho^2+z1m.^2).^(-3/2) .* ...
  539. (1+(mua*(rho^2+z1m.^2)/D).^(1/2)) .* ...
  540. exp(-(mua*(rho^2+z1m.^2)/D).^(1/2)) - ...
  541. z2m.*(rho^2+z2m.^2).^(-3/2) .* ...
  542. (1+(mua*(rho^2+z2m.^2)/D).^(1/2)) .* ...
  543. exp(-(mua*(rho^2+z2m.^2)/D).^(1/2)) ...
  544. ); %1/mm^2
  545. end
  546. % =============== Reflection Parameter ====================================
  547. function A = n2A(nin, nout)
  548. % Based on:
  549. % R. Aronson, "Boundary conditions for diffusion of light," JOSA A,
  550. % vol. 12, no. 11, pp. 2532–2539, Nov. 1995, doi: 10/dff63n.
  551. % A = n2A(nin,nout)
  552. % Inputs:
  553. % nin - Index of refraction inside medium
  554. % nout - Index of refraction outside medium
  555. % Output:
  556. % A - Index of refraction mismatch parameter
  557. if nargin==0
  558. dan12=1.4;
  559. else
  560. dan12=nin/nout;
  561. end
  562. if dan12>1
  563. A=504.332889-2641.00214*dan12+...
  564. 5923.699064*dan12.^2-7376.355814*dan12^3+...
  565. 5507.53041*dan12^4-2463.357945*dan12^5+...
  566. 610.956547*dan12^6-64.8047*dan12^7;
  567. elseif dan12<1
  568. A=3.084635-6.531194*dan12+...
  569. 8.357854*dan12^2-5.082751*dan12^3+1.171382*dan12^4;
  570. else
  571. A=1;
  572. end
  573. end
  574. % =============== Extinction Coefficients ===============
  575. function E = makeE(chroms, lambda)
  576. % E = makeE(chroms, lambda)
  577. % Giles Blaney Spring 2021
  578. %
  579. % Inputs: - chroms: String of chromophores to include in E.
  580. % Available chromophores:
  581. % - O: Oxyhemoglobin
  582. % - D: Deoxyhemoglobin
  583. % - W: Water
  584. % - L: Lipid
  585. % (Default: 'OD')
  586. % Spaces are ignored.
  587. % - lambda: Vectors of wavelengths (nm).
  588. % (Default: [830, 690])
  589. %
  590. % Output: - E: Extinction coefficient matrix.
  591. % Units: 1/(mm uM) for O, D, CCOo, and CCOr
  592. % 1/mm for W, L, and C
  593. % size(E)=[length(lambda), length(chroms)];
  594. % Defined as mua=E*C
  595. % Order of C is defined by order in chroms input
  596. % Relevant references in .mat files for each chromophore
  597. if nargin<=0
  598. chroms='OD';
  599. end
  600. if nargin<=1
  601. lambda=[830, 690]; %nm
  602. end
  603. if size(lambda, 1)==1
  604. lambda=lambda';
  605. end
  606. chroms=chroms(~isspace(chroms));
  607. E=[];
  608. while ~isempty(chroms)
  609. switch chroms(1)
  610. case 'O' %Oxy
  611. blood=load('Bext.mat');
  612. Oext=interp1(blood.Blambda, blood.Oext, lambda,...
  613. 'linear', 'extrap');
  614. Oext(Oext<0)=0;
  615. E=[E, Oext];
  616. case 'D' %Deoxy
  617. blood=load('Bext.mat');
  618. Dext=interp1(blood.Blambda, blood.Dext, lambda,...
  619. 'linear', 'extrap');
  620. Dext(Dext<0)=0;
  621. E=[E, Dext];
  622. case 'W' %Water
  623. water=load('Wext.mat');
  624. Wext=interp1(water.Wlambda, water.Wmua, lambda,...
  625. 'linear', 'extrap');
  626. Wext(Wext<0)=0;
  627. E=[E, Wext];
  628. case 'L' %Lipid
  629. lipid=load('Lext.mat');
  630. Lext=interp1(lipid.Llambda, lipid.Lmua, lambda,...
  631. 'linear', 'extrap');
  632. Lext(Lext<0)=0;
  633. E=[E, Lext];
  634. otherwise
  635. warning(['Unknown chromophore' chroms(1) ', ignored']);
  636. end
  637. chroms(1)=[];
  638. end
  639. end

LEDspecColor_forPUB.m at commit 24e6c13, no license · at the source

Overview

  1. Tufts University, Department of Biomedical Engineering, Medford, Massachusetts, United States
Institutions: Tufts University (United States)
Journal: Biophotonics discovery, volume 3, issue 2, article 025003
Dates: received 5 December 2025; accepted 25 February 2026; published online 24 March 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1117/1.bios.3.2.025003 · PMID 42038099 · PMCID PMC13107251 · OpenAlex W4417143741
Open access: hybrid, a free copy (OpenAlex)
Status: code verified (how the code is found and verified)
Categories: fNIRS (modality), human (organism), computational (subfield)
Methods: Graphs, fMRI & imaging, Smoothing, state filtering, decompositions
Keywords: functional near-infrared spectroscopy, diffuse optics, dual-slope, frequency-domain near-infrared spectroscopy, multi-layer model, Monte Carlo simulations
Topic: Optical Imaging and Spectroscopy Techniques (Radiology, Nuclear Medicine and Imaging, Medicine), according to OpenAlex
Funding: NHLBI NIH HHS (K99 HL181290)
Citations: not cited yet (Europe PMC); 41 references in the paper

Abstract

Significance: Functional near-infrared spectroscopy (fNIRS) is impacted by signal contamination from superficial hemodynamics. It is important to develop methods that account for such contamination and provide accurate measurements of cerebral hemodynamics.

Aim: We aim to investigate whether simulated data with two- or three-layer tissue models are able to reproduce in vivo data collected with dual-slope (DS) frequency-domain (FD) near-infrared spectroscopy (NIRS) on human subjects during brain activation.

Approach: We performed Monte Carlo simulations to generate DS FD-NIRS data from two- and three-layer media with a range of layer thicknesses and optical properties. We collected in vivo data with DS FD-NIRS (source-detector distances: 25 and 37 mm, wavelengths: 690 and 830 nm, and modulation frequency: 140 MHz) over the occipital lobe of human subjects during visual stimulation. Simulated and in vivo data were analyzed with diffusion theory for a homogeneous medium, and results were compared for each DS FD-NIRS data type.

Results: We found that the main qualitative features of in vivo data could be reproduced by simulated data from a three-layer medium, with a second layer (representing the cerebrospinal fluid in the subarachnoid space) that is less absorbing and less scattering than the other two layers, and with a top layer thickness that represents the combined scalp and skull thickness.

Conclusions: A three-layer model is a viable improvement over a homogeneous model to analyze DS FD-NIRS data (or any other fNIRS data) to generate more accurate measurements of cerebral hemodynamic changes without a need for large datasets for tomographic reconstructions.

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

doit-lab/doit-public

License: none: the authors keep all their rights
State: the link answers, verified on 6 November 2026
Evidence: files inventoried
Commit: 24e6c13b4eb47ca4ae5188eabad86c7bbdb4c059, 9 July 2026
Languages: MATLAB (199)
Size: 438 files, 199 scripts
Software Heritage: not archived
Found in: “Code and Data Availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 2 checks, the latest on 6 November 2026: the link answers
  • 6 November 2026: the link answers
  • 30 September 2026: the link answers
199 files

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

Tracing map

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

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 199 scripts, each with its path and the digest of its content;
  • 10 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.

Code and Data Availability

Data and code will be made available at the following repository: https://github.com/DOIT-Lab/DOIT-Public/tree/master/ThreeLayer_BiophotonicsDiscovery.

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

Recorded: type, language, journal, volume, issue, pages, dates, 4 authors, 6 keywords, 1 funder, 40 references.

Cite

This paper

Frias, J., Blaney, G., Sassaroli, A., & Fantini, S. (2026). Functional dual-slope frequency-domain near-infrared spectroscopy data interpreted with two- and three-layer models. Biophotonics discovery, 3(2), 025003. https://doi.org/10.1117/1.bios.3.2.025003

BibTeX

@article{frias2026functional,
author = {Frias, Jodee and Blaney, Giles and Sassaroli, Angelo and Fantini, Sergio},
title = {{Functional dual-slope frequency-domain near-infrared spectroscopy data interpreted with two- and three-layer models}},
journal = {Biophotonics discovery},
year = {2026},
month = mar,
volume = {3},
number = {2},
pages = {025003},
publisher = {Society of Photo-Optical Instrumentation Engineers},
issn = {3005-4745},
doi = {10.1117/1.bios.3.2.025003},
url = {https://doi.org/10.1117/1.bios.3.2.025003},
pmid = {42038099},
pmcid = {PMC13107251}
}

RIS

TY - JOUR
AU - Frias, Jodee
AU - Blaney, Giles
AU - Sassaroli, Angelo
AU - Fantini, Sergio
TI - Functional dual-slope frequency-domain near-infrared spectroscopy data interpreted with two- and three-layer models
T2 - Biophotonics discovery
J2 - Biophotonics Discov
PY - 2026
DA - 2026/03/24
VL - 3
IS - 2
SP - 025003
SN - 3005-4745
PB - Society of Photo-Optical Instrumentation Engineers
DO - 10.1117/1.bios.3.2.025003
UR - https://doi.org/10.1117/1.bios.3.2.025003
LA - en
ER -

CSL-JSON

{
"id": "10.1117/1.bios.3.2.025003",
"type": "article-journal",
"title": "Functional dual-slope frequency-domain near-infrared spectroscopy data interpreted with two- and three-layer models",
"container-title": "Biophotonics discovery",
"author": [
{
"family": "Frias",
"given": "Jodee"
},
{
"family": "Blaney",
"given": "Giles"
},
{
"family": "Sassaroli",
"given": "Angelo"
},
{
"family": "Fantini",
"given": "Sergio"
}
],
"container-title-short": "Biophotonics Discov",
"volume": "3",
"issue": "2",
"page": "025003",
"DOI": "10.1117/1.bios.3.2.025003",
"PMID": "42038099",
"PMCID": "PMC13107251",
"ISSN": "3005-4745",
"publisher": "Society of Photo-Optical Instrumentation Engineers",
"URL": "https://doi.org/10.1117/1.bios.3.2.025003",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
24
]
]
}
}

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.1117/1.nph.10.1.013508 [code]
Dual-slope imaging of cerebral hemodynamics with frequency-domain near-infrared spectroscopy.
Journal: Neurophotonics
In common: Wavelet Toolbox, CircStat, Optimization Toolbox, 3 other tools, fNIRS, 12 references, 2 authors
[2] doi:10.1117/1.nph.9.s2.s24001 [code]
Optical imaging and spectroscopy for the study of the human brain: status report.
Journal: Neurophotonics
In common: Signal Processing Toolbox, fNIRS, 10 references, author Giles Blaney
[3] doi:10.1117/1.nph.9.3.035003 [code]
Correction of global physiology in resting-state functional near-infrared spectroscopy.
Journal: Neurophotonics
In common: Wavelet Toolbox, CircStat, Optimization Toolbox, 3 other tools, fNIRS, 3 references
[4] doi:10.1117/1.nph.10.2.025007
Short-separation regression incorporated diffuse optical tomography image reconstruction modeling for high-density functional near-infrared spectroscopy.
Journal: Neurophotonics
In common: fNIRS, 7 references
[5] doi:10.1117/1.nph.12.4.045003 [code]
Anisotropic light propagation in human brain white matter.
Journal: Neurophotonics
In common: computational, 6 references
[6] doi:10.1371/journal.pone.0285581 [code]
Acute effects of nitrate and breakfast on working memory, cerebral blood flow, arterial stiffness, and psychological factors in adolescents: Study protocol for a randomised crossover trial.
Journal: PloS one
In common: Wavelet Toolbox, CircStat, Optimization Toolbox, 3 other tools, 1 reference
[7] doi:10.1162/imag.a.1289 [code]
Measurement prediction and power analysis for fNIRS and DOT.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: Optimization Toolbox, Signal Processing Toolbox, Statistics and Machine Learning Toolbox, fNIRS, 4 references
[8] doi:10.1117/1.nph.12.1.015009 [code]
Revisiting equivalent optical properties for cerebrospinal fluid to improve diffusion-based modeling accuracy in the brain.
Journal: Neurophotonics
In common: fNIRS, computational, 5 references
[9] doi:10.3389/fnhum.2024.1329086 [code]
fNIRS dataset during complex scene analysis.
Journal: Frontiers in human neuroscience
In common: Wavelet Toolbox, Optimization Toolbox, Parallel Computing Toolbox, 2 other tools, fNIRS, 1 reference
[10] doi:10.1117/1.jbo.29.2.025004
Retrieval of chromophore concentration changes in a digital human head model using analytical mean partial pathlengths of photons.
Journal: Journal of biomedical optics
In common: fNIRS, computational, 5 references

Contribute

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

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

Add the badge to the code's README

OSCR: the badge of this paper

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

Markdown
<!-- oscr-badge:start -->
[![OSCR](https://openscicode.org/badge/doi/10.1117/1.bios.3.2.025003.svg)](https://openscicode.org/badge/doi/10.1117/1.bios.3.2.025003)
<!-- oscr-badge:end -->
reStructuredText
.. oscr-badge:start

.. image:: https://openscicode.org/badge/doi/10.1117/1.bios.3.2.025003.svg
   :target: https://openscicode.org/badge/doi/10.1117/1.bios.3.2.025003
   :alt: OSCR

.. oscr-badge:end
HTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.1117/1.bios.3.2.025003"><img src="https://openscicode.org/badge/doi/10.1117/1.bios.3.2.025003.svg" alt="OSCR"></a>
<!-- oscr-badge:end -->

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

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

Request its removal

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

Discussion, reproductions, activity

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

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

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

Report a reproduction failure (signed in)

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

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