目錄:
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) 模擬,通常比單一程式快數百到數千倍。
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。您必須使用 OpenCL 版本的 MCX、MCX-CL,從下列位置下載
https://mcx.space/wiki/?Learn#mcxcl
要運行模擬,最小輸入是配置(文字)文件,如果輸入檔案不包含內建域形狀描述,則需要外部磁碟區檔案(透過-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 將假設您一次-g 20
模擬 1 個時間門。 。如果您使用自動駕駛模式 ( -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
字段