Mapowanie transformacji metadanych DICOM w rozwiązaniach do obsługi danych medycznych
Ten artykuł opisuje, jak możliwości przekształcania danych DICOM w środowisku rozwiązania do obsługi danych medycznych wyodrębniają i przekształcają metadane DICOM na różnych poziomach magazynu lakehouse. Możesz również dowiedzieć się więcej o kompleksowym procesie przekształcania metadanych i zrozumieć mapowanie transformacji na każdym poziomie.
Transformacja metadanych za pośrednictwem potoku pozyskiwania składa się z następujących trzech kolejnych etapów:
- Wyodrębnianie i przekształcanie metadanych DICOM do brązowej tabeli delta
- Transformacja metadanych z brązowej na srebrną tabelę delta
- Transformacja metadanych ze srebrnej na złotą tabelę delta
W poniższych sekcjach szczegółowo opisano mapowanie transformacji dla każdego etapu.
Mapowanie transformacji metadanych DICOM do brązowej tabeli delta
Istnieje ponad 5000 tagów DICOM zdefiniowanych przez standard DICOM, w tym tagi prywatne specyficzne dla dostawcy. Ta sekcja określa, które tagi pobieramy i wyjaśnia proces ekstrakcji w brązowym magazynie lakehouse?
Proces wyodrębniania tagów i tworzenia tabeli delta ImagingDicom obejmuje następujące akcje:
Wyodrębnianie z plików DICOM: Wyodrębnij kolekcję wszystkich znaczników z plików DICOM (DCM) w zoptymalizowanej strukturze folderów w brązowym magazynie lakehouse.
Wykluczenie znacznika danych piksela: wyklucz znacznik danych piksela DICOM (7FE0,0010) i atrybuty modułu danych piksela obrazu z kolekcji. Znacznik danych piksela DICOM zawiera szczegóły na poziomie obrazu/piksela.
Mapowanie JSON: zamapuj wszystkie wyodrębnione tagi DICOM na strukturę JSON par klucz-wartość w następującym schemacie:
METADATA_JSON_DICT_SCHEMA = MapType ( StringType(), StructType([ StructField("vr", StringType(), True), StructField("Value", ArrayType(StringType(), True), True) ]) )
Te pary JSON klucz-wartość są zapisywane w kolumnie metadanych w brązowej tabeli delta magazyn lakehouse ImagingDicom .
Notatka
Kolumna
metadata_string
przechowuje również metadane jako ciąg, ponieważ punkty końcowe sieci szkieletowej SQL nie obsługują złożonych typów danych, takich jak struktury, tablice i mapy. Możesz wykonywać zapytania dotyczące tych kolumn jako ciągów przy użyciu SQL punkt końcowy (T-SQL) lub pracować z ich typami natywnymi (strukturami, tablicami, mapami) przy użyciu platformy Spark.Ekstrakcja i mapowanie do brązu magazyn lakehouse: Następnie wyodrębnij następujące 29 tagów DICOM i zapisz je w odpowiednich kolumnach docelowych w tabeli delta ImagingDicom :
Źródłowy znacznik DICOM Kolumna docelowa Wymagania (0020,000D) [studyInstanceUid]
Tak (0010,0010) [patientName]
Nie. (0010,0040) [patientSex]
Nie. (0010,0020) [patientId]
Tak (0010,0030) [patientBirthDate]
Nie. (0008,0050) [accessionNumber]
Tak (0008,0090) [referringPhysicianName]
Tak (0008,0020) [studyDate]
Tak (0008,1030) [studyDescription]
Tak (0020,000E) [seriesInstanceUid]
Tak (0008,0060) [modality]
Tak (0008,0061) [modalitiesInStudy]
Tak (0040,0244) [performedProcedureStepStartDate]
Nie. (0008,1090) [manufacturerModelName]
Nie. (0008,0018) [sopInstanceUid]
Tak (0008,0030) [studyTime]
Tak (0008,0201) [timezoneOffsetFromUtc]
Tak (0020,1206) [numberOfStudyRelatedSeries]
Tak (0020,1208) [numberOfStudyRelatedInstances]
Tak (0020,0011) [seriesNumber]
Tak (0008,103E) [seriesDescription]
Tak (0020,1209) [numberOfSeriesRelatedInstances]
Tak (0018,0015) [bodyPartExamined]
Tak (0020,0060) [laterality]
Tak (0008,0021) [seriesDate]
Tak (0008,0031) [seriesTime]
Tak (0008,0016) [sopClassUid]
Tak (0020,0013) [instanceNumber]
Tak (0042,0010) [documentTitle]
Tak Notatka
Aby uzyskać więcej informacji o tym, dlaczego promujemy te konkretne 29 tagów DICOM, zobacz Wyodrębnianie tagów DICOM.
Aby dowiedzieć się więcej o wzorcu pozyskiwania (dołączenie), przejdź do tematu Wzorzec pozyskiwania w brązowym magazynie lakehouse.
Kolumna
modalitiesInStudy_string
przechowuje również tag modalitiesInStudy jako ciąg, ponieważ punkty końcowe sieci szkieletowej SQL nie obsługują złożonych typów danych, takich jak struktury, tablice i mapy. Możesz wykonywać zapytania dotyczące tych kolumn jako ciągów przy użyciu SQL punkt końcowy (T-SQL) lub pracować z ich typami natywnymi (strukturami, tablicami, mapami) przy użyciu platformy Spark.
Magazyn ścieżek do plików DCM: Pełna ścieżka do pliku DCM jest zapisywana w kolumnie
filePath
w tabeli różnicowej ImagingDicom .Rejestrowanie czasu modyfikacji: Ostatni znacznik czasu, w którym plik DCM został zmodyfikowany w źródle, jest zapisywany w kolumnie
sourceModifiedAt
w tabeli delta ImagingDicom .Magazyn przestrzeni nazw: wartość przestrzeni nazw jest zapisywana w kolumnie
sourceSystem
w tabeli różnicowej ImagingDicom . Ta wartość pochodzi od nazwy folderu w ujednoliconej strukturze folderów.- W przypadku regularnego pozyskiwania wartość przestrzeni nazw jest nazwą folderu po
Files\Process\Imaging\DICOM
. - W przypadku pozyskiwania Bring Your Own Storage (BYOS) wartość przestrzeni nazw to nazwa folderu po
Files\External\Imaging\DICOM
.
- W przypadku regularnego pozyskiwania wartość przestrzeni nazw jest nazwą folderu po
Rejestrowanie czasu wykonywania: data i godzina wykonania notesu są zapisywane w kolumnie
createdDatetime
w tabeli delta ImagingDicom .
Mapowanie transformacji metadanych DICOM z brązowej do srebrnej tabeli delta
W poniższych tabelach przedstawiono pełne mapowanie transformacji metadanych DICOM z brązowej tabeli delta magazyn lakehouse ImagingDicom do tabel delta ImagingMetastore i ImagingStudy w srebrnym magazyn lakehouse. Tabela delta ImagingMetastore przechowuje znaczniki DICOM dla każdego pliku DCM jako pary klucz-wartość JSON w kolumnach metadanych. Skopiowanie wszystkich metadanych z warstwy brązowej do srebrnej pozwala zachować integralność danych między warstwami. Tabela delta ImagingStudy zawiera 29 tagów DICOM wybranych do wyrównania z polami standardowymi FHIR. Zawiera również więcej pól do obsługi śledzenia danych i pochodzenia.
Kolumna źródłowa w ImagingDicom | Kolumna docelowa w ImagingMetastore | Szczegóły mapowania |
---|---|---|
N/D | msftModifiedDatetime |
Uwzględnione za pomocą wspólnej logiki scalania różnicowego zastosowanej do wszystkich tabel w warstwie srebrnej. |
studyInstanceUid |
studyInstanceUid |
Mapowanie bezpośrednie z relacją jeden-do-jednego. Każda wartość w kolumnie źródłowej jest mapowana bezpośrednio na pojedynczą odpowiadającą jej wartość w miejscu docelowym. |
seriesInstanceUid |
seriesInstanceUid |
Mapowanie bezpośrednie z relacją jeden-do-jednego. |
sopInstanceUid |
sopInstanceUid |
Mapowanie bezpośrednie z relacją jeden-do-jednego. |
sourceSystem |
msftSourceSystem |
Mapowanie bezpośrednie z relacją jeden-do-jednego. |
metadata |
metadata |
Mapowanie bezpośrednie z relacją jeden-do-jednego. |
metadata_string |
metadata_string |
Mapowanie bezpośrednie z relacją jeden-do-jednego. |
filePath |
filePath |
Mapowanie bezpośrednie z relacją jeden-do-jednego. |
sourceModifiedAt |
sourceModifiedAt |
Mapowanie bezpośrednie z relacją jeden-do-jednego. |
N/D | id |
Identyfikator GUID wygenerowany przy użyciu modułu UUID języka Python. |
N/D | msftCreatedDatetime |
Uwzględnione za pomocą wspólnej logiki scalania różnicowego zastosowanej do wszystkich tabel w warstwie srebrnej. |
Kolumna źródłowa w ImagingDicom | Kolumna Docelowa w ImagingStudy | Szczegóły mapowania |
---|---|---|
N/D | msftModifiedDatetime |
Uwzględnione za pomocą wspólnej logiki scalania różnicowego zastosowanej do wszystkich tabel w warstwie srebrnej. |
N/D | id |
Identyfikator GUID wygenerowany przy użyciu modułu UUID języka Python. |
N/D | resourceType |
"ImagingStudy" |
sourceSystem |
msftSourceSystem |
Nie jest to bezpośrednie mapowanie. Funkcja przekształcania danych DICOM używa kolumny sourceSystem w brązie magazyn lakehouse do tworzenia folderu Przestrzeń nazw podczas zapisywania wygenerowanych plików NDJSON w folderze Proces . Aby dowiedzieć się więcej o folderze Przestrzeń nazw, zobacz Ujednolicona struktura folderów: Opisy folderów. Na tym etapie usługa pozyskiwania brązu klinicznego używa nazwy folderu przestrzeni nazw do wypełnienia kolumny msftSourceSystem w srebrnym magazyn lakehouse. Jeśli na przykład sourceSystem wartość definiuje się jako MyPACSsystem w brązowej tabeli ImagingDicom , usługa pozyskiwania brązu do obrazowania zapisuje nowo utworzone pliki NDJSON w następującej strukturze folderów: Process\Clinical\FHIR-NDJSON\MyPACSsystem\YYYY\MM\DD\ImagingStudy-<timestamp>.ndjson Gdy kliniczne spożycie brązu pobiera te pliki, automatycznie wypełnia kolumnę msftSourceSystem MyPACSsystem ze struktury folderów i propaguje tę samą wartość do warstwy srebra. |
N/D | msftFilePath |
Ścieżka pliku do wygenerowanego pliku NDJSON ImagingStudy w folderze Process\Clinical\FHIR-NDJSON\DICOM-HDS . |
filePath |
extension |
"extension": [{"url": "lit('file_path')", "valueUrl": "col('FilePath')"}] Wartość dla FilePath obejmuje ścieżkę pliku ABFS w OneLake dla wszystkich plików DCM na poziomie wystąpienia, które są częścią tego ImagingStudy. |
N/D | 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' i type.coding.code = 'ACSN')) =>"AccessionNumber" |
N/D | 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')"}]}]}]} |
N/D | meta.lastupdated |
Currenttimestamp() |
N/D | msftCreatedDatetime |
Uwzględnione za pomocą wspólnej logiki scalania różnicowego zastosowanej do wszystkich tabel w warstwie srebrnej. |
Notatka
Kolumny z sufiksem
Orig
są tworzone w kolorze srebrnym magazyn lakehouse w celu przechowywania oryginalnych wartości pól pochodzących z brązowej warstwa. Ta standardowa praktyka obejmuje następujące kolumny w tabeli ImagingStudy :meta_lastUpdatedOrig
,identifierOrig
,idOrig
, orazstartedOrig
.Kolumny z sufiksem
_string
przechowują ciągi znaków pól zawierających złożone dane JSON, co umożliwia wykonywanie zapytań za pośrednictwem punkt końcowy analizy SQL. Ta praktyka ma zastosowanie do wszystkich tabel w srebrnym magazyn lakehouse i obejmuje następujące kolumny w tabeli 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
Niektóre pola w tabeli ImagingStudy są generowane w celu wyrównania ze schematem FHIR ImagingStudy . Ponieważ jednak warstwa brązowa nie wyodrębnia z plików DCM danych, które dokładnie odpowiadają tym polom, powiązane kolumny w tabeli srebrnej pozostają puste. W związku z tym następujące kolumny w tabeli ImagingStudy zawierają wartości null:
implicitRules
,,language
text
,contained
encounter
basedOn
referrer
interpreter
endpoint
procedureReference
procedureCode
location
reasonCode
,,reasonReference
note
Mapowanie transformacji metadanych DICOM ze srebrnej do złotej tabeli delta
Poniższa tabela wyjaśnia pełne mapowanie transformacji danych DICOM w srebrnej tabeli delta magazyn lakehouse ImagingStudy do tabeli delta Observational Medical Outcomes Partnership (OMOP) Image_Occurrence w złotej tabeli magazyn lakehouse.
Kolumna źródłowa w ImagingStudy | Kolumna docelowa w OMOP Image_Occurrence | Typ danych | Szczegóły mapowania |
---|---|---|---|
series.started |
image_occurrence_date |
data | Data wystąpienia procedury obrazowania (serii). |
series.modality (kombinacja i series.modality.code series.modality.system ) |
modality_concept_id |
string | concat_ws('<->', exp_series.modality.code, exp_series.modality.system) |
N/D | SourceTable |
string | 'ImagingStudy_FHIR' |
id |
msftSourceRecordId |
string | Wygenerowany przez system identyfikator rekordu źródłowego. |
identifier['studyInstanceUid'] |
image_study_uid |
string | Identyfikator UID badania DICOM. |
subject |
person_id |
integer | Identyfikator osoby powiązanej z nagrywaną procedurą. |
Tablica wartości słownika, gdzie klucz to instance.uid klucz, a wartość to 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))) |
N/D | SourceModifiedOn |
datetime | Data modyfikacji rekordu. |
resourceType |
msftSourceTableName |
string | 'Imaging Study' |
msftModifiedDatetime |
msftModifiedDatetime |
datetime | Mapowanie bezpośrednie z relacją jeden-do-jednego. |
series.uid |
image_occurrence_id |
string | Klucz unikatowy nadany do zapisu badania obrazowego. |
series.modality.code |
modality_source_value |
string | Modalność serii. |
Notatka
Niektóre pola w złotej tabeli są generowane w celu wyrównania ze schematem OMOP Image_Occurrence . Ponieważ jednak warstwa brązowa nie wyodrębnia danych, które dokładnie odpowiadają tym polom, powiązane kolumny w tabeli złotej pozostają puste. W związku z tym następujące kolumny w tabeli Image_Occurrence zawierają wartości null: visit_occurrence_id
, procedure_occurrence_id
, i anatomic_site_concept_id
.