Compartilhar via


Transformação de metadados DICOM mapeamento em soluções de dados de saúde

Este artigo explica como o ambiente de soluções de dados de serviços de saúde extrai e transforma metadados DICOM em diferentes níveis de lakehouse. Você também pode saber mais sobre o processo de transformação de metadados de ponta a ponta e entender o mapeamento da transformação em cada nível.

A transformação de metadados por meio do pipeline de ingestão consiste nos três estágios consecutivos a seguir:

  1. Extração e transformação de metadados DICOM para tabela delta bronze
  2. Transformação de metadados da tabela delta bronze para a prata
  3. Transformação de metadados da tabela delta prata para a ouro

As seções a seguir detalham o mapeamento da transformação para cada estágio.

Mapeamento da transformação de metadados DICOM para a tabela delta bronze

Existem mais de 5000 marcas DICOM definidas pelo padrão DICOM, incluindo marcas privadas específicas do fornecedor. Esta seção identifica quais marcas recuperamos e explica o processo de extração no lakehouse bronze.

O processo de extração de tags e criação da tabela delta do ImagingDicom inclui as seguintes ações:

  1. Extração de arquivos DICOM: extraia uma coleção de todas as marcas dos arquivos DICOM (DCM) na estrutura de pastas otimizada no lakehouse bronze.

  2. Exclusão da marca de dados de pixel: exclua a marca de dados de pixel DICOM (7FE0,0010) e os atributos do módulo de dados de pixel de imagem da coleção. A marca de dados de pixel DICOM inclui detalhes em nível de imagem/pixel.

  3. Mapeamento JSON: mapeie todas as marcas DICOM extraídas em uma estrutura JSON de pares de chave/valor no seguinte esquema:

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

    Esses pares JSON de chave-valor são gravados na coluna metadados da tabela delta bronze lakehouse ImagingDicom .

    Observação

    A metadata_string coluna também armazena os metadados como uma string porque os endpoints do Fabric SQL não suportam tipos de dados complexos, como structs, arrays e mapas. Você pode consultar essas colunas como strings usando o endpoint SQL (T-SQL) ou trabalhar com seus tipos nativos (structs, arrays, maps) usando o Spark.

  4. Extração e mapeamento para bronzear lakehouse: Extraia ainda as 29 tags DICOM a seguir e grave-as nas respectivas colunas de destino na tabela delta ImagingDicom :

    Marca DICOM de origem Coluna de destino Obrigatória
    (0020,000D) [studyInstanceUid] Sim
    (0010,0010) [patientName] No
    (0010,0040) [patientSex] No
    (0010,0020) [patientId] Sim
    (0010,0030) [patientBirthDate] No
    (0008,0050) [accessionNumber] Sim
    (0008,0090) [referringPhysicianName] Sim
    (0008,0020) [studyDate] Sim
    (0008,1030) [studyDescription] Sim
    (0020,000E) [seriesInstanceUid] Sim
    (0008,0060) [modality] Sim
    (0008,0061) [modalitiesInStudy] Sim
    (0040,0244) [performedProcedureStepStartDate] No
    (0008,1090) [manufacturerModelName] No
    (0008,0018) [sopInstanceUid] Sim
    (0008,0030) [studyTime] Sim
    (0008,0201) [timezoneOffsetFromUtc] Sim
    (0020,1206) [numberOfStudyRelatedSeries] Sim
    (0020,1208) [numberOfStudyRelatedInstances] Sim
    (0020,0011) [seriesNumber] Sim
    (0008,103E) [seriesDescription] Sim
    (0020,1209) [numberOfSeriesRelatedInstances] Sim
    (0018,0015) [bodyPartExamined] Sim
    (0020,0060) [laterality] Sim
    (0008,0021) [seriesDate] Sim
    (0008,0031) [seriesTime] Sim
    (0008,0016) [sopClassUid] Sim
    (0020,0013) [instanceNumber] Sim
    (0042,0010) [documentTitle] Sim

    Observação

    • Para obter mais informações sobre por que promovemos essas 29 marcas DICOM específicas, consulte Extração de marcas DICOM.

    • Para saber mais sobre o padrão de ingestão (acréscimo), acesse Padrão de acréscimo no lakehouse bronze.

    • A coluna modalitiesInStudy_string também armazena a tag modalitiesInStudy como uma string porque os endpoints do Fabric SQL não suportam tipos de dados complexos, como structs, arrays e mapas. Você pode consultar essas colunas como strings usando o endpoint SQL (T-SQL) ou trabalhar com seus tipos nativos (structs, arrays, maps) usando o Spark.

  5. Armazenamento do caminho do arquivo DCM: O caminho completo do arquivo DCM é gravado na filePath coluna na tabela delta ImagingDicom .

  6. Registro de hora de modificação: o último registro de data e hora em que o arquivo DCM foi modificado em sua origem é gravado na sourceModifiedAt coluna na tabela delta do ImagingDicom .

  7. Armazenamento de namespace: O valor do namespace é gravado na sourceSystem coluna na tabela delta ImagingDicom . Este valor deriva do nome da pasta na estrutura de pastas unificada.

    • Para ingestão regular, o valor do namespace é o nome da pasta depois de Files\Process\Imaging\DICOM.
    • Para ingestão de Bring Your Own Storage (BYOS), o valor do namespace é o nome da pasta após Files\External\Imaging\DICOM.
  8. Registro de tempo de execução: a data e a hora de execução do notebook são gravadas na createdDatetime coluna na tabela delta do ImagingDicom .

Mapeamento da transformação da tabela delta bronze para a prata

As tabelas a seguir explicam o mapeamento completo para a transformação de metadados DICOM da tabela delta bronze lakehouse ImagingDicom para as tabelas delta ImagingMetastore e ImagingStudy na tabela delta prata lakehouse. A tabela delta ImagingMetastore armazena as tags DICOM para cada arquivo DCM como pares de chave-valor JSON dentro das colunas de metadados. Copiar todos os metadados do bronze para o prata camada preserva a integridade dos dados em todas as camadas. A tabela delta do ImagingStudy inclui as 29 tags DICOM selecionadas para alinhamento com campos padrão FHIR. Ele também contém mais campos para dar suporte ao rastreamento e à linhagem de dados.

Coluna de origem em ImagingDicom Coluna de destino no ImagingMetastore Detalhes do mapeamento
ND msftModifiedDatetime Incluído por meio da lógica de mesclagem delta comum aplicada a todas as tabelas no silver camada.
studyInstanceUid studyInstanceUid Direcione mapeamento com um relacionamento um-para-um. Cada valor na coluna de origem é mapeado diretamente para um único valor correspondente no destino.
seriesInstanceUid seriesInstanceUid Direcione mapeamento com um relacionamento um-para-um.
sopInstanceUid sopInstanceUid Direcione mapeamento com um relacionamento um-para-um.
sourceSystem msftSourceSystem Direcione mapeamento com um relacionamento um-para-um.
metadata metadata Direcione mapeamento com um relacionamento um-para-um.
metadata_string metadata_string Direcione mapeamento com um relacionamento um-para-um.
filePath filePath Direcione mapeamento com um relacionamento um-para-um.
sourceModifiedAt sourceModifiedAt Direcione mapeamento com um relacionamento um-para-um.
ND id Um GUID gerado usando o módulo UUID de Python.
ND msftCreatedDatetime Incluído por meio da lógica de mesclagem delta comum aplicada a todas as tabelas no silver camada.
Coluna de origem em ImagingDicom Coluna de destino no ImagingStudy Detalhes do mapeamento
ND msftModifiedDatetime Incluído por meio da lógica de mesclagem delta comum aplicada a todas as tabelas no silver camada.
ND id Um GUID gerado usando o módulo UUID de Python.
ND resourceType "ImagingStudy"
sourceSystem msftSourceSystem Não é um mapeamento direto. O recurso de transformação de dados DICOM usa a sourceSystem coluna no bronze lakehouse para criar a pasta Namespace ao gravar os arquivos NDJSON gerados na pasta Process . Para saber mais sobre a pasta Namespace , consulte Estrutura de pasta unificada: descrições de pasta. Nesta fase, o serviço de ingestão de bronze clínico usa o nome da pasta Namespace para preencher a msftSourceSystem coluna no arquivo prateado lakehouse.

Por exemplo, se o sourceSystem valor for definido como MyPACSsystem na tabela bronze ImagingDicom , o serviço de ingestão de bronze de imagem gravará os arquivos NDJSON recém-criados na seguinte estrutura de pasta: Process\Clinical\FHIR-NDJSON\MyPACSsystem\YYYY\MM\DD\ImagingStudy-<timestamp>.ndjson. Quando a ingestão de bronze clínico coleta esses arquivos, ela preenche automaticamente a msftSourceSystem coluna com MyPACSsystem da estrutura de pastas e propaga o mesmo valor para o camada prateado.
ND msftFilePath Caminho do arquivo para o ImagingStudy NDJSON gerado na Process\Clinical\FHIR-NDJSON\DICOM-HDS pasta.
filePath extension "extension": [{"url": "lit('file_path')", "valueUrl": "col('FilePath')"}]

O valor para FilePath inclui o caminho do arquivo ABFS no OneLake para todos os arquivos DCM em nível de instância que fazem parte de ImagingStudy.
ND 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' e type.coding.code = 'ACSN')) =>"AccessionNumber"
ND 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')"}]}]}]}
ND meta.lastupdated Currenttimestamp()
ND msftCreatedDatetime Incluído por meio da lógica de mesclagem delta comum aplicada a todas as tabelas no silver camada.

Observação

  • Colunas com o sufixo Orig são criadas no lakehouse prateado para armazenar valores originais de campos originados do camada bronze. Esta prática padrão inclui as seguintes colunas na tabela ImagingStudy : meta_lastUpdatedOrig, identifierOrig, idOrig e startedOrig.

  • Colunas com o sufixo _string armazenam versões em string de campos que contêm dados JSON complexos, permitindo consultas por meio do ponto de extremidade analítico SQL. Esta prática se aplica a todas as tabelas na prata lakehouse e inclui as seguintes colunas na tabela 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 e identifierOrig_string.

  • Alguns campos na tabela ImagingStudy são gerados para alinhar com o esquema FHIR ImagingStudy . Entretanto, como o bronze camada não extrai dados dos arquivos DCM que correspondem precisamente a esses campos, as colunas relacionadas na tabela prateada permanecem vazias. Como resultado, as seguintes colunas na tabela ImagingStudy contêm valores nulos: implicitRules, language, text, contained, encounter, basedOn, referrer, interpreter, endpoint, procedureReference, procedureCode, location, reasonCode, reasonReference e note.

Mapeamento da transformação da tabela delta prata para a ouro

A tabela a seguir explica o mapeamento completo para a transformação de dados DICOM na tabela delta lakehouse ImagingStudy prata para a tabela delta Observational Medical Outcomes Partnership (OMOP) Image_Occurrence na tabela delta lakehouse dourada.

Coluna de origem em ImagingStudy Coluna de destino em OMOP Image_Occurrence Tipo de dados Detalhes do mapeamento
series.started image_occurrence_date data Data de ocorrência do procedimento de imagiologia (série).
series.modality (combinação de series.modality.code e series.modality.system) modality_concept_id cadeia concat_ws('<->', exp_series.modality.code, exp_series.modality.system)
ND SourceTable cadeia 'ImagingStudy_FHIR'
id msftSourceRecordId cadeia ID gerado pelo sistema do registro de origem.
identifier['studyInstanceUid'] image_study_uid cadeia Estudo DICOM UID.
subject person_id integer ID da pessoa associada ao procedimento gravado.
Uma matriz de valores de dicionário, onde a chave é instance.uid e o valor é instance.extension[0].valueUrl local_path cadeia 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)))
ND SourceModifiedOn datetime Data de modificação do registro.
resourceType msftSourceTableName cadeia 'Imaging Study'
msftModifiedDatetime msftModifiedDatetime datetime Direcione mapeamento com um relacionamento um-para-um.
series.uid image_occurrence_id cadeia Chave exclusiva fornecida a um registro de estudo de imagem.
series.modality.code modality_source_value cadeia Modalidade da série.

Observação

Alguns campos na tabela gold são gerados para alinhar com o esquema OMOP Image_Occurrence . Entretanto, como o bronze camada não extrai dados que correspondem precisamente a esses campos, as colunas relacionadas na tabela ouro permanecem vazias. Como resultado, as seguintes colunas na tabela Image_Occurrence contêm valores nulos: visit_occurrence_id, procedure_occurrence_id e anatomic_site_concept_id.