Transformación de metadatos DICOM asignación en soluciones de datos sanitarios
En este artículo se explica cómo el entorno de soluciones de datos de atención sanitaria extrae y transforma los metadatos DICOM en diferentes niveles de almacén de lago. También puede obtener información sobre el proceso de transformación de metadatos de un extremo a otro y comprender la asignación de transformación en cada nivel.
La transformación de metadatos a través de la canalización de ingesta consta de las siguientes tres fases consecutivas:
- Extracción y transformación de metadatos DICOM en tabla delta bronce
- Transformación de metadatos de la tabla bronce a la tabla delta plata
- Transformación de metadatos de la tabla delta plata a oro
Las siguientes secciones detallan la asignación de transformación para cada etapa.
Hay más de 5000 etiquetas DICOM definidas por el estándar DICOM, incluidas las etiquetas privadas específicas del proveedor. Esta sección identifica qué etiquetas recuperamos y explica el proceso de extracción en el almacén de lago bronce.
El proceso de extracción de etiquetas y creación de la tabla delta de ImagingDicom incluye las siguientes acciones:
Extracción de archivos DICOM: Extraiga una colección de todas las etiquetas de los archivos DICOM (DCM) en la estructura de carpetas optimizada en el almacén de lago bronce.
Exclusión de etiquetas de datos de píxeles: excluya la etiqueta de datos de píxeles DICOM (7FE0,0010) y los atributos del módulo de datos de píxeles de imagen de la colección. La etiqueta de datos de píxeles DICOM incluye detalles en el nivel de imagen/píxel.
Asignación de JSON: Asigne todas las etiquetas DICOM extraídas en una estructura JSON de pares clave-valor en el siguiente esquema:
METADATA_JSON_DICT_SCHEMA = MapType ( StringType(), StructType([ StructField("vr", StringType(), True), StructField("Value", ArrayType(StringType(), True), True) ]) )
Estos pares JSON clave-valor se escriben en la columna metadatos en la tabla delta bronce almacén de lago de datos ImagingDicom .
Nota
La columna
metadata_string
también almacena los metadatos como una cadena porque los puntos finales de Fabric SQL no admiten tipos de datos complejos como estructuras, matrices y mapas. Puede consultar estas columnas como cadenas usando SQL punto de conexión (T-SQL) o trabajar con sus tipos nativos (estructuras, matrices, mapas) usando Spark.Extracción y asignación para broncear almacén de lago de datos: extraiga además las siguientes 29 etiquetas DICOM y escríbalas en las respectivas columnas de destino en la tabla delta ImagingDicom :
Etiqueta DICOM de origen Columna de destino Obligatorio (0020,000D) [studyInstanceUid]
Sí (0010,0010) [patientName]
No (0010,0040) [patientSex]
No (0010,0020) [patientId]
Sí (0010,0030) [patientBirthDate]
No (0008,0050) [accessionNumber]
Sí (0008,0090) [referringPhysicianName]
Sí (0008,0020) [studyDate]
Sí (0008,1030) [studyDescription]
Sí (0020,000E) [seriesInstanceUid]
Sí (0008,0060) [modality]
Sí (0008,0061) [modalitiesInStudy]
Sí (0040,0244) [performedProcedureStepStartDate]
No (0008,1090) [manufacturerModelName]
No (0008,0018) [sopInstanceUid]
Sí (0008,0030) [studyTime]
Sí (0008,0201) [timezoneOffsetFromUtc]
Sí (0020,1206) [numberOfStudyRelatedSeries]
Sí (0020,1208) [numberOfStudyRelatedInstances]
Sí (0020,0011) [seriesNumber]
Sí (0008,103E) [seriesDescription]
Sí (0020,1209) [numberOfSeriesRelatedInstances]
Sí (0018,0015) [bodyPartExamined]
Sí (0020,0060) [laterality]
Sí (0008,0021) [seriesDate]
Sí (0008,0031) [seriesTime]
Sí (0008,0016) [sopClassUid]
Sí (0020,0013) [instanceNumber]
Sí (0042,0010) [documentTitle]
Sí Nota
Para obtener más información sobre por qué promovemos estas 29 etiquetas DICOM en concreto, consulte Extracción de etiquetas DICOM.
Para obtener más información sobre el patrón de ingesta (anexar), vaya a Patrón de anexar en el almacén de lago bronce.
La columna
modalitiesInStudy_string
también almacena la etiqueta modalitiesInStudy como una cadena porque los puntos finales de Fabric SQL no admiten tipos de datos complejos como estructuras, matrices y mapas. Puede consultar estas columnas como cadenas usando SQL punto de conexión (T-SQL) o trabajar con sus tipos nativos (estructuras, matrices, mapas) usando Spark.
Almacenamiento de la ruta del archivo DCM: la ruta completa del archivo DCM se escribe en la columna
filePath
de la tabla delta ImagingDicom .Registro de tiempo de modificación: la última marca de tiempo en la que se modificó el archivo DCM en su origen se escribe en la columna
sourceModifiedAt
de la tabla delta ImagingDicom .Almacenamiento del espacio de nombres: el valor del espacio de nombres se escribe en la columna
sourceSystem
de la tabla delta ImagingDicom . Este valor se deriva del nombre de la carpeta en la estructura de carpetas unificada.- Para la ingestión regular, el valor del espacio de nombres es el nombre de la carpeta después de
Files\Process\Imaging\DICOM
. - Para la ingesta de Bring Your Own Storage (BYOS), el valor del espacio de nombres es el nombre de la carpeta después de
Files\External\Imaging\DICOM
.
- Para la ingestión regular, el valor del espacio de nombres es el nombre de la carpeta después de
Registro del tiempo de ejecución: la fecha y la hora de ejecución del cuaderno se escriben en la columna
createdDatetime
de la tabla delta ImagingDicom .
Las siguientes tablas explican el asignación completo para la transformación de metadatos DICOM de la tabla delta de bronce almacén de lago de datos ImagingDicom a las tablas delta de ImagingMetastore e ImagingStudy en la tabla plata almacén de lago de datos. La tabla delta ImagingMetastore almacena las etiquetas DICOM de cada archivo DCM como pares clave-valor JSON dentro de las columnas de metadatos. Copiar todos los metadatos del bronce al plata capa preserva la integridad de los datos en todas las capas. La tabla delta ImagingStudy incluye las 29 etiquetas DICOM seleccionadas para alineación con campos estándar FHIR. También contiene más campos para respaldar el seguimiento y el linaje de datos.
Columna de origen en ImagingDicom | Columna de destino en ImagingMetastore | Detalles de la asignación |
---|---|---|
No disponible | msftModifiedDatetime |
Incluido a través de la lógica de fusión delta común aplicada a todas las tablas en la plata capa. |
studyInstanceUid |
studyInstanceUid |
Directo asignación con una relación uno a uno. Cada valor en la columna de origen se asigna directamente a un único valor correspondiente en el destino. |
seriesInstanceUid |
seriesInstanceUid |
Directo asignación con una relación uno a uno. |
sopInstanceUid |
sopInstanceUid |
Directo asignación con una relación uno a uno. |
sourceSystem |
msftSourceSystem |
Directo asignación con una relación uno a uno. |
metadata |
metadata |
Directo asignación con una relación uno a uno. |
metadata_string |
metadata_string |
Directo asignación con una relación uno a uno. |
filePath |
filePath |
Directo asignación con una relación uno a uno. |
sourceModifiedAt |
sourceModifiedAt |
Directo asignación con una relación uno a uno. |
No disponible | id |
GUID generado mediante el módulo UUID de Python |
No disponible | msftCreatedDatetime |
Incluido a través de la lógica de fusión delta común aplicada a todas las tablas en la plata capa. |
Columna de origen en ImagingDicom | Columna de destino en ImagingStudy | Detalles de la asignación |
---|---|---|
No disponible | msftModifiedDatetime |
Incluido a través de la lógica de fusión delta común aplicada a todas las tablas en la plata capa. |
No disponible | id |
GUID generado mediante el módulo UUID de Python |
No disponible | resourceType |
"ImagingStudy" |
sourceSystem |
msftSourceSystem |
No es un asignación directo. La capacidad de transformación de datos DICOM utiliza la columna en el bronce almacén de lago de datos para crear la carpeta sourceSystem Espacio de nombres al escribir los archivos NDJSON generados en la carpeta Proceso . Para obtener más información sobre la carpeta Espacio de nombres , consulte Estructura de carpetas unificada: Descripciones de carpetas. En esta etapa, el servicio de ingestión de bronce clínico utiliza el nombre de la carpeta Espacio de nombres para completar la columna msftSourceSystem en la plata almacén de lago de datos. Por ejemplo, si el valor sourceSystem se define como MyPACSsystem en la tabla de bronce ImagingDicom , el servicio de ingesta de bronce de imágenes escribe los archivos NDJSON recién creados en la siguiente estructura de carpetas: Process\Clinical\FHIR-NDJSON\MyPACSsystem\YYYY\MM\DD\ImagingStudy-<timestamp>.ndjson . Cuando la ingesta de bronce clínico recoge estos archivos, rellena automáticamente la columna msftSourceSystem con MyPACSsystem de la estructura de la carpeta y propaga el mismo valor a la plata capa. |
No disponible | msftFilePath |
Ruta del archivo al ImagingStudy NDJSON generado en la carpeta Process\Clinical\FHIR-NDJSON\DICOM-HDS . |
filePath |
extension |
"extension": [{"url": "lit('file_path')", "valueUrl": "col('FilePath')"}] El valor de FilePath incluye la ruta de acceso al archivo ABFS en OneLake para todos los archivos DCM de nivel de instancia que forman parte de este ImagingStudy. |
No disponible | 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' y type.coding.code = 'ACSN')) =>"AccessionNumber" |
No disponible | 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')"}]}]}]} |
No disponible | meta.lastupdated |
Currenttimestamp() |
No disponible | msftCreatedDatetime |
Incluido a través de la lógica de fusión delta común aplicada a todas las tablas en la plata capa. |
Nota
Las columnas con el sufijo
Orig
se crean en la plata almacén de lago de datos para almacenar valores originales de campos provenientes del bronce capa. Esta práctica estándar incluye las siguientes columnas en la tabla ImagingStudy :meta_lastUpdatedOrig
,identifierOrig
,idOrig
ystartedOrig
.Las columnas con el sufijo
_string
almacenan versiones en formato de cadena de campos que contienen datos JSON complejos, lo que permite realizar consultas a través del análisis SQL punto de conexión. Esta práctica se aplica en todas las tablas del archivo Silver almacén de lago de datos e incluye las siguientes columnas en la tabla 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
, yidentifierOrig_string
.Algunos campos de la tabla ImagingStudy se generan para alinear con el esquema FHIR ImagingStudy . Sin embargo, dado que el bronce capa no extrae datos de los archivos DCM que corresponden con precisión a estos campos, las columnas relacionadas en la tabla de plata permanecen vacías. Como resultado, las siguientes columnas de la tabla ImagingStudy contienen valores nulos:
implicitRules
,language
,text
,contained
,encounter
,basedOn
,referrer
,interpreter
,endpoint
,procedureReference
,procedureCode
,location
,reasonCode
,reasonReference
ynote
.
La siguiente tabla explica el asignación completo para la transformación de datos DICOM en la tabla delta plateada almacén de lago de datos ImagingStudy a la tabla delta Observational Medical Outcomes Partnership (OMOP) Image_Occurrence en la tabla delta dorada almacén de lago de datos.
Columna de origen en ImagingStudy | Columna de destino en OMOP Image_Occurrence | Tipo de datos | Detalles de la asignación |
---|---|---|---|
series.started |
image_occurrence_date |
date | Fecha de aparición del procedimiento de técnica de imagen (serie). |
series.modality (combinación de series.modality.code y series.modality.system ) |
modality_concept_id |
string | concat_ws('<->', exp_series.modality.code, exp_series.modality.system) |
No disponible | SourceTable |
string | 'ImagingStudy_FHIR' |
id |
msftSourceRecordId |
string | ID del registro de origen generado por el sistema. |
identifier['studyInstanceUid'] |
image_study_uid |
string | Estudio DICOM UID. |
subject |
person_id |
entero | Id. de la persona asociada al procedimiento grabado |
Una matriz de valores de diccionario, donde la clave es instance.uid y el valor es 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))) |
No disponible | SourceModifiedOn |
datetime | Fecha de modificación del registro. |
resourceType |
msftSourceTableName |
string | 'Imaging Study' |
msftModifiedDatetime |
msftModifiedDatetime |
datetime | Directo asignación con una relación uno a uno. |
series.uid |
image_occurrence_id |
string | Clave única que se le da a un registro de estudio de imágenes |
series.modality.code |
modality_source_value |
string | Modalidad de la serie. |
Nota
Algunos campos de la tabla de oro se generan en alinear con el esquema OMOP Image_Occurrence . Sin embargo, dado que el bronce capa no extrae datos que correspondan con precisión a estos campos, las columnas relacionadas en la tabla de oro permanecen vacías. Como resultado, las siguientes columnas de la tabla Image_Occurrence contienen valores nulos: visit_occurrence_id
, procedure_occurrence_id
y anatomic_site_concept_id
.