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:
- Extração e transformação de metadados DICOM para tabela delta bronze
- Transformação de metadados da tabela delta bronze para a prata
- 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:
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.
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.
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.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.
Armazenamento do caminho do arquivo DCM: O caminho completo do arquivo DCM é gravado na
filePath
coluna na tabela delta ImagingDicom .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 .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
.
- Para ingestão regular, o valor do namespace é o nome da pasta depois de
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
estartedOrig
.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
eidentifierOrig_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
enote
.
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
.