Victor Lima
victorporto@ifsc.usp.br
victor.lima@ufscar.br
victorportog.github.io
Release date:
24 March 2025
Last modification:
24 March 2025
This file is part of SkinOptics documentation.
Hey! :)
In this tutorial you can check some examples on how to use the functions available in the following modules: absorption_coefficient, scattering_coefficient, anisotropy_factor and refractive_index.
import numpy as np
import matplotlib
from matplotlib import rcParams, style
import matplotlib.pyplot as plt
import pandas as pd
import findiff
from findiff import FinDiff
print('numpy version:', np.__version__)
print('matplotlib version:', matplotlib.__version__)
print('pandas version:', pd.__version__)
print('findiff version:', findiff.__version__)
numpy version: 1.26.4 matplotlib version: 3.9.0 pandas version: 2.2.2 findiff version: 0.10.0
rcParams.update({'font.size': 12})
rcParams.update({'axes.labelsize': 12})
rcParams.update({'axes.titlesize': 12})
rcParams.update({'xtick.labelsize': 12})
rcParams.update({'ytick.labelsize': 12})
rcParams.update({'legend.fontsize': 10})
rcParams.update({'axes.grid': True})
style.use('seaborn-v0_8-colorblind')
plt.rcParams["figure.figsize"] = (6, 4)
import skinoptics
from skinoptics.utils import *
from skinoptics.absorption_coefficient import *
from skinoptics.scattering_coefficient import *
from skinoptics.anisotropy_factor import *
from skinoptics.refractive_index import *
print('skinoptics version:', skinoptics.__version__)
skinoptics version: 0.0.1b5
all_lambda = np.arange(220, 820)
plt.plot(all_lambda, molarext_eum_Sarna(all_lambda),
'saddlebrown', lw = 2., label = 'eum (Sarna & Swartz 2006)')
plt.plot(all_lambda, molarext_phe_Sarna(all_lambda),
'sandybrown', lw = 2., label = 'phe (Sarna & Swartz 2006)')
all_lambda = np.arange(250, 1000)
plt.plot(all_lambda, molarext_oxy_Prahl(all_lambda),
'r', lw = 2., label = 'oxy (Prahl 1999)')
plt.plot(all_lambda, molarext_deo_Prahl(all_lambda),
'purple', lw = 2., label = 'deo (Prahl 1999)')
all_lambda = np.arange(240, 520)
plt.plot(all_lambda, molarext_bil_Li(all_lambda),
'gold', lw = 2., label = 'bil (Li 1997)')
plt.xlabel('wavelength [nm]')
plt.ylabel('molar extinction coefficient\n[cm$^{-1}$ M$^{-1}$]')
plt.xlim(220, 1000)
plt.ylim(5E1, 1E7)
plt.yscale('log')
plt.legend(loc = 'upper right')
plt.show()
all_lambda = np.arange(214, 820)
plt.plot(all_lambda, molarext_from_ext(ext_eum_Sarna(all_lambda), 178),
'c', lw = 2.)
plt.plot(all_lambda, molarext_from_ext(ext_phe_Sarna(all_lambda), 295),
'purple', lw = 2.)
plt.plot(all_lambda, molarext_eum_Sarna(all_lambda),
'--k', lw = 2., label = 'eumelanin\n(Sarna & Swartz 2006)')
plt.plot(all_lambda, molarext_phe_Sarna(all_lambda),
'gold', ls = '--', lw = 2., label = 'pheomelanin\n(Sarna & Swartz 2006)')
plt.xlabel('wavelength [nm]')
plt.ylabel('molar extinction coefficient\n[cm$^{-1}$ M$^{-1}$]')
plt.legend()
plt.xlim(220, 820)
plt.ylim(0, 15000)
plt.show()
all_lambda = np.arange(200, 1600)
plt.plot(all_lambda, mua_wat_Hale(all_lambda),
'b', lw = 2., label = 'wat (Hale & Querry 1973)')
plt.plot(all_lambda, mua_wat_Segelstein(all_lambda),
'c', ls = '--', lw = 2., label = 'wat (Segelstein 1981)')
all_lambda = np.arange(360, 830)
plt.plot(all_lambda, mua_mel_Jacques(all_lambda),
'saddlebrown', lw = 2., label = 'mel (Jacques 1998)')
all_lambda = np.arange(250, 1000)
plt.plot(all_lambda, mua_oxy_Prahl(all_lambda),
'red', lw = 2., label = 'oxy, 150 g/L (Prahl 1999)')
plt.plot(all_lambda, mua_deo_Prahl(all_lambda),
'purple', ls = '--', lw = 2., label = 'deo, 150 g/L (Prahl 1999)')
all_lambda = np.arange(240, 515)
plt.plot(all_lambda, mua_bil_Li(all_lambda, 0.01),
'gold', lw = 2., label = 'bil, 0.01 g/L (Li 1997)')
all_lambda = np.arange(430, 1098)
plt.plot(all_lambda, mua_fat_vanVeen(all_lambda),
'darkorange', ls = '-', lw = 2, label = 'fat (van Veen et al. 2005)')
all_lambda = np.arange(350, 1100)
plt.plot(all_lambda, mua_baseline(all_lambda),
'gray', lw = 2., label = 'bas, rat skin (Jacques 1998)')
all_lambda = np.arange(450, 750)
plt.plot(all_lambda, mua_baseline2(all_lambda),
'k', ls = '--', lw = 2., label = 'bas, neonate skin (Jacques 1998) ')
plt.xlim(210, 1600)
plt.ylim(1E-5, 1E3)
plt.yscale('log')
plt.xlabel('wavelength [nm]')
plt.ylabel('absorption coefficient [mm$^{-1}$]')
plt.legend(bbox_to_anchor = (1.01, 1.02))
plt.show()
fig, axs = plt.subplots(1, 2,
gridspec_kw = {'wspace': 0.3}, figsize = (12, 4))
all_lambda = np.arange(200, 3000)
axs[0].plot(all_lambda, mua_wat_Hale(all_lambda), 'b', lw = 2., label = 'Hale & Querry 1973')
axs[0].plot(all_lambda, mua_wat_Segelstein(all_lambda), 'c', ls = '--', lw = 2., label = 'Segelstein 1981')
all_lambda = np.arange(900, 1000)
lambda_peak = all_lambda[mua_wat_Hale(all_lambda).argmax()]
axs[0].vlines(lambda_peak, 0, 1E4, 'k', ls = ':', lw = 2., label = '$\lambda$ = {} nm'.format(lambda_peak))
all_lambda = np.arange(1100, 1250)
lambda_peak = all_lambda[mua_wat_Hale(all_lambda).argmax()]
axs[0].vlines(lambda_peak, 0, 1E4, 'k', ls = '--', lw = 2., label = '$\lambda$ = {} nm'.format(lambda_peak))
all_lambda = np.arange(1400, 1500)
lambda_peak = all_lambda[mua_wat_Hale(all_lambda).argmax()]
axs[0].vlines(lambda_peak, 0, 1E4, 'k', ls = '-.', lw = 2., label = '$\lambda$ = {} nm'.format(lambda_peak))
all_lambda = np.arange(1900, 2000)
lambda_peak = all_lambda[mua_wat_Hale(all_lambda).argmax()]
axs[0].vlines(lambda_peak, 0, 1E4, 'k', ls = '-', lw = 2., label = '$\lambda$ = {} nm'.format(lambda_peak))
axs[0].set_xlabel('wavelength [nm]')
axs[0].set_ylabel('absorption coefficient [mm$^{-1}$]')
axs[0].set_yscale('log')
axs[0].set_xlim(200, 3000)
axs[0].set_ylim(5E-6, 1E4)
axs[0].set_title('(a) water', loc = 'left')
axs[0].legend(loc = 'lower right')
all_lambda = np.arange(250, 1000)
axs[1].plot(all_lambda, mua_oxy_Prahl(all_lambda),
color = 'r', lw = 2., label = 'oxyhemoglobin\n150 g/L (Prahl 1999)')
axs[1].plot(all_lambda, mua_deo_Prahl(all_lambda),
color = 'purple', lw = 2., label = 'deoxyhemoglobin\n150 g/L (Prahl 1999)')
all_lambda = np.arange(400, 420)
lambda_peak = all_lambda[mua_oxy_Prahl(all_lambda).argmax()]
axs[1].vlines(lambda_peak, 0, 1E4,
'r', ls = ':', lw = 2., label = '$\lambda$ = {} nm'.format(lambda_peak))
all_lambda = np.arange(420, 450)
lambda_peak = all_lambda[mua_deo_Prahl(all_lambda).argmax()]
axs[1].vlines(lambda_peak, 0, 1E4,
'purple', ls = ':', lw = 2., label = '$\lambda$ = {} nm'.format(lambda_peak))
all_lambda = np.arange(520, 560)
lambda_peak = all_lambda[mua_oxy_Prahl(all_lambda).argmax()]
axs[1].vlines(lambda_peak, 0, 1E4,
'r', ls = '--', lw = 2., label = '$\lambda$ = {} nm'.format(lambda_peak))
all_lambda = np.arange(520, 560)
lambda_peak = all_lambda[mua_deo_Prahl(all_lambda).argmax()]
axs[1].vlines(lambda_peak, 0, 1E4,
'purple', ls = '--', lw = 2., label = '$\lambda$ = {} nm'.format(lambda_peak))
all_lambda = np.arange(560, 580)
lambda_peak = all_lambda[mua_oxy_Prahl(all_lambda).argmax()]
axs[1].vlines(lambda_peak, 0, 1E4,
'r', ls = '-.', lw = 2., label = '$\lambda$ = {} nm'.format(lambda_peak))
axs[1].set_yscale('log')
axs[1].set_xlabel('wavelength [nm]')
axs[1].set_ylabel('absorption coefficient [mm$^{-1}$]')
axs[1].legend(loc = 'upper right')
axs[1].set_xlim(250, 1000)
axs[1].set_ylim(1E-1, 1E4)
axs[1].set_title('(b) hemoglobin water solutions', loc = 'left')
plt.show()
plt.errorbar(np.array(EP_Salomatina_dataframe)[:,0],
np.array(EP_Salomatina_dataframe)[:,1],
np.array(EP_Salomatina_dataframe)[:,2],
color = 'k', label = 'EP (Salomatina et al. 2006)')
plt.errorbar(np.array(DE_Salomatina_dataframe)[:,0],
np.array(DE_Salomatina_dataframe)[:,1],
np.array(DE_Salomatina_dataframe)[:,2],
color = 'pink', label = 'DE (Salomatina et al. 2006)')
plt.errorbar(np.array(HY_Salomatina_dataframe)[:,0],
np.array(HY_Salomatina_dataframe)[:,1],
np.array(HY_Salomatina_dataframe)[:,2],
color = 'gray', label = 'HY (Salomatina et al. 2006)')
all_lambda = np.arange(370, 1600)
plt.plot(all_lambda, mua_wat_Hale(all_lambda),
'b', lw = 2., label = 'water (Hale & Querry 1973)')
plt.vlines(1440, 0, 50, 'k', ls = 'dashed', lw = 2., label = '$\lambda$ = 1440 nm')
plt.xlabel('wavelength [nm]')
plt.ylabel('absorption coefficient [mm$^{-1}$]')
plt.yscale('log')
plt.legend(loc = 'lower right')
plt.xlim(370, 1600)
plt.ylim(1E-5, 1E1)
plt.show()
fig, axs = plt.subplots(1, 2,
gridspec_kw = {'wspace': 0.25}, figsize = (12, 4))
axs[0].errorbar(np.array(EP_Salomatina_dataframe)[:,0],
np.array(EP_Salomatina_dataframe)[:,1],
np.array(EP_Salomatina_dataframe)[:,2],
color = 'k', label = 'EP (Salomatina et al. 2006)')
axs[0].errorbar(np.array(DE_Salomatina_dataframe)[:,0],
np.array(DE_Salomatina_dataframe)[:,1],
np.array(DE_Salomatina_dataframe)[:,2],
color = 'pink', label = 'DE (Salomatina et al. 2006)')
axs[0].errorbar(np.array(HY_Salomatina_dataframe)[:,0],
np.array(HY_Salomatina_dataframe)[:,1],
np.array(HY_Salomatina_dataframe)[:,2],
color = 'gray', label = 'HY (Salomatina et al. 2006)')
axs[0].errorbar(np.array(EP_Shimojo_dataframe)[:,0],
np.array(EP_Shimojo_dataframe)[:,1],
np.array(EP_Shimojo_dataframe)[:,2],
color = 'lime', fmt = 'o', label = 'EP (Shimojo et al. 2020)')
axs[0].errorbar(np.array(DE_Shimojo_dataframe)[:,0],
np.array(DE_Shimojo_dataframe)[:,1],
np.array(DE_Shimojo_dataframe)[:,2],
color = 'r', fmt = 'o', label = 'DE (Shimojo et al. 2020)')
axs[0].errorbar(np.array(HY_Shimojo_dataframe)[:,0],
np.array(HY_Shimojo_dataframe)[:,1],
np.array(HY_Shimojo_dataframe)[:,2],
color = 'b', fmt = 'o', label = 'HY (Shimojo et al. 2020)')
axs[0].set_xlabel('wavelength [nm]')
axs[0].set_ylabel('absorption coefficient [mm$^{-1}$]')
axs[0].set_title('(a)', loc = 'left')
axs[0].set_xlim(370, 1200)
axs[0].set_ylim(0, 6.)
axs[0].legend(loc = 'upper right')
axs[1].errorbar(np.array(EP_Salomatina_dataframe)[:,0],
np.array(EP_Salomatina_dataframe)[:,3],
np.array(EP_Salomatina_dataframe)[:,4],
color = 'k', label = 'EP (Salomatina et al. 2006)')
axs[1].errorbar(np.array(DE_Salomatina_dataframe)[:,0],
np.array(DE_Salomatina_dataframe)[:,3],
np.array(DE_Salomatina_dataframe)[:,4],
color = 'pink', label = 'DE (Salomatina et al. 2006)')
axs[1].errorbar(np.array(HY_Salomatina_dataframe)[:,0],
np.array(HY_Salomatina_dataframe)[:,3],
np.array(HY_Salomatina_dataframe)[:,4],
color = 'gray', label = 'HY (Salomatina et al. 2006)')
axs[1].errorbar(np.array(EP_Shimojo_dataframe)[:,0],
np.array(EP_Shimojo_dataframe)[:,3],
np.array(EP_Shimojo_dataframe)[:,4],
color = 'lime', fmt = 'o', label = 'EP (Shimojo et al. 2020)')
axs[1].errorbar(np.array(DE_Shimojo_dataframe)[:,0],
np.array(DE_Shimojo_dataframe)[:,3],
np.array(DE_Shimojo_dataframe)[:,4],
color = 'r', fmt = 'o', label = 'DE (Shimojo et al. 2020)')
axs[1].errorbar(np.array(HY_Shimojo_dataframe)[:,0],
np.array(HY_Shimojo_dataframe)[:,3],
np.array(HY_Shimojo_dataframe)[:,4],
color = 'b', fmt = 'o', label = 'HY (Shimojo et al. 2020)')
axs[1].set_xlabel('wavelength [nm]')
axs[1].set_ylabel('reduced scattering coefficient [mm$^{-1}$]')
axs[1].set_title('(b)', loc = 'left')
axs[1].set_xlim(370, 1200)
axs[1].set_ylim(0, 16)
axs[1].legend(loc = 'upper right')
plt.show()
fig, axs = plt.subplots(1, 2,
gridspec_kw = {'wspace': 0.25}, figsize = (12, 4))
axs[0].errorbar(np.array(EP_Salomatina_dataframe)[:,0],
np.array(EP_Salomatina_dataframe)[:,3],
np.array(EP_Salomatina_dataframe)[:,4],
color = 'k', label = 'EP (Salomatina et al. 2006)')
axs[0].errorbar(np.array(DE_Salomatina_dataframe)[:,0],
np.array(DE_Salomatina_dataframe)[:,3],
np.array(DE_Salomatina_dataframe)[:,4],
color = 'pink', label = 'DE (Salomatina et al. 2006)')
axs[0].errorbar(np.array(HY_Salomatina_dataframe)[:,0],
np.array(HY_Salomatina_dataframe)[:,3],
np.array(HY_Salomatina_dataframe)[:,4],
color = 'gray', label = 'HY (Salomatina et al. 2006)')
all_lambda = np.arange(360, 1600)
axs[0].plot(all_lambda, rmus_Jacques(all_lambda, 6.67, 0.29, 0.689),
color = 'lime', lw = 2., label = 'EP (fit by Jacques 2013)')
axs[0].plot(all_lambda, rmus_Jacques(all_lambda, 4.36, 0.41, 0.562),
color = 'r', lw = 2., label = 'DE (fit by Jacques 2013)')
axs[0].plot(all_lambda, rmus_Jacques(all_lambda, 3.42, 0.26, 0.567),
color = 'b', lw = 2., label = 'HY (fit by Jacques 2013)')
axs[0].vlines(1440, 0, 14, color = 'k', ls = '--', lw = 2., label = '$\lambda$ = 1440 nm')
axs[0].legend(loc = 'upper right')
axs[0].set_xlabel('wavelength [nm]')
axs[0].set_ylabel('reduced scattering coefficient [mm$^{-1}$]')
axs[0].set_title('(a)', loc = 'left')
axs[0].set_xlim(370, 1600)
axs[0].set_ylim(0, 14)
axs[1].errorbar(np.array(EP_Salomatina_dataframe)[:,0],
np.array(EP_Salomatina_dataframe)[:,3],
np.array(EP_Salomatina_dataframe)[:,4],
color = 'k', label = 'EP (Salomatina et al. 2006)')
all_lambda = np.arange(280, 1600)
axs[1].plot(all_lambda, rmus_Jacques(all_lambda, 6.67, 0.29, 0.689),
'lime', lw = 2., label = 'fit by Jacques 2013')
axs[1].plot(all_lambda, rmus_Ray(all_lambda, 6.67*0.29/500**(-4)),
'--r', lw = 2., label = 'Rayleigh scattering contribution')
axs[1].plot(all_lambda, rmus_Mie(all_lambda, 6.67*(1-0.29)/500**(-0.689), 0.689),
'--b', lw = 2., label = 'Mie scattering contribution')
axs[1].set_xlabel('wavelength [nm]')
axs[1].set_ylabel('reduced scattering coefficient [mm$^{-1}$]')
axs[1].set_title('(b)', loc = 'left')
axs[1].legend(loc = 'upper right')
axs[1].set_xlim(300, 1600)
plt.show()
all_g = np.array([0.9, 0.7, 0.5, 0.3, 0])
color_cycle = ['r', 'darkorange', 'g', 'b', 'purple', 'c']
for i in range(5):
plt.plot(np.linspace(0,180,1000), ptheta_HG(np.linspace(0,180,1000), all_g[i]),
color = color_cycle[i], lw = 2., label = 'HG, g = {}'.format('%g' % all_g[i]))
plt.xlabel('scattering polar angle $\\theta$ [radians]')
plt.ylabel('scattering phase function p($\\theta$)')
plt.legend()
plt.yscale('log')
plt.xlim(0, 180)
plt.ylim(1E-2, 1E3)
plt.xticks([0, 45, 90, 135, 180],['$0$', '$\\frac{\pi}{4}$', '$\\frac{\pi}{2}$', '$\\frac{3\pi}{4}$', '$\pi$'])
plt.show()
fig, axs = plt.subplots(2, 3, subplot_kw = {'projection': 'polar'},
gridspec_kw = {'wspace': 0., 'hspace': 0.55}, figsize = (12, 7))
for i in range(5):
axs[int(i/3), i%3].plot(np.linspace(0,180,1000)*np.pi/180,
ptheta_HG(np.linspace(0,180,1000), all_g[i]),
color = color_cycle[i], lw = 2.)
axs[int(i/3), i%3].plot(-np.linspace(0,180,1000)*np.pi/180,
ptheta_HG(np.linspace(0,180,1000), all_g[i]),
color = color_cycle[i], lw = 2.)
axs[1,2].plot(np.linspace(0,180,1000)*np.pi/180, ptheta_R(np.linspace(0,180,1000)), 'c', lw = 2.)
axs[1,2].plot(-np.linspace(0,180,1000)*np.pi/180, ptheta_R(np.linspace(0,180,1000)), 'c', lw = 2.)
axs[0,0].set_title('(a) HG, g = {}'.format(all_g[0]))
axs[0,1].set_title('(b) HG, g = {}'.format(all_g[1]))
axs[0,2].set_title('(c) HG, g = {}'.format(all_g[2]))
axs[1,0].set_title('(d) HG, g = {}'.format(all_g[3]))
axs[1,1].set_title('(e) HG, g = {}'.format(round(all_g[4])))
axs[1,2].set_title('(f) R')
for i in range(5):
ptheta_HG_max = ptheta_HG(np.linspace(0,180,1000), all_g[i]).max()
axs[int(i/3), i%3].set_yticks([ptheta_HG_max/2, ptheta_HG_max, ptheta_HG_max*3/2],
['', round(ptheta_HG_max, 1), ''])
ptheta_R_max = ptheta_R(np.linspace(0,180,1000)).max()
axs[1,2].set_yticks([ptheta_R_max/2, ptheta_R_max, ptheta_R_max*3/2],
['', round(ptheta_HG_max, 1), ''])
plt.show()
plt.plot(np.linspace(0,180,1000), ptheta_R(np.linspace(0,180,1000)),
'r', lw = 2., label = 'R')
plt.plot(np.linspace(0,180,1000), ptheta_HG(np.linspace(0,180,1000), g = 0.9),
'g', lw = 2., label = 'HG, g = 0.9')
plt.scatter(np.linspace(0,180,20), ptheta_RM(np.linspace(0,180,20), g = 0.9, alpha = 0.5),
color = 'lime', marker = '.', label = 'RM, g = 0.9, $\\alpha$ = 0.5')
plt.scatter(np.linspace(0,180,20), ptheta_RM(np.linspace(0,180,20), g = 0.9, alpha = 1.),
color = 'k', marker = '.', label = 'RM, g = 0.9, $\\alpha$ = 1')
plt.scatter(np.linspace(0,180,20), ptheta_CS(np.linspace(0,180,20), g = 0),
color = 'tomato', marker = '.', label = 'CS, g = 0')
plt.plot(np.linspace(0,180,1000), ptheta_CS(np.linspace(0,180,1000), g = 0.9),
'b', lw = 2., label = 'CS, g = 0.9')
plt.plot(np.linspace(0,180,1000), ptheta_D(np.linspace(0,180,1000), g = 0., alpha = 1.),
'--m', lw = 2., label = 'D, g = 0, $\\alpha$ = 1')
plt.plot(np.linspace(0,180,1000), ptheta_D(np.linspace(0,180,1000), g = 0.9, alpha = 0.),
'--y', lw = 2., label = 'D, g = 0.9, $\\alpha$ = 0')
plt.plot(np.linspace(0,180,1000), ptheta_D(np.linspace(0,180,1000), g = 0.9, alpha = 1.),
'--c', lw = 2., label = 'D, g = 0.9, $\\alpha$ = 1')
plt.plot(np.linspace(0,180,1000), ptheta_U2(np.linspace(0,180,1000), g = 0.9),
'gray', lw = 2., label = 'U2, g = 0.9')
plt.xlabel('scattering polar angle $\\theta$ [radians]')
plt.ylabel('scattering phase function p($\\theta$)')
plt.legend(bbox_to_anchor = (1.01, 1.02))
plt.yscale('log')
plt.xlim(0, 180)
plt.ylim(5E-4, 1E3)
plt.xticks([0, 45, 90, 135, 180],
['$0$', '$\\frac{\pi}{4}$', '$\\frac{\pi}{2}$', '$\\frac{3\pi}{4}$', '$\pi$'])
plt.show()
fig, axs = plt.subplots(1, 2,
gridspec_kw = {'wspace': 0.25, 'width_ratios': [1.2, 1]}, figsize = (12, 4))
for i in range(5):
axs[0].hist(theta_HG_from_RND(all_g[i]), bins = 'fd', color = color_cycle[i], lw = 1.5,
histtype = 'step', label = 'HG, g = {}'.format('%g' % all_g[i]))
axs[0].hist(theta_R_from_RND(), bins = 'fd', color = color_cycle[5], lw = 1.5,
histtype = 'step', label = 'R')
axs[0].set_xlabel('scattering polar angle $\\theta$ [degrees]')
axs[0].set_ylabel('count [-]')
axs[0].set_title('(a) 1E6 random numbers', loc = 'left')
axs[0].legend()
axs[0].set_xlim(0, 180)
axs[0].set_ylim(0, 22500)
axs[1].plot(np.linspace(-1, 1, 100), linear(np.linspace(-1, 1, 100), 1, 0), '--k', lw = 2.)
for i in range(5):
axs[1].scatter(all_g[i], np.cos(theta_HG_from_RND(all_g[i])*np.pi/180).mean(), color = color_cycle[i])
axs[1].set_xlabel('parameter g (HG phase function)')
axs[1].set_ylabel('anisotropy factor $\\langle \\cos \\theta \\rangle$')
axs[1].set_title('(b)', loc = 'left')
axs[1].set_xlim(-1, 1)
axs[1].set_ylim(-1, 1)
axs[1].set_aspect('equal')
plt.show()
fig, axs = plt.subplots(1, 2,
gridspec_kw = {'wspace': 0.25, 'width_ratios': [1.2, 1]}, figsize = (12, 4))
for i in range(5):
axs[0].hist(theta_U2_from_RND(all_g[i]), bins = 'fd', color = color_cycle[i], lw = 1.5,
histtype = 'step', label = 'U2, g = {}'.format('%g' % all_g[i]))
axs[0].set_xlabel('scattering polar angle $\\theta$ [degrees]')
axs[0].set_ylabel('count [-]')
axs[0].set_title('(a) 1E6 random numbers', loc = 'left')
axs[0].legend()
axs[0].set_xlim(0, 180)
axs[0].set_ylim(0, 17500)
axs[1].plot(np.linspace(-.99, .99, 100), costheta_U2(np.linspace(-.99, .99, 100)), '--k', lw = 2.)
for i in range(5):
axs[1].scatter(all_g[i], np.cos(theta_U2_from_RND(all_g[i])*np.pi/180).mean(), color = color_cycle[i])
axs[1].set_xlabel('parameter g (U2 phase function)')
axs[1].set_ylabel('anisotropy factor $\\langle \\cos \\theta \\rangle$')
axs[1].set_title('(b)', loc = 'left')
axs[1].set_aspect('equal')
axs[1].set_xlim(-1, 1)
axs[1].set_ylim(-1, 1)
plt.show()
all_alpha = np.array([0.5, 1., 2., 5.])
fig, ax = plt.subplots(1, 1)
for i in range(len(all_alpha)):
ax.plot(np.linspace(-.99, .99, 100),
costheta_RM(g = np.linspace(-.99, .99, 100), alpha = all_alpha[i]),
color = color_cycle[i], ls = '--', lw = 2., label = '$\\alpha$ = {}'.format(all_alpha[i]))
ax.set_xlabel('parameter g (RM phase function)')
ax.set_ylabel('anisotropy factor $\\langle \\cos \\theta \\rangle$')
plt.legend()
ax.set_aspect('equal')
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
plt.show()
similar to Figure 3.(A) from Jacques & McCormick 2023
all_lambda = np.arange(380, 700)
plt.plot(all_lambda, g_vanGemert(all_lambda),
'k', lw = 2., label = 'epidermis/dermis\n(van Gemert et al. 1989)')
plt.plot(all_lambda, g_Bosschaart(all_lambda),
'r', lw = 2., label = 'blood\n(Bosschaart et al. 2014)')
plt.xlabel('wavelength [nm]')
plt.ylabel('anisotropy factor [-]')
plt.legend(loc = 'lower right')
plt.xlim(400, 700)
plt.ylim(0.6, 1.)
plt.show()
all_lambda = np.arange(200, 1400)
plt.plot(all_lambda, n_wat_Hale(all_lambda),
'b', lw = 2., label = 'water (Hale & Querry 1973)')
plt.plot(all_lambda, n_wat_Segelstein(all_lambda),
'c', lw = 2., label = 'water (Segelstein 1981)')
all_lambda = np.arange(370, 850)
plt.plot(all_lambda, n_blo_Li(all_lambda),
'-r', lw = 2., label = 'blood (Li, Lin & Xie 2000)')
plt.xlabel('wavelength [nm]')
plt.ylabel('refractive index [-]')
plt.legend(loc = 'upper right')
plt.xlim(200, 1400)
plt.ylim(1.3, 1.48)
plt.show()
fig, axs = plt.subplots(1, 2,
gridspec_kw = {'wspace': 0.25}, figsize = (12, 4))
all_lambda = np.arange(325, 1557)
axs[0].plot(np.array(n_and_k_EP_Ding_dataframe)[:,0],
np.array(n_and_k_EP_Ding_dataframe)[:,1],
'ok', label = 's-polarization')
axs[0].plot(np.array(n_and_k_EP_Ding_dataframe)[:,0],
np.array(n_and_k_EP_Ding_dataframe)[:,2],
'^k', label = 'p-polarization')
axs[0].plot(all_lambda, n_EP_Ding(all_lambda),
'r', ls = '-', lw = 2., label = 'Cauchy')
axs[0].plot(all_lambda, n_EP_Ding(all_lambda,'Cornu'),
'g', ls = '-.', lw = 2., label = 'Cornu')
axs[0].plot(all_lambda, n_EP_Ding(all_lambda, 'Conrady'),
'b', ls = '--', lw = 2., label = 'Conrady')
axs[0].set_xlabel('wavelength [nm]')
axs[0].set_ylabel('refractive index [-]')
axs[0].set_title('(a) epidermis (Ding et al. 2006)', loc = 'left')
axs[0].legend(loc = 'upper right')
axs[0].set_xlim(325, 1557)
axs[0].set_ylim(1.36, 1.52)
axs[1].plot(np.array(n_and_k_DE_Ding_dataframe)[:,0],
np.array(n_and_k_DE_Ding_dataframe)[:,1],
'ok', label = 's-polarization')
axs[1].plot(np.array(n_and_k_DE_Ding_dataframe)[:,0],
np.array(n_and_k_DE_Ding_dataframe)[:,2],
'^k', label = 'p-polarization')
axs[1].plot(all_lambda, n_DE_Ding(all_lambda),
'r', ls = '-', lw = 2., label = 'Cauchy')
axs[1].plot(all_lambda, n_DE_Ding(all_lambda,'Cornu'),
'g', ls = '-.', lw = 2., label = 'Cornu')
axs[1].plot(all_lambda, n_DE_Ding(all_lambda, 'Conrady'),
'b', ls = '--', lw = 2., label = 'Conrady')
axs[1].set_xlabel('wavelength [nm]')
axs[1].set_ylabel('refractive index [-]')
axs[1].set_title('(b) dermis (Ding et al. 2006)', loc = 'left')
axs[1].legend(loc = 'upper right')
axs[1].set_xlim(325, 1557)
axs[1].set_ylim(1.34, 1.44)
plt.show()
all_lambda = np.linspace(450, 1551, 1000)
plt.plot(all_lambda, n_HY_Matiatou(all_lambda),
color = 'gold', lw = 2., label = 'HY, Cauchy\n(Matiatou et al. 2021)')
plt.plot(all_lambda, n_AT_Matiatou(all_lambda),
color = 'darkorange', ls = '--', lw = 2., label = 'AT, Cauchy\n(Matiatou et al. 2021)')
plt.errorbar(np.array(n_HY_Matiatou_dataframe)[:,0],
np.array(n_HY_Matiatou_dataframe)[:,1],
np.array(n_HY_Matiatou_dataframe)[:,2],
color = 'gold', fmt = 'o', label = 'HY (Matiatou et al. 2021)')
plt.errorbar(np.array(n_AT_Matiatou_dataframe)[:,0],
np.array(n_AT_Matiatou_dataframe)[:,1],
np.array(n_AT_Matiatou_dataframe)[:,2],
color = 'darkorange', fmt = 's', label = 'AT (Matiatou et al. 2021)')
all_lambda = np.linspace(480, 1550, 1000)
plt.plot(all_lambda, n_AT_Yanina(all_lambda),
'k', lw = 2., label = 'AT, Sellmeier\n(Yanina, Lazareva & Tuchin 2018)')
plt.xlabel('wavelength [nm]')
plt.ylabel('refractive index [-]')
plt.xlim(450, 1551)
plt.ylim(1.44, 1.5)
plt.legend()
plt.show()
fig, axs = plt.subplots (2, 2,
gridspec_kw = {'wspace': 0.3, 'hspace': 0.4}, figsize = (12, 9))
all_lambda = np.arange(200, 200000)
lambda_valley = all_lambda[mua_wat_Hale(all_lambda).argmin()]
lambda_peak = all_lambda[mua_wat_Hale(all_lambda).argmax()]
axs[0,0].plot(all_lambda, n_wat_Segelstein(all_lambda),'-c', lw = 2.)
axs[0,0].scatter(np.array(n_and_k_wat_Hale_dataframe)[:,0], np.array(n_and_k_wat_Hale_dataframe)[:,2],
color = 'b', marker = '.')
axs[0,0].vlines(lambda_valley, 1, 2.2, color = 'k', ls = ':')
axs[0,0].vlines(lambda_peak, 1, 2.2, color = 'k', ls = '--', lw = 2.)
axs[0,0].set_xscale('log')
axs[0,0].set_xlabel('wavelength [nm]')
axs[0,0].set_ylabel('n$(\\lambda)$ [-]')
axs[0,0].set_title('(a)', loc = 'left')
axs[0,0].set_xlim(200, 200000)
axs[0,0].set_ylim(1, 2.2)
axs[1,0].plot(all_lambda, k_wat_Segelstein(all_lambda), color = 'c', ls = '-')
axs[1,0].scatter(np.array(n_and_k_wat_Hale_dataframe)[:,0], np.array(n_and_k_wat_Hale_dataframe)[:,1],
color = 'b', marker = '.')
axs[1,0].vlines(lambda_valley, 0, 1E2, color = 'k', ls = ':')
axs[1,0].vlines(lambda_peak, 0, 1E2, color = 'k', ls = '--')
axs[1,0].set_xscale('log')
axs[1,0].set_yscale('log')
axs[1,0].set_xlabel('wavelength [nm]')
axs[1,0].set_ylabel('k$(\\lambda)$ [-]')
axs[1,0].set_title('(b)', loc = 'left')
axs[1,0].set_xlim(200, 200000)
axs[1,0].set_ylim(1E-10, 1E2)
axs[0,1].scatter(np.array(n_and_k_wat_Hale_dataframe)[:,0],
mua_from_k(np.array(n_and_k_wat_Hale_dataframe)[:,1],
np.array(n_and_k_wat_Hale_dataframe)[:,0]),
color = 'b', marker = '.', label = 'water\n(Hale & Querry 1973)')
axs[0,1].plot(all_lambda, mua_wat_Segelstein(all_lambda), '-c', label = 'water\n(Segelstein 1981)')
axs[0,1].vlines(lambda_valley, 0, 1E5, color = 'k', ls = ':', lw = 2., label = '$\\lambda$ = {} nm'.format(lambda_valley))
axs[0,1].vlines(lambda_peak, 0, 1E5, color = 'k', ls = '--', lw = 2., label = '$\\lambda$ = {} nm'.format(lambda_peak))
axs[0,1].set_xscale('log')
axs[0,1].set_yscale('log')
axs[0,1].set_xlabel('wavelength [nm]')
axs[0,1].set_ylabel('$\\mu_a(\\lambda)$ [mm$^{-1}$]')
axs[0,1].set_title('(c)', loc = 'left')
axs[0,1].set_xlim(200, 200000)
axs[0,1].set_ylim(5E-6, 1E5)
axs[0,1].legend(loc = 'lower right')
dx = all_lambda[1] - all_lambda[0]
d_dx = FinDiff(0, dx, 1)
axs[1,1].plot(all_lambda, d_dx(mua_wat_Segelstein(all_lambda)), '-c', lw = 2.)
axs[1,1].vlines(lambda_valley, -12, 12, color = 'k', ls = ':')
axs[1,1].vlines(lambda_peak, -12, 12, color = 'k', ls = '--', lw = 2.)
axs[1,1].set_xscale('log')
axs[1,1].set_xlabel('wavelength [nm]')
axs[1,1].set_ylabel('$\mathrm{d}\\mu_a(\\lambda)/\mathrm{d}\\lambda$ [mm$^{-1}$ nm$^{-1}$]')
axs[1,1].set_title('(d)', loc = 'left')
axs[1,1].set_xlim(200, 200000)
axs[1,1].set_ylim(-12, 12)
plt.show()
fig, axs = plt.subplots (2, 2,
gridspec_kw = {'wspace': 0.35, 'hspace': 0.4}, figsize = (12, 9))
all_lambda = np.arange(250, 1000)
lambda_peak = all_lambda[mua_oxy_Prahl(all_lambda).argmax()]
axs[0,0].plot(all_lambda, mua_oxy_Prahl(all_lambda),
'k', lw = 2., label = 'oxyhemoglobin\n150 g/L (Prahl 1999)')
axs[0,0].vlines(lambda_peak, 0., 5E2,
'r', ls = '--', lw = 2., label = '$\\lambda$ = {} nm'.format(lambda_peak))
axs[0,0].set_ylabel('$\\mu_a(\\lambda)$ [mm$^{-1}$]')
axs[0,0].legend(loc = "upper right")
axs[0,0].set_xlim(250, 1000)
axs[0,0].set_ylim(1E-1, 5E2)
axs[0,0].set_yscale('log')
axs[0,0].set_title('(a)', loc = 'left')
axs[0,1].plot(all_lambda, beta_oxy_Friebel(all_lambda),
'k', lw = 2., label = 'linear interpolation')
axs[0,1].scatter(np.array(beta_oxy_Friebel_dataframe)[:,0],
np.array(beta_oxy_Friebel_dataframe)[:,1],
color = 'k', marker = '.', label = 'data (Friebel & Meinke 2006)')
axs[0,1].vlines(lambda_peak, 0.0015, 0.0024, 'r', ls = '--', lw = 2.)
axs[0,1].set_ylabel('$\\beta(\\lambda)$ [dL/g]')
axs[0,1].legend(loc = 'upper right')
axs[0,1].set_xlim(250, 1000)
axs[0,1].set_ylim(0.0015, 0.0024)
axs[0,1].set_title('(c)', loc = 'left')
dx = all_lambda[1] - all_lambda[0]
d_dx = FinDiff(0, dx, 1)
axs[1,0].plot(all_lambda, d_dx(mua_oxy_Prahl(all_lambda)),
'k', lw = 2., label = 'oxyhemoglobin\n150 g/L (Prahl 1999)')
axs[1,0].vlines(lambda_peak, -18., 22.,
'r', ls = '--', lw = 2., label = '$\\lambda$ = {} nm'.format(lambda_peak))
axs[1,0].set_ylabel('$d\\mu_a(\\lambda)/d\\lambda$ [mm$^{-1}$]')
axs[1,0].legend(loc = 'upper right')
axs[1,0].set_xlim(250, 1000)
axs[1,0].set_ylim(-18., 22.)
axs[1,0].set_title('(b)', loc = 'left')
axs[1,1].plot(all_lambda, n_oxy_Friebel(all_lambda, 0),
'b', lw = 2., label = 'water (Segelstein 1981)')
axs[1,1].plot(all_lambda, n_oxy_Friebel(all_lambda, 4.6),
':k', lw = 2., label = 'oxyhemoglobin, 46 g/L')
axs[1,1].plot(all_lambda, n_oxy_Friebel(all_lambda, 10.4),
'--k', lw = 2., label = 'oxyhemoglobin, 104 g/L')
axs[1,1].plot(all_lambda, n_oxy_Friebel(all_lambda, 16.5),
'-.k', lw = 2., label = 'oxyhemoglobin, 165 g/L')
axs[1,1].plot(all_lambda, n_oxy_Friebel(all_lambda, 28.7),
'-k', lw = 2., label = 'oxyhemoglobin, 287 g/L')
axs[1,1].vlines(lambda_peak, 0., 10., color = 'r', ls = '--', lw = 2.)
axs[1,1].set_ylabel('n$(\\lambda)$ [-]')
axs[1,1].legend(loc = 'upper right')
axs[1,1].set_xlim(250, 1000)
axs[1,1].set_ylim(1.3, 1.55)
axs[1,1].set_title('(d)', loc = 'left')
for i in range(2):
for j in range(2):
axs[i,j].set_xlabel('wavelength [nm]')
plt.show()
all_C_oxy = np.array([4.6, 10.4, 16.5, 28.7])
all_n_oxy_430 = np.array([n_oxy_Friebel(430, i) for i in all_C_oxy])
all_n_oxy_800 = np.array([n_oxy_Friebel(800, i) for i in all_C_oxy])
plt.scatter(all_C_oxy, all_n_oxy_430/n_oxy_Friebel(430, 0),
color = 'k', marker = 'o', label = '430 nm')
plt.scatter(all_C_oxy, all_n_oxy_800/n_oxy_Friebel(800, 0),
color = 'k', marker = 's', label = '800 nm')
plt.plot(np.arange(0, 28.7, 0.01), linear(np.arange(0, 28.7, 0.01), beta_oxy_Friebel(430), 1), 'k')
plt.plot(np.arange(0, 28.7, 0.01), linear(np.arange(0, 28.7, 0.01), beta_oxy_Friebel(800), 1),'--k')
plt.xlabel('oxyhemoglobin concentration [g/dL]')
plt.ylabel('n$_{oxy}$/n$_{wat}$ [-]')
plt.title('oxyhemoglobin solutions (Friebel & Meinke 2006)')
plt.legend(loc = 'upper left')
plt.xlim(0, 30)
plt.ylim(1, 1.07)
plt.show()