目次:
MCX v2024.2 には、主要な新機能と重大なバグ修正の両方が含まれています。すべてのユーザーに強く推奨されるアップグレードです。
具体的には、MCX v2024.2 には 3 つの重要な新機能が追加されました。
MCX v2023 に含まれるユーザー定義の位相関数機能と同様に、最初の機能では、ユーザーは離散化逆 CDF (累積分布関数) を介して、光源方向ベクトルを基準にして光子を発射するための天頂角分布を定義できます。 。 MATLAB/Octave では、それぞれcfg.invcdf
またはcfg.angleinvcdf
として設定できます。すぐに使用できるデモ スクリプトをmcxlab/examples/demo_mcxlab_phasefun.m
およびdemo_mcxlab_launchangle.m
で提供しました。
2 番目の機能により、ユーザーはsrcpos
、 srcdir
、 srcparam1
、およびsrcparam2
定義するときに、同じタイプの複数のソースを指定できます。各ソースは、srcpos の 4 番目の要素によって制御される独立した重みを持つことができます。
新機能とは別に、フォトン共有を使用しないすべてのpattern
およびpattern3d
シミュレーションに影響する重大なバグが発見されました。を参照してください。
#212
このバグのため、古いリリースの MCX/MCX-CL は、パターン自体ではなく正方形のパターン/pattern3d データをシミュレートしていました。シミュレーションでこれら 2 つのソース タイプを使用し、フォトン共有を使用しない場合 (つまり、複数のパターンを一緒にシミュレーションする場合)、MCX/MCX-CL をアップグレードしてシミュレーションを再実行してください。このバグは体積フルエンス/磁束出力にのみ影響します。拡散反射出力やバイナリ パターンには影響しません。
また、拡散反射率を保存する際の精度損失に関する #195 のバグ修正も含まれています。
多くの重要な問題を報告してくれた Haohui Zhang (#195 と #212)、スリット ソースを拡張するパッチ (#214) を提供してくれた Liam Keegan に感謝します。 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 次元領域全体で光子線を横断し、空間的に分解されたフルエンス、光束、拡散反射率/透過率、エネルギー蓄積、部分光路長などの物理的に意味のある量を計算します。対照的に、ほとんどのグラフィックス レイ トレーシング エンジンは、レイの 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 をサポートしていない場合は、次の URL から MCXCL をダウンロードしてください。
https://mcx.space/wiki/index.cgi?Learn#mcxcl
このセクションをよくお読みください。 MCX を使用した障害の大部分は、NVIDIA GPU ドライバーの誤ったインストールに関連していることがわかりました。
詳しい手順については、https://mcx.space/#documentation を参照してください。
MCX-CUDA の場合、このソフトウェアを使用するための要件は次のとおりです。
NVIDIA グラフィックス ドライバーが正しくインストールされていることを確認する必要があります。 CUDA 対応カードのリストは [2] にあります。 MCX ソース コードをコンパイルできる最も古い GPU アーキテクチャは Fermi ( sm_20
) です。最新の NVIDIA カードを使用すると、最高の速度が得られることが期待されます。正式にリリースされたバイナリ (mex ファイルおよびpmcx
モジュールを含む) は、Kepler (GTX-730、 sm_35
) と同じくらい古い NVIDIA GPU で実行できます。すべての MCX バイナリは、再コンパイルすることなく将来の世代の NVIDIA GPU で直接実行できるため、前方互換性があります。
以下の Web ページでは、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 シミュレーションを実行するように OS を構成する必要もあります。これには、ファイル エクスプローラーを使用して 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 を使用している場合は、 nvidia-prime
を使用して NVIDIA GPU をコンピューティング専用にしたまま、表示用にインテル統合 GPU (iGPU) を有効にすることができます。 を参照してください。
https://forums.developer.nvidia.com/t/solved-run-cuda-on-dicate-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 の OpenCL バージョン、MCX-CL を以下からダウンロードして使用する必要があります。
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 に GPU スレッドを手動で設定し ( -A 0
)、1 ブロックあたり 64 スレッドごとに 16384 の GPU スレッドを起動する ( -t
) ように要求します ( -T
)。合計 1e7 フォトン ( -n
) が最初の GPU ( -G 1
) によってシミュレートされ、2 回繰り返されます ( -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) であることに注意してください。
ボリューム ファイル (上記の例ではsemi60x60x60.bin
) は、MCX によって、ユーザー パラメータ-a
の値に応じて行優先[3] または列優先の 2 つの方法で読み取ることができます。ボリューム ファイルが matlab または fortran を使用して保存された場合、バイト順序は列優先になるため、 -a 0
使用するか、コマンド ラインから省略する必要があります。 C のfwrite()
使用して保存された場合、順序は行優先となり、 -a 1
使用できます。
バイナリ ボリューム ファイルを JSON 形式のシェープ ファイルに置き換えることができます。詳細については、セクション V を参照してください。
タイム ゲート パラメーターは、開始時間、終了時間、タイム ステップ サイズ (秒単位) の 3 つの数値で指定します。上記の例では、設定は [0 1] ns の合計時間ウィンドウを 0.1 ns の分解能で指定します。つまり、タイムゲートの総数は 10 になります。
MCX には、GPU メモリが制限されている場合にシミュレーションを実行するための高度なオプション -g が用意されています。同時にシミュレートするゲートの数を指定します。ユーザーは、その数を入力ファイルで指定された合計数よりも少なく制限したい場合があります。デフォルトでは、単一のシミュレーションで一度に 1 つのゲートが実行されます。ただし、セクション II のメモリ要件に基づいて十分なメモリがある場合は、 -g 10
使用して (上記の例の) 10 個のタイム ゲートすべてを同時にシミュレートできます。その場合、ビデオ カードに少なくとも 60*60 のメモリがあることを確認する必要があります。 *60*10*5=10MB の空きメモリ。 -g
含めないと、MCX は一度に 1 つのタイム ゲートだけをシミュレートすると想定します。入力ファイルの合計数より大きいタイム ゲート数を指定した場合 (例: -g 20
) MCX は 10 回のタイムゲートが完了すると停止します。自動操縦モード ( -A
) を使用する場合、タイムゲートは自動的に推定されます。
バージョン 0.7.9 以降、MCX は従来の tMCimg のような入力形式に加えて、JSON 形式の入力ファイルを受け入れます。 JSON (JavaScript Object Notation) は、複雑な階層データを表現するための移植性があり、人間が判読できる「脂肪のない」テキスト形式です。 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
フィールド