蒙特卡洛法模拟光在单层生物组织中传播
介绍
我的一次课程作业,记录一下。蒙特卡洛方法(Monte Carlo method,MC)广泛应用于模拟研究粒子传输、性质与行为。同样,MC也可用于数值模拟光在生物组织中的传播行为,并在该领域有着广泛的应用。
生物组织的光学性质与特性参数的测量在生物医学光子领域是极为重要的领域,如何运用数学方法与计算机仿真研究光在生物组织中的传输过程以及得到生物组织的光学参数是一个十分有价值的研究课题。目前对该问题较为有效的方法为利用蒙特卡洛法模拟光子在生物组织的传播.
光与生物组织的相互作用
生物组织性质较多,从成分上看包括色素、含水量、不均匀组织等等。以组织单位计算的话,应该划分成细胞、细胞间质、基本组织等单独或者连续的组织。生物组织的结构相当复杂。在红外和近红外光谱范围内,生物组织对光子的传输与吸收源于各种色散,如血色素、细胞色素等。而散射则是主要源于连接组织、细胞成份等。
d
行为 | 描述 |
---|---|
反射 | 边界处折射率不同,在空气/组织引起镜式反射、漫反射 |
折射 | 在组织/空气界面产生折射内散射 |
吸收 | 红蛋白的原血红素、胆红素等色素吸收 |
散射 | 显微水平上组织折射率不均 |
- 折射与反射
在实际进行模拟时,需要忽略由于生物组织内部各处可能存在的差异性问题,在折射率的选择上,选择平均折射率,所模拟的各处折射率相同。在所查询的文章中,由于生物组织含水量一般在80%以上。故生物组织折射率与水近似:
上式中n为折射率,W为含水量,当W为0.8时。N约为1.37.如此,得到折射率后,反射率为:
- 光的吸收与散射
在生物医学光子学的研究中,对光子吸收是最重要的活动之一,光子的吸收一方面是激光产生治疗效果的主要因素,一方光吸收也能提供分析作用,例如光谱与光成像。在实际光传播中,除真空外几乎所有介质都对光有不同程度的吸收作用,可以如下式子表示:
光通过介质,除了吸收外,还要发生散射,散射是使得光强减弱并使得光在物体传播、穿出时发生弥散的现象,射发生的原因为介质中折射率的不均匀导致,而生物组织内部折射率分布极为不均匀,为强散射体,光在生物组织内部会发生多次散射,同时其散射呈各向异性,即发生散射时,其传播角度、方向改变的几率不同。该特性可用散射的角度分布函数表示,同时散射函数满足归一化与对易性质:
组织中光散射分布并非各向异性的,其呈现为一种向前性散射,这种散射可用平均散射余弦,即各向异因子g表示:
现在最常用来描述散射分布情况的函数为Henyey-Greenstin函数:
参数 | 描述 |
---|---|
吸收系数 | 每单位长度上一个光子被吸收概率 |
散射系数 | 每单位长度上一个光子被吸收概率 |
散射相位 | 表示发生散射时,从一个方向附近立体角 到另一个的概率 |
平均折射率 | 表示边界、色散时间特性。 |
蒙特卡洛法模拟光子传输过程
蒙特卡洛(Monte Carlo,MC)方法以概率论与数理统计为基础,利用计算机随机数区完成模拟仿真,把概率现象作为研究对象的数值模拟方法,是按抽样调查法求取统计值来推定未知特性量的计算方法。蒙特卡洛的具体方法即为建立一个概率模型或随机过程,使它的参数或数字特征等于问题的解:然后通过对模型或过程的观察或抽样试验来计算这些参数或数字特征,最后给出所求解的近似值。
光子在组织传播大致可分为几个步骤,光子的发射、传输、吸收、散射等,这里对各种可能的过程与步骤进行介绍。
Step1 光子发射,光子垂直入射到组织的表面,在入射的面上可能会有镜面反射,设镜面反射系数为R,则每次反射,光子的量减少如下,M为反射后的光子权重:
Step2 光子的步长与传输,光子的传输为以(x,y,z)为传播起点,则其下一个位置坐标为:
Step3 光子的吸收。当发射吸收作用时,光子权重会衰减,假设发生n此吸收作用,其表达式如下:
Step4 光子的散射,光子发生散射
时,光子的传播方向会改变,方位角ψ=2πx和散射偏转角[0,pi]即可确定光子下一个散射位置的新方向。
Step5 光子的终止,当光子权重为0时,光子认定为消亡,此时确定一个临界值,即可做出判断。考虑到光子的实际传输过程,此处引入轮盘赌,给定参数m,再产生一个随机数x,当x<1/m时,更新光子的权重为mw。轮盘赌是MCML中必要的一种方式。
抽样方法
在随机抽样方法上,每个模拟的点要遵循一定的规律,设在区间(a,b)的随机变量x的概率密度函数为p(x),该函数为归一化的概率密度函数:
-
若随机函数y在区间(0,1)上分布,变量x与y存在一一对应的关系,即x=f(y):
-
步长的概率抽样,光子步长在模拟中同样是随机的,光子在组织散射步长s概率密度函数p(s)可以表示为:
-
散射方向的概率抽样,在组织中传播的光子的方向会因为碰撞改变方向,光子的传输方向是又方位角ψ∈[0,2π]与散射偏转角θ∈[0,π]。偏转角余弦服从Henyey-Greenstein函数:
-
对上述函数进行抽样可以得到:
-
代码示例
% A:吸收光的部分
% R:光的反射率
%path:每个探测到的光子走过的路径长度(cm)
% mua:组织吸收系数(/cm)
% mus:组织散射系数(/cm)
% g:各向异性因子
% rho:源检测器分离(cm)
% ntissue:组织的折射率
% nout:介质的折射率
% n:模拟所需的光子数
%%初始化
clc;
A = 0 ; % 吸收系数
R = 0 ; % Resflectance matrix
mua = 0.1 ; %吸收系数
lamda_a = 1/mua;
mus = 100 ; % 散射系数
lamda_s = 1/mus;
mut = mua + mus;
lamda_t = 1/mut;
g = 0.91 ; %各向异因子
rho = 5 ; %源探测器分离
ntissue = 1.37; %生物组织折射率
nout = 1; %空气折射率
Nphotons = 1e4; %需要模拟的光子数量
Reflectance=0;
R_rho=0;
radius =0;
phi_cw=0;
phi_CW_n=0;
TOF_1=0;
TOF_2=0;
DistTravel_1=[];%储存光子存活距离
DistTravel_2=[];
v=3e10; % 光速
%生物组织的最大厚度
thickness = 50;
% 反射的光子
Rsp = ((nout - ntissue).^2) / ((nout + ntissue).^2);
Rs = Rsp.*Nphotons;
count=[];
% 光子存活
epsilon = 0.0001; %阈值权重
m = 10; %赌
% Q2
rho_two= 1:0.5:5; % 源检测器分离
R_CW = zeros(size(rho_two)); %反射率矩阵
h = waitbar(0,'Progress...');
%%蒙特卡洛模拟
Dist=[];
Dist(1:1000000)=0;
cpath=1;
%for k=1:5
% A=0;
for n=1:Nphotons % 逐个光子模拟
% 初始化光子参数、位置、方向
x=0;
y=0;
z=0;
mu_x=0;
mu_y=0;
mu_z=1;
% 初始化光子重
w = 1 - Rsp;
% 初始化光子路径
paths = 0;
while(w >= epsilon && z>=0) % 光子进入
%random=rand();
step = (- lamda_t) * log(rand);
paths=paths+step; %总路程
cpath=cpath+round(paths*100);
Dist(cpath)=Dist(cpath)+1;
cpath=1;
% Move photon
% Update path length
x = x + step*mu_x;
y = y + step*mu_y;
z = z + step*mu_z;
% 光子吸收与吸收重量、更新吸收矩阵
W_absorbed = w * (mua / mut);
A = A + W_absorbed;
w = w - W_absorbed ;
% 光子散射、选择新方向
cos_theta = (1/(2*g)) *(1 + (g.^2) - ( (1 - (g.^2)) / (1 - g + (2*g*rand)) )^2 );
sin_theta=sqrt(1-(cos_theta^2));
% 找新的角度
phi = 2 * pi * rand;
if (abs(mu_z)>0.999)
mu_x = sin_theta * cos(phi);
mu_y = sin_theta * sin(phi);
mu_z = sign(mu_z)*cos_theta;
else
d=sqrt(1-(mu_z^2));
mu_x= (sin_theta * (((mu_x*mu_z*cos(phi))-(mu_y*sin(phi)))/d) ) + (mu_x*cos_theta);
mu_y= (sin_theta * (((mu_y*mu_z*cos(phi))-(mu_x*sin(phi)))/d) ) + (mu_y*cos_theta);
mu_z= ((-sin_theta)*cos(phi)*d)+(mu_z*cos_theta);
end
if( w < epsilon)
if(rand()<=(1/m))
w = m*w;
else
% 死啦
w = 0;
end
end
end
% 若光子被反射
if(z< 0)
R = R + w ;
radius = sqrt(x^2 + y^2);
%Q1 光子是否在范围
count(n)=radius;
if( radius <= rho)
% Update R(rho)
R_rho = R_rho+w;
end
%% Question 2
for r = 1:numel(rho_two)
drho=0.1*rho_two(r); % +/- 10% of the ring
rho_exit_lower = rho_two(r) - drho;
rho_exit_higher = rho_two(r) + drho;
if ((rho_exit_lower<= radius) && (radius <= rho_exit_higher))
R_CW(r) = R_CW(r) + w; %更新反射矩阵
end
end
% Question 3,1cm separation
if ((1.1 >= radius) && (radius >= 0.9))
DistTravel_1=[DistTravel_1 paths]; %储存path
TOF_1=DistTravel_1./v; %path耗时
end
%1cm separation
if ((2.75 >= radius) && (radius >= 2.25))
DistTravel_2=[DistTravel_2 paths];
TOF_2=DistTravel_2./v;
end
end
waitbar(n/Nphotons,h,[num2str(100*n/Nphotons, '%.2f') '%']);
end
%count(k)=A;
%end
%%%%%%%%绘图区
close(h);
Bin_edges= linspace (1e-11,1e-9,513);
%Time resolved calculations for 1cm
figure;
h1=histogram(TOF_1,100,'Normalization','pdf');
%%%%%%%%%%%
figure;
h2=histogram(TOF_2,100,'Normalization','pdf');
%%%%%%%%%%%
y_hist = h1.Values;
BinEdges=0:0.05e-9:5e-9;
xbin = BinEdges;
Xbin=((h1.BinEdges(2:end)+h1.BinEdges(1:end-1))/2);
t=h1.BinEdges(1,2:51);
figure;
plot(Xbin,y_hist/max(y_hist),'b.');
h2=histogram(TOF_2,50,'Normalization','pdf');
%%%%%%%%%%%
y_hist = h2.Values;
start_point_TD = [0.2,70 ];
options_TD = optimset('MaxFunEvals',1e10);
%fun_TD=@(params_TD)TDmodelmonte(params_TD,rho,h.BinEdges(1,2:51),ntissue,nout,h.Values);
plot(t,y_hist,'b.');