I am gradually trying to evolve my single CBCT detector simulation into a multi-layer CBCT detector simulation. I might have anywhere between 1 and 4 detector layers. Is it possible to set up a simulation with more than one detector plane in the same simulation?
When I do this, I will want each layer's detector output to feel the effects of attenuation from the layers that come before it in the beam path. I will also want it to feel the effects of scatter from neighboring layers both before and after it in the beam path. I assume this means I will need to define a navigator for each detector layer. If so, am I still using GGEMSCTSystem to implement the detection process? Can navigators and GGEMSCTSystems occupy the same 3D space?
Hi, if you want to build a multi-layer setup, then yes — you need to create 4 navigators (GGEMSCTSystem) and place them next to each other. You will then get 4 projection output files. Just be careful with navigator overlaps, but it should work.
Quote from: didier.benoit on Nov 05, 2025, 04:15 PMHi, if you want to build a multi-layer setup, then yes — you need to create 4 navigators (GGEMSCTSystem) and place them next to each other. You will then get 4 projection output files. Just be careful with navigator overlaps, but it should work.
OK, thanks. But I find it interesting that you seem to say above that GGEMSCTSystem objects can be considered navigators. The documentation section on navigators only mentions GGEMSVoxelizedPhantom and GGEMSMeshedPhantom. You are saying that GGEMSCTSystem produces a 3rd navigator type?
If so, I wonder if one can make an "output-less" GGEMSCTSystem as a simple way of implementing a navigator for arbitrary rectangular objects (not necessarily detectors) ? For example, if I wanted to put a copper filtering sheet in front of my detector, to block high energy photons, could I spoof an appropriate navigator for the sheet as below, where I have deliberately set nothing for sheet.save()?
sheet = GGEMSCTSystem('Copper Sheet')
sheet.set_ct_type('flat')
sheet.set_number_of_modules(1, 1)
sheet.set_number_of_detection_elements(1, 1)
sheet.set_size_of_detection_elements(300, 400, 0.7, 'mm')
sheet.set_material('Cu')
sheet.set_source_isocenter_distance(1000.0, 'mm')
sheet.set_source_detector_distance(1500.0, 'mm')
#sheet.set_threshold(20.0, 'keV')
sheet.set_rotation(0.0, 0.0, -90.0, 'deg')
#sheet.save('data/truebeam_projection')
#sheet.store_scatter(False)
Hi,
In GGEMS, any volume that defines its own geometry and interaction rules can act as a navigator.
GGEMSCTSystem does this too, since it manages detector modules with defined boundaries and materials.
So yes — you can see it as a third navigator type, but it's actually a navigator with output.
Every detector in GGEMS is, by design, also a navigator.
If you remove the output, it simply becomes a passive volume that still guides particles through its geometry.
Interesting. Thanks again!
Quote from: didier.benoit on Nov 12, 2025, 11:33 AMIn GGEMS, any volume that defines its own geometry and interaction rules can act as a navigator.
GGEMSCTSystem does this too, since it manages detector modules with defined boundaries and materials.
That is interesting, as I said, but it seems to contradict what you said in this earlier thread (https://forum.ggems.fr/index.php?topic=148.0). There, you said things like the GGEMSBox are not navigators, and that they simply act as a tool for writing out voxelized .mhd phantoms.
box = GGEMSBox(24.0, 36.0, 56.0, 'mm')
box.set_position(-70.0, -30.0, 10.0, 'mm')
box.set_label_value(1)
box.set_material('Water')
Since this object has defined boundaries and materials, I wonder why it doesn't act as a navigator, like you said all objects do.
GGEMSBox is only a volume to Draw, not more :-). See the example 3 : https://doc.ggems.fr/v1.3/example_3.html. It's just a tool to create a voxelised phantom. If you don't have data, I think it's nice to draw some volume. It's not a navigator.