Поделиться через


Преобразование метаданных DICOM сопоставление в решениях для обработки медицинских данных

В этой статье объясняется, как функция решений для данных здравоохранения извлекает и преобразует метаданные DICOM на разных уровнях озера данных. Вы также можете узнать о сквозном процессе преобразования метаданных и понять сопоставление преобразований на каждом уровне.

Преобразование метаданных через конвейер приема состоит из следующих трех последовательных этапов:

  1. Извлечение и преобразование метаданных DICOM в бронзовую разностную таблицу
  2. Преобразование метаданных из бронзовой в серебряную разностную таблицу
  3. Преобразование метаданных из серебряной в золотую разностную таблицу

В следующих разделах подробно описывается сопоставление преобразований для каждого этапа.

Сопоставление преобразований для метаданных DICOM в бронзовую разностную таблицу

Существует более 5000 тегов DICOM, определенных стандартом DICOM, включая частные теги, специфичные для конкретного производителя. В этом разделе определяется, какие теги мы получаем, и объясняется процесс извлечения в бронзовом хранилище озера данных.

Процесс извлечения тегов и создания таблицы изменений ImagingDicom включает в себя следующие действия:

  1. Извлечение из файлов DICOM: извлеките коллекцию всех тегов из файлов DICOM (DCM) в оптимизированной структуре папок в бронзовом хранилище озера данных.

  2. Исключение тегов пиксельных данных: исключение из коллекции атрибутов тега пиксельных данных DICOM (7FE0,0010) и атрибутов модуля пиксельных данных изображения. Тег пиксельных данных DICOM включает сведения на уровне изображения/пикселя.

  3. Сопоставление JSON: сопоставьте все извлеченные теги DICOM в структуре JSON пар "ключ-значение" в следующей схеме:

    METADATA_JSON_DICT_SCHEMA = MapType
       (
          StringType(),
          StructType([
                       StructField("vr", StringType(), True),
                       StructField("Value", ArrayType(StringType(), True), True)
                     ])
       )
    

    Эти пары JSON «ключ-значение» записываются в столбец metadata в бронзовой хранилище и озеро данных ImagingDicom delta-таблице.

    Заметка

    Столбец metadata_string также хранит метаданные в виде строки, поскольку конечные точки Fabric SQL не поддерживают сложные типы данных, такие как структуры, массивы и карты. Вы можете запрашивать эти столбцы как строки, используя SQL конечная точка (T-SQL), или работать с их собственными типами (структурами, массивами, картами), используя Spark.

  4. Извлечение и сопоставление в bronze хранилище и озеро данных: Далее извлеките следующие 29 тегов DICOM и запишите их в соответствующие столбцы назначения в таблице ImagingDicom delta:

    Исходный тег 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.

  5. Хранение пути к файлу DCM: полный путь к файлу DCM записывается в столбец filePath в таблице изменений ImagingDicom .

  6. Регистрация времени изменения: последняя временная метка, когда файл DCM был изменен в его источнике, записывается в столбец sourceModifiedAt в таблице изменений ImagingDicom .

  7. Хранилище пространства имен: значение пространства имен записывается в столбец sourceSystem в таблице дельта ImagingDicom . Это значение выводится из имени папки в унифицированной структуре папок.

    • Для обычного приема значением пространства имен является имя папки после Files\Process\Imaging\DICOM.
    • Для приема собственного хранилища (BYOS) значением пространства имен является имя папки после Files\External\Imaging\DICOM.
  8. Регистрация времени выполнения: дата и время выполнения блокнота записываются в столбец createdDatetime таблицы изменений ImagingDicom .

Сопоставление преобразований для бронзовой с серебряной разностной таблицей

В следующих таблицах поясняется полный сопоставление для преобразования метаданных DICOM из бронзовой таблицы дельта хранилище и озеро данных ImagingDicom в таблицы дельта ImagingMetastore и ImagingStudy в серебряной таблице дельта хранилище и озеро данных. Таблица ImagingMetastore delta хранит теги DICOM для каждого файла DCM в виде пар «ключ-значение» JSON в столбцах метаданных. Копирование всех метаданных из бронзового в серебряный слой сохраняет целостность данных между слоями. Таблица дельта ImagingStudy содержит 29 тегов DICOM, выбранных для сопоставления со стандартными полями FHIR. Он также содержит больше полей для поддержки отслеживания данных и определения происхождения.

Исходный столбец в ImagingDicom Столбец назначения в ImagingMetastore Сведения о сопоставлении
Неприменимо msftModifiedDatetime Включено через общую логику дельта-слияния, применяемую ко всем таблицам в серебряном слой.
studyInstanceUid studyInstanceUid Прямая сопоставление с отношением один к одному. Каждое значение в исходном столбце напрямую сопоставляется с одним соответствующим значением в целевом столбце.
seriesInstanceUid seriesInstanceUid Прямая сопоставление с отношением один к одному.
sopInstanceUid sopInstanceUid Прямая сопоставление с отношением один к одному.
sourceSystem msftSourceSystem Прямая сопоставление с отношением один к одному.
metadata metadata Прямая сопоставление с отношением один к одному.
metadata_string metadata_string Прямая сопоставление с отношением один к одному.
filePath filePath Прямая сопоставление с отношением один к одному.
sourceModifiedAt sourceModifiedAt Прямая сопоставление с отношением один к одному.
Неприменимо id Идентификатор GUID, созданный с помощью модуля UUID Python.
Неприменимо msftCreatedDatetime Включено через общую логику дельта-слияния, применяемую ко всем таблицам в серебряном слой.
Исходный столбец в ImagingDicom Столбец назначения в ImagingStudy Сведения о сопоставлении
Неприменимо msftModifiedDatetime Включено через общую логику дельта-слияния, применяемую ко всем таблицам в серебряном слой.
Неприменимо id Идентификатор GUID, созданный с помощью модуля UUID Python.
Неприменимо resourceType "ImagingStudy"
sourceSystem msftSourceSystem Не прямой сопоставление. Возможность преобразования данных DICOM использует столбец sourceSystem в бронзовом хранилище и озеро данных для создания папки Namespace при записи сгенерированных файлов NDJSON в папку Process . Чтобы узнать больше о папке Пространство имен , см. раздел Унифицированная структура папок: описания папок. На этом этапе клиническая бронзовая служба приема использует имя папки пространства имен для заполнения msftSourceSystem столбца в серебряной хранилище и озеро данных.

Например, если значение sourceSystem определено как MyPACSsystem в таблице bronze ImagingDicom , служба приема изображений bronze записывает вновь созданные файлы 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 включает путь к файлу ABFS в OneLake для всех файлов DCM на уровне экземпляра, которые являются частью этого ImagingStudy.
Неприменимо мета "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 содержат нулевые значения: implicitRules, language, text, contained, encounter, basedOn, referrer, interpreter, endpoint, procedureReference, procedureCode, location, reasonCode, reasonReference и note.

Сопоставление преобразований для серебряной с золотой разностной таблицей

В следующей таблице поясняется полный сопоставление для преобразования данных DICOM в серебряной таблице дельта хранилище и озеро данных ImagingStudy в золотую таблицу дельта 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 Сгенерированный системой идентификатор исходной записи.
identifier['studyInstanceUid'] image_study_uid string Уникальный идентификатор исследования DICOM.
subject person_id integer Идентификатор лица, связанного с записанной процедурой.
Массив значений словаря, где ключ - 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 Прямая сопоставление с отношением один к одному.
series.uid image_occurrence_id string Уникальный ключ, выдаваемый записи визуализационного исследования.
series.modality.code modality_source_value string Модальность серии.

Заметка

Некоторые поля в таблице золота генерируются для соответствия схеме OMOP Image_Occurrence . Однако поскольку бронзовый слой не извлекает данные, которые точно соответствуют этим полям, соответствующие столбцы в таблице золота остаются пустыми. В результате следующие столбцы в таблице Image_Occurrence содержат нулевые значения: visit_occurrence_id, procedure_occurrence_id и anatomic_site_concept_id.