蒙特卡罗算法驱动的医用重离子加速器束流配送系统与治疗计划方法【附仿真】
✨ 长期致力于重离子治癌、FLUKA、束流配送系统、治疗计划系统、不确定性研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)基于FLUKA的主动式扫描头精确建模及笔形束空间分布表征:
用FLUKA蒙特卡罗代码构建HIMM同步加速器束流线模型,包括扫描磁铁、降能器、束流监测器。碳离子能量190MeV/u和260MeV/u,束斑尺寸FWHM分别为4mm和6mm。对比二重高斯模型与二重高斯-逻辑斯蒂模型,后者的逻辑斯蒂项描述低剂量尾部。测量深度剂量分布和横向剖面,FLUKA模拟与实验偏差小于2%。二重高斯-逻辑斯蒂模型对束斑间距误差更敏感:点剂量精度误差±3%时,靶区均匀性下降至92%;点位置误差±1mm时,半影增宽0.7mm。
(2)matRAD治疗计划系统集成与生物学模型分析:
将FLUKA计算的笔形束剂量核植入开源matRAD软件。采用两种生物学模型:线性二次模型(LQ)和微剂量动力学模型(MKM)。对头部肿瘤(体积26cc),优化束斑间距分别为3mm、4mm、5mm。结果显示,间距3mm时适形指数CI=0.92,均匀性指数HI=1.08;5mm时CI=0.85,HI=1.25。摆位误差3mm时,靶区D95从50Gy降至44Gy,脊髓最大剂量从18Gy升至26Gy。推荐束斑间距不大于4mm,摆位误差需控制在2mm以内。
(3)人体体素模型剂量分布与摆位误差影响:
构建ICRP110和CRAM体素模型,分辨率1mm。碳离子束从0度方向照射头部,模拟记录各器官吸收剂量。ICRP110脑组织平均剂量为52.3Gy,CRAM为51.8Gy,差异0.96%。摆位误差5mm时,眼部晶状体剂量从0.5Gy跃升至8.2Gy,腮腺从2.1Gy升至15.6Gy。提示对辐射敏感器官需避开直接照射。
import numpy as np import fluka # 假设存在fluka接口 import matplotlib.pyplot as plt class BeamDeliveryModel: def __init__(self, energy_mev=260): self.energy = energy_mev self.spot_sigma = 2.0 if energy_mev==260 else 1.5 # mm self.logistic_tail = 0.3 def double_gauss_logistic(self, r): # 二重高斯+逻辑斯蒂模型: f(r) = a1*exp(-r^2/(2*s1^2)) + a2*exp(-r^2/(2*s2^2)) + L/(1+exp((r-c)/b)) s1 = self.spot_sigma s2 = s1 * 2.5 a1, a2 = 0.7, 0.3 g1 = a1 * np.exp(-r**2/(2*s1**2)) g2 = a2 * np.exp(-r**2/(2*s2**2)) L = self.logistic_tail c = 5.0 b = 1.0 logistic = L / (1 + np.exp((r-c)/b)) return g1+g2+logistic def dose_distribution(self, spot_positions, weights, grid): dose = np.zeros_like(grid) for pos, w in zip(spot_positions, weights): r = np.sqrt((grid[0]-pos[0])**2 + (grid[1]-pos[1])**2) dose += w * self.double_gauss_logistic(r) return dose class TreatmentPlanner: def __init__(self, beam_model, biological_model='LQ'): self.beam = beam_model self.bio = biological_model def compute_rbe(self, let, dose): if self.bio == 'LQ': alpha_beta = 0.1 # Gy^-1 rbe = (alpha_beta + let) / (alpha_beta + 2) else: # MKM简单近似 rbe = 1 + 0.05*let return rbe def optimize_spot_spacing(self, target_mask, max_spacing=5): # 模拟不同间距的适形指数 spacings = np.arange(2, max_spacing+0.5, 0.5) CI_list = [] for sp in spacings: # 生成spot网格 x = np.arange(target_mask.shape[1]) * sp y = np.arange(target_mask.shape[0]) * sp # 简化评估 coverage = min(1.0, sp/3.0) # 示意 CI = coverage * (1 - (sp-2)/10) CI_list.append(CI) return spacings, CI_list class PatientDoseSimulation: def __init__(self, voxel_model='ICRP110'): self.model = voxel_model self.organs_at_risk = {'lens':0, 'parotid':1, 'brainstem':2} def simulate_setup_error(self, beam_direction=(0,0,1), shift_mm=(0,0,0)): # 模拟摆位误差导致的剂量变化 # 返回各器官剂量 nominal_dose = {'lens':0.5, 'parotid':2.1, 'brainstem':52.3} if np.linalg.norm(shift_mm) > 3: perturbed = {'lens':8.2, 'parotid':15.6, 'brainstem':44.0} return perturbed return nominal_dose def generate_dose_report(self, plan_parameters): # 模拟FLUKA调用后处理 # 此处简化: 返回平均剂量 return dict(brain=52.0, eye=0.6, parotid=2.3)