Siemens Intevo Bold SPECT/CT#

import pydicom
import os
import matplotlib.pyplot as plt
import numpy as np

from toor.DetectionLayout.Modules import PETModule
from toor.DetectionLayout.Photodetectors.Crystals import GenericCrystal
from toor.Geometry.Standard import PlanarGeometry
from toor.Designer import DeviceDesignerStandalone


file_path = "C:\\Users\\pedro\\Downloads\\phase_1_challenge_data_03_05_2025\\NEMA_phantom-20250221T115435Z-001\\NEMA_phantom\\SPECT-projections\\"

file_path = os.path.join(file_path, "DICOM\\25011616\\21060000\\31702333")
ds = pydicom.dcmread(file_path)
print(ds)
Dataset.file_meta -------------------------------
(0002, 0000) File Meta Information Group Length  UL: 200
(0002, 0001) File Meta Information Version       OB: b'\x00\x01'
(0002, 0002) Media Storage SOP Class UID         UI: Nuclear Medicine Image Storage
(0002, 0003) Media Storage SOP Instance UID      UI: 1.3.12.2.1107.5.8.15.102372.30000025011616112216100000420
(0002, 0010) Transfer Syntax UID                 UI: Explicit VR Little Endian
(0002, 0012) Implementation Class UID            UI: 1.3.12.2.1107.5.8.15.10.20090701
(0002, 0013) Implementation Version Name         SH: 'syngo.via'
-------------------------------------------------
(0008, 0005) Specific Character Set              CS: 'ISO_IR 100'
(0008, 0008) Image Type                          CS: ['ORIGINAL', 'PRIMARY', 'TOMO', 'EMISSION']
(0008, 0016) SOP Class UID                       UI: Nuclear Medicine Image Storage
(0008, 0018) SOP Instance UID                    UI: 1.3.12.2.1107.5.8.15.102372.30000025011616112216100000420
(0008, 0020) Study Date                          DA: '20241210'
(0008, 0021) Series Date                         DA: '20241210'
(0008, 0022) Acquisition Date                    DA: '20241210'
(0008, 0023) Content Date                        DA: '20241210'
(0008, 0030) Study Time                          TM: '101647'
(0008, 0031) Series Time                         TM: '133615'
(0008, 0032) Acquisition Time                    TM: '133615.706000'
(0008, 0033) Content Time                        TM: '133615'
(0008, 0050) Accession Number                    SH: ''
(0008, 0060) Modality                            CS: 'NM'
(0008, 0061) Modalities in Study                 CS: ['NM', 'CT', 'SR']
(0008, 0070) Manufacturer                        LO: 'SIEMENS NM'
(0008, 0090) Referring Physician's Name          PN: ''
(0008, 1090) Manufacturer's Model Name           LO: 'Encore2'
(0008, 2218)  Anatomic Region Sequence  1 item(s) ----
   (0008, 0100) Code Value                          SH: ''
   (0008, 0102) Coding Scheme Designator            SH: ''
   (0008, 0104) Code Meaning                        LO: '-'
   ---------
(0010, 0010) Patient's Name                      PN: 'ACTI_QUANT_NEMA_SCAN_Phase1'
(0010, 0020) Patient ID                          LO: 'ACTI_QUANT_NEMA_SCAN_Phase1'
(0010, 0030) Patient's Birth Date                DA: '20250116'
(0010, 0040) Patient's Sex                       CS: 'F'
(0010, 1010) Patient's Age                       AS: '035Y'
(0010, 1020) Patient's Size                      DS: "1.67"
(0010, 1030) Patient's Weight                    DS: "62.0"
(0012, 0062) Patient Identity Removed            CS: 'YES'
(0012, 0063) De-identification Method            LO: ['Deidentified', 'Basic Application Confidentiality Profile applied', 'Retain Longitudinal Temporal Information With Full Dates Option', 'Retain Patient Characteristics Option']
(0012, 0064)  De-identification Method Code Sequence  2 item(s) ----
   (0008, 0100) Code Value                          SH: '113106'
   (0008, 0102) Coding Scheme Designator            SH: 'DCM'
   (0008, 0104) Code Meaning                        LO: 'Retain Longitudinal Temporal Information With Full Dates Option'
   ---------
   (0008, 0100) Code Value                          SH: '113108'
   (0008, 0102) Coding Scheme Designator            SH: 'DCM'
   (0008, 0104) Code Meaning                        LO: 'Retain Patient Characteristics Option'
   ---------
(0018, 0026)  Intervention Drug Information Sequence  1 item(s) ----
   (0018, 0028) Intervention Drug Dose              DS: "0.0"
   (0018, 0034) Intervention Drug Name              LO: ''
   (0018, 0035) Intervention Drug Start Time        TM: '000000.000000'
   ---------
(0018, 0070) Counts Accumulated                  IS: None
(0018, 0071) Acquisition Termination Condition   CS: 'TIME'
(0018, 1020) Software Versions                   LO: ['10.700.2003.1302', '10.700.1911.801', 'syngo CT VC50>Symbia Intevo 16>VB22A', 'VB22A']
(0018, 1030) Protocol Name                       LO: 'DeIdentified'
(0018, 1200) Date of Last Calibration            DA: ['20241125', '20240404', '20240916', '20241125', '20240404']
(0018, 1201) Time of Last Calibration            TM: ['153300.000000', '161358.000000', '153833.000000', '153300.000000', '161358.000000']
(0018, 5100) Patient Position                    CS: 'FFS'
(0020, 000d) Study Instance UID                  UI: 1.3.12.2.1107.5.8.15.102372.30000025011616112216100000421
(0020, 000e) Series Instance UID                 UI: 1.3.12.2.1107.5.8.15.102372.30000025011616112216100000422
(0020, 0010) Study ID                            SH: ''
(0020, 0011) Series Number                       IS: "1000"
(0020, 0013) Instance Number                     IS: "1"
(0020, 0052) Frame of Reference UID              UI: 1.3.12.2.1107.5.8.15.102372.30000025011616112216100000423
(0020, 1040) Position Reference Indicator        LO: 'unknown'
(0020, 1208) Number of Study Related Instances   IS: "1964"
(0028, 0002) Samples per Pixel                   US: 1
(0028, 0004) Photometric Interpretation          CS: 'MONOCHROME2'
(0028, 0008) Number of Frames                    IS: "720"
(0028, 0009) Frame Increment Pointer             AT: [(0054, 0010), (0054, 0020), (0054, 0050), (0054, 0090)]
(0028, 0010) Rows                                US: 128
(0028, 0011) Columns                             US: 128
(0028, 0030) Pixel Spacing                       DS: [4.7951998710632, 4.7951998710632]
(0028, 0051) Corrected Image                     CS: ['UNIF', 'UNIF', 'UNIF', 'UNIF', 'UNIF', 'UNIF', 'UNIF', 'UNIF', 'UNIF', 'UNIF', 'UNIF', 'UNIF', 'UNIF']
(0028, 0100) Bits Allocated                      US: 16
(0028, 0101) Bits Stored                         US: 16
(0028, 0102) High Bit                            US: 15
(0028, 0103) Pixel Representation                US: 0
(0028, 0106) Smallest Image Pixel Value          US: 0
(0028, 0107) Largest Image Pixel Value           US: 31
(0028, 1050) Window Center                       DS: "15.0"
(0028, 1051) Window Width                        DS: "31.0"
(0029, 0010) Private Creator                     LO: 'SIEMENS MEDCOM HEADER'
(0029, 0011) Private Creator                     LO: 'SIEMENS CSA HEADER'
(0029, 1040)  [Application Header Sequence]  4 item(s) ----
   (0029, 0010) Private Creator                     LO: 'SIEMENS MEDCOM HEADER'
   (0029, 1041) [Application Header Type]           CS: 'VECTORMAP'
   (0029, 1042) [Application Header ID]             LO: 'Header 1'
   (0029, 1043) [Application Header Version]        LO: '1.1'
   (0029, 1044) [Application Header Info]           OB: Array of 327680 elements
   ---------
   (0029, 0010) Private Creator                     LO: 'SIEMENS MEDCOM HEADER'
   (0029, 1041) [Application Header Type]           CS: 'VECTORMAP'
   (0029, 1042) [Application Header ID]             LO: 'Header 2'
   (0029, 1043) [Application Header Version]        LO: '1.1'
   (0029, 1044) [Application Header Info]           OB: Array of 327680 elements
   ---------
   (0029, 0010) Private Creator                     LO: 'SIEMENS MEDCOM HEADER'
   (0029, 1041) [Application Header Type]           CS: 'DEFLECTIONMATRIX'
   (0029, 1042) [Application Header ID]             LO: 'Header 1'
   (0029, 1043) [Application Header Version]        LO: '1.1'
   (0029, 1044) [Application Header Info]           OB: Array of 2880 elements
   ---------
   (0029, 0010) Private Creator                     LO: 'SIEMENS MEDCOM HEADER'
   (0029, 1041) [Application Header Type]           CS: 'DEFLECTIONMATRIX'
   (0029, 1042) [Application Header ID]             LO: 'Header 2'
   (0029, 1043) [Application Header Version]        LO: '1.1'
   (0029, 1044) [Application Header Info]           OB: Array of 2880 elements
   ---------
(0029, 1108) [CSA Image Header Type]             CS: 'NUC FLOOD'
(0029, 1109) [CSA Image Header Version]          LO: '1.1'
(0029, 1110) [CSA Image Header Info]             OB: Array of 786432 elements
(0033, 0010) Private Creator                     LO: 'SIEMENS MED NM'
(0033, 1029) [Crystal thickness]                 FL: [9.524999618530273, 9.524999618530273]
(0033, 1030) [Preset name used for acquisition]  LO: 'WouterTESTAc225'
(0035, 0010) Private Creator                     LO: 'SIEMENS MED NM'
(0035, 1000) [Specialized tomo type]             LO: 'None'
(0035, 1001) [Energy window type]                LO: ['Photopeak', 'Scatter', 'Photopeak', 'Scatter', 'Photopeak', 'Scatter']
(0040, 0244) Performed Procedure Step Start Date DA: '20241210'
(0040, 0245) Performed Procedure Step Start Time TM: '101647.697000'
(0041, 0010) Private Creator                     LO: 'SIEMENS MED NM'
(0041, 1001) [Unknown]                           SL: 1
(0041, 1002) [Unknown]                           SL: 1
(0054, 0010) Energy Window Vector                US: Array of 720 elements
(0054, 0011) Number of Energy Windows            US: 6
(0054, 0012)  Energy Window Information Sequence  6 item(s) ----
   (0054, 0013)  Energy Window Range Sequence  1 item(s) ----
      (0054, 0014) Energy Window Lower Limit           DS: "398.35800170898"
      (0054, 0015) Energy Window Upper Limit           DS: "486.88198852539"
      ---------
   (0054, 0018) Energy Window Name                  SH: 'Window Group A'
   ---------
   (0054, 0013)  Energy Window Range Sequence  1 item(s) ----
      (0054, 0014) Energy Window Lower Limit           DS: "241.51960754395"
      (0054, 0015) Energy Window Upper Limit           DS: "398.26742553711"
      ---------
   (0054, 0018) Energy Window Name                  SH: 'Window Group B'
   ---------
   (0054, 0013)  Energy Window Range Sequence  1 item(s) ----
      (0054, 0014) Energy Window Lower Limit           DS: "194.33699035645"
      (0054, 0015) Energy Window Upper Limit           DS: "237.52299499512"
      ---------
   (0054, 0018) Energy Window Name                  SH: 'Window Group C'
   ---------
   (0054, 0013)  Energy Window Range Sequence  1 item(s) ----
      (0054, 0014) Energy Window Lower Limit           DS: "103.26010131836"
      (0054, 0015) Energy Window Upper Limit           DS: "193.89128112793"
      ---------
   (0054, 0018) Energy Window Name                  SH: 'Window Group D'
   ---------
   (0054, 0013)  Energy Window Range Sequence  1 item(s) ----
      (0054, 0014) Energy Window Lower Limit           DS: "71.04125213623"
      (0054, 0015) Energy Window Upper Limit           DS: "91.338752746582"
      ---------
   (0054, 0018) Energy Window Name                  SH: 'Window Group E'
   ---------
   (0054, 0013)  Energy Window Range Sequence  1 item(s) ----
      (0054, 0014) Energy Window Lower Limit           DS: "62.216251373291"
      (0054, 0015) Energy Window Upper Limit           DS: "70.158744812012"
      ---------
   (0054, 0018) Energy Window Name                  SH: 'Window Group F'
   ---------
(0054, 0016)  Radiopharmaceutical Information Sequence  0 item(s) ----
(0054, 0020) Detector Vector                     US: Array of 720 elements
(0054, 0021) Number of Detectors                 US: 2
(0054, 0022)  Detector Information Sequence  2 item(s) ----
   (0018, 1142) Radial Position                     DS: Array of 60 elements
   (0018, 1145) Center of Rotation Offset           DS: "0.0"
   (0018, 1147) Field of View Shape                 CS: 'RECTANGLE'
   (0018, 1149) Field of View Dimension(s)          IS: [537, 383]
   (0018, 1180) Collimator/grid Name                SH: '@30419607'
   (0018, 1181) Collimator Type                     CS: 'PARA'
   (0018, 1182) Focal Distance                      IS: "0"
   (0018, 1183) X Focus Center                      DS: [0, 0]
   (0018, 1184) Y Focus Center                      DS: [0, 0]
   (0020, 0032) Image Position (Patient)            DS: [0, 0, 942.49519181252]
   (0020, 0037) Image Orientation (Patient)         DS: [1, -8.742278e-008, 0, 0, 0, -1]
   (0028, 0031) Zoom Factor                         DS: [1, 1]
   (0054, 0200) Start Angle                         DS: "179.85116577148"
   ---------
   (0018, 1142) Radial Position                     DS: Array of 60 elements
   (0018, 1145) Center of Rotation Offset           DS: "0.0"
   (0018, 1147) Field of View Shape                 CS: 'RECTANGLE'
   (0018, 1149) Field of View Dimension(s)          IS: [537, 383]
   (0018, 1180) Collimator/grid Name                SH: '@30419608'
   (0018, 1181) Collimator Type                     CS: 'PARA'
   (0018, 1182) Focal Distance                      IS: "0"
   (0018, 1183) X Focus Center                      DS: [0, 0]
   (0018, 1184) Y Focus Center                      DS: [0, 0]
   (0020, 0032) Image Position (Patient)            DS: [0, 0, 942.49519181252]
   (0020, 0037) Image Orientation (Patient)         DS: [-1, 0, 0, 0, 0, -1]
   (0028, 0031) Zoom Factor                         DS: [1, 1]
   (0054, 0200) Start Angle                         DS: "0.14882896840572"
   ---------
(0054, 0050) Rotation Vector                     US: Array of 720 elements
(0054, 0051) Number of Rotations                 US: 1
(0054, 0052)  Rotation Information Sequence  1 item(s) ----
   (0018, 1130) Table Height                        DS: "222.1"
   (0018, 1131) Table Traverse                      DS: "831.5"
   (0018, 1140) Rotation Direction                  CS: 'CC'
   (0018, 1142) Radial Position                     DS: Array of 60 elements
   (0018, 1143) Scan Arc                            DS: "180.0"
   (0018, 1144) Angular Step                        DS: "3.0"
   (0018, 1242) Actual Frame Duration               IS: "60001"
   (0054, 0053) Number of Frames in Rotation        US: 60
   (0054, 0200) Start Angle                         DS: "179.85116577148"
   ---------
(0054, 0090) Angular View Vector                 US: Array of 720 elements
(0054, 0202) Type of Detector Motion             CS: ''
(0054, 0410)  Patient Orientation Code Sequence  1 item(s) ----
   (0008, 0100) Code Value                          SH: 'F-10450'
   (0008, 0102) Coding Scheme Designator            SH: '99SDM'
   (0008, 0104) Code Meaning                        LO: 'Recumbent'
   (0054, 0412)  Patient Orientation Modifier Code Sequence  1 item(s) ----
      (0008, 0100) Code Value                          SH: 'F-10340'
      (0008, 0102) Coding Scheme Designator            SH: '99SDM'
      (0008, 0104) Code Meaning                        LO: 'Supine position'
      ---------
   ---------
(0054, 0414)  Patient Gantry Relationship Code Sequence  1 item(s) ----
   (0008, 0100) Code Value                          SH: 'G-5191'
   (0008, 0102) Coding Scheme Designator            SH: '99SDM'
   (0008, 0104) Code Meaning                        LO: 'Feet-first'
   ---------
(7fe0, 0010) Pixel Data                          OW: Array of 23592960 elements
(7fe3, 0010) Private Creator                     LO: 'SIEMENS MED NM'
(7fe3, 1014) [Lowest Pixel Value in THIS Frame]  OW: Array of 2880 elements
(7fe3, 1015) [Highest Pixel Value in THIS Frame] OW: Array of 2880 elements
if hasattr(ds, "PixelData"):
    num_frames = getattr(ds, "NumberOfFrames", 1)  # Multi-frame images
    rows, cols = ds.Rows, ds.Columns

detector information sequence

detector_info = ds.DetectorInformationSequence[0]
radial_positions = detector_info.RadialPosition
FOV_shape = detector_info.FieldOfViewShape
FOV_dim = detector_info.FieldOfViewDimensions
Focal_distance = detector_info.FocalDistance
start_angle = detector_info.StartAngle
#pixel spacing
pixel_spacing = ds.PixelSpacing

# print(f"Radial Positions: {radial_positions}")
rotationVector = ds.RotationVector
rotationInformationSequence = ds.RotationInformationSequence[0]
RotationDirection = rotationInformationSequence.RotationDirection
scanArc = rotationInformationSequence.ScanArc
angularStep = rotationInformationSequence.AngularStep
# numberOfFrames = rotationInformationSequence.NumberOfFrames

# arcOfRotation = rotationVector.ScanArc

angularViewVector = np.array(ds.AngularViewVector)
detectorVector = np.array(ds.DetectorVector)

print(f"Rotation Vector: {rotationVector}")


# module_spect = SPECTHeadGeneric()


# module_.setHighEnergyLightDetectorBlock(2)

#
newDevice = PlanarGeometry(distance_between_planes=537, detector_module=PETModule)
newDevice.setDeviceName("Siemens SYmbia Intevo Bold SPEC/CT")
newDevice.setNumberOfModulesZ(1)
newDevice.setNumberOfModulesPerSide(1)
newDevice.setNumberOfModulesPhi(2)
print("Number of modules: ", newDevice.numberOfModules)

modules_ = [PETModule(i) for i in range(newDevice.numberOfModules)]
newDevice.setDetectorModule(modules_)

for i in range(newDevice.numberOfModules):
    newDevice.detectorModule[i].setModuleID(i)
    newDevice.detectorModule[i].updateNumberHighEnergyLightDetectors(128,128)

    print("Number of high energy light detectors: ", newDevice.detectorModule[i].totalNumberHighEnergyLightDetectors)

    newDevice.detectorModule[i].setModelHighEnergyLightDetectors([GenericCrystal(k) for k in
                                                range(newDevice.detectorModule[i].totalNumberHighEnergyLightDetectors)])
    for j in range(newDevice.detectorModule[i].totalNumberHighEnergyLightDetectors):

        newDevice.detectorModule[i].modelHighEnergyLightDetectors[j].setCrystalID(j)
        newDevice.detectorModule[i].modelHighEnergyLightDetectors[j].setCristalSize(pixel_spacing[0], pixel_spacing[0], 30)
    newDevice.detectorModule[i].setReflectorThicknessX(0)
    newDevice.detectorModule[i].setReflectorThicknessY(0)

    newDevice.detectorModule[i].setHighEnergyLightDetectorBlock()

newDevice.calculateInitialGeometry()

designer = DeviceDesignerStandalone(device=newDevice)
designer.addDevice()
designer.startRender()

print(newDevice.getDeviceName())
Rotation Vector: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
radius:  40
Number of modules:  2
Number of high energy light detectors:  16384
Number of high energy light detectors:  16384
Adding module
<toor.DetectionLayout.Modules.PETModuleGeneric.PETModule object at 0x000002350996ADC0>
Adding module
<toor.DetectionLayout.Modules.PETModuleGeneric.PETModule object at 0x0000023500F00D60>
Siemens SYmbia Intevo Bold SPEC/CT
# Check if the file contains Pixel Data (projection images)
if hasattr(ds, "PixelData"):
    pixel_array = ds.pixel_array  # Convert pixel data to NumPy array

    num_frames = getattr(ds, "NumberOfFrames", 1)  # Check number of projection frames
    print(f"Projection Data Found: {num_frames} frames of {ds.Rows}x{ds.Columns} pixels.")

    # Display first few projections
    num_display = min(num_frames, 10)  # Show up to 6 projections
    fig, axes = plt.subplots(1, num_display, figsize=(15, 5))
    for i in range(num_display):
        axes[i].imshow(pixel_array[i], cmap="gray")
        axes[i].set_title(f"Projection {i+1}")
        axes[i].axis("off")
    # plt.show()

else:
    print("No Pixel Data found.")
Projection 1, Projection 2, Projection 3, Projection 4, Projection 5, Projection 6, Projection 7, Projection 8, Projection 9, Projection 10
Projection Data Found: 720 frames of 128x128 pixels.

create a sinogram from the dicom information

print(pixel_array.shape)
sinogram = pixel_array[40]
# theta = np.linspace()
# image = iradon(sinogram, theta=theta, circle=True)
# plt.imshow(image, cmap='gray')/
(720, 128, 128)

Total running time of the script: (2 minutes 22.966 seconds)

Gallery generated by Sphinx-Gallery