Udostępnij za pośrednictwem


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:

  1. Wyodrębnianie i przekształcanie metadanych DICOM do brązowej tabeli delta
  2. Transformacja metadanych z brązowej na srebrną tabelę delta
  3. 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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. Magazyn ścieżek do plików DCM: Pełna ścieżka do pliku DCM jest zapisywana w kolumnie filePath w tabeli różnicowej ImagingDicom .

  6. 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 .

  7. 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.
  8. 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, oraz startedOrig.

  • 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.