Hi Dr. Fang,
Thanks for this amazing software.
I'm working with MMC widefield sources and detectors via the cli interface using json config and missing some features that I see are present in the mmclab.
Specifically, when defining a detector they just accept "Pos" and "R", and from tests I inferred this detector is located in the XY plane. From the mmclab i can see that actually you can define detparam1 and detparam2, which allow you to use issaveexit=2. Is this behavior allowed from the command line using json input?
On the other hand, when working with detectors and activating the -x flag to save exit position/direction i get a mch file containing the following:
The position and direction works, and i can plot both the mct and mch data which seems coherent.
But I'm missing the way to be able to know the weight of the photons when reaching the detector, as well as detected photon time, mean path per tissue and mean scat.
Would I need to trace each photon path from the mct file and somehow determine in which element are they present at each moment to track that information?
Looking though the repo I found matlab/mmcdetweight.m and matlab/mmcmeanscat.m, but they use the detp object from mmclab which already contains things like ppath or nscat that I don’t have. I’m sure I’m missing something to be able to have that information. Can you kindly point me in the right direction?
Thanks in advance,
Alejandro
Find the information on the system and mesh below:
MMC in Ubuntu 24 x64, RTX 4060 (Rev::a1465d$v2025.10$Date::2026-03-27 17:07:15 -04$ by $Author::Qianqian Fang), latest version of iso2mesh. Command for MMC:
mmc -f config.json -V 1 -k 0 -b 1 -M P -D SEMW -x 1 --momentum
Simulation mesh can be generated as:
voxelCube = ones(20, 20, 20);
voxelCube = uint8(voxelCube);
[node, elem, face] = v2m(voxelCube, [], 1, 1, 'cgalmesh');
% Source
srcPos = [10, 10, 25];
srcDir = [ 0,0,-1];
srcType = 'planar';
srcStruct = struct( ...
'srctype', srcType, ...
'srcpos', srcPos, ...
'srcdir', srcDir, ...
'srcparam1', [2 0 0 0], ...
'srcparam2', [0 2 0 0]);
[nodes_final, elem_final] = mmcaddsrc(node, elem, srcStruct);
% Detector
detStruct = struct( ...
'srctype', 'disk', ...
'srcpos', [10, 10, 30], ...
'srcdir', srcDir, ...
'srcparam1', [2 0 0 0], ...
'srcparam2', [0 0 0 0]);
[nodes_final, elem_final] = mmcadddet(nodes_final, elem_final, detStruct);
eid = tsearchn(nodes_final, elem_final(:,1:4), srcPos);
savemmcmesh('mesh', nodes_final, elem_final);
Props are:
1 1
1 0.1 1 0.2 1.3
And json config:
{
"Mesh": {
"MeshID": "sample_cube",
"InitElem": -1
},
"Session": {
"Photons": 200000,
"Seed": 42,
"ID": "sample_cube"
},
"Forward": {
"T0": 0.0,
"T1": 5e-09,
"Dt": 5e-09
},
"Optode": {
"Source": {
"Type": "planar",
"Pos": [
10,
10,
25
],
"Dir": [
0,
0,
-1
],
"Param1": [
2.0,
0.0,
0.0,
0.0
],
"Param2": [
0.0,
2.0,
0.0,
0.0
]
},
"Detector": [{
"Pos": [10,10,30],
"R": 2
}]
}
}
hi Alejandro,
see my replies below.
You don't often get email from alexr...@gmail.com. Learn why this is important
Hi Dr. Fang,
Thanks for this amazing software.I'm working with MMC widefield sources and detectors via the cli interface using json config and missing some features that I see are present in the mmclab.
Specifically, when defining a detector they just accept "Pos" and "R", and from tests I inferred this detector is located in the XY plane. From the mmclab i can see that actually you can define detparam1 and detparam2, which allow you to use issaveexit=2. Is this behavior allowed from the command line using json input?
you are correct. the detparam1/detparam2 inputs were implemented over 10 years ago, and it was only supported in the .inp file input format (see https://github.com/fangq/mmc/blob/v2025.10/src/mmc_utils.c#L2056-L2062), but not in the .json format.
I just made the following commit
https://github.com/fangq/mmc/commit/82994b1fb1efd725fe918f26a5bf84a6d8a735b1
it should be supported in the JSON input as well.
On the other hand, when working with detectors and activating the -x flag to save exit position/direction i get a mch file containing the following:
- MCH header: {'version': 1, 'medianum': 1, 'detnum': 0, 'recordnum': 10, 'totalphoton': 500000, 'detectedphoton': 1572, 'savedphoton': 1572, 'lengthunit': 1.0, 'seedbyte': 0, 'normalizer': 400.0816955566406, 'respin': 1, 'srcnum': 1, 'savedetflag': 0}
- Sample MCH row: [1.9045000e+04 0.0000000e+00 0.0000000e+00 1.0908831e+01 1.0329286e+01 3.0000000e+01 1.0902426e-03 1.1011607e-02 9.9993873e-01 1.0000000e+00]
As you can see, for the scattering, path length and momentum, I just get two 0 values (--momentum flag active).The position and direction works, and i can plot both the mct and mch data which seems coherent.
But I'm missing the way to be able to know the weight of the photons when reaching the detector, as well as detected photon time, mean path per tissue and mean scat.
please add -F jnii in your command line, this asks mmc to save the detected photon data to a JSON based output file, which contains the detid, ppath, nscat etc subkeys in the output data structure. you use jsonlab's loadjson or loadjd to load this file to matlab, you should see those subfields
https://github.com/fangq/mmc/blob/v2025.10/src/mmc_utils.c#L999-L1001
Qianqian
--
You received this message because you are subscribed to the Google Groups "mcx-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mcx-users+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/mcx-users/493840e7-414e-4cfe-bdf0-6821a9eb8e39n%40googlegroups.com.
hi Alejandro,
thanks for reporting this. it appears that the current mmc binary only saves .mch/.mct binary files despite that json-based output function do exist (ported from mcx).
I've created a new ticket on github
https://github.com/fangq/mmc/issues/124
and was able to fix it with this commit
https://github.com/fangq/mmc/commit/2a7c1f83d8909c174c3ebee4c22efe5238b92e29
also added binary JSON output via -F bnii
https://github.com/fangq/mmc/commit/76f945de7958d95d094aac8d076e631762211c02
going back to your original question:
Would I need to trace each photon path from the mct file and somehow determine in which element are they present at each moment to track that information?
Looking though the repo I found matlab/mmcdetweight.m and matlab/mmcmeanscat.m, but they use the detp object from mmclab which already contains things like ppath or nscat that I don’t have. I’m sure I’m missing something to be able to have that information. Can you kindly point me in the right direction?
correct. mcx/mmc does not save the detected weight. instead, it saves the partial path lengths, and passing detp output struct to mmcdetweight() will allow you to recompute the detected weight (and you can perturb the ma for each label via changing the prop input to mmcdetweight). same for other derivable per-photon data, such as meanpath, meannscat, dettime, detpsf, with functions under mmc/matlab/ folder.
by the way, the detected photon has a field of w0, but it is not the detected/final weight, but the initial weight. if you have a pencil beam, all values of w0 should be 1. w0 is only useful in source types where the launch weight is spatially varying - such as pattern/fourier etc.
Qianqian
To view this discussion visit https://groups.google.com/d/msgid/mcx-users/6da55f60-e0f3-4c74-b864-9704236e62e7n%40googlegroups.com.