Partilhar via


Mapeamento de transformação de metadados DICOM em soluções de dados de saúde

Este artigo explica como o ambiente de soluções de dados de cuidados de saúde extrai e transforma metadados DICOM em diferentes níveis do lakehouse. Também pode saber mais sobre o processo de transformação de metadados ponto a ponto e compreender o mapeamento de transformação em cada nível.

A transformação de metadados através do pipeline de ingestão consiste nas seguintes três etapas consecutivas:

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

As seções seguintes detalham o mapeamento de transformação para cada fase.

Mapeamento de transformação de metadados DICOM em tabela delta de bronze

Existem mais de 5000 etiquetas DICOM definidas pelo padrão DICOM, incluindo etiquetas privadas específicas do fornecedor. Esta secção identifica as etiquetas que obtemos e explica o processo de extração no lakehouse de bronze.

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

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

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

  3. Mapeamento JSON: Mapeie todas as etiquetas DICOM extraídas para uma estrutura JSON de pares 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 chave-valor são gravados na coluna de metadados na tabela delta lakehouse ImagingDicom bronze.

    Nota

    A metadata_string coluna também armazena os metadados como uma cadeia de caracteres porque os pontos de extremidade Fabric SQL não oferecem suporte a tipos de dados complexos, como structs, arrays e mapas. Você pode consultar essas colunas como cadeias de caracteres usando o SQL ponto final (T-SQL) ou trabalhar com seus tipos nativos (structs, arrays, maps) usando o Spark.

  4. Extração e mapeamento para bronze lakehouse: Extraia ainda mais as seguintes 29 tags DICOM e escreva-as nas respetivas colunas de destino na tabela delta ImagingDicom :

    Etiqueta DICOM de origem Coluna de destino Obrigatório
    (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

    Nota

    • Para obter mais informações sobre porque promovemos estas 29 etiquetas DICOM específicas, consulte Extração de etiquetas DICOM.

    • Para saber mais sobre o padrão de ingestão (anexar), aceda a Anexar padrão no lakehouse de bronze.

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

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

  6. Registro de tempo de modificação: O carimbo de data/hora mais recente no qual o arquivo DCM foi modificado em sua origem é gravado sourceModifiedAt na coluna da tabela delta ImagingDicom .

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

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

Mapeamento de transformação para tabela delta de bronze para 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 lakehouse prata. A tabela delta ImagingMetastore armazena as tags DICOM para cada arquivo DCM como pares chave-valor JSON dentro das colunas de metadados. Copiar todos os metadados do bronze para o prateado camada preserva a integridade dos dados em todas as camadas. A tabela delta ImagingStudy inclui as 29 tags DICOM selecionadas para alinhamento com campos padrão FHIR. Ele também contém mais campos para suportar o rastreamento de dados e linhagem.

Coluna Fonte em ImagingDicom Coluna de destino no ImagingMetastore Detalhes de mapeamento
ND msftModifiedDatetime Incluído através da lógica comum de mesclagem delta aplicada a todas as tabelas no camada prata.
studyInstanceUid studyInstanceUid Direcione mapeamento com uma relação um-para-um. Cada valor na coluna de origem é mapeado diretamente para um único valor correspondente no destino.
seriesInstanceUid seriesInstanceUid Direcione mapeamento com uma relação um-para-um.
sopInstanceUid sopInstanceUid Direcione mapeamento com uma relação um-para-um.
sourceSystem msftSourceSystem Direcione mapeamento com uma relação um-para-um.
metadata metadata Direcione mapeamento com uma relação um-para-um.
metadata_string metadata_string Direcione mapeamento com uma relação um-para-um.
filePath filePath Direcione mapeamento com uma relação um-para-um.
sourceModifiedAt sourceModifiedAt Direcione mapeamento com uma relação um-para-um.
ND id Um GUID gerado usando o módulo Python UUID.
ND msftCreatedDatetime Incluído através da lógica comum de mesclagem delta aplicada a todas as tabelas no camada prata.
Coluna Fonte em ImagingDicom Coluna de destino no ImagingStudy Detalhes de mapeamento
ND msftModifiedDatetime Incluído através da lógica comum de mesclagem delta aplicada a todas as tabelas no camada prata.
ND id Um GUID gerado usando o módulo Python UUID.
ND resourceType "ImagingStudy"
sourceSystem msftSourceSystem Não é uma mapeamento direta. 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 Processo . Para saber mais sobre a pasta Namespace , consulte Estrutura unificada de pastas: descrições de pastas. Nesta etapa, o serviço de ingestão clínica de bronze usa o nome da pasta Namespace para preencher a msftSourceSystem coluna no lakehouse prateado.

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 pastas: Process\Clinical\FHIR-NDJSON\MyPACSsystem\YYYY\MM\DD\ImagingStudy-<timestamp>.ndjson. Quando a ingestão clínica de bronze pega esses arquivos, ela preenche automaticamente a msftSourceSystem coluna com MyPACSsystem a estrutura de pastas e propaga o mesmo valor para a camada de prata.
ND msftFilePath Caminho do arquivo para o NDJSON gerado ImagingStudy 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 ficheiro ABFS no OneLake para todos os ficheiros DCM ao nível da instância que fazem parte deste 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 através da lógica comum de mesclagem delta aplicada a todas as tabelas no camada prata.

Nota

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

  • As colunas com o sufixo _string armazenam versões stringidas de campos contendo dados JSON complexos, permitindo a consulta através do ponto final de análise SQL. Essa prática se aplica a todas as tabelas no lakehouse prateado 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 identifierOrig_string,

  • Alguns campos na tabela ImagingStudy são gerados para se alinharem com o esquema FHIR ImagingStudy . No entanto, como o camada bronze não extrai dados dos arquivos DCM que correspondam com precisão a esses campos, as colunas relacionadas na tabela de prata 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 note,

Mapeamento de transformação para tabela delta de prata para 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 lakehouse ouro.

Coluna Fonte em ImagingStudy Coluna de destino no OMOP Image_Occurrence Tipo de dados Detalhes de 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 número inteiro ID da pessoa associada ao procedimento registado.
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 Registar a data de modificação.
resourceType msftSourceTableName cadeia 'Imaging Study'
msftModifiedDatetime msftModifiedDatetime datetime Direcione mapeamento com uma relação um-para-um.
series.uid image_occurrence_id cadeia Chave única dada a um registo de estudo de imagem.
series.modality.code modality_source_value cadeia Modalidade da série.

Nota

Alguns campos na tabela dourada são gerados para se alinharem com o OMOP esquema Image_Occurrence . No entanto, como o camada bronze não extrai dados que correspondam com precisão a esses campos, as colunas relacionadas na tabela de 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.