Trasformazione dei metadati DICOM mapping nelle soluzioni di dati sanitari
In questo articolo viene descritto come l'ambiente delle soluzioni per dati sanitari estrae e trasforma i metadati DICOM in diversi livelli dei lakehouse. Apprenderai inoltre il processo di trasformazione dei metadati end-to-end e il mapping delle trasformazioni a ogni livello.
Il processo di trasformazione dei metadati tramite la pipeline di inserimento è costituito dalle tre fasi consecutive seguenti:
- Estrazione e trasformazione di metadati DICOM in una tabella delta Bronze
- Trasformazione dei metadati dalla tabella delta Bronze a Silver
- Trasformazione dei metadati dalla tabella delta Silver a Gold
Le sezioni seguenti descrivono in dettaglio il mapping della trasformazione per ogni fase.
Mapping della trasformazione dei metadati DICOM a una tabella delta Bronze
Esistono più di 5000 tag DICOM definiti dallo standard DICOM, inclusi i tag privati specifici del fornitore. Questa sezione identifica quali tag recuperiamo e spiega il processo di estrazione nel lakehouse Bronze.
Il processo di estrazione dei tag e creazione della tabella delta ImagingDicom include le seguenti azioni:
Estrazione da file DICOM: estrai una raccolta di tutti i tag dai file DICOM (DCM) nella struttura di cartelle ottimizzata nel lakehouse Bronze.
Esclusione del tag dei dati pixel: esclude il tag dei dati pixel DICOM (7FE0,0010) e gli attributi del modulo dei dati pixel immagine dalla raccolta. Il tag dei dati pixel DICOM include dettagli a livello di immagine/pixel.
Mapping JSON: mappa tutti i tag DICOM estratti in una struttura JSON di coppie chiave-valore nello schema seguente:
METADATA_JSON_DICT_SCHEMA = MapType ( StringType(), StructType([ StructField("vr", StringType(), True), StructField("Value", ArrayType(StringType(), True), True) ]) )
Queste coppie JSON di valori-chiave vengono scritte nella colonna metadati nella tabella delta bronze lakehouse ImagingDicom .
Nota
La colonna
metadata_string
memorizza anche i metadati come stringa, perché gli endpoint Fabric SQL non supportano tipi di dati complessi come strutture, array e mappe. È possibile interrogare queste colonne come stringhe utilizzando SQL endpoint (T-SQL) oppure lavorare con i loro tipi nativi (strutture, array, mappe) utilizzando Spark.Estrazione e mapping in bronzo lakehouse: estrarre ulteriormente i seguenti 29 tag DICOM e scriverli nelle rispettive colonne di destinazione nella tabella delta ImagingDicom :
Tag DICOM di origine Colonna di destinazione Obbligatorio (0020,000D) [studyInstanceUid]
Sì (0010,0010) [patientName]
No (0010,0040) [patientSex]
No (0010,0020) [patientId]
Sì (0010,0030) [patientBirthDate]
No (0008,0050) [accessionNumber]
Sì (0008,0090) [referringPhysicianName]
Sì (0008,0020) [studyDate]
Sì (0008,1030) [studyDescription]
Sì (0020,000E) [seriesInstanceUid]
Sì (0008,0060) [modality]
Sì (0008,0061) [modalitiesInStudy]
Sì (0040,0244) [performedProcedureStepStartDate]
No (0008,1090) [manufacturerModelName]
No (0008,0018) [sopInstanceUid]
Sì (0008,0030) [studyTime]
Sì (0008,0201) [timezoneOffsetFromUtc]
Sì (0020,1206) [numberOfStudyRelatedSeries]
Sì (0020,1208) [numberOfStudyRelatedInstances]
Sì (0020,0011) [seriesNumber]
Sì (0008,103E) [seriesDescription]
Sì (0020,1209) [numberOfSeriesRelatedInstances]
Sì (0018,0015) [bodyPartExamined]
Sì (0020,0060) [laterality]
Sì (0008,0021) [seriesDate]
Sì (0008,0031) [seriesTime]
Sì (0008,0016) [sopClassUid]
Sì (0020,0013) [instanceNumber]
Sì (0042,0010) [documentTitle]
Sì Nota
Per ulteriori informazioni sul motivo per cui promuoviamo questi particolari 29 tag DICOM, vedi Estrazione di tag DICOM.
Per altre informazioni sul modello di inserimento (append), vedi Modello di aggiunta nella lakehouse Bronze.
La colonna
modalitiesInStudy_string
memorizza anche il tag modalitiesInStudy come stringa perché gli endpoint Fabric SQL non supportano tipi di dati complessi quali strutture, array e mappe. È possibile interrogare queste colonne come stringhe utilizzando SQL endpoint (T-SQL) oppure lavorare con i loro tipi nativi (strutture, array, mappe) utilizzando Spark.
Archiviazione del percorso del file DCM: il percorso completo del file DCM viene scritto nella colonna
filePath
nella tabella delta ImagingDicom .Registrazione dell'ora di modifica: l'ultima marca temporale in cui il file DCM è stato modificato all'origine viene scritta nella colonna
sourceModifiedAt
nella tabella delta ImagingDicom .Archiviazione dello spazio dei nomi: il valore dello spazio dei nomi viene scritto nella colonna
sourceSystem
nella tabella delta ImagingDicom . Questo valore deriva dal nome della cartella nella struttura delle cartelle unificata.- Per l'ingestione regolare, il valore dello spazio dei nomi è il nome della cartella dopo
Files\Process\Imaging\DICOM
. - Per l'ingestione Bring Your Own Storage (BYOS), il valore dello spazio dei nomi è il nome della cartella dopo
Files\External\Imaging\DICOM
.
- Per l'ingestione regolare, il valore dello spazio dei nomi è il nome della cartella dopo
Registrazione del tempo di esecuzione: la data e l'ora di esecuzione del notebook vengono scritte nella colonna
createdDatetime
nella tabella delta ImagingDicom .
Mapping della trasformazione della tabella delta da Bronze a Silver
Le tabelle seguenti spiegano il mapping completo per la trasformazione dei metadati DICOM dalla tabella bronze lakehouse ImagingDicom delta alle tabelle ImagingMetastore e ImagingStudy delta nella tabella silver lakehouse. La tabella delta ImagingMetastore memorizza i tag DICOM per ciascun file DCM come coppie chiave-valore JSON all'interno delle colonne dei metadati. Copiando tutti i metadati dal bronzo all'argento layer si preserva l'integrità dei dati tra i livelli. La tabella delta ImagingStudy include i 29 tag DICOM selezionati per allineamento con campi standard FHIR. Contiene inoltre più campi per supportare il tracciamento dei dati e la discendenza.
Colonna di origine in ImagingDicom | Colonna di destinazione in ImagingMetastore | Dettagli del mapping |
---|---|---|
ND | msftModifiedDatetime |
Incluso tramite la logica di unione delta comune applicata a tutte le tabelle nel file silver layer. |
studyInstanceUid |
studyInstanceUid |
Mapping diretto con una relazione uno a uno. Ogni valore nella colonna di origine viene mappato direttamente a un singolo valore corrispondente nella destinazione. |
seriesInstanceUid |
seriesInstanceUid |
Mapping diretto con una relazione uno a uno. |
sopInstanceUid |
sopInstanceUid |
Mapping diretto con una relazione uno a uno. |
sourceSystem |
msftSourceSystem |
Mapping diretto con una relazione uno a uno. |
metadata |
metadata |
Mapping diretto con una relazione uno a uno. |
metadata_string |
metadata_string |
Mapping diretto con una relazione uno a uno. |
filePath |
filePath |
Mapping diretto con una relazione uno a uno. |
sourceModifiedAt |
sourceModifiedAt |
Mapping diretto con una relazione uno a uno. |
ND | id |
Un GUID generato usando il modulo UUID Python. |
ND | msftCreatedDatetime |
Incluso tramite la logica di unione delta comune applicata a tutte le tabelle nel file silver layer. |
Colonna di origine in ImagingDicom | Colonna di destinazione in ImagingStudy | Dettagli del mapping |
---|---|---|
ND | msftModifiedDatetime |
Incluso tramite la logica di unione delta comune applicata a tutte le tabelle nel file silver layer. |
ND | id |
Un GUID generato usando il modulo UUID Python. |
ND | resourceType |
"ImagingStudy" |
sourceSystem |
msftSourceSystem |
Non un mapping diretto. La capacità di trasformazione dei dati DICOM utilizza la colonna sourceSystem nel file bronze lakehouse per creare la cartella Namespace quando si scrivono i file NDJSON generati nella cartella Process . Per saperne di più sulla cartella Namespace , vedere Struttura delle cartelle unificata: descrizioni delle cartelle. In questa fase, il servizio di inserimento dei dati in bronzo clinico utilizza il nome della cartella Namespace per popolare la colonna msftSourceSystem nel file lakehouse in argento. Ad esempio, se il valore sourceSystem è definito come MyPACSsystem nella tabella bronze ImagingDicom , il servizio di acquisizione di immagini bronze scrive i file NDJSON appena creati nella seguente struttura di cartelle: Process\Clinical\FHIR-NDJSON\MyPACSsystem\YYYY\MM\DD\ImagingStudy-<timestamp>.ndjson . Quando l'ingestione di bronzo clinico rileva questi file, popola automaticamente la msftSourceSystem colonna con MyPACSsystem dalla struttura delle cartelle e propaga lo stesso valore al silver layer. |
ND | msftFilePath |
Percorso del file ImagingStudy NDJSON generato nella cartella Process\Clinical\FHIR-NDJSON\DICOM-HDS . |
filePath |
extension |
"extension": [{"url": "lit('file_path')", "valueUrl": "col('FilePath')"}] Il valore di FilePath include il percorso del file ABFS in OneLake per tutti i file DCM a livello di istanza che fanno parte di questo 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 |
Incluso tramite la logica di unione delta comune applicata a tutte le tabelle nel file silver layer. |
Nota
Le colonne con il suffisso
Orig
vengono create nel file lakehouse silver per memorizzare i valori originali dei campi ricavati dal file layer bronze. Questa pratica standard include le seguenti colonne nella tabella ImagingStudy :meta_lastUpdatedOrig
,identifierOrig
,idOrig
estartedOrig
.Le colonne con il suffisso
_string
memorizzano le versioni in formato stringa dei campi contenenti dati JSON complessi, consentendo l'esecuzione di query tramite l'analisi SQL endpoint. Questa pratica si applica a tutte le tabelle nel file lakehouse silver e include le seguenti colonne nella tabella 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
.Alcuni campi nella tabella ImagingStudy vengono generati in allineare con lo schema FHIR ImagingStudy . Tuttavia, poiché il bronzo layer non estrae dati dai file DCM che corrispondono accuratamente a questi campi, le colonne correlate nella tabella argento rimangono vuote. Di conseguenza, le seguenti colonne nella tabella ImagingStudy contengono valori nulli:
implicitRules
,language
,text
,contained
,encounter
,basedOn
,referrer
,interpreter
,endpoint
,procedureReference
,procedureCode
,location
,reasonCode
,reasonReference
enote
.
Mapping della trasformazione della tabella delta da Silver a Gold
La tabella seguente spiega il mapping completo per la trasformazione dei dati DICOM nella tabella delta lakehouse ImagingStudy silver nella tabella delta lakehouse ( )OMOPImage_Occurrence dell'Observational Medical Outcomes Partnership ( ) nella tabella delta lakehouse gold.
Colonna di origine in ImagingStudy | Colonna di destinazione in OMOP Image_Occurrence | Tipo di dati | Dettagli del mapping |
---|---|---|---|
series.started |
image_occurrence_date |
data | Data di occorrenza della procedura di imaging (serie). |
series.modality (combinazione di series.modality.code e series.modality.system ) |
modality_concept_id |
string | concat_ws('<->', exp_series.modality.code, exp_series.modality.system) |
ND | SourceTable |
string | 'ImagingStudy_FHIR' |
id |
msftSourceRecordId |
string | ID generato dal sistema del record di origine. |
identifier['studyInstanceUid'] |
image_study_uid |
string | UID dello studio DICOM. |
subject |
person_id |
integer | ID persona della persona associata alla procedura registrata. |
Un array di valori del dizionario, dove la chiave è instance.uid e il valore è 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))) |
ND | SourceModifiedOn |
datetime | Data di modifica del record. |
resourceType |
msftSourceTableName |
string | 'Imaging Study' |
msftModifiedDatetime |
msftModifiedDatetime |
datetime | Mapping diretto con una relazione uno a uno. |
series.uid |
image_occurrence_id |
string | Chiave univoca fornita a un record di studio di imaging. |
series.modality.code |
modality_source_value |
string | Modalità della serie. |
Nota
Alcuni campi nella tabella gold vengono generati in allineare con lo schema OMOP Image_Occurrence . Tuttavia, poiché il bronzo layer non estrae dati che corrispondono accuratamente a questi campi, le colonne correlate nella tabella oro rimangono vuote. Di conseguenza, le seguenti colonne nella tabella Image_Occurrence contengono valori nulli: visit_occurrence_id
, procedure_occurrence_id
e anatomic_site_concept_id
.