Parameter files for a block-detector based tomograph Author: R. Harrison Date: February 2006 Description This document describes the geometry of block-detector based tomograph in SimSET and the parameter files used to define this geometry. There are three types of parameter files used: a block parameter file, which defines the geometry of a detector block; a ring parameter file, which defines a ring of detector blocks; and a block detector system parameter file, which defines a tomograph as a stack of rings. SimSET allows for considerable flexibility in the geometry of block-detector systems. The two main limitations are that all elements of the detector system are outside an elliptical cylinder containing the object being imaged, and that the elements of the detector system be composed entirely of right-rectangular boxes. This latter constraint does not allow for the simulation of triangular cross-section objects, as might be desired for interblock septa; these would need to be approximated as a collection of right-rectangular boxes. We will also be creating easier ways (e.g. a MatLab program or Excel macro) to create common tomograph geometries; however, these will still create the parameter files described below. Furthermore, direct generation of the parameter files may be required for some complicated tomograph definitions. Definition of a tomograph Definition of a block-detector system requires three levels of parameter files: parameter files describing the block type or types used; parameter files arranging blocks into rings (or other arrangements, as long as they fit inside two nested elliptical cylinders); and a parameter file which creates a tomograph from a stack of rings and defines some general tomograph parameters. All distances in the parameter files are measured in cm, all angles in degrees. Blocks The basic unit for a block-detector system is the block. Blocks are right-rectangular boxes which can be further subdivided into smaller right-rectangular boxes. Each block has its own coordinate system, with x corresponding to the depth into the block (the radial direction, for the default block orientation in the tomograph), y corresponding to the other transaxial dimension, and z corresponding to the axial dimension. (Figure 1.) Figure 1. A four layer block (block A) and a tungsten blade (block B). Each block has its own coordinate system, with x corresponding to the depth into the block (the radial direction, for the default block orientation in the tomograph), y corresponding to the other transaxial dimension, and z corresponding to the axial dimension. Blocks are split into layers in the x-direction. Each layer is subdivided into non-uniform voxels at user-specified boundaries in the y and z direction. Layers extend across the entire block, and the other boundaries extend across the entire layer, thus some parts of the block (e.g. the housing) will be defined as multiple voxels (Figure 2). Figure 2. In the block parameter file, all material boundaries are extended across the whole block. Here a block layer consisting of detector housing, crystals, and inter-crystal gaps is split into the voxels that would need to be defined in the block parameter file. We will use two types of blocks in our sample system. Block A consists of two layers of crystal and a light guide plus some block housing. Block B is just a tungsten blade used for interblock septa. (Figures 1, 3 and 4.) The parameter files for them are given below in Appendices 1 and 2. We use block A to elucidate some of the features and syntax of block parameter files. The first step in defining a block is to give a reference point somewhere on or in the block. This is the point that will later be positioned in space when defining rings containing the blocks (see Rings below). REAL block_reference_x = 0.0 REAL block_reference_y = 0.0 REAL block_reference_z = 0.0 The next steps are to define the outer dimensions of the block and the number of layers (Figure 3). Figure 3. The user first defines some general characteristics of the block: a reference point (here the point at the middle of the front face of the block); the range of values the block occupies in the x, y and z dimensions; and the number of layers. REAL REAL REAL REAL REAL REAL block_x_minimum block_x_maximum block_y_minimum block_y_maximum block_z_minimum block_z_maximum = = = = = = 0.0 3.1 -1.015 1.015 -1.015 1.015 INT block_num_layers = 4 The rest of the block parameter file specifies the dimensions, materials, and whether the material is ‘active’ (e.g. scintillating) for each voxel in the block layer by layer (Figure 4). Figure 4. The four layers of block A. The user defines materials and dimensions for each layer of the block detector. Block A consists of an aluminum front cover (layer 0), tungsten side covers (extending through layers 1 and 2), a 4x4 array of BGO separated by graphite-filled gaps (layer 1), a 2 NaI crystals separated by a graphite-filled gap (layer 2), and a polyethylene backcover/light guide (layer 3). The BGO and NaI crystals are the active elements. Block A consists of an aluminum front cover (layer 0), tungsten side covers (extending through layers 2 and 3), a 4x4 array of BGO separated by graphite-filled gaps (layer 1), a 2 NaI crystals separated by a graphite-filled gap (layer 2), and a polyethylene backcover/light guide (layer 3). (Some of the materials are unusual – we are limited to the materials in the SimSET attenuation table, though that table can be expanded.) The BGO and NaI crystals are the active elements. For each layer in the block, the block parameter file gives a list of five items (some of which are themselves lists): the inner and outer x-boundaries of the layer; the y and z coordinates for voxel boundaries/material changes; and the definition of the voxels/material elements. For instance, for layer 1: NUM_ELEMENTS_IN_LIST block_layer_info_list = 5 REAL block_layer_inner_x = 0.1 # (must be == to outer x of previous layer) REAL block_layer_outer_x = 1.6 NUM_ELEMENTS_IN_LIST block_layer_num_y_changes = 8 REAL block_layer_y_change = -0.915 REAL block_layer_y_change = -0.465 REAL block_layer_y_change = -0.455 … REAL block_layer_y_change = 0.915 NUM_ELEMENTS_IN_LIST block_layer_num_z_changes = 8 REAL block_layer_z_change = -0.915 … REAL block_layer_z_change = 0.915 NUM_ELEMENTS_IN_LIST block_layer_material elements = 81 # Material element 0 NUM_ELEMENTS_IN_LIST block_material_info_list = 2 INT block_material_index = 21 # tungsten BOOL block_material_is_active = FALSE … # Material element 10, Crystal 0 NUM_ELEMENTS_IN_LIST block_material_info_list = 2 INT block_material_index = 10 # BGO BOOL block_material_is_active = TRUE # Material element 11 NUM_ELEMENTS_IN_LIST block_material_info_list = 2 INT block_material_index = 12 # graphite BOOL block_material_is_active = FALSE … # Material element 80 NUM_ELEMENTS_IN_LIST block_material_info_list = 2 INT block_material_index = 21 # tungsten BOOL block_material_is_active = FALSE Note that the number of material elements in a layer is equal to (number of y material changes +1)*(number of z material changes +1). Rings Rings are axially and radially bounded collections of blocks. Within the axial and radial bounds the blocks can be arranged in almost any orientation; the two restrictions are that the axial faces of the blocks remain parallel to the x-y (transaxial) plane, and the blocks may not overlap. Appendix 3 gives a parameter file for a sample ring constructed from blocks A and B (Figures 4 and 5). 12 type A blocks are arranged in a square, three to a side. 4 type B blocks serve as interblock septa at the corners of the square. A 0.001 cm gap is left between the blocks along the sides of the square: this is to protect against overlap of two blocks due to round-off errors when computing their positions. Figure 5. The sample ring consists of 12 copies of block type A arranged in a square with 4 copies of block type B serving as inter-block septa. The parameter file starts with the outer ring dimensions: REAL REAL REAL REAL ring_x_inner_radius ring_x_outer_radius ring_y_inner_radius ring_y_outer_radius = = = = 3.05 6.9 3.05 6.9 # by having x-, y-radii the same, # bounding cylinders are circular. REAL ring_z_minimum = -1.015 REAL ring_z_maximum = 1.015 The coordinate system for these parameters is specific to the ring, but related to the tomograph coordinate system: the ring will be positioned in the tomograph by specifying an axial (zcoordinate) shift and a transaxial rotation (see following section). The parameter file then gives the number of blocks in the ring and the file name and positioning for each block: NUM_ELEMENTS_IN_LIST ring_num_blocks_in_ring = 16 # PLACEMENT AND DEFINITION OF BLOCK 0 NUM_ELEMENTS_IN_LIST ring_block_description_list = 5 STR ring_block_parameter_file = “sampleBlockA.blockparms” REAL ring_block_x_position = 3.05 REAL ring_block_y_position = -2.031 REAL ring_block_z_position = 0.0 REAL ring_block__transaxial_orientation = 33.659711 # degrees … Each block is defined and positioned using a list of 5 parameters. The first is a reference to its parameter file, the next three give the position of the block reference point (described above in the Blocks section) within the ring, and the last gives the orientation of the front face of the block relative to the center line of the tomograph. The orientation is specified by the angle the perpendicular to the face of the block at the block’s reference point makes with the line between the reference point and the center line of the tomograph. An orientation angle of 0 degrees means they are collinear, a positive angle means that the perpendicular is shifted in the counterclockwise direction from the line. (Figure 6.) Reference point position = (3.05, -2.031, 0) Figure 6. Block position for block 0. Block position is specified by the position of the reference point and by an orientation angle, , the angle between the line from the central axis of the ring and the perpendicular to the front face of the block at the reference point. Here positive. 2.031 33.6597 . Counterclockwise rotations are 3.05 arctan Tomograph A block-detector tomograph is defined as an axial stack of rings. Two rings cannot share any part of the same axial range – not even if they are radially distinct. Appendix 4 gives a parameter file defining a sample tomograph consisting of three of the rings defined above, with the center ring rotated 45 degrees (Figure 7). Figure 7. Sample tomograph consisting of three copies of the same ring, with the center ring rotated 45 degrees. The parameter file starts with parameters that are common to all the detector types. It uses a new detector type, block. ENUM detector_type = block BOOL do_forced_interaction = true REAL REAL reference_energy_keV = 511.0 energy_resolution_percentage = 15 STR history_file = "PET3d.dethist" STR history_params_file = "" The rest of the parameter file is devoted to defining the positioning of the rings. First the number of rings is declared, then the parameter file name and positioning is given for each ring. NUM_ELEMENTS_IN_LIST blocktomo_num_rings = 3 # Ring 0 NUM_ELEMENTS_IN_LIST blocktomo_ring_description_list = 3 STR blocktomo_ring_parameter_file = “sampleRingA.ringparms” REAL blocktomo_ring_axial_shift = -2.03 REAL blocktomo_ring_transaxial_rotation = 0 # Ring 1 NUM_ELEMENTS_IN_LIST blocktomo_ring_description_list = 3 STR blocktomo_ring_parameter_file = “sampleRingA.ringparms” REAL blocktomo_ring_axial_shift = 0.0 REAL blocktomo_ring_transaxial_rotation = 45 # degrees … The axial shift specifies how far the z=0 plane of the ring should be shifted when positioning it in the tomograph. For instance, as the ring is declared (above in the Rings section) to cover the axial range [-1.015, 1.015], after a -2.03 cm shift Ring 0 will cover the range [-3.045, -1.-15]. The transaxial rotation is measured counterclockwise: thus Ring 1 is rotated 1/8 of a turn.