Phantoms and projectors - xcist/documentation GitHub Wiki
There are several different phantom types/formats, including
- voxelized,
- analytic,
- polygonal, and
- NURBS (the format for files produced by XCAT software).
Each type requires its own projector because, as a ray is traced from the source to the detector, we need to determine the pathlength though each material in the phantom, as well as the volume fraction of that material. Determination of the pathlength and material properties depends on the phantom format, hence the need for projectors that can parse each format.
Voxelized files are specified as one or more 2D images. Because voxelized phantoms are specified as images, they can be visualized using an image viewer. For details about visualization using ImageJ, see Viewing image files using ImageJ.
The latter three phantom types are specified in text files, each with their own unique format. These phantom types are difficult to visualize, because it would be necessary to parse the file and render an image of what it describes. At this time, no such utilities are provided with XCIST.
As explained in the Wiki manual page Simulation Models and Software Architecture, CatSim is in principle able to use different phantom types, provided a C library is provided to perform the corresponding projection operations. The projector is specified by the field
cfg.callback_projector = 'ProjectorCallbackFunctionName';
Where ProjectorCallbackFunctionName is one of
'C_Projector_Analytic'
'C_Projector_NCAT'
'C_Projector_Polygon'
'C_Projector_Voxelized'
These all have been reasonable well tested, with the exception of the polygon projector. Prior to Release 5.7, the voxelized projector was limited to a monochromatic spectrum and a single material (water). With Release 5.7, we extended the voxelized projector to perform polychromatic simulations of multi-material voxelized phantoms.
The core catsim.m
routine has only a few calls to the C libraries. The various components in the projection process are parsed and passed to C in the following sequence, via the routines specified by these variables:
cfg.callback_getphantom
cfg.callback_setMaterial
cfg.callback_setSource
cfg.callback_setDetector
cfg.callback_projector
The type of phantom that is used determines the projector callback required, which in turn determines the callback that will be used for each of the others. This relationship is summarized in Table 1: Phantom types and associated callback functions.
Some projectors also use the following fields:
The maximum number of threads is specified using
cfg.n_threads=1;
The detector bounding box computation is specified using
cfg.detector_bounding_box_strategy=2;
where 1 means that only v limits are computed for the detector bounding box, and 2 means that both u and v limits are used.
Table 1: Phantom types and associated callback functions
More information on specific phantom types:
- Voxelized Phantoms
- Analytical Phantoms
- Polygonal Phantoms
- NURB Phantoms
- Hybrid Phantoms
- Dynamic Phantoms
- Large Phantoms on LSF