Содержание:
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
. Каждый источник может иметь независимый вес, управляемый 4-м элементом srcpos.
Помимо новых функций, была обнаружена серьезная ошибка, которая затрагивает все модели pattern
и pattern3d
, которые не используют совместное использование фотонов, см.
#212
Из-за этой ошибки MCX/MCX-CL в более старых версиях имитировал квадратные данные шаблона/pattern3d вместо самого шаблона. Если в вашем моделировании используются эти два типа источников и вы не используете совместное использование фотонов (т. е. совместное моделирование нескольких шаблонов), обновите MCX/MCX-CL и повторно запустите моделирование. Эта ошибка влияет только на объемные значения флюенса/потока; это не влияет на выходные данные диффузного отражения или двоичные диаграммы.
Он также включает исправление ошибки № 195, касающееся потери точности при сохранении диффузного отражения.
Мы хотим поблагодарить Хаохуэй Чжана за сообщение о ряде критических проблем (№195 и №212), Лиама Кигана за исправление для расширения исходного кода (№214). Шиджи Ян и Фанюен также внесли свой вклад в исправления ошибок и улучшения.
Подробные обновления можно найти в журнале изменений ниже.
Monte Carlo eXtreme (MCX) — это быстрое и физически точное программное обеспечение для фотонного моделирования сложных трехмерных гетерогенных сред. Используя преимущества массивных параллельных потоков и чрезвычайно низкой задержки памяти в современном графическом процессоре (GPU), эта программа способна выполнять моделирование Монте-Карло (MC) с невероятной скоростью, обычно в сотни-тысячу раз быстрее, чем одиночный процессор. Многопоточная реализация MC на базе ЦП.
MCX написан на C и NVIDIA CUDA. Он выполняется только на графических процессорах NVIDIA. Если вы хотите запустить моделирование MCX с аппаратным ускорением на графических процессорах или процессорах AMD/Intel, загрузите MCX-CL (MCX для OpenCL), написанный на OpenCL. MCX и MCX-CL полностью совместимы.
Из-за характера базовых алгоритмов MC MCX и MCX-CL представляют собой скрытое программное обеспечение для трассировки лучей и приведения лучей. По сравнению с широко распространенными библиотеками трассировки лучей, используемыми в компьютерной графике или игровых движках, MCX-CL и MCX обладают многими уникальными характеристиками. Самое важное отличие состоит в том, что MCX/MCX-CL строго основаны на физических законах. Они являются численными решателями основного уравнения переноса излучения (RTE), и их решения были проверены во многих публикациях с использованием оптических инструментов и экспериментальных измерений. Для сравнения, большинству графических трассировщиков лучей приходится выполнять множество аппроксимаций, чтобы добиться быстрого рендеринга и обеспечить количественно точные результаты моделирования света. По этой причине MCX/MCX-CL широко используются исследовательскими сообществами в области биофотоники для получения эталонных решений и руководства разработкой новых систем медицинской визуализации или клинических приложений. Кроме того, MCX/MCX-CL представляют собой объемные трассировщики лучей; они пропускают фотонные лучи через сложные трехмерные области и вычисляют физически значимые величины, такие как флюенс с пространственным разрешением, поток, диффузное отражение/пропускание, энерговыделение, частичные длины пути и многие другие. Напротив, большинство графических механизмов трассировки лучей отслеживают только цвет RGB луча и отображают его на плоском двухмерном экране. Другими словами, MCX/MCX-CL обеспечивает физически точное трехмерное распределение света, в то время как графические трассировщики лучей фокусируются на двухмерном рендеринге сцены на камере. Тем не менее, они имеют много общего, например, вычисления лучевого марширования, ускорение графического процессора, обработку рассеяния/поглощения и т. д.
Алгоритм работы этого программного обеспечения подробно описан в ссылках [Fang2009,Yu2018,Yan2020]. Краткое изложение основных характеристик включает в себя:
Это программное обеспечение можно использовать в Windows, Linux и Mac OS. MCX написан на C/CUDA и требует графических процессоров NVIDIA (поддержка процессоров/графических процессоров AMD/Intel через ROCm все еще находится в стадии разработки). Более портативная реализация MCX для OpenCL, то есть MCXCL, была анонсирована в июле 2012 года и поддерживает почти все модели процессоров и графических процессоров NVIDIA/AMD/Intel. Если ваше оборудование не поддерживает CUDA, загрузите MCXCL по указанному ниже URL-адресу:
https://mcx.space/wiki/index.cgi?Learn#mcxcl
Пожалуйста, внимательно прочитайте этот раздел. Большинство сбоев при использовании MCX были связаны с неправильной установкой драйвера графического процессора NVIDIA.
Пожалуйста, просмотрите https://mcx.space/#documentation для получения пошаговых инструкций.
Для MCX-CUDA требования для использования этого программного обеспечения включают:
Вы должны убедиться, что ваш графический драйвер NVIDIA установлен правильно. Список карт с поддержкой CUDA можно найти по адресу [2]. Самая старая архитектура графического процессора, которую можно скомпилировать исходным кодом MCX, — это Fermi ( sm_20
). Ожидается, что использование новейшей карты NVIDIA обеспечит максимальную скорость. Официально выпущенные двоичные файлы (включая файлы mex и модули pmcx
) могут работать на графических процессорах NVIDIA, таких как Kepler (GTX-730, sm_35
). Все двоичные файлы MCX могут работать непосредственно на будущих поколениях графических процессоров NVIDIA без необходимости перекомпиляции, поэтому они совместимы с будущими версиями.
На веб-странице ниже мы суммировали разницу в скорости между различными поколениями графических процессоров NVIDIA.
https://mcx.space/gpubench/
Для моделирования больших объемов для выполнения моделирования также требуется достаточный объем графической памяти. Минимальный объем графической памяти, необходимый для моделирования MC, составляет Nx*Ny*Nz байт для входных данных о ткани плюс Nx*Ny*Nz*Ng*4*2 байта для выходных данных потока/флюэнса - где Nx,Ny,Nz — размеры объема ткани, Ng — количество одновременных временных ворот, 4 — размер числа одинарной точности с плавающей запятой, 2 — дополнительная память, необходимая для обеспечения точности вывода (#41). MCX не требует поддержки двойной точности на вашем оборудовании.
MCX сохраняет оптические свойства и положения детекторов в постоянной памяти. Обычно графические процессоры NVIDIA обеспечивают около 64 КБ постоянной памяти. В результате мы можем только общее количество оптических свойств плюс количество детекторов не может превышать 4000 (4000*4*4 = 64 к).
Кроме того, MCX сохраняет данные обнаруженных фотонов в общей памяти, размер которой также варьируется от 42 до 100 КБ на каждый потоковый процессор для разных поколений графических процессоров. Если ваш домен содержит много типов носителей, возможно, выделение общей памяти может превысить лимит. Вы также получите сообщение об ошибке «недостаточно памяти».
Чтобы установить MCX, вам необходимо загрузить двоичный исполняемый файл, скомпилированный для вашей компьютерной архитектуры (32 или 64-битной) и платформы, извлечь пакет и запустить исполняемый файл в каталоге {mcx root}/bin
.
Пользователи Windows должны убедиться, что для вашего графического процессора установлен соответствующий драйвер 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 (iGPU) для отображения, оставив графический процессор NVIDIA выделенным для вычислений с использованием 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
Мы заметили, что при запуске Ubuntu Linux 22.04 с ядром 6.5 на ноутбуке с гибридным графическим процессором с Intel iGPU и графическим процессором NVIDIA необходимо настроить ноутбук на использование графического процессора NVIDIA в качестве основного графического процессора, выбрав «NVIDIA (режим производительности)». в разделе «Профили PRIME» в настройках NVIDIA X Server . Вы также можете запустить
sudo prime-select nvidia
для достижения той же цели. В противном случае симуляция может зависнуть в вашей системе после работы на несколько секунд. Ноутбук с гибридным графическим процессором, сочетающий графический процессор NVIDIA с iGPU AMD, похоже, не имеет этой проблемы при использовании Linux.
Кроме того, драйвер 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. вам придется использовать версию MCX для OpenCL, 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
) установить потоки графического процессора и запустить 16384 потока графического процессора ( -t
) с каждыми 64 потоками в блоке ( -T
); всего 1e7 фотонов ( -n
) моделируются первым графическим процессором ( -G 1
) и повторяются дважды ( -r
) - т.е. всего 2e7 фотонов; конфигурация носителя/источника будет считана из файла JSON с именем input.json
( -f
), а выходные данные будут помечены идентификатором сеанса «test» ( -s
); симуляция будет запускать 10 одновременных временных ворот ( -g
), если память графического процессора не может симулировать все нужные временные ворота одновременно. Фотоны, проходящие через определенные положения детектора, сохраняются для последующего изменения масштаба ( -d
); Несоответствие показателей преломления рассматривается на границах сред ( -b
).
Исторически сложилось так, что MCX поддерживает расширенную версию формата входного файла (.inp), используемого tMCimg. Однако мы постепенно прекращаем поддержку .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 двумя способами: по строке[3] или по столбцу в зависимости от значения пользовательского параметра -a
. Если файл тома был сохранен с использованием Matlab или Fortran, порядок байтов — по столбцам, и вам следует использовать -a 0
или исключить его из командной строки. Если он был сохранен с помощью fwrite()
в C, порядок является основным по строкам, и вы можете использовать -a 1
.
Вы можете заменить файл двоичного тома файлом формы в формате JSON. Подробную информацию см. в разделе V.
Параметр временного шлюза задается тремя числами: временем начала, временем окончания и размером временного шага (в секундах). В приведенном выше примере конфигурация определяет общий временной интервал [0 1] нс с разрешением 0,1 нс. Это означает, что общее количество временных врат равно 10.
MCX предоставляет расширенную опцию -g для запуска моделирования, когда память графического процессора ограничена. Он определяет, сколько временных ворот необходимо моделировать одновременно. Пользователи могут захотеть ограничить это число меньшим, чем общее число, указанное во входном файле - и по умолчанию он запускает по одному вентилю за раз в одной симуляции. Но если памяти достаточно, исходя из требований к памяти, описанных в разделе II, вы можете смоделировать все 10 временных ворот (из приведенного выше примера) одновременно, используя -g 10
, и в этом случае вы должны убедиться, что видеокарта имеет как минимум 60 * 60 *60*10*5=10 МБ свободной памяти. Если вы не укажете -g
, MCX предположит, что вы хотите имитировать только 1 временной шлюз за раз. Если вы укажете номер временного шлюза, превышающий общее число во входном файле (например, -g 20
), MCX остановится, когда пройдут 10 временных врат. Если вы используете режим автопилота ( -A
), то временные интервалы рассчитываются для вас автоматически.
Начиная с версии 0.7.9, MCX принимает входной файл в формате JSON в дополнение к обычному входному формату, подобному tMCimg. JSON (нотация объектов JavaScript) — это переносимый, удобочитаемый и «обезжиренный» текстовый формат для представления сложных иерархических данных. Использование формата JSON делает входной файл понятным, расширяемым и простым в использовании с другими приложениями (например, MATLAB).
Пример входного файла JSON можно найти в папке example/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
. Например, поле VolumeFile
в Domain