simind-python-connector 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. simind_python_connector/__init__.py +72 -0
  2. simind_python_connector/backends/__init__.py +480 -0
  3. simind_python_connector/backends/base.py +387 -0
  4. simind_python_connector/backends/sirf_backend.py +309 -0
  5. simind_python_connector/backends/stir_backend.py +395 -0
  6. simind_python_connector/builders/__init__.py +19 -0
  7. simind_python_connector/builders/acquisition_builder.py +526 -0
  8. simind_python_connector/builders/image_builder.py +217 -0
  9. simind_python_connector/configs/AnyScan.yaml +420 -0
  10. simind_python_connector/configs/Discovery670.yaml +412 -0
  11. simind_python_connector/configs/Example.yaml +420 -0
  12. simind_python_connector/configs/MLD001_SCAN0.yaml +426 -0
  13. simind_python_connector/configs/__init__.py +41 -0
  14. simind_python_connector/configs/input.smc +51 -0
  15. simind_python_connector/connectors/__init__.py +24 -0
  16. simind_python_connector/connectors/_spacing.py +69 -0
  17. simind_python_connector/connectors/base.py +40 -0
  18. simind_python_connector/connectors/python_connector.py +355 -0
  19. simind_python_connector/connectors/pytomography_adaptor.py +263 -0
  20. simind_python_connector/connectors/sirf_adaptor.py +164 -0
  21. simind_python_connector/connectors/stir_adaptor.py +164 -0
  22. simind_python_connector/converters/__init__.py +16 -0
  23. simind_python_connector/converters/attenuation.py +367 -0
  24. simind_python_connector/converters/dicom_to_stir.py +3 -0
  25. simind_python_connector/converters/simind_to_stir.py +769 -0
  26. simind_python_connector/core/__init__.py +7 -0
  27. simind_python_connector/core/config.py +939 -0
  28. simind_python_connector/core/executor.py +96 -0
  29. simind_python_connector/core/types.py +203 -0
  30. simind_python_connector/data/Schneider2000.json +222 -0
  31. simind_python_connector/data/__init__.py +25 -0
  32. simind_python_connector/data/bone.atn +187 -0
  33. simind_python_connector/data/h2o.atn +92 -0
  34. simind_python_connector/utils/__init__.py +120 -0
  35. simind_python_connector/utils/backend_access.py +121 -0
  36. simind_python_connector/utils/import_helpers.py +74 -0
  37. simind_python_connector/utils/interfile_numpy.py +195 -0
  38. simind_python_connector/utils/interfile_parser.py +175 -0
  39. simind_python_connector/utils/io_utils.py +14 -0
  40. simind_python_connector/utils/simind_utils.py +70 -0
  41. simind_python_connector/utils/sirf_stir_utils.py +194 -0
  42. simind_python_connector/utils/stir_utils.py +485 -0
  43. simind_python_connector-1.0.0.dist-info/METADATA +274 -0
  44. simind_python_connector-1.0.0.dist-info/RECORD +47 -0
  45. simind_python_connector-1.0.0.dist-info/WHEEL +5 -0
  46. simind_python_connector-1.0.0.dist-info/licenses/LICENSE +195 -0
  47. simind_python_connector-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,217 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+ from typing import Literal, Optional
5
+
6
+ import numpy as np
7
+
8
+ from simind_python_connector.utils.backend_access import BACKEND_AVAILABLE, BACKENDS
9
+ from simind_python_connector.utils.import_helpers import get_sirf_types
10
+ from simind_python_connector.utils.io_utils import temporary_directory
11
+
12
+
13
+ ImageData, _, SIRF_AVAILABLE = get_sirf_types()
14
+
15
+
16
+ class STIRSPECTImageDataBuilder:
17
+ """
18
+ Builder class for creating a uniform STIR ImageData object.
19
+
20
+ Default header parameters are set during initialization but may be overridden
21
+ via constructor parameters or using the update_header method.
22
+ """
23
+
24
+ def __init__(
25
+ self,
26
+ header_overrides=None,
27
+ backend: Optional[Literal["sirf", "stir"]] = None,
28
+ ):
29
+ if backend is not None and backend not in {"sirf", "stir"}:
30
+ raise ValueError("backend must be one of: 'sirf', 'stir', or None")
31
+ self.backend = backend
32
+
33
+ # Define default header keys.
34
+ self.header = {
35
+ "!INTERFILE": "",
36
+ "!imaging modality": "nucmed",
37
+ "!version of keys": "STIR4.0",
38
+ "!GENERAL DATA": "",
39
+ "!name of data file": "temp.v",
40
+ "!GENERAL IMAGE DATA": "",
41
+ "!type of data": "Tomographic",
42
+ "imagedata byte order": "LITTLEENDIAN",
43
+ "!SPECT STUDY (general)": "",
44
+ "!process status": "reconstructed",
45
+ "!number format": "float",
46
+ "!number of bytes per pixel": "4",
47
+ "number of dimensions": "3",
48
+ "matrix axis label [1]": "x",
49
+ "matrix axis label [2]": "y",
50
+ "matrix axis label [3]": "z",
51
+ "!matrix size [1]": "128",
52
+ "!matrix size [2]": "128",
53
+ "!matrix size [3]": "128",
54
+ "scaling factor (mm/pixel) [1]": "1",
55
+ "scaling factor (mm/pixel) [2]": "1",
56
+ "scaling factor (mm/pixel) [3]": "1",
57
+ "number of time frames": "1",
58
+ "!END OF INTERFILE": "",
59
+ }
60
+
61
+ self.pixel_array: Optional[np.ndarray] = None
62
+
63
+ # Override defaults if header_overrides is provided.
64
+ if header_overrides is not None:
65
+ self.header.update(header_overrides)
66
+
67
+ def update_header(self, updates):
68
+ """
69
+ Update the header dictionary with new key-value pairs.
70
+
71
+ Parameters:
72
+ updates (dict): Dictionary of header key updates.
73
+ """
74
+ self.header.update(updates)
75
+
76
+ def set_pixel_array(self, array: np.ndarray) -> None:
77
+ """Provide image data to be written to disk."""
78
+ self.pixel_array = np.asarray(array, dtype=np.float32)
79
+
80
+ def _resolve_data_array(self) -> np.ndarray:
81
+ if self.pixel_array is not None:
82
+ return np.asarray(self.pixel_array, dtype=np.float32)
83
+
84
+ dim_x = int(self.header["!matrix size [1]"])
85
+ dim_y = int(self.header["!matrix size [2]"])
86
+ dim_z = int(self.header["!matrix size [3]"])
87
+ return np.zeros((dim_z, dim_y, dim_x), dtype=np.float32)
88
+
89
+ def build(self, output_path: Optional[str | Path] = None):
90
+ """
91
+ Build and return the STIR ImageData object.
92
+
93
+ Returns:
94
+ ImageData: The constructed STIR ImageData object.
95
+ """
96
+ data = self._resolve_data_array()
97
+
98
+ def _write(base_path: Path, cleanup: bool):
99
+ header_path = base_path.with_suffix(".hv")
100
+ raw_path = base_path.with_suffix(".v")
101
+ self.header["!name of data file"] = raw_path.name
102
+
103
+ with open(header_path, "w") as f:
104
+ line = 0
105
+ for key, value in self.header.items():
106
+ if key.islower() or line == 0:
107
+ temp_str = f"{key} := {value}\n"
108
+ line += 1
109
+ else:
110
+ temp_str = f"\n{key} := {value}\n"
111
+ f.write(temp_str)
112
+
113
+ data.tofile(raw_path)
114
+
115
+ image_data = self._load_image(str(header_path))
116
+
117
+ if cleanup:
118
+ header_path.unlink(missing_ok=True)
119
+ raw_path.unlink(missing_ok=True)
120
+ return self._unwrap_native(image_data)
121
+
122
+ if output_path is None:
123
+ with temporary_directory() as tmp_dir:
124
+ return _write(Path(tmp_dir) / "spect_image", cleanup=False)
125
+
126
+ return _write(Path(output_path), cleanup=False)
127
+
128
+ def _load_image(self, header_path: str):
129
+ """Load an image with optional explicit backend selection."""
130
+ if BACKEND_AVAILABLE and BACKENDS.factories.create_image_data is not None:
131
+ if (
132
+ self.backend is not None
133
+ and BACKENDS.detection.set_backend is not None
134
+ and BACKENDS.detection.get_backend is not None
135
+ ):
136
+ previous_backend = None
137
+ try:
138
+ previous_backend = BACKENDS.detection.get_backend()
139
+ except Exception:
140
+ previous_backend = None
141
+ BACKENDS.detection.set_backend(self.backend)
142
+ try:
143
+ return BACKENDS.factories.create_image_data(header_path)
144
+ finally:
145
+ if (
146
+ previous_backend is not None
147
+ and previous_backend != self.backend
148
+ ):
149
+ try:
150
+ BACKENDS.detection.set_backend(previous_backend)
151
+ except Exception:
152
+ pass
153
+
154
+ return BACKENDS.factories.create_image_data(header_path)
155
+
156
+ if self.backend == "stir":
157
+ raise ImportError(
158
+ "Requested STIR backend for image loading, "
159
+ "but backend wrappers are unavailable."
160
+ )
161
+
162
+ if SIRF_AVAILABLE:
163
+ return ImageData(header_path)
164
+
165
+ raise ImportError(
166
+ "Unable to load image data: neither SIRF nor STIR Python "
167
+ "backends are available."
168
+ )
169
+
170
+ @staticmethod
171
+ def _unwrap_native(obj):
172
+ """Return native backend object when a wrapper is provided."""
173
+ native = getattr(obj, "native_object", None)
174
+ return native if native is not None else obj
175
+
176
+ @staticmethod
177
+ def create_spect_uniform_image_from_sinogram(sinogram, origin=None):
178
+ """
179
+ Create a uniform image for SPECT data based on the sinogram dimensions.
180
+
181
+ Adjusts the z-direction voxel size and image dimensions to create a template
182
+ image.
183
+
184
+ Args:
185
+ sinogram (AcquisitionData): The SPECT sinogram.
186
+ origin (tuple, optional): The origin of the image. Defaults to (0, 0, 0)
187
+ if not provided.
188
+
189
+ Returns:
190
+ ImageData: A uniform SPECT image initialized with the computed dimensions
191
+ and voxel sizes.
192
+ """
193
+ if not SIRF_AVAILABLE:
194
+ raise ImportError(
195
+ "create_spect_uniform_image_from_sinogram requires the SIRF backend."
196
+ )
197
+
198
+ # Create a uniform image from the sinogram and adjust z-voxel size.
199
+ image = sinogram.create_uniform_image(1)
200
+ voxel_size = list(image.voxel_sizes())
201
+ voxel_size[0] *= 2 # Adjust z-direction voxel size.
202
+
203
+ # Compute new dimensions based on the uniform image.
204
+ dims = list(image.dimensions())
205
+ dims[0] = (
206
+ dims[0] // 2 + dims[0] % 2
207
+ ) # Halve the first dimension (with rounding)
208
+ dims[1] -= dims[1] % 2 # Ensure even number for second dimension
209
+ dims[2] = dims[1] # Set third dimension equal to second dimension
210
+
211
+ if origin is None:
212
+ origin = (0, 0, 0)
213
+
214
+ # Initialize a new image with computed dimensions, voxel sizes, and origin.
215
+ new_image = ImageData()
216
+ new_image.initialise(tuple(dims), tuple(voxel_size), tuple(origin))
217
+ return new_image
@@ -0,0 +1,420 @@
1
+ metadata:
2
+ comment: Test simulation
3
+ source_file: /home/sam/working/STIR_users_MIC2023/input/input.smc
4
+ parameters:
5
+ source:
6
+ photon_energy:
7
+ index: 1
8
+ value: 150.0
9
+ description: Photon energy in keV (e.g., 140 for 99mTc, 208 for 177Lu)
10
+ source_half_length:
11
+ index: 2
12
+ value: 0.0
13
+ description: Source half-length in cm
14
+ source_half_width:
15
+ index: 3
16
+ value: 0.1
17
+ description: Source half-width in cm
18
+ source_half_height:
19
+ index: 4
20
+ value: 0.1
21
+ description: Source half-height in cm
22
+ source_type:
23
+ index: 15
24
+ value: 5.0
25
+ description: Source type code (0=sphere, 1=cylinder, etc.) - check SIMIND manual
26
+ shift_source_x:
27
+ index: 16
28
+ value: 0.0
29
+ description: Shift of source in x-direction (cm)
30
+ shift_source_y:
31
+ index: 17
32
+ value: 0.0
33
+ description: Shift of source in y-direction (cm)
34
+ shift_source_z:
35
+ index: 18
36
+ value: 0.0
37
+ description: Shift of source in z-direction (cm)
38
+ photon_direction:
39
+ index: 19
40
+ value: 3
41
+ description: Photon direction code (see manual for details)
42
+ emitted_photons_per_decay:
43
+ index: 24
44
+ value: 0.879
45
+ description: Number of photons emitted per decay
46
+ source_activity:
47
+ index: 25
48
+ value: 1.0
49
+ description: Source activity in MBq
50
+ number_photon_histories:
51
+ index: 26
52
+ value: 1.0
53
+ description: Number of photon histories to simulate (10^6 typical minimum)
54
+ matrix_size_source_map_i:
55
+ index: 79
56
+ value: 256.0
57
+ description: Matrix size for source map (i-direction) - 128x128 standard
58
+ matrix_size_source_map_j:
59
+ index: 82
60
+ value: 0.0
61
+ description: Matrix size for source map (j-direction) - 128x128 standard
62
+ phantom:
63
+ phantom_half_length:
64
+ index: 5
65
+ value: 8.32
66
+ description: Phantom half-length in cm
67
+ phantom_half_width:
68
+ index: 6
69
+ value: 11.0
70
+ description: Phantom half-width in cm
71
+ phantom_half_height:
72
+ index: 7
73
+ value: 23.5
74
+ description: Phantom half-height in cm
75
+ phantom_type:
76
+ index: 14
77
+ value: 4.0
78
+ description: Phantom type code
79
+ pixel_size_density_images:
80
+ index: 31
81
+ value: 0.1
82
+ description: Pixel size for density images (cm)
83
+ orientation_density_images:
84
+ index: 32
85
+ value: 0.0
86
+ description: Orientation of density images
87
+ first_image_density_images:
88
+ index: 33
89
+ value: 1.0
90
+ description: First image number for density images
91
+ number_density_images:
92
+ index: 34
93
+ value: 186.0
94
+ description: Number of density images
95
+ density_limit_border:
96
+ index: 35
97
+ value: 0.01
98
+ description: Density limit at border
99
+ shift_density_images_y:
100
+ index: 36
101
+ value: 0.0
102
+ description: Shift of density images in y-direction (cm)
103
+ shift_density_images_z:
104
+ index: 37
105
+ value: 0.0
106
+ description: Shift of density images in z-direction (cm)
107
+ shift_density_images_x:
108
+ index: 39
109
+ value: 0.0
110
+ description: Shift of density images in x-direction (cm)
111
+ density_threshold_soft_bone:
112
+ index: 40
113
+ value: 0.0
114
+ description: Density threshold for soft bone
115
+ code_definitions_zubal_phantom:
116
+ index: 45
117
+ value: 1.0
118
+ description: Code definitions for Zubal phantom
119
+ matrix_size_density_map_i:
120
+ index: 78
121
+ value: 256.0
122
+ description: Matrix size for density map (i-direction)
123
+ matrix_size_density_map_j:
124
+ index: 81
125
+ value: 0.0
126
+ description: Matrix size for density map (j-direction)
127
+ detector_crystal:
128
+ crystal_half_length_radius:
129
+ index: 8
130
+ value: 21.25
131
+ description: Crystal half-length/radius in cm (circular detectors use radius)
132
+ crystal_thickness:
133
+ index: 9
134
+ value: 0.95
135
+ description: 'Crystal thickness in cm (NaI(Tl) typical: 0.95cm)'
136
+ crystal_half_width:
137
+ index: 10
138
+ value: 27.0
139
+ description: Crystal half-width in cm (for rectangular crystals)
140
+ backscatter_thickness:
141
+ index: 11
142
+ value: 5.0
143
+ description: Backscatter thickness in cm (for backscatter material)
144
+ height_to_detector_surface:
145
+ index: 12
146
+ value: 25.0
147
+ description: Height from collimator to detector surface (cm)
148
+ cover_thickness:
149
+ index: 13
150
+ value: 0.1
151
+ description: Cover thickness in cm (typically Al or Be window)
152
+ energy_resolution:
153
+ index: 22
154
+ value: 9.2
155
+ description: Energy resolution FWHM (%) at reference energy (9-12% typical at
156
+ 140keV)
157
+ intrinsic_resolution:
158
+ index: 23
159
+ value: 0.32
160
+ description: Intrinsic spatial resolution FWHM (cm) (3-4mm typical)
161
+ voltage:
162
+ index: 91
163
+ value: 0.0
164
+ description: Applied voltage (V) for semiconductor detectors
165
+ mobility_life_electrons:
166
+ index: 92
167
+ value: 0.0
168
+ description: Mobility-life product for electrons (semiconductor detectors)
169
+ mobility_life_holes:
170
+ index: 93
171
+ value: 0.0
172
+ description: Mobility-life product for holes (semiconductor detectors)
173
+ contact_pad_size:
174
+ index: 94
175
+ value: 0.0
176
+ description: Contact pad size (cm) for pixelated detectors
177
+ anode_element_pitch:
178
+ index: 95
179
+ value: 0.0
180
+ description: Anode element pitch (cm) for pixelated detectors
181
+ exponential_decay_constant_tau:
182
+ index: 96
183
+ value: 0.0
184
+ description: Exponential decay constant tau for charge collection
185
+ components_hecht_formula:
186
+ index: 97
187
+ value: 0.0
188
+ description: Components for Hecht formula (charge collection efficiency)
189
+ energy_resolution_model:
190
+ index: 98
191
+ value: 0.0
192
+ description: Energy resolution model code (check SIMIND manual for options)
193
+ cloud_mobility:
194
+ index: 99
195
+ value: 0.0
196
+ description: Cloud mobility parameter for charge collection
197
+ detector_array_size_i:
198
+ index: 100
199
+ value: 0.0
200
+ description: Detector array size (i-direction) for pixelated systems
201
+ detector_array_size_j:
202
+ index: 101
203
+ value: 0.0
204
+ description: Detector array size (j-direction) for pixelated systems
205
+ collimator:
206
+ hole_size_x:
207
+ index: 46
208
+ value: 0.25
209
+ description: 'Collimator hole diameter (cm)'
210
+ hole_size_y:
211
+ index: 47
212
+ value: 0.25
213
+ description: Collimator hole diameter (cm) - should match hole_size_x for round
214
+ holes
215
+ distance_between_holes_x:
216
+ index: 48
217
+ value: 0.12
218
+ description: 'Distance between hole centers (cm)'
219
+ distance_between_holes_y:
220
+ index: 49
221
+ value: 0.12
222
+ description: Distance between hole centers (cm)'
223
+ shift_center_hole_x:
224
+ index: 50
225
+ value: 0.13
226
+ description: Shift of center hole in x-direction (cm) for alignment
227
+ shift_center_hole_y:
228
+ index: 51
229
+ value: 0.13
230
+ description: Shift of center hole in y-direction (cm) for alignment
231
+ collimator_thickness:
232
+ index: 52
233
+ value: 3.5
234
+ description: 'Collimator thickness (cm)'
235
+ collimator_routine:
236
+ index: 53
237
+ value: 1
238
+ description: Collimator routine code (1= analytical, 2 = septal penetration)
239
+ hole_shape:
240
+ index: 54
241
+ value: 3.0
242
+ description: Hole shape code (3=hexagonal, 4=rectangular)
243
+ distance_collimator_detector:
244
+ index: 56
245
+ value: 0.0
246
+ description: Distance from collimator face to detector surface (cm)
247
+ random_collimator_movement:
248
+ index: 59
249
+ value: 0.0
250
+ description: Random collimator movement parameter (for manufacturing variations)
251
+ energy_analysis:
252
+ upper_window_threshold:
253
+ index: 20
254
+ value: 225
255
+ description: Upper energy window threshold (keV)
256
+ lower_window_threshold:
257
+ index: 21
258
+ value: 75
259
+ description: Lower energy window threshold (keV)
260
+ kev_per_channel:
261
+ index: 27
262
+ value: 4
263
+ description: keV per channel for energy spectrum binning
264
+ energy_spectra_channels:
265
+ index: 80
266
+ value: 512.0
267
+ description: Number of energy spectra channels (512 typical)
268
+ cutoff_energy_terminate_photon_history:
269
+ index: 83
270
+ value: 0.0
271
+ description: Cutoff energy to terminate photon history (keV)
272
+ spect_imaging:
273
+ pixel_size_simulated_image:
274
+ index: 28
275
+ value: 0.44
276
+ description: Pixel size for simulated images (cm) - affects resolution vs FOV
277
+ spect_no_projections:
278
+ index: 29
279
+ value: 64.0
280
+ description: Number of SPECT projections (60, 120, 180 typical)
281
+ spect_rotation:
282
+ index: 30
283
+ value: 0.0
284
+ description: "SPECT rotation parameter - controls direction and extent"
285
+ spect_starting_angle:
286
+ index: 41
287
+ value: 0.0
288
+ description: "SPECT starting angle (degrees)"
289
+ spect_orbital_rotation_fraction:
290
+ index: 42
291
+ value: 1.0
292
+ description: SPECT orbital rotation fraction (1.0 = full orbit)
293
+ camera_offset_x:
294
+ index: 43
295
+ value: 0.0
296
+ description: Camera offset in x-direction (cm) from rotation center
297
+ camera_offset_y:
298
+ index: 44
299
+ value: 0.0
300
+ description: Camera offset in y-direction (cm) from rotation center
301
+ matrix_size_image_i:
302
+ index: 76
303
+ value: 64.0
304
+ description: Matrix size for images (i-direction) - 128x128 standard
305
+ matrix_size_image_j:
306
+ index: 77
307
+ value: 64.0
308
+ description: Matrix size for images (j-direction) - 128x128 standard
309
+ simulation_control:
310
+ step_size_photon_path_simulation:
311
+ index: 38
312
+ value: 0.1
313
+ description: Step size for photon path simulation (cm) - smaller = more accurate
314
+ type:
315
+ index: 55
316
+ value: 0.0
317
+ description: General type parameter - check SIMIND manual for current meaning
318
+ scoring_routine:
319
+ index: 84
320
+ value: 1
321
+ description: Scoring routine code - affects output data collection
322
+ csv_file_content:
323
+ index: 85
324
+ value: 0.0
325
+ description: CSV file content parameter - for custom data output
326
+ unused_parameters:
327
+ unused_parameter_1:
328
+ index: 57
329
+ value: 0.0
330
+ description: Unused parameter 1 - reserved for future use
331
+ unused_parameter_2:
332
+ index: 58
333
+ value: 0.0
334
+ description: Unused parameter 2 - reserved for future use
335
+ unused_parameter_3:
336
+ index: 60
337
+ value: 0.0
338
+ description: Unused parameter 3 - reserved for future use
339
+ simulation_flags:
340
+ write_results_to_screen:
341
+ index: 1
342
+ enabled: true
343
+ write_images_to_files:
344
+ index: 2
345
+ enabled: false
346
+ write_pulse_height_distribution_to_file:
347
+ index: 3
348
+ enabled: true
349
+ include_collimator:
350
+ index: 4
351
+ enabled: true
352
+ simulate_spect_study:
353
+ index: 5
354
+ enabled: false
355
+ include_characteristic_xray_emissions:
356
+ index: 6
357
+ enabled: true
358
+ include_backscattering_material:
359
+ index: 7
360
+ enabled: true
361
+ use_random_seed_value:
362
+ index: 8
363
+ enabled: true
364
+ currently_not_in_use:
365
+ index: 9
366
+ enabled: false
367
+ include_interactions_in_cover:
368
+ index: 10
369
+ enabled: true
370
+ include_interactions_in_phantom:
371
+ index: 11
372
+ enabled: true
373
+ include_energy_resolution_in_crystal:
374
+ index: 12
375
+ enabled: true
376
+ include_forced_interactions_in_crystal:
377
+ index: 13
378
+ enabled: true
379
+ write_interfile_header_files:
380
+ index: 14
381
+ enabled: false
382
+ save_aligned_phantom_images:
383
+ index: 15
384
+ enabled: false
385
+ text_variables:
386
+ 1: ma-megp
387
+ 2: none
388
+ 3: none
389
+ 4: none
390
+ 5: none
391
+ 6: none
392
+ 7: none
393
+ 8: none
394
+ data_files:
395
+ phantom_soft_tissue:
396
+ index: 1
397
+ filepath: h2o
398
+ phantom_bone:
399
+ index: 2
400
+ filepath: bone
401
+ cover_material:
402
+ index: 3
403
+ filepath: al
404
+ crystal_material:
405
+ index: 4
406
+ filepath: nai
407
+ image_file_phantom:
408
+ index: 5
409
+ filepath: cyl_un1
410
+ image_file_source:
411
+ index: 6
412
+ filepath: vox_brn
413
+ backscatter_material:
414
+ index: 7
415
+ filepath: pmt
416
+ energy_resolution_file:
417
+ index: 8
418
+ filepath: none
419
+
420
+