Imaging & DICOM Studies
v0.1.0DICOM 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:
- 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. - Cloud Object Storage (
cloud_object_storage): Synchronizes encrypted DICOM blobs to an S3-compatible bucket. Cloud sync requires patient consent underConsentType::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 Tag | Description | Action |
|---|---|---|
(0010,0010) | Patient’s Name | Replaced with anonymous alphanumeric token |
(0010,0020) | Patient ID / Medical Record Number | Replaced with internal opaque hash |
(0010,0030) | Patient’s Birth Date | Truncated to 5-year age bracket |
(0010,0040) | Patient’s Sex | Preserved for anatomical scaling |
(0008,0080) | Institution Name / Clinic Name | Redacted |
(0008,0090) | Referring Physician’s Name | Redacted |
(0028,0010) | Pixel Dimensions / Voxel Spacing | Preserved 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 Class | Trigger | Payload |
|---|---|---|
DicomStudyReceived | Dispatched when a new radiograph is ingested and registered. | DicomStudy $study |