DICOM 메타데이터 변환 매핑 in Healthcare Data Solutions
이 문서에서는 의료 데이터 솔루션 환경이 다양한 레이크하우스 수준에서 DICOM 메타데이터를 추출하고 변환하는 방법을 설명합니다. 또한 엔드투엔드 메타데이터 변환 프로세스에 대해 알아보고 각 수준에서의 변환 매핑을 이해할 수 있습니다.
수집 파이프라인을 통한 메타데이터 변환은 다음과 같은 세 가지 연속 단계로 구성됩니다.
- DICOM 메타데이터를 브론즈 델타 테이블로 추출 및 변환
- 브론즈에서 실버 델타 테이블로 메타데이터 변환
- 실버에서 골드 델타 테이블로 메타데이터 변환
다음 섹션에서는 각 단계에 대한 변환 매핑에 대해 자세히 설명합니다.
DICOM 메타데이터를 브론즈 델타 테이블로 변환 매핑
공급업체별 프라이빗 태그를 포함하여 DICOM 표준에 의해 정의된 DICOM 태그는 5,000개 이상입니다. 이 섹션에서는 어떤 태그를 검색해야 하는지 확인하고 브론즈 레이크하우스의 추출 과정을 설명합니다.
태그 추출 및 ImagingDicom 델타 테이블 생성 프로세스에는 다음 작업이 포함됩니다.
DICOM 파일에서 추출: 브론즈 레이크하우스의 최적화된 폴더 구조에 있는 DICOM(DCM) 파일에서 모든 태그 컬렉션을 추출합니다.
픽셀 데이터 태그 제외: DICOM 픽셀 데이터 태그(7FE0,0010)와 이미지 픽셀 데이터 모듈 특성을 컬렉션에서 제외합니다. DICOM 픽셀 데이터 태그에는 이미지/픽셀 수준 세부 정보가 포함됩니다.
JSON 매핑: 추출된 모든 DICOM 태그를 다음 스키마의 키-값 쌍의 JSON 구조에 매핑합니다.
METADATA_JSON_DICT_SCHEMA = MapType ( StringType(), StructType([ StructField("vr", StringType(), True), StructField("Value", ArrayType(StringType(), True), True) ]) )
이러한 키-값 JSON 쌍은 Bronze 레이크하우스 ImagingDicom delta 테이블의 메타데이터 열에 기록됩니다.
참고
metadata_string
열은 Fabric SQL 엔드포인트가 구조체, 배열, 맵과 같은 복잡한 데이터 유형을 지원하지 않기 때문에 메타데이터를 문자열로 저장합니다. SQL 끝점(T-SQL)를 사용하여 이러한 열을 문자열로 쿼리하거나 Spark를 사용하여 기본 유형(구조체, 배열, 맵)으로 작업할 수 있습니다.추출 및 매핑를 사용하여 레이크하우스를 청동화합니다. 다음 29개 DICOM 태그를 추가로 추출하여 ImagingDicom 델타 테이블의 해당 대상 열에 씁니다.
원본 DICOM 태그 대상 열 필수 (0020,000D) [studyInstanceUid]
네 (0010,0010) [patientName]
없음 (0010,0040) [patientSex]
없음 (0010,0020) [patientId]
네 (0010,0030) [patientBirthDate]
없음 (0008,0050) [accessionNumber]
네 (0008,0090) [referringPhysicianName]
네 (0008,0020) [studyDate]
네 (0008,1030) [studyDescription]
네 (0020,000E) [seriesInstanceUid]
네 (0008,0060) [modality]
네 (0008,0061) [modalitiesInStudy]
네 (0040,0244) [performedProcedureStepStartDate]
없음 (0008,1090) [manufacturerModelName]
없음 (0008,0018) [sopInstanceUid]
네 (0008,0030) [studyTime]
네 (0008,0201) [timezoneOffsetFromUtc]
네 (0020,1206) [numberOfStudyRelatedSeries]
네 (0020,1208) [numberOfStudyRelatedInstances]
네 (0020,0011) [seriesNumber]
네 (0008,103E) [seriesDescription]
네 (0020,1209) [numberOfSeriesRelatedInstances]
네 (0018,0015) [bodyPartExamined]
네 (0020,0060) [laterality]
네 (0008,0021) [seriesDate]
네 (0008,0031) [seriesTime]
네 (0008,0016) [sopClassUid]
네 (0020,0013) [instanceNumber]
네 (0042,0010) [documentTitle]
네 참고
이러한 특정 29개 DICOM 태그를 홍보하는 이유에 대한 자세한 내용은 DICOM 태그 추출을 참조하세요.
수집 패턴(추가)에 대해 자세히 알아보려면 브론즈 레이크하우스의 패턴 추가를 참조하세요.
modalitiesInStudy_string
열은 또한 modalitiesInStudy 태그를 문자열로 저장합니다. 그 이유는 Fabric SQL 엔드포인트가 구조체, 배열, 맵과 같은 복잡한 데이터 유형을 지원하지 않기 때문입니다. SQL 끝점(T-SQL)를 사용하여 이러한 열을 문자열로 쿼리하거나 Spark를 사용하여 기본 유형(구조체, 배열, 맵)으로 작업할 수 있습니다.
DCM 파일 경로 저장: DCM 파일의 전체 파일 경로는
filePath
ImagingDicom 델타 테이블의 열에 기록됩니다.수정 시간 로깅: DCM 파일이 소스에서 수정된 최신 타임스탬프가
sourceModifiedAt
ImagingDicom 델타 테이블의 열에 기록됩니다.네임스페이스 저장소: 네임스페이스 값은
sourceSystem
ImagingDicom 델타 테이블의 열에 기록됩니다. 이 값은 통합 폴더 구조의 폴더 이름에서 파생됩니다.- 일반적인 수집의 경우 네임스페이스 값은
Files\Process\Imaging\DICOM
뒤의 폴더 이름입니다. - BYOS(Bring Your Own Storage) 수집의 경우 네임스페이스 값은
Files\External\Imaging\DICOM
뒤의 폴더 이름입니다.
- 일반적인 수집의 경우 네임스페이스 값은
실행 시간 로깅: 노트북의 실행 날짜와 시간은
createdDatetime
ImagingDicom 델타 테이블의 열에 기록됩니다.
브론즈에서 실버로 델타 테이블에 대한 변환 매핑
다음 표에서는 청동 레이크하우스 ImagingDicom 델타 테이블에서 실버 레이크하우스의 ImagingMetastore 와 ImagingStudy 델타 테이블로 DICOM 메타데이터를 변환하기 위한 전체 매핑를 설명합니다. ImagingMetastore 델타 테이블은 각 DCM 파일의 DICOM 태그를 메타데이터 열 내의 JSON 키-값 쌍으로 저장합니다. 청동에서 실버 레이어로 모든 메타데이터를 복사하면 모든 레이어에서 데이터 무결성이 유지됩니다. ImagingStudy 델타 테이블에는 FHIR 표준 필드와 함께 맞춤에 대해 선택된 29개의 DICOM 태그가 포함되어 있습니다. 또한 데이터 추적 및 계보를 지원하는 더 많은 필드가 포함되어 있습니다.
ImagingDicom의 소스 열 | ImagingMetastore의 대상 열 | 매핑 세부 정보 |
---|---|---|
해당 없음 | msftModifiedDatetime |
모든 테이블에 적용되는 공통 델타 병합 논리를 통해 실버 레이어에 포함됩니다. |
studyInstanceUid |
studyInstanceUid |
매핑에게 1:1 관계를 맺어 직접 연락하세요. 소스 열의 각 값은 대상의 단일 해당 값에 직접 매핑됩니다. |
seriesInstanceUid |
seriesInstanceUid |
매핑에게 1:1 관계를 맺어 직접 연락하세요. |
sopInstanceUid |
sopInstanceUid |
매핑에게 1:1 관계를 맺어 직접 연락하세요. |
sourceSystem |
msftSourceSystem |
매핑에게 1:1 관계를 맺어 직접 연락하세요. |
metadata |
metadata |
매핑에게 1:1 관계를 맺어 직접 연락하세요. |
metadata_string |
metadata_string |
매핑에게 1:1 관계를 맺어 직접 연락하세요. |
filePath |
filePath |
매핑에게 1:1 관계를 맺어 직접 연락하세요. |
sourceModifiedAt |
sourceModifiedAt |
매핑에게 1:1 관계를 맺어 직접 연락하세요. |
해당 없음 | id |
Python UUID 모듈을 사용하여 생성된 GUID입니다. |
해당 없음 | msftCreatedDatetime |
모든 테이블에 적용되는 공통 델타 병합 논리를 통해 실버 레이어에 포함됩니다. |
ImagingDicom의 소스 열 | ImagingStudy의 대상 열 | 매핑 세부 정보 |
---|---|---|
해당 없음 | msftModifiedDatetime |
모든 테이블에 적용되는 공통 델타 병합 논리를 통해 실버 레이어에 포함됩니다. |
해당 없음 | id |
Python UUID 모듈을 사용하여 생성된 GUID입니다. |
해당 없음 | resourceType |
"ImagingStudy" |
sourceSystem |
msftSourceSystem |
직접적인 매핑가 아닙니다. DICOM 데이터 변환 기능은 생성된 NDJSON 파일을 sourceSystem Process 폴더에 쓸 때 청동 레이크하우스의 열을 사용하여 네임스페이스 폴더를 생성합니다. 네임스페이스 폴더에 대해 자세히 알아보려면 통합 폴더 구조: 폴더 설명을 참조하세요. 이 단계에서, 임상 청동 섭취 서비스는 네임스페이스 폴더 이름을 사용하여 msftSourceSystem 실버 레이크하우스의 열을 채웁니다. 예를 들어, sourceSystem 값이 bronze MyPACSsystem ImagingDicom 테이블에 로 정의되어 있는 경우, 이미징 브론즈 수집 서비스는 새로 생성된 NDJSON 파일을 다음 폴더 구조에 기록합니다. Process\Clinical\FHIR-NDJSON\MyPACSsystem\YYYY\MM\DD\ImagingStudy-<timestamp>.ndjson 임상 청동 섭취가 이러한 파일을 수집하면 자동으로 msftSourceSystem 열을 MyPACSsystem 폴더 구조에서 채우고 동일한 값을 실버 레이어로 전파합니다. |
해당 없음 | msftFilePath |
ImagingStudy NDJSON이 생성된 Process\Clinical\FHIR-NDJSON\DICOM-HDS 폴더의 파일 경로입니다. |
filePath |
extension |
"extension": [{"url": "lit('file_path')", "valueUrl": "col('FilePath')"}] FilePath 의 값에는 이 ImagingStudy에 속하는 모든 인스턴스 수준 DCM 파일에 대한 OneLake의 ABFS 파일 경로가 포함됩니다. |
해당 없음 | meta | "meta": {"lastUpdated":"current_timestamp()"} |
studyInstanceUid accessionNumber |
identifier |
ImagingStudy.identifier.where(system = 'urn:dicom:uid') =>StudyInstanceUID ImagingStudy.identifier.where(type.coding.system = 'http://terminology.hl7.org/CodeSystem/v2-0203' 및 type.coding.code = 'ACSN')) =>"AccessionNumber" |
해당 없음 | status |
"available" |
modalitiesInStudy |
modality |
modality = List{code = col('ModalitiesInStudy')} |
patientId |
subject |
""subject"": {""identifier"": {""type"": {""coding"": [{""system"": ""lit('http://terminology.hl7.org/CodeSystem/v2-0203')"",""code"": ""lit('MR')""}]},""value"": ""col('PatientID')""},""type": ""lit('Patient')""}," |
patientName patientBirthDate patientSex |
subject |
"subject": {"extension": [{"url": "lit('name')", "valueString": "col('PatientName')"}, {"url": "lit('birthDate')", "valueDateTime": "col('PatientBirthDate')"}, {"url": "lit('gender')", "valueCode": "col('PatientSex')"}]} |
studyDate studyTime timezoneOffsetFromUtc |
started |
concat_ws(' ', col('StudyDate'), col('StudyTime'), col('TimezoneOffsetFromUTC')) |
numberOfStudyRelatedSeries |
numberOfSeries |
col('NumberOfStudyRelatedSeries') |
numberOfStudyRelatedInstances |
numberOfInstances |
col('NumberOfStudyRelatedInstances') |
studyDescription |
description |
col('StudyDescription') |
seriesInstanceUid seriesDate seriesTime timezoneOffsetFromUtc modality laterality bodyPartExamined numberOfSeriesRelatedInstances seriesDescription seriesNumber sopInstanceUid sopClassUid instanceNumber documentTitle |
series |
{"series": [{"uid": "col('SeriesInstanceUID')", "started": {"tag": "SeriesDate,SeriesTime,TimezoneOffsetFromUTC", "calc": "concat_ws(' ', col('SeriesDate'), col('SeriesTime'), col('TimezoneOffsetFromUTC')).cast(TimestampType())"}, "modality": {"code": "col('Modality')", "system": "lit('https://dicom.nema.org/resources/ontology/DCM')"}, "laterality": {"display": "col('Laterality')"}, "bodySite": {"display": "col('BodyPartExamined')"}, "numberOfInstances": "col('NumberOfSeriesRelatedInstances')", "description": "col('SeriesDescription')", "number": "col('SeriesNumber')", "instance": [{"uid": "col('SOPInstanceUID')", "sopClass": {"code": "col('SOPClassUID')"}, "number": "col('InstanceNumber')", "title": "col('DocumentTitle')", "extension": [{"url": "lit('file_path')", "valueUrl": "col('FilePath')"}]}]}]} |
해당 없음 | meta.lastupdated |
Currenttimestamp() |
해당 없음 | msftCreatedDatetime |
모든 테이블에 적용되는 공통 델타 병합 논리를 통해 실버 레이어에 포함됩니다. |
참고
접미사
Orig
가 붙은 열은 청동 레이어에서 제공된 필드의 원래 값을 저장하기 위해 실버 레이크하우스에 생성됩니다. 이 표준 관행에는 ImagingStudy 표의 다음 열이 포함됩니다:meta_lastUpdatedOrig
,identifierOrig
,idOrig
, 및startedOrig
._string
접미사가 붙은 열은 복잡한 JSON 데이터를 포함하는 필드의 문자열화된 버전을 저장하므로 SQL 분석 끝점를 통한 쿼리가 가능합니다. 이 방법은 실버 레이크하우스의 모든 테이블에 적용되며 다음 열을 포함합니다. ImagingStudy 표:meta_string
,text_string
,contained_string
,identifier_string
,modality_string
,subject_string
,encounter_string
,basedOn_string
,referrer_string
,interpreter_string
,endpoint_string
,procedureReference_string
,procedureCode_string
,location_string
,reasonCode_string
,reasonReference_string
,note_string
,series_string
, 그리고identifierOrig_string
.ImagingStudy 테이블의 일부 필드는 FHIR ImagingStudy 스키마를 사용하여 맞추다로 생성됩니다. 그러나 청동 레이어는 이러한 필드에 정확하게 해당하는 데이터를 DCM 파일에서 추출하지 않으므로 실버 테이블의 관련 열은 비어 있습니다. 결과적으로 ImagingStudy 테이블의 다음 열에 null 값이 포함됩니다:
implicitRules
,language
,text
,contained
,encounter
,basedOn
,referrer
,interpreter
,endpoint
,procedureReference
,procedureCode
,location
,reasonCode
,reasonReference
, 및note
.
실버에서 골드로 델타 테이블에 대한 변환 매핑
다음 표에서는 실버 레이크하우스 ImagingStudy 델타 테이블의 DICOM 데이터를 골드 레이크하우스의 Observational Medical Outcomes Partnership(OMOP) Image_Occurrence 델타 테이블로 변환하기 위한 전체 매핑를 설명합니다.
ImagingStudy의 소스 열 | OMOP Image_Occurrence의 대상 열 | 데이터 형식 | 매핑 세부 정보 |
---|---|---|---|
series.started |
image_occurrence_date |
날짜 | 이미징 절차(시리즈) 발생 날짜입니다. |
series.modality ( series.modality.code 와 series.modality.system 의 조합) |
modality_concept_id |
string | concat_ws('<->', exp_series.modality.code, exp_series.modality.system) |
해당 없음 | SourceTable |
string | 'ImagingStudy_FHIR' |
id |
msftSourceRecordId |
string | 소스 레코드의 시스템이 생성한 ID입니다. |
identifier['studyInstanceUid'] |
image_study_uid |
string | DICOM 연구 UID. |
subject |
person_id |
integer | 기록된 절차와 관련된 사람의 개인 ID입니다. |
키가 이고 값이 instance.uid 인 사전 값의 배열 instance.extension[0].valueUrl |
local_path |
string | to_json(transform(exp_series.instance, x -> map('instanceid', x.uid, 'local_path', from_json(x.extension, 'array<struct<valueUrl:string,url:string>>')[0].valueUrl))) |
해당 없음 | SourceModifiedOn |
datetime | 기록 수정 날짜. |
resourceType |
msftSourceTableName |
string | 'Imaging Study' |
msftModifiedDatetime |
msftModifiedDatetime |
datetime | 매핑에게 1:1 관계를 맺어 직접 연락하세요. |
series.uid |
image_occurrence_id |
string | 이미징 스터디 레코드에 부여되는 고유 키입니다. |
series.modality.code |
modality_source_value |
string | 시리즈의 양식입니다. |
참고
골드 테이블의 일부 필드는 OMOP Image_Occurrence 스키마를 사용하여 맞추다를 생성합니다. 그러나 청동 레이어는 이러한 필드에 정확하게 해당하는 데이터를 추출하지 않으므로 골드 테이블의 관련 열은 비어 있습니다. 결과적으로 Image_Occurrence 테이블의 다음 열에 null 값이 포함됩니다: visit_occurrence_id
, procedure_occurrence_id
, 및 anatomic_site_concept_id
.