Преобразование метаданных DICOM сопоставление в решениях для обработки медицинских данных
В этой статье объясняется, как функция решений для данных здравоохранения извлекает и преобразует метаданные DICOM на разных уровнях озера данных. Вы также можете узнать о сквозном процессе преобразования метаданных и понять сопоставление преобразований на каждом уровне.
Преобразование метаданных через конвейер приема состоит из следующих трех последовательных этапов:
- Извлечение и преобразование метаданных DICOM в бронзовую разностную таблицу
- Преобразование метаданных из бронзовой в серебряную разностную таблицу
- Преобразование метаданных из серебряной в золотую разностную таблицу
В следующих разделах подробно описывается сопоставление преобразований для каждого этапа.
Сопоставление преобразований для метаданных DICOM в бронзовую разностную таблицу
Существует более 5000 тегов DICOM, определенных стандартом DICOM, включая частные теги, специфичные для конкретного производителя. В этом разделе определяется, какие теги мы получаем, и объясняется процесс извлечения в бронзовом хранилище озера данных.
Процесс извлечения тегов и создания таблицы изменений 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 «ключ-значение» записываются в столбец metadata в бронзовой хранилище и озеро данных ImagingDicom delta-таблице.
Заметка
Столбец
metadata_string
также хранит метаданные в виде строки, поскольку конечные точки Fabric SQL не поддерживают сложные типы данных, такие как структуры, массивы и карты. Вы можете запрашивать эти столбцы как строки, используя SQL конечная точка (T-SQL), или работать с их собственными типами (структурами, массивами, картами), используя Spark.Извлечение и сопоставление в 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.
Хранение пути к файлу DCM: полный путь к файлу DCM записывается в столбец
filePath
в таблице изменений ImagingDicom .Регистрация времени изменения: последняя временная метка, когда файл DCM был изменен в его источнике, записывается в столбец
sourceModifiedAt
в таблице изменений ImagingDicom .Хранилище пространства имен: значение пространства имен записывается в столбец
sourceSystem
в таблице дельта ImagingDicom . Это значение выводится из имени папки в унифицированной структуре папок.- Для обычного приема значением пространства имен является имя папки после
Files\Process\Imaging\DICOM
. - Для приема собственного хранилища (BYOS) значением пространства имен является имя папки после
Files\External\Imaging\DICOM
.
- Для обычного приема значением пространства имен является имя папки после
Регистрация времени выполнения: дата и время выполнения блокнота записываются в столбец
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
.