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