radfusion/app/Services/Pacs/DicomUtils.php
2025-01-22 13:07:08 +06:00

91 lines
4.7 KiB
PHP

<?php
namespace App\Services\Pacs;
use App\Services\StudyRouter\DicomTagIdentifiers;
use Carbon\Carbon;
use Illuminate\Support\Str;
final class DicomUtils
{
public static function dateToCarbon(?string $datePart, string $timezone = 'UTC'): ?Carbon
{
if ($datePart === null) {
return null;
}
return Carbon::createFromFormat('Ymd', $datePart, $timezone);
}
public static function dateTimeToCarbon(?string $datePart, ?string $timePart, string $timezone = 'UTC'): ?Carbon
{
if (blank($datePart) || blank($timePart)) {
return null;
}
return Carbon::createFromFormat('YmdHis', $datePart . Str::before($timePart, '.'), $timezone);
}
public static function getDicomTagDescription(DicomTagIdentifiers $tag): string
{
return match ($tag) {
DicomTagIdentifiers::PatientName => "Patient's Name",
DicomTagIdentifiers::PatientID => 'Patient ID',
DicomTagIdentifiers::PatientBirthDate => "Patient's Birth Date",
DicomTagIdentifiers::PatientSex => "Patient's Sex",
DicomTagIdentifiers::StudyInstanceUID => 'Study Instance UID',
DicomTagIdentifiers::SeriesInstanceUID => 'Series Instance UID',
DicomTagIdentifiers::StudyID => 'Study ID',
DicomTagIdentifiers::SeriesNumber => 'Series Number',
DicomTagIdentifiers::InstanceNumber => 'Instance Number',
DicomTagIdentifiers::SOPClassUID => 'SOP Class UID',
DicomTagIdentifiers::SOPInstanceUID => 'SOP Instance UID',
DicomTagIdentifiers::StudyDate => 'Study Date',
DicomTagIdentifiers::StudyTime => 'Study Time',
DicomTagIdentifiers::AccessionNumber => 'Accession Number',
DicomTagIdentifiers::Modality => 'Modality',
DicomTagIdentifiers::Manufacturer => 'Manufacturer',
DicomTagIdentifiers::InstitutionName => 'Institution Name',
DicomTagIdentifiers::ReferringPhysicianName => "Referring Physician's Name",
DicomTagIdentifiers::StationName => 'Station Name',
DicomTagIdentifiers::SeriesDescription => 'Series Description',
DicomTagIdentifiers::ManufacturerModelName => "Manufacturer's Model Name",
DicomTagIdentifiers::PatientAge => "Patient's Age",
DicomTagIdentifiers::PatientWeight => "Patient's Weight",
DicomTagIdentifiers::BodyPartExamined => 'Body Part Examined',
DicomTagIdentifiers::ProtocolName => 'Protocol Name',
DicomTagIdentifiers::SoftwareVersions => 'Software Versions',
DicomTagIdentifiers::AcquisitionDate => 'Acquisition Date',
DicomTagIdentifiers::AcquisitionTime => 'Acquisition Time',
DicomTagIdentifiers::ContentDate => 'Content Date',
DicomTagIdentifiers::ContentTime => 'Content Time',
DicomTagIdentifiers::AcquisitionDeviceProcessingDescription => 'Acquisition Device Processing Description',
DicomTagIdentifiers::InstitutionAddress => 'Institution Address',
DicomTagIdentifiers::StudyDescription => 'Study Description',
DicomTagIdentifiers::OperatorsName => "Operator's Name",
DicomTagIdentifiers::Private10 => 'Private Tag 10',
DicomTagIdentifiers::IW_Private => 'IW Private Tag',
DicomTagIdentifiers::ImageType => 'Image Type',
DicomTagIdentifiers::PatientOrientation => 'Patient Orientation',
DicomTagIdentifiers::ImagePositionPatient => 'Image Position (Patient)',
DicomTagIdentifiers::ImageOrientationPatient => 'Image Orientation (Patient)',
DicomTagIdentifiers::FrameOfReferenceUID => 'Frame of Reference UID',
DicomTagIdentifiers::PositionReferenceIndicator => 'Position Reference Indicator',
DicomTagIdentifiers::SliceLocation => 'Slice Location',
DicomTagIdentifiers::SamplesPerPixel => 'Samples per Pixel',
DicomTagIdentifiers::PhotometricInterpretation => 'Photometric Interpretation',
DicomTagIdentifiers::Rows => 'Rows',
DicomTagIdentifiers::Columns => 'Columns',
DicomTagIdentifiers::PixelSpacing => 'Pixel Spacing',
DicomTagIdentifiers::BitsAllocated => 'Bits Allocated',
DicomTagIdentifiers::BitsStored => 'Bits Stored',
DicomTagIdentifiers::HighBit => 'High Bit',
DicomTagIdentifiers::PixelRepresentation => 'Pixel Representation',
DicomTagIdentifiers::WindowCenter => 'Window Center',
DicomTagIdentifiers::WindowWidth => 'Window Width',
DicomTagIdentifiers::RescaleIntercept => 'Rescale Intercept',
DicomTagIdentifiers::RescaleSlope => 'Rescale Slope',
};
}
}