目录:
MCX v2024.2 包含主要新功能和关键错误修复。强烈建议所有用户进行升级。
具体来说,MCX v2024.2 获得了三个重要的新功能:
与 MCX v2023 中包含的用户定义相位函数功能类似,第一个功能允许用户定义相对于源方向矢量发射光子的天顶角分布,也可以通过离散化逆 CDF(累积分布函数) 。在 MATLAB/Octave 中,它们可以分别设置为cfg.invcdf
或cfg.angleinvcdf
。我们在mcxlab/examples/demo_mcxlab_phasefun.m
和demo_mcxlab_launchangle.m
中提供了即用型演示脚本。
第二个功能允许用户在定义srcpos
、 srcdir
、 srcparam1
和srcparam2
时指定多个相同类型的源。每个源可以有独立的权重,由 srcpos 的第 4 个元素控制。
除了新功能之外,还发现了一个严重的错误,该错误会影响所有不使用光子共享的pattern
和pattern3d
模拟,请参阅
第212章
由于此错误,旧版本中的 MCX/MCX-CL 一直在模拟平方图案/pattern3d 数据而不是图案本身。如果您的模拟使用这两种源类型并且不使用光子共享(即同时模拟多个图案),请升级您的 MCX/MCX-CL 并重新运行模拟。此错误仅影响体积注量/通量输出;它不会影响漫反射输出或二进制图案。
它还包括 #195 中有关保存漫反射率时精度损失的错误修复。
我们要感谢张浩辉报告了许多关键问题(#195 和#212),感谢 Liam Keegan 贡献了一个扩展狭缝源的补丁(#214)。 ShijieYan 和 fanyuyen 也为错误修复和改进做出了贡献。
详细更新可以在下面的变更日志中找到
Monte Carlo eXtreme (MCX) 是一款用于 3D 异构复杂介质的快速物理精确光子模拟软件。通过利用现代图形处理单元 (GPU) 中的大规模并行线程和极低的内存延迟,该程序能够以极快的速度执行蒙特卡罗 (MC) 模拟,通常比单个程序快数百到数千倍。 -基于线程CPU的MC实现。
MCX 是用 C 和 NVIDIA CUDA 编写的。它只能在 NVIDIA GPU 上执行。如果您想在 AMD/Intel GPU 或 CPU 上运行硬件加速的 MCX 模拟,请下载用 OpenCL 编写的 MCX-CL (MCX for OpenCL)。 MCX和MCX-CL高度兼容。
由于底层 MC 算法的性质,MCX 和 MCX-CL 是底层的光线追踪/光线投射软件。与计算机图形或游戏引擎中常见的光线追踪库相比,MCX-CL 和 MCX 具有许多独特的特性。最重要的区别是 MCX/MCX-CL 严格基于物理定律。它们是基础辐射传递方程 (RTE) 的数值求解器,其解决方案已使用光学仪器和实验测量在许多出版物中得到验证。相比之下,大多数面向图形的光线追踪器必须进行多次近似才能实现快速渲染,从而能够提供定量准确的光模拟结果。正因为如此,MCX/MCX-CL已被生物光子学研究界广泛使用,以获得参考解决方案并指导新型医学成像系统或临床应用的开发。此外,MCX/MCX-CL 是体积射线追踪器;它们使光子射线穿过复杂的 3-D 域,并计算物理上有意义的量,例如空间分辨注量、通量、漫反射率/透射率、能量沉积、部分路径长度等。相比之下,大多数图形光线追踪引擎仅追踪光线的 RGB 颜色并将其渲染在平面 2D 屏幕上。换句话说,MCX/MCX-CL 提供物理上精确的 3D 光分布,而图形光线追踪器则专注于摄像机场景的 2D 渲染。尽管如此,它们还是有许多相似之处,例如光线行进计算、GPU 加速、散射/吸收处理等。
该软件的算法详见参考文献[Fang2009,Yu2018,Yan2020]。主要功能的简短摘要包括:
该软件可在 Windows、Linux 和 Mac OS 上使用。 MCX 采用 C/CUDA 编写,需要 NVIDIA GPU(通过 ROCm 对 AMD/Intel CPU/GPU 的支持仍在开发中)。 MCX 的更便携的 OpenCL 实现,即 MCXCL,于 2012 年 7 月发布,支持几乎所有 NVIDIA/AMD/Intel CPU 和 GPU 型号。如果您的硬件不支持 CUDA,请从以下网址下载 MCXCL:
https://mcx.space/wiki/index.cgi?Learn#mcxcl
请仔细阅读本节。使用 MCX 的大多数故障都与 NVIDIA GPU 驱动程序安装不正确有关。
请浏览 https://mcx.space/#documentation 以获取分步说明。
对于MCX-CUDA,使用该软件的要求包括
您必须确保 NVIDIA 显卡驱动程序安装正确。可在 [2] 中找到支持 CUDA 的卡的列表。 MCX 源代码可以编译的最古老的 GPU 架构是 Fermi ( sm_20
)。使用最新的 NVIDIA 卡预计会产生最佳速度。正式发布的二进制文件(包括 mex 文件和pmcx
模块)可以在 Kepler(GTX-730、 sm_35
)等老版本的 NVIDIA GPU 上运行。所有 MCX 二进制文件都可以直接在未来几代 NVIDIA GPU 上运行,无需重新编译,因此向前兼容。
在下面的网页中,我们总结了不同代 NVIDIA GPU 之间的速度差异
https://mcx.space/gpubench/
对于大容量的模拟,还需要足够的图形内存来执行模拟。 MC 模拟所需的最小图形内存量为输入组织数据的 Nx*Ny*Nz 字节加上输出通量/注量数据的 Nx*Ny*Nz*Ng*4*2 字节 - 其中 Nx,Ny,Nz是组织体积的维度,Ng 是并发时间门的数量,4 是单精度浮点数的大小,2 是确保输出精度所需的额外内存(#41)。 MCX 不需要硬件支持双精度。
MCX 将光学属性和探测器位置存储在常量存储器中。通常,NVIDIA GPU 提供大约 64 kB 恒定内存。这样一来,我们只能光学性质的总数加上探测器的数量不能超过4000个(4000 * 4 * 4 = 64 k)。
此外,MCX 将检测到的光子数据存储在共享内存中,不同 GPU 代的每个流处理器的内存范围也在 42 kB 到 100 kB 之间。如果您的域包含多种介质类型,则共享内存的分配可能会超出限制。您还将收到“内存不足”错误。
要安装 MCX,您需要下载为您的计算机体系结构(32 或 64 位)和平台编译的二进制可执行文件,解压包并在{mcx root}/bin
目录下运行可执行文件。
对于 Windows 用户,您必须确保已为您的 GPU 安装了适当的 NVIDIA 驱动程序。您还应该配置操作系统来运行 CUDA 模拟。这需要您使用文件资源管理器打开 mcx/setup/win64 文件夹,右键单击apply_timeout_registry_fix.bat
文件并选择“以管理员身份运行” 。确认后,您应该会看到一个带有消息的 Windows 命令窗口
Patching your registry
Done
Press any key to continue ...
您必须重新启动 Windows 计算机才能使此设置生效。上述补丁修改了您的驱动程序设置,以便您可以运行 MCX 模拟超过几秒钟。否则,当运行 MCX 超过几秒钟时,您将收到 CUDA 错误:“未指定错误”。
详情请参阅以下链接
https://mcx.space/wiki/index.cgi?Doc/FAQ#I_am_getting_a_kernel_launch_timed_out_error_what_is_that
如果您使用 Linux,您可以启用 Intel 集成 GPU (iGPU) 进行显示,同时让 NVIDIA GPU 专用于使用nvidia-prime
进行计算,请参阅
https://forums.developer.nvidia.com/t/solved-run-cuda-on-dedicated-nvidia-gpu-while-connecting-monitors-to-intel-hd-graphics-is-this-possible/47690/ 6
或选择本博文中的其他 4 种方法之一
https://nvidia.custhelp.com/app/answers/detail/a_id/3029/~/using-cuda-and-x
我们注意到,在具有 Intel iGPU 和 NVIDIA GPU 混合 GPU 的笔记本电脑上运行具有 6.5 内核的 Ubuntu Linux 22.04,您必须通过选择“NVIDIA(性能模式)”将笔记本电脑配置为使用 NVIDIA GPU 作为主 GPU在NVIDIA X 服务器设置的 PRIME 配置文件部分。你也可以运行
sudo prime-select nvidia
以达到同样的目标。否则,模拟可能会在运行几秒钟后挂起您的系统。如果使用 Linux,将 NVIDIA GPU 与 AMD iGPU 结合在一起的混合 GPU 笔记本电脑似乎不会出现此问题。
此外,NVIDIA 驱动程序(520 或更新版本)在 Linux 内核 6.x(例如 Ubuntu 22.04 中的内核)上运行时存在已知故障。看
https://forums.developer.nvidia.com/t/dev-nvidia-uvm-io-error-on-ubuntu-22-04-520-to-535-driver-versions/262153
当笔记本电脑处于“性能”模式并从挂起状态唤醒时,MCX 或任何 CUDA 程序无法运行并出现错误
MCX ERROR(-999):unknown error in unit mcx_core.cu:2523
这是因为内核模块nvida-uvm
挂起后无法重新加载。如果您有一个打开的 MATLAB 会话,则必须先关闭 MATLAB,然后运行以下命令(如果 MATLAB 已打开,您将看到rmmod: ERROR: Module nvidia_uvm is in use
)
sudo rmmod /dev/nvidia-uvm
sudo modprobe nvidia-uvm
执行上述命令后,MCX 应该能够再次运行。
新一代 Mac 电脑不再支持 NVIDIA 或 AMD GPU。您必须使用 MCX、MCX-CL 的 OpenCL 版本,方法是从
https://mcx.space/wiki/?Learn#mcxcl
要运行模拟,最小输入是配置(文本)文件,如果输入文件不包含内置域形状描述,则需要外部卷文件(通过-K/--mediabyte
指定体素格式的二进制文件) -K/--mediabyte
)。不带任何参数键入mcx
将打印帮助信息和支持的参数列表,如下所示:
###############################################################################
# Monte Carlo eXtreme (MCX) -- CUDA #
# Copyright (c) 2009-2024 Qianqian Fang <q.fang at neu.edu> #
# https://mcx.space/ & https://neurojson.io/ #
# #
# Computational Optics & Translational Imaging (COTI) Lab- http://fanglab.org #
# Department of Bioengineering, Northeastern University, Boston, MA, USA #
###############################################################################
# The MCX Project is funded by the NIH/NIGMS under grant R01-GM114365 #
###############################################################################
# Open-source codes and reusable scientific data are essential for research, #
# MCX proudly developed human-readable JSON-based data formats for easy reuse.#
# #
#Please visit our free scientific data sharing portal at https://neurojson.io/#
# and consider sharing your public datasets in standardized JSON/JData format #
###############################################################################
$Rev::d593a0$v2024.2 $Date::2024-03-04 00:04:10 -05$ by $Author::Qianqian Fang$
###############################################################################
usage: mcx <param1> <param2> ...
where possible parameters include (the first value in [*|*] is the default)
== Required option ==
-f config (--input) read an input file in .json or .inp format
if the string starts with '{', it is parsed as
an inline JSON input file
or
--bench ['cube60','skinvessel',..] run a buint-in benchmark specified by name
run --bench without parameter to get a list
== MC options ==
-n [0|int] (--photon) total photon number (exponential form accepted)
max accepted value:9.2234e+18 on 64bit systems
-r [1|+/-int] (--repeat) if positive, repeat by r times,total= #photon*r
if negative, divide #photon into r subsets
-b [1|0] (--reflect) 1 to reflect photons at ext. boundary;0 to exit
-B '______' (--bc) per-face boundary condition (BC), 6 letters for
/case insensitive/ bounding box faces at -x,-y,-z,+x,+y,+z axes;
overwrite -b if given.
each letter can be one of the following:
'_': undefined, fallback to -b
'r': like -b 1, Fresnel reflection BC
'a': like -b 0, total absorption BC
'm': mirror or total reflection BC
'c': cyclic BC, enter from opposite face
if input contains additional 6 letters,
the 7th-12th letters can be:
'0': do not use this face to detect photon, or
'1': use this face for photon detection (-d 1)
the order of the faces for letters 7-12 is
the same as the first 6 letters
eg: --bc ______010 saves photons exiting at y=0
-u [1.|float] (--unitinmm) defines the length unit for the grid edge
-U [1|0] (--normalize) 1 to normalize flux to unitary; 0 save raw
-E [1648335518|int|mch](--seed) set rand-number-generator seed, -1 to generate
if an mch file is followed, MCX "replays"
the detected photon; the replay mode can be used
to calculate the mua/mus Jacobian matrices
-z [0|1] (--srcfrom0) 1 volume origin is [0 0 0]; 0: origin at [1 1 1]
-k [1|0] (--voidtime) when src is outside, 1 enables timer inside void
-Y [0|int] (--replaydet) replay only the detected photons from a given
detector (det ID starts from 1), used with -E
if 0, replay all detectors and sum all Jacobians
if -1, replay all detectors and save separately
-V [0|1] (--specular) 1 source located in the background,0 inside mesh
-e [0.|float] (--minenergy) minimum energy level to trigger Russian roulette
-g [1|int] (--gategroup) number of maximum time gates per run
== GPU options ==
-L (--listgpu) print GPU information only
-t [16384|int](--thread) total thread number
-T [64|int] (--blocksize) thread number per block
-A [1|int] (--autopilot) 1 let mcx decide thread/block size, 0 use -T/-t
-G [0|int] (--gpu) specify which GPU to use, list GPU by -L; 0 auto
or
-G '1101' (--gpu) using multiple devices (1 enable, 0 disable)
-W '50,30,20' (--workload) workload for active devices; normalized by sum
-I (--printgpu) print GPU information and run program
--atomic [1|0] 1: use atomic operations to avoid thread racing
0: do not use atomic operation (not recommended)
== Input options ==
-P '{...}' (--shapes) a JSON string for additional shapes in the grid.
only the root object named 'Shapes' is parsed
and added to the existing domain defined via -f
or --bench
-j '{...}' (--json) a JSON string for modifying all input settings.
this input can be used to modify all existing
settings defined by -f or --bench
-K [1|int|str](--mediabyte) volume data format, use either a number or a str
voxel binary data layouts are shown in {...}, where [] for byte,[i:]
for 4-byte integer, [s:] for 2-byte short, [h:] for 2-byte half float,
[f:] for 4-byte float; on Little-Endian systems, least-sig. bit on left
1 or byte: 0-128 tissue labels
2 or short: 0-65535 (max to 4000) tissue labels
4 or integer: integer tissue labels
96 or asgn_float: mua/mus/g/n 4xfloat format
{[f:mua][f:mus][f:g][f:n]}
97 or svmc: split-voxel MC 8-byte format
{[n.z][n.y][n.x][p.z][p.y][p.x][upper][lower]}
98 or mixlabel: label1+label2+label1_percentage
{[label1][label2][s:0-32767 label1 percentage]}
99 or labelplus: 32bit composite voxel format
{[h:mua/mus/g/n][s:(B15-16:0/1/2/3)(label)]}
100 or muamus_float: 2x 32bit floats for mua/mus
{[f:mua][f:mus]}; g/n from medium type 1
101 or mua_float: 1 float per voxel for mua
{[f:mua]}; mus/g/n from medium type 1
102 or muamus_half: 2x 16bit float for mua/mus
{[h:mua][h:mus]}; g/n from medium type 1
103 or asgn_byte: 4x byte gray-levels for mua/s/g/n
{[mua][mus][g][n]}; 0-255 mixing prop types 1&2
104 or muamus_short: 2x short gray-levels for mua/s
{[s:mua][s:mus]}; 0-65535 mixing prop types 1&2
when formats 99 or 102 is used, the mua/mus values in the input volume
binary data must be pre-scaled by voxel size (unitinmm) if it is not 1.
pre-scaling is not needed when using these 2 formats in mcxlab/pmcx
-a [0|1] (--array) 1 for C array (row-major); 0 for Matlab array
== Output options ==
-s sessionid (--session) a string to label all output file names
-O [X|XFEJPMRL](--outputtype) X - output flux, F - fluence, E - energy deposit
/case insensitive/ J - Jacobian (replay mode), P - scattering,
event counts at each voxel (replay mode only)
M - momentum transfer; R - RF/FD Jacobian
L - total pathlength
-d [1|0-3] (--savedet) 1 to save photon info at detectors; 0 not save
2 reserved, 3 terminate simulation when detected
photon buffer is filled
-w [DP|DSPMXVW](--savedetflag)a string controlling detected photon data fields
/case insensitive/ 1 D output detector ID (1)
2 S output partial scat. even counts (#media)
4 P output partial path-lengths (#media)
8 M output momentum transfer (#media)
16 X output exit position (3)
32 V output exit direction (3)
64 W output initial weight (1)
combine multiple items by using a string, or add selected numbers together
by default, mcx only saves detector ID and partial-path data
-x [0|1] (--saveexit) 1 to save photon exit positions and directions
setting -x to 1 also implies setting '-d' to 1.
same as adding 'XV' to -w.
-X [0|1] (--saveref) 1 to save diffuse reflectance at the air-voxels
right outside of the domain; if non-zero voxels
appear at the boundary, pad 0s before using -X
-m [0|1] (--momentum) 1 to save photon momentum transfer,0 not to save.
same as adding 'M' to the -w flag
-q [0|1] (--saveseed) 1 to save photon RNG seed for replay; 0 not save
-M [0|1] (--dumpmask) 1 to dump detector volume masks; 0 do not save
-H [1000000] (--maxdetphoton) max number of detected photons
-S [1|0] (--save2pt) 1 to save the flux field; 0 do not save
-F [jnii|...](--outputformat) fluence data output format:
mc2 - MCX mc2 format (binary 32bit float)
jnii - JNIfTI format (https://neurojson.org)
bnii - Binary JNIfTI (https://neurojson.org)
nii - NIfTI format
hdr - Analyze 7.5 hdr/img format
tx3 - GL texture data for rendering (GL_RGBA32F)
the bnii/jnii formats support compression (-Z) and generate small files
load jnii (JSON) and bnii (UBJSON) files using below lightweight libs:
MATLAB/Octave: JNIfTI toolbox https://neurojson.org/download/jnifti
MATLAB/Octave: JSONLab toolbox https://neurojson.org/download/jsonlab
Python: PyJData: https://neurojson.org/download/pyjdata
JavaScript: JSData: https://neurojson.org/download/jsdata
-Z [zlib|...] (--zip) set compression method if -F jnii or --dumpjson
is used (when saving data to JSON/JNIfTI format)
0 zlib: zip format (moderate compression,fast)
1 gzip: gzip format (compatible with *.gz)
2 base64: base64 encoding with no compression
3 lzip: lzip format (high compression,very slow)
4 lzma: lzma format (high compression,very slow)
5 lz4: LZ4 format (low compression,extrem. fast)
6 lz4hc: LZ4HC format (moderate compression,fast)
--dumpjson [-,0,1,'file.json'] export all settings, including volume data using
JSON/JData (https://neurojson.org) format for
easy sharing; can be reused using -f
if followed by nothing or '-', mcx will print
the JSON to the console; write to a file if file
name is specified; by default, prints settings
after pre-processing; '--dumpjson 2' prints
raw inputs before pre-processing
== User IO options ==
-h (--help) print this message
-v (--version) print MCX revision number
-l (--log) print messages to a log file instead
-i (--interactive) interactive mode
== Debug options ==
-D [0|int] (--debug) print debug information (you can use an integer
or or a string by combining the following flags)
-D [''|RMPT] 1 R debug RNG
/case insensitive/ 2 M store photon trajectory info
4 P print progress bar
8 T save trajectory data only, disable flux/detp
combine multiple items by using a string, or add selected numbers together
== Additional options ==
--root [''|string] full path to the folder storing the input files
--gscatter [1e9|int] after a photon completes the specified number of
scattering events, mcx then ignores anisotropy g
and only performs isotropic scattering for speed
--srcid [0|-1,0,1,2,..] -1 simulate multi-source separately;0 all sources
together; a positive integer runs a single source
--internalsrc [0|1] set to 1 to skip entry search to speedup launch
--maxvoidstep [1000|int] maximum distance (in voxel unit) of a photon that
can travel before entering the domain, if
launched outside (i.e. a widefield source)
--maxjumpdebug [10000000|int] when trajectory is requested (i.e. -D M),
use this parameter to set the maximum positions
stored (default: 1e7)
== Example ==
example: (list built-in benchmarks)
mcx --bench
or (list supported GPUs on the system)
mcx -L
or (use multiple devices - 1st,2nd and 4th GPUs - together with equal load)
mcx --bench cube60b -n 1e7 -G 1101 -W 10,10,10
or (use inline domain definition)
mcx -f input.json -P '{"Shapes":[{"ZLayers":[[1,10,1],[11,30,2],[31,60,3]]}]}'
or (use inline json setting modifier)
mcx -f input.json -j '{"Optode":{"Source":{"Type":"isotropic"}}}'
or (dump simulation in a single json file)
mcx --bench cube60planar --dumpjson
为了进一步说明命令行选项,下面可以找到一个示例命令
mcx -A 0 -t 16384 -T 64 -n 1e7 -G 1 -f input.json -r 2 -s test -g 10 -d 1 -w dpx -b 1
上面的命令要求 mcx 手动 ( -A 0
) 设置 GPU 线程,并启动 16384 个 GPU 线程 ( -t
),每 64 个线程一个块 ( -T
);第一个 GPU ( -G 1
) 模拟总共 1e7 个光子 ( -n
) 并重复两次 ( -r
) - 即总共 2e7 个光子;媒体/源配置将从名为input.json
( -f
) 的 JSON 文件中读取,输出将标有会话 ID“test”( -s
);如果 GPU 内存无法同时模拟所有所需的时间门,则模拟将运行 10 个并发时间门 ( -g
)。通过定义的探测器位置的光子被保存以供以后重新缩放( -d
);考虑介质边界 ( -b
) 处的折射率失配。
从历史上看,MCX 支持 tMCimg 使用的输入文件格式 (.inp) 的扩展版本。但是,我们正在逐步取消 .inp 支持,并强烈鼓励用户采用 JSON 格式 (.json) 输入文件。许多高级 MCX 选项仅支持 JSON 输入格式。
旧版 .inp MCX 输入文件如下所示:
1000000 # total photon, use -n to overwrite in the command line
29012392 # RNG seed, negative to generate, use -E to overwrite
30.0 30.0 0.0 1 # source position (in grid unit), the last num (optional) sets --srcfrom0 (-z)
0 0 1 0 # initial directional vector, 4th number is the focal-length, 0 for collimated beam, nan for isotropic
0.e+00 1.e-09 1.e-10 # time-gates(s): start, end, step
semi60x60x60.bin # volume ('unsigned char' binary format, or specified by -K/--mediabyte)
1 60 1 60 # x voxel size in mm (isotropic only), dim, start/end indices
1 60 1 60 # y voxel size, must be same as x, dim, start/end indices
1 60 1 60 # y voxel size, must be same as x, dim, start/end indices
1 # num of media
1.010101 0.01 0.005 1.37 # scat. mus (1/mm), g, mua (1/mm), n
4 1.0 # detector number and default radius (in grid unit)
30.0 20.0 0.0 2.0 # detector 1 position (real numbers in grid unit) and individual radius (optional)
30.0 40.0 0.0 # ..., if individual radius is ignored, MCX will use the default radius
20.0 30.0 0.0 #
40.0 30.0 0.0 #
pencil # source type (optional)
0 0 0 0 # parameters (4 floats) for the selected source
0 0 0 0 # additional source parameters
注意,散射系数mus=musp/(1-g)。
MCX 可以通过两种方式读取卷文件(上例中的semi60x60x60.bin
):行优先[3] 或列优先,具体取决于用户参数-a
的值。如果卷文件是使用 matlab 或 fortran 保存的,则字节顺序是列优先的,您应该使用-a 0
或将其保留在命令行之外。如果它是使用 C 中的fwrite()
保存的,则顺序是行优先的,您可以使用-a 1
。
您可以将二进制卷文件替换为 JSON 格式的形状文件。详情请参阅第五节。
时间门参数由三个数字指定:开始时间、结束时间和时间步长(以秒为单位)。在上面的示例中,配置指定了 [0 1] ns 的总时间窗口,分辨率为 0.1 ns。这意味着时间门的总数是 10 个。
MCX 提供了高级选项 -g,用于在 GPU 内存有限时运行模拟。它指定要同时模拟多少个时间门。用户可能希望将该数量限制为小于输入文件中指定的总数 - 默认情况下,它在单个模拟中一次运行一个门。但是,如果根据第 II 节中的内存要求有足够的内存,您可以使用-g 10
同时模拟所有 10 个时间门(来自上面的示例),在这种情况下,您必须确保显卡至少有 60*60 *60*10*5=10MB 可用内存。如果您不包含-g
,MCX 将假定您一次只想模拟 1 个时间门。如果您指定的时间门编号大于输入文件中的总数(例如-g 20
)当 10 个时间门完成时,MCX 将停止。如果您使用自动驾驶模式 ( -A
),则会自动为您估计时间门。
从版本 0.7.9 开始,MCX 除了接受传统的类似 tMCimg 的输入格式外,还接受 JSON 格式的输入文件。 JSON(JavaScript 对象表示法)是一种可移植、人类可读且“无脂肪”的文本格式,用于表示复杂且分层的数据。使用 JSON 格式使输入文件不言自明、可扩展并且易于与其他应用程序(例如 MATLAB)交互。
示例 JSON 输入文件可以在 Examples/quicktest 文件夹下找到。相同的文件qtest.json
也如下所示:
{
"Help": {
"[en]": {
"Domain::VolumeFile": "file full path to the volume description file, can be a binary or JSON file",
"Domain::Dim": "dimension of the data array stored in the volume file",
"Domain::OriginType": "similar to --srcfrom0, 1 if the origin is [0 0 0], 0 if it is [1.0,1.0,1.0]",
"Domain::LengthUnit": "define the voxel length in mm, similar to --unitinmm",
"Domain::Media": "the first medium is always assigned to voxels with a value of 0 or outside of
the volume, the second row is for medium type 1, and so on. mua and mus must
be in 1/mm unit",
"Session::Photons": "if -n is not specified in the command line, this defines the total photon number",
"Session::ID": "if -s is not specified in the command line, this defines the output file name stub",
"Forward::T0": "the start time of the simulation, in seconds",
"Forward::T1": "the end time of the simulation, in seconds",
"Forward::Dt": "the width of each time window, in seconds",
"Optode::Source::Pos": "the grid position of the source, can be non-integers, in grid unit",
"Optode::Detector::Pos": "the grid position of a detector, can be non-integers, in grid unit",
"Optode::Source::Dir": "the unitary directional vector of the photon at launch",
"Optode::Source::Type": "source types, must be one of the following:
pencil,isotropic,cone,gaussian,planar,pattern,fourier,arcsine,disk,fourierx,fourierx2d,
zgaussian,line,slit,pencilarray,pattern3d",
"Optode::Source::Param1": "source parameters, 4 floating-point numbers",
"Optode::Source::Param2": "additional source parameters, 4 floating-point numbers"
}
},
"Domain": {
"VolumeFile": "semi60x60x60.bin",
"Dim": [60,60,60],
"OriginType": 1,
"LengthUnit": 1,
"Media": [
{"mua": 0.00, "mus": 0.0, "g": 1.00, "n": 1.0},
{"mua": 0.005,"mus": 1.0, "g": 0.01, "n": 1.0}
]
},
"Session": {
"Photons": 1000000,
"RNGSeed": 29012392,
"ID": "qtest"
},
"Forward": {
"T0": 0.0e+00,
"T1": 5.0e-09,
"Dt": 5.0e-09
},
"Optode": {
"Source": {
"Pos": [29.0, 29.0, 0.0],
"Dir": [0.0, 0.0, 1.0],
"Type": "pencil",
"Param1": [0.0, 0.0, 0.0, 0.0],
"Param2": [0.0, 0.0, 0.0, 0.0]
},
"Detector": [
{
"Pos": [29.0, 19.0, 0.0],
"R": 1.0
},
{
"Pos": [29.0, 39.0, 0.0],
"R": 1.0
},
{
"Pos": [19.0, 29.0, 0.0],
"R": 1.0
},
{
"Pos": [39.0, 29.0, 0.0],
"R": 1.0
}
]
}
}
JSON 输入文件需要几个根对象,即Domain
、 Session
、 Forward
和Optode
。其他根部分,例如Help
,将被忽略。每个对象都是一个数据结构,提供由其名称指示的信息。每个对象可以包含各种子字段。同一级别的字段顺序灵活。对于每个字段,您始终可以在*.inp
输入文件中找到等效字段。例如, Domain
下的VolumeFile
字段