Condividi tramite


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:

  1. Estrazione e trasformazione di metadati DICOM in una tabella delta Bronze
  2. Trasformazione dei metadati dalla tabella delta Bronze a Silver
  3. 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:

  1. Estrazione da file DICOM: estrai una raccolta di tutti i tag dai file DICOM (DCM) nella struttura di cartelle ottimizzata nel lakehouse Bronze.

  2. 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.

  3. 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.

  4. 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]
    (0010,0010) [patientName] No
    (0010,0040) [patientSex] No
    (0010,0020) [patientId]
    (0010,0030) [patientBirthDate] No
    (0008,0050) [accessionNumber]
    (0008,0090) [referringPhysicianName]
    (0008,0020) [studyDate]
    (0008,1030) [studyDescription]
    (0020,000E) [seriesInstanceUid]
    (0008,0060) [modality]
    (0008,0061) [modalitiesInStudy]
    (0040,0244) [performedProcedureStepStartDate] No
    (0008,1090) [manufacturerModelName] No
    (0008,0018) [sopInstanceUid]
    (0008,0030) [studyTime]
    (0008,0201) [timezoneOffsetFromUtc]
    (0020,1206) [numberOfStudyRelatedSeries]
    (0020,1208) [numberOfStudyRelatedInstances]
    (0020,0011) [seriesNumber]
    (0008,103E) [seriesDescription]
    (0020,1209) [numberOfSeriesRelatedInstances]
    (0018,0015) [bodyPartExamined]
    (0020,0060) [laterality]
    (0008,0021) [seriesDate]
    (0008,0031) [seriesTime]
    (0008,0016) [sopClassUid]
    (0020,0013) [instanceNumber]
    (0042,0010) [documentTitle]

    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.

  5. Archiviazione del percorso del file DCM: il percorso completo del file DCM viene scritto nella colonna filePath nella tabella delta ImagingDicom .

  6. 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 .

  7. 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.
  8. 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 e startedOrig.

  • 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, e identifierOrig_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 e note.

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.