Transformation des métadonnées DICOM mappage dans les solutions de données de santé
Cet article explique comment l’environnement de solutions de données de santé extrait et transforme les métadonnées DICOM à différents niveaux de la lakehouse. Vous pouvez également en apprendre davantage sur le processus de transformation des métadonnées de bout en bout et comprendre le mappage de transformation à chaque niveau.
La transformation des métadonnées via le pipeline d’ingestion comprend les trois phases consécutives suivantes :
- Extraction et transformation des métadonnées DICOM dans la table delta bronze
- Transformation des métadonnées de la table delta bronze à la table delta argent
- Transformation des métadonnées de la table delta argent à la table delta or
Les sections suivantes détaillent le mappage de transformation pour chaque phase.
Mappage de transformation pour les métadonnées DICOM dans la table delta bronze
Il existe plus de 5 000 balises DICOM définies par la norme DICOM, y compris des balises privées spécifiques au fournisseur. Cette section identifie quelles balises nous récupérons et explique le processus d’extraction dans la lakehouse bronze.
Le processus d’extraction de balises et de création de table delta ImagingDicom inclut les actions suivantes :
Extraction des fichiers DICOM : extrayez une collection de toutes les balises des fichiers DICOM (DCM) dans la structure de dossiers optimisée de la lakehouse bronze.
Exclusion de la balise de données de pixel : excluez la balise de données de pixel DICOM (7FE0,0010) et les attributs du module de données de pixel d’image de la collection. La balise de données de pixel DICOM inclut des détails au niveau de l’image ou du pixel.
Mappage JSON : mappez toutes les balises DICOM extraites dans une structure JSON de paires de clé-valeur dans le schéma suivant :
METADATA_JSON_DICT_SCHEMA = MapType ( StringType(), StructType([ StructField("vr", StringType(), True), StructField("Value", ArrayType(StringType(), True), True) ]) )
Ces paires JSON clé-valeur sont écrites dans la colonne métadonnées de la table delta bronze lakehouse ImagingDicom .
Note
La colonne
metadata_string
stocke également les métadonnées sous forme de chaîne, car les points de terminaison Fabric SQL ne prennent pas en charge les types de données complexes tels que les structures, les tableaux et les cartes. Vous pouvez interroger ces colonnes sous forme de chaînes à l’aide de SQL point de terminaison (T-SQL) ou travailler avec leurs types natifs (structures, tableaux, cartes) à l’aide de Spark.Extraction et mappage vers bronze lakehouse : extrayez ensuite les 29 balises DICOM suivantes et écrivez-les dans les colonnes de destination respectives de la table delta ImagingDicom :
Balise DICOM source Colonne de destination Requise (0020,000D) [studyInstanceUid]
Oui (0010,0010) [patientName]
No (0010,0040) [patientSex]
No (0010,0020) [patientId]
Oui (0010,0030) [patientBirthDate]
No (0008,0050) [accessionNumber]
Oui (0008,0090) [referringPhysicianName]
Oui (0008,0020) [studyDate]
Oui (0008,1030) [studyDescription]
Oui (0020,000E) [seriesInstanceUid]
Oui (0008,0060) [modality]
Oui (0008,0061) [modalitiesInStudy]
Oui (0040,0244) [performedProcedureStepStartDate]
No (0008,1090) [manufacturerModelName]
No (0008,0018) [sopInstanceUid]
Oui (0008,0030) [studyTime]
Oui (0008,0201) [timezoneOffsetFromUtc]
Oui (0020,1206) [numberOfStudyRelatedSeries]
Oui (0020,1208) [numberOfStudyRelatedInstances]
Oui (0020,0011) [seriesNumber]
Oui (0008,103E) [seriesDescription]
Oui (0020,1209) [numberOfSeriesRelatedInstances]
Oui (0018,0015) [bodyPartExamined]
Oui (0020,0060) [laterality]
Oui (0008,0021) [seriesDate]
Oui (0008,0031) [seriesTime]
Oui (0008,0016) [sopClassUid]
Oui (0020,0013) [instanceNumber]
Oui (0042,0010) [documentTitle]
Oui Note
Pour plus d’informations sur les raisons pour lesquelles nous promouvoir ces 29 balises DICOM particulières, voir Extraction de balises DICOM.
Pour en savoir plus sur le modèle d’ingestion (ajout), accédez à Ajouter un modèle dans la lakehouse bronze.
La colonne
modalitiesInStudy_string
stocke également la balise modalitiesInStudy sous forme de chaîne, car les points de terminaison Fabric SQL ne prennent pas en charge les types de données complexes tels que les structures, les tableaux et les cartes. Vous pouvez interroger ces colonnes sous forme de chaînes à l’aide de SQL point de terminaison (T-SQL) ou travailler avec leurs types natifs (structures, tableaux, cartes) à l’aide de Spark.
Stockage du chemin d’accès au fichier DCM : le chemin d’accès complet au fichier DCM est écrit dans la colonne
filePath
de la table delta ImagingDicom .Enregistrement de l’heure de modification : l’horodatage le plus récent auquel le fichier DCM a été modifié à sa source est écrit dans la colonne
sourceModifiedAt
de la table delta ImagingDicom .Stockage de l’espace de noms : la valeur de l’espace de noms est écrite dans la colonne
sourceSystem
de la table delta ImagingDicom . Cette valeur dérive du nom du dossier dans la structure de dossier unifiée.- Pour une ingestion régulière, la valeur de l’espace de noms est le nom du dossier après
Files\Process\Imaging\DICOM
. - Pour l’ingestion Bring Your Own Storage (BYOS), la valeur de l’espace de noms est le nom du dossier après
Files\External\Imaging\DICOM
.
- Pour une ingestion régulière, la valeur de l’espace de noms est le nom du dossier après
Journalisation du temps d’exécution : la date et l’heure d’exécution du bloc-notes sont écrites dans la colonne
createdDatetime
de la table delta ImagingDicom .
Mappage de transformation de la table delta bronze à la table delta argent
Les tableaux suivants expliquent le couche complet pour la transformation des métadonnées DICOM de la table delta bronze lakehouse ImagingDicom aux tables delta ImagingMetastore et ImagingStudy dans la table argent lakehouse. La table delta ImagingMetastore stocke les balises DICOM pour chaque fichier DCM sous forme de paires clé-valeur JSON dans les colonnes de métadonnées. La copie de toutes les métadonnées du bronze vers l’argent couche préserve l’intégrité des données à travers les couches. La table delta ImagingStudy inclut les 29 balises DICOM sélectionnées pour mappage avec les champs standard FHIR. Il contient également davantage de champs pour prendre en charge le suivi et la lignée des données.
Colonne source dans ImagingDicom | Colonne de destination dans ImagingMetastore | Détails du mappage |
---|---|---|
N/A | msftModifiedDatetime |
Inclus via la logique de fusion delta commune appliquée à toutes les tables dans l’argent #glsr_cfhibaz. |
studyInstanceUid |
studyInstanceUid |
Direct mappage avec une relation individuelle. Chaque valeur de la colonne source correspond directement à une seule valeur correspondante dans la destination. |
seriesInstanceUid |
seriesInstanceUid |
Direct mappage avec une relation individuelle. |
sopInstanceUid |
sopInstanceUid |
Direct mappage avec une relation individuelle. |
sourceSystem |
msftSourceSystem |
Direct mappage avec une relation individuelle. |
metadata |
metadata |
Direct mappage avec une relation individuelle. |
metadata_string |
metadata_string |
Direct mappage avec une relation individuelle. |
filePath |
filePath |
Direct mappage avec une relation individuelle. |
sourceModifiedAt |
sourceModifiedAt |
Direct mappage avec une relation individuelle. |
N/A | id |
Un GUID généré à l’aide du module UUID Python. |
N/A | msftCreatedDatetime |
Inclus via la logique de fusion delta commune appliquée à toutes les tables dans l’argent #glsr_cfhibaz. |
Colonne source dans ImagingDicom | Colonne de destination dans ImagingStudy | Détails du mappage |
---|---|---|
N/A | msftModifiedDatetime |
Inclus via la logique de fusion delta commune appliquée à toutes les tables dans l’argent #glsr_cfhibaz. |
N/A | id |
Un GUID généré à l’aide du module UUID Python. |
N/A | resourceType |
"ImagingStudy" |
sourceSystem |
msftSourceSystem |
Pas un mappage direct. La capacité de transformation des données DICOM utilise la colonne sourceSystem dans le bronze lakehouse pour créer le dossier Namespace lors de l’écriture des fichiers NDJSON générés dans le dossier Process . Pour en savoir plus sur le dossier Espace de noms , consultez Structure de dossier unifiée : descriptions de dossiers. À ce stade, le service d’ingestion de bronze clinique utilise le nom du dossier Namespace pour renseigner la colonne msftSourceSystem dans le lakehouse argent. Par exemple, si la valeur est définie comme dans la table bronze ImagingDicom, le service d’ingestion d’imagerie Bronze écrit les fichiers NDJSON nouvellement créés dans la structure de dossiers suivante :. sourceSystem MyPACSsystem Process\Clinical\FHIR-NDJSON\MyPACSsystem\YYYY\MM\DD\ImagingStudy-<timestamp>.ndjson Lorsque l’ingestion de bronze clinique récupère ces fichiers, elle remplit automatiquement la msftSourceSystem colonne avec MyPACSsystem de la structure du dossier et propage la même valeur à l’argent couche. |
N/A | msftFilePath |
Chemin d’accès au fichier ImagingStudy NDJSON généré dans le dossier Process\Clinical\FHIR-NDJSON\DICOM-HDS . |
filePath |
extension |
"extension": [{"url": "lit('file_path')", "valueUrl": "col('FilePath')"}] La valeur pour FilePath inclut le chemin du fichier ABFS dans OneLake pour tous les fichiers DCM au niveau de l’instance qui font partie de ce ImagingStudy. |
N/A | méta | "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' et type.coding.code = 'ACSN')) =>"AccessionNumber" |
N/A | 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')"}]}]}]} |
N/A | meta.lastupdated |
Currenttimestamp() |
N/A | msftCreatedDatetime |
Inclus via la logique de fusion delta commune appliquée à toutes les tables dans l’argent #glsr_cfhibaz. |
Note
Les colonnes avec le suffixe
Orig
sont créées dans l’argent lakehouse pour stocker les valeurs originales des champs provenant du bronze couche. Cette pratique standard inclut les colonnes suivantes dans la table ImagingStudy :meta_lastUpdatedOrig
,identifierOrig
,idOrig
etstartedOrig
.Les colonnes avec le suffixe
_string
stockent des versions stringifiées de champs contenant des données JSON complexes, permettant ainsi d’effectuer des requêtes via les analyses SQL point de terminaison. Cette pratique s’applique à toutes les tables du silver lakehouse et inclut les colonnes suivantes dans le tableau 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
, etidentifierOrig_string
.Certains champs de la table ImagingStudy sont générés en aligner avec le schéma FHIR ImagingStudy . Cependant, comme le bronze couche n’extrait pas les données des fichiers DCM qui correspondent exactement à ces champs, les colonnes associées dans la table argent restent vides. Par conséquent, les colonnes suivantes dans la table ImagingStudy contiennent des valeurs nulles :
implicitRules
,language
,text
,contained
,encounter
,basedOn
,referrer
,interpreter
,endpoint
,procedureReference
,procedureCode
,location
,reasonCode
,reasonReference
etnote
.
Mappage de transformation de la table delta argent à la table delta or
Le tableau suivant explique le couche complet pour la transformation des données DICOM dans la table delta argent lakehouse ImagingStudy en table delta Observational Medical Outcomes Partnership (OMOP) Image_Occurrence dans la table delta or lakehouse.
Colonne source dans ImagingStudy | Colonne de destination dans OMOP Image_Occurrence | Type de données | Détails du mappage |
---|---|---|---|
series.started |
image_occurrence_date |
date | Date d’occurrence de la procédure d’imagerie (série). |
series.modality (combinaison de series.modality.code et series.modality.system ) |
modality_concept_id |
chaine | concat_ws('<->', exp_series.modality.code, exp_series.modality.system) |
N/A | SourceTable |
chaine | 'ImagingStudy_FHIR' |
id |
msftSourceRecordId |
chaine | ID généré par le système de l’enregistrement source. |
identifier['studyInstanceUid'] |
image_study_uid |
chaine | Étude DICOM UID. |
subject |
person_id |
Entier | ID de la personne associée à la procédure enregistrée. |
Un tableau de valeurs de dictionnaire, où la clé est instance.uid et la valeur est instance.extension[0].valueUrl |
local_path |
chaine | 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))) |
N/A | SourceModifiedOn |
DateHeure | Date de modification de l’enregistrement. |
resourceType |
msftSourceTableName |
chaine | 'Imaging Study' |
msftModifiedDatetime |
msftModifiedDatetime |
DateHeure | Direct mappage avec une relation individuelle. |
series.uid |
image_occurrence_id |
chaine | Clé unique fournie à un enregistrement d’étude d’imagerie. |
series.modality.code |
modality_source_value |
chaine | Modalité de la série. |
Note
Certains champs de la table Gold génèrent aligner avec le schéma OMOP Image_Occurrence . Cependant, comme le bronze #glsr_cfhibaz n’extrait pas de données correspondant précisément à ces champs, les colonnes associées dans la table or restent vides. Par conséquent, les colonnes suivantes dans la table Image_Occurrence contiennent des valeurs nulles : visit_occurrence_id
, procedure_occurrence_id
et anatomic_site_concept_id
.