Imaging & DICOM Studies

v0.1.0

DICOM study registration, PACS bridge integration, tooth/procedure linking, and patient de-identification.

Imaging & DICOM Studies

The Imaging & DICOM bounded context manages diagnostic dental radiography, Picture Archiving and Communication System (PACS) bridges, and 3D optical impression scans. It integrates chairside imaging hardware directly with tooth charts, treatment plans, and HIPAA/GDPR privacy filters.


Supported Imaging Modalities

Obelawium Dental recognizes standard dental radiological and optical scan modalities:

use Obelaw\Ium\Dental\Enums\ImagingType;

enum ImagingType: string
{
    case CBCT_3D = 'cbct_3d';                   // Cone Beam Computed Tomography (3D Volumetric)
    case PANORAMIC_OPG = 'panoramic_opg';       // Extraoral 2D Orthopantomogram
    case BITEWING_2D = 'bitewing_2d';           // Intraoral interproximal caries radiograph
    case PERIAPICAL_2D = 'periapical_2d';       // Intraoral root apex & endodontic radiograph
    case CEPHALOMETRIC = 'cephalometric';       // Lateral orthodontic skull projection
    case INTRAORAL_CAMERA = 'intraoral_camera'; // High-resolution photographic tooth surface
    case STL_OPTICAL_SCAN = 'stl_optical_scan'; // 3D digital impression surface mesh
}

DICOM Architecture & PACS Bridge

[Dental Sensor / CBCT / Scanner]
               |
      (DICOM C-STORE / PUSH)
               v
  [Clinic PACS Server (Port 11112)]
               |
         (Local Ingest)
               v
   [Obelawium ImagingService]
         |             |
  (Local Air-Gapped)   (Cloud Object Storage)
         |             |
         |       Has IMAGING_CLOUD_SYNC consent?
         |             |
         |         YES +---> Cloud S3 Bucket
         |          NO +---> De-identify Tags First
         v
[Direct Link to Tooth & Planned Procedure]

Storage Adapter Options

Configured in config/ium/dental.php:

  1. Local Disk (local): Files reside in local air-gapped storage (storage_path('dicom/incoming')). Ideal for on-premise clinic deployments with strict data sovereignty mandates.
  2. Cloud Object Storage (cloud_object_storage): Synchronizes encrypted DICOM blobs to an S3-compatible bucket. Cloud sync requires patient consent under ConsentType::IMAGING_CLOUD_SYNC.

HIPAA & GDPR De-identification Pipeline

Prior to off-site cloud replication, external specialist referrals, or AI-assisted diagnostic evaluation, the de-identification pipeline strips direct identifiers while preserving anatomical and radiometric metadata:

DICOM TagDescriptionAction
(0010,0010)Patient’s NameReplaced with anonymous alphanumeric token
(0010,0020)Patient ID / Medical Record NumberReplaced with internal opaque hash
(0010,0030)Patient’s Birth DateTruncated to 5-year age bracket
(0010,0040)Patient’s SexPreserved for anatomical scaling
(0008,0080)Institution Name / Clinic NameRedacted
(0008,0090)Referring Physician’s NameRedacted
(0028,0010)Pixel Dimensions / Voxel SpacingPreserved intact for diagnostic integrity
// Invoke de-identification on registered study
$anonymizedStudy = ium()->dental()->imaging()->deidentify($studyId);

Fluent Service Operations

All radiography operations are invoked via ium()->dental()->imaging():

1. Registering an Incoming DICOM Study

use Obelaw\Ium\Dental\Data\RegisterDicomStudyDto;
use Obelaw\Ium\Dental\Enums\ImagingType;
use Obelaw\Ium\Dental\ValueObjects\ToothNumber;
use DateTimeImmutable;

$study = ium()->dental()->imaging()->registerStudy(RegisterDicomStudyDto::from([
    'patient_id' => $patient->id,
    'study_instance_uid' => '1.2.840.10008.5.1.4.1.1.1.20261015091234',
    'imaging_type' => ImagingType::PERIAPICAL_2D,
    'file_path' => 'dicom/studies/2026/10/pt-482-tooth19-pa.dcm',
    'tooth_number' => ToothNumber::fromUniversal(19),
    'acquired_at' => new DateTimeImmutable('2026-10-15 09:12:00'),
    'technician_id' => 'TECH-SARAH',
    'notes' => 'Periapical radiograph confirming radiolucency at apex of mesial root.',
]));

2. Linking Radiograph to a Planned Procedure

Link imaging studies directly to clinical treatment plan procedures:

$linkedStudy = ium()->dental()->imaging()->linkToProcedure(
    studyId: $study->id,
    procedureId: $plannedProcedure->id
);

3. Fetching Patient Imaging History

$patientStudies = ium()->dental()->imaging()->getStudiesForPatient($patient->id);

foreach ($patientStudies as $radiograph) {
    echo "{$radiograph->imaging_type->value}: {$radiograph->study_instance_uid}\n";
}

Emitted Domain Events

Event ClassTriggerPayload
DicomStudyReceivedDispatched when a new radiograph is ingested and registered.DicomStudy $study