Leer en inglés

Compartir a través de


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:

  1. Extracción y transformación de metadatos DICOM en tabla delta bronce
  2. Transformación de metadatos de la tabla bronce a la tabla delta plata
  3. Transformación de metadatos de la tabla delta plata a oro

Las siguientes secciones detallan la asignación de transformación para cada etapa.

Asignación de transformación para metadatos DICOM en tabla delta bronce

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:

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

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

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

  4. 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]
    (0010,0010) [patientName] No
    (0010,0040) [patientSex] No
    (0010,0020) [patientId]
    (0010,0030) [patientBirthDate] No
    (0008,0050) [accessionNumber]
    (0008,0090) [referringPhysicianName]
    (0008,0020) [studyDate]
    (0008,1030) [studyDescription]
    (0020,000E) [seriesInstanceUid]
    (0008,0060) [modality]
    (0008,0061) [modalitiesInStudy]
    (0040,0244) [performedProcedureStepStartDate] No
    (0008,1090) [manufacturerModelName] No
    (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]

    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.

  5. Almacenamiento de la ruta del archivo DCM: la ruta completa del archivo DCM se escribe en la columna filePath de la tabla delta ImagingDicom .

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

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

Asignación de transformación para tabla delta bronce a plata

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 y startedOrig.

  • 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, y identifierOrig_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 y note.

Asignación de transformación para tabla delta plata a oro

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.