forked from ETSInitiative/PETSIRD
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDetectorInformation.yml
More file actions
73 lines (63 loc) · 3.22 KB
/
Copy pathDetectorInformation.yml
File metadata and controls
73 lines (63 loc) · 3.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# A shape filled with a uniform material
SolidVolume<Shape>: !record
fields:
shape: Shape
# identifier referring to `ScannerInformation.bulkMaterials` list
materialId: uint
BoxSolidVolume: SolidVolume<BoxShape>
GenericSolidVolume: SolidVolume<GeometricShape>
# A list of identical SolidVolumes<BoxShape> at different locations
ReplicatedBoxSolidVolume: ReplicatedObject< BoxSolidVolume >
# A list of identical SolidVolumes<GeometricShape> at different locations
ReplicatedGenericSolidVolume: ReplicatedObject< GenericSolidVolume >
# Top-level detector structure, consisting of a group of (elementary) detecting elements (or "crystals")
# Note: all "crystals" have to be identical, aside from location. This includes properties such as
# shape, energy and timing resolution.
# This implies that for scanners with different types of detecting elements (e.g. phoswich detectors),
# different DetectorModules have to be used (see ScannerGeometry).
DetectorModule: !record
fields:
detectingElements: ReplicatedBoxSolidVolume
# optional list describing shielding/optical reflectors etc
nonDetectingElements: ReplicatedGenericSolidVolume*
# A list of identical modules at different locations
ReplicatedDetectorModule: ReplicatedObject< DetectorModule >
# Full definition of the geometry of the scanner, consisting of
# one of more types of modules replicated in space and (optional) other structures (e.g. side-shielding)
ScannerGeometry: !record
fields:
# list of different types of replicated modules
# While most current clinical scanners have only one type of DetectorModule, some
# would have different types, e.g. for scanners with phoswich detector, high resolution inserts, etc.
# Constraint: numberOfReplicatedModules > 0
replicatedModules: ReplicatedDetectorModule*
# shielding etc
nonDetectingVolumes: GenericSolidVolume*?
computedFields:
numberOfReplicatedModules: size(replicatedModules)
# This is the type for the index over "module-types".
# It is an unsigned integer that runs over all the types starting from 0.
#
# This index runs over ScannerGeometry.replicated_modules
TypeOfModule: uint
# This is a pair of 2 "module-types".
TypeOfModulePair: TypeOfModule*2
# type for a "single" detection (of a particular type of module), expanded into
# indices into the `ScannerGeometry`
ExpandedDetectionBin: !record
fields:
# index (starting from 0) into ScannerGeometry.replicatedModules.transforms
moduleIndex: uint
# index (starting from 0) into DetectorModule.detectingElements.transforms
elementIndex: uint
# index (starting from 0) for the energy window
# See the ScannerInformation.eventEnergyBinEdges field
energyIndex: uint
# type for a "single" detection (of a particular type of module), used in `CoincidenceEvent` and `TripleEvent`.
# This a single number (starting from 0), encoding the indices in `ExpandedDetectionBin`
# into a single number.
# For a particular type of module, the number of modules, (detecting) elements in each module and
# energy windows is fixed. Given an `ExpandedDetectionBin`, a `DetectionBin` is computed as
# energyIndex + (elementIndex + moduleIndex * numberOfElementsIndices) * numberOfModules
# TODO is uint big enough?
DetectionBin: uint