Skip to content

Commit 4239fe2

Browse files
authored
Merge pull request #3 from aphp/ngr/fullExample
Ngr/full example
2 parents 946bdbb + 9666dba commit 4239fe2

21 files changed

+418
-47
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
map "https://aphp.fr/ig/fhir/dm/StructureMap/CoreBusiness2Physical" = "CoreBusiness2Physical"
2+
3+
/// name = 'CoreBusiness2Physical'
4+
/// title = 'Alignement de l\'expression de besoin vers le modèle physique du DPI dans le cadre de l\'usage Core'
5+
6+
// Alignement entre le modèle métier et le ùodèle physique du DPI
7+
8+
9+
uses "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse" alias QR as source
10+
uses "https://aphp.fr/ig/fhir/dm/StructureDefinition/CoreDataSet" alias DataSet as target
11+
uses "https://aphp.fr/ig/fhir/dm/StructureDefinition/CorePatient" alias PatientTable as target
12+
uses "https://aphp.fr/ig/fhir/dm/StructureDefinition/CoreSejour" alias SejourTable as target
13+
uses "https://aphp.fr/ig/fhir/dm/StructureDefinition/CoreBiology" alias BiologyTable as target
14+
uses "https://aphp.fr/ig/fhir/dm/StructureDefinition/CoreClinical" alias ClinicalTable as target
15+
uses "https://aphp.fr/ig/fhir/dm/StructureDefinition/CoreMedicationAdm" alias MedicationAdmTable as target
16+
uses "https://aphp.fr/ig/fhir/dm/StructureDefinition/CoreMedicationPre" alias MedicationPreTable as target
17+
18+
19+
group init(source srcQR : QR, target tgtDS : DataSet) <<types>> {
20+
srcQR -> tgtDS.logicalid = uuid() "setId";
21+
srcQR -> tgtDS.patient as tgtPatient,
22+
tgtDS.sejour as tgtSejour,
23+
tgtDS.biology as tgtBiol,
24+
tgtDS.clinical as tgtClin,
25+
tgtDS.medicationPre as tgtMedPre,
26+
tgtDS.medicationAdm as tgtMedAdm then {
27+
srcQR.item as srcSocioDemoDataItem where linkId = '4647259356106' then {
28+
srcSocioDemoDataItem.item as srcPatientIdItem where linkId = '2958000860428' then {
29+
srcPatientIdItem.item as srcNomItem where linkId = '8605698058770' then {
30+
srcNomItem.answer as srcNomAnswer then {
31+
srcNomAnswer.value : string as srcNomValue -> tgtPatient.name = srcNomValue "SetNomValue";
32+
} "setNomAnswer" ;
33+
} "setNom" ;
34+
srcPatientIdItem.item as srcPrenomItem where linkId = '6214879623503' then {
35+
srcPrenomItem.answer as srcPrenomAnswer then {
36+
srcPrenomAnswer.value : string as srcPrenomValue -> tgtPatient.firstName = srcPrenomValue "SetPrenomValue";
37+
} "setPrenomAnswer" ;
38+
} "setPrenom" ;
39+
srcPatientIdItem.item as srcNIRItem where linkId = '5711960356160' then {
40+
srcNIRItem.answer as srcNIRAnswer then {
41+
srcNIRAnswer.value : string as srcNIRValue -> tgtPatient.nir = srcNIRValue "SetNIRValue";
42+
} "setNIRAnswer" ;
43+
} "setNIR" ;
44+
srcPatientIdItem.item as srcDDNItem where linkId = '5036133558154' then {
45+
srcDDNItem.answer as srcDDNAnswer then {
46+
srcDDNAnswer.value : date as srcDDNValue -> tgtPatient.birthDate = srcDDNValue "SetDDNValue";
47+
} "setDDNAnswer" ;
48+
} "setDDN" ;
49+
srcPatientIdItem.item as srcDDDItem where linkId = '5036133558154' then {
50+
srcDDDItem.answer as srcDDDAnswer then {
51+
srcDDDAnswer.value : date as srcDDDValue "SetDDDValue";
52+
} "setDDDAnswer" ;
53+
srcDDDItem.item as srcDDDSourceItem where linkId = '9098810065693' then {
54+
srcDDDSourceItem.answer as srcDDDSourceAnswer then {
55+
srcDDDSourceAnswer.value : Coding as srcDDDSourceValue "SetDDDSourceValue";
56+
} "setDDDSourceAnswer" ;
57+
} "setDDDSource" ;
58+
} "setDDD" ;
59+
srcPatientIdItem.item as srcGemRankItem where linkId = '6931296968515' then {
60+
srcGemRankItem.answer as srcGemRankAnswer then {
61+
srcGemRankAnswer.value : integer as srcGemRankValue "SetGemRankValue";
62+
} "setDDNAnswer" ;
63+
} "setDDN" ;
64+
} "navigationToPatientId" ;
65+
srcSocioDemoDataItem.item as srcEnvItem where linkId = '5491974639955' then {
66+
srcEnvItem.item as srcGeocodItem where linkId = '3816475533472' then {
67+
srcGeocodItem.item as srcLatItem where linkId = '3709843054556' then {
68+
srcLatItem.answer as srcLatAnswer then {
69+
srcLatAnswer.value : decimal as srcLatValue "SetLatValue";
70+
} "setLatAnswer" ;
71+
} "setLat" ;
72+
srcGeocodItem.item as srcLongItem where linkId = '7651448032665' then {
73+
srcLongItem.answer as srcLongAnswer then {
74+
srcLongAnswer.value : decimal as srcLongValue "SetLongValue";
75+
} "setLongAnswer" ;
76+
} "setLong" ;
77+
srcGeocodItem.item as srcGeocodDateItem where linkId = '1185653257776' then {
78+
srcGeocodDateItem.answer as srcGeocodDateAnswer then {
79+
srcGeocodDateAnswer.value : date as srcGeocodDateValue "SetGeocodDateValue";
80+
} "setGeocodDateAnswer" ;
81+
} "setGeocodDate" ;
82+
} "navigationToGeocod" ;
83+
srcEnvItem.item as srcIrisItem where linkId = '7621032273792' then {
84+
srcIrisItem.answer as srcIrisAnswer then {
85+
srcIrisAnswer.value : Coding as srcIrisValue "SetIrisValue";
86+
} "setIrisAnswer" ;
87+
srcIrisItem.item as srcIrisDateItem where linkId = '4999580038872' then {
88+
srcIrisDateItem.answer as srcIrisDateAnswer then {
89+
srcIrisDateAnswer.value : date as srcIrisDateValue "SetIrisDateValue";
90+
} "setIrisDateAnswer" ;
91+
} "setIrisDate" ;
92+
} "setIris" ;
93+
} "navigationToEnv" ;
94+
} "navigationToSocioDemoData" ;
95+
srcQR.item as srcPMSIDataItem where linkId = '2825244231605' then {
96+
srcPMSIDataItem.item as srcPMSISexeItem where linkId = '3894630481120' then {
97+
srcPMSISexeItem.answer as srcPMSISexeAnswer then {
98+
srcPMSISexeAnswer.value : Coding as srcPMSISexeValueCoding -> tgtPatient.gender = (%srcPMSISexeValueCoding.code) "SetPMSISexeValue" ;
99+
} "SetPMSISexeAnswer" ;
100+
} "setPMSISexe" ;
101+
} "navigationToPMSIData" ;
102+
} "setTgtVar" ;
103+
}

input/fml/usages/core/StructureMap-CorePhysical2FHIR.fml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ group patient(source srcPatient : PatientTable, target tgtPatient : FHIRPatient)
4040
srcPatient -> tgtPatient.id = uuid() "setId";
4141
srcPatient.patientNi as srcNi -> tgtPatient.meta as tgtMeta then setPatientMeta(srcNi, tgtMeta) "setMeta"; // copie la valeur du champ patientNi de la table Patient dans l'élément id de la ressource FHIR Patient
4242
srcPatient -> tgtPatient.name as tgtPatientName then setHumainName(srcPatient, tgtPatientName) "setHumainName";
43+
srcPatient -> tgtPatient.identifier as tgtPatientIdentifier then setHumainNir(srcPatient, tgtPatientIdentifier) "setHumainNir" ;
4344
srcPatient.gender as srcPatientGender -> tgtPatient.gender = translate(srcPatientGender, 'https://aphp.fr/ig/fhir/dm/ConceptMap/DpiGender2Hl7Gender', 'code') "setGender"; // traduit la valeur du champ gender de la table Patient dans l'élément gender de la ressource FHIR Patient
4445
srcPatient.birthDate as srcPatientBirthDate -> tgtPatient.birthDate = srcPatientBirthDate "setBirthDate"; // copie la valeur du champ birthDate de la table Patient dans l'élément birthDate de la ressource FHIR Patient
4546
}
@@ -59,6 +60,13 @@ srcPatient.name as srcPatientName -> tgtPatientName.family = srcPatientName then
5960
tgtPatientName.text = (%srcPatientFirstName + ' ' + %srcPatientName) "setFirstNameAndText";
6061
} "setName";}
6162

63+
group setHumainNir(source srcPatient : PatientTable, target tgtPatientIdentifier) {
64+
srcPatient.nir as srcPatientNir -> tgtPatientIdentifier.use = 'official',
65+
tgtPatientIdentifier.type = cc('https://hl7.fr/ig/fhir/core/CodeSystem/fr-core-cs-v2-0203', 'INS-NIR'),
66+
tgtPatientIdentifier.system = 'urn:oid:1.2.250.1.213.1.4.8',
67+
tgtPatientIdentifier.value = srcPatientNir "setNir" ;
68+
}
69+
6270
group encounter(source srcSejour : SejourTable, source srcPatient : FHIRPatient, target tgtEncounter : FHIREncounter) {
6371
srcSejour -> tgtEncounter.id = uuid() "setId";
6472
srcSejour.sejourNi as srcNi -> tgtEncounter.meta as tgtMeta then setEncounterMeta(srcNi, tgtMeta) "setMeta"; // copie la valeur du champ patientNi de la table Patient dans l'élément id de la ressource FHIR Patient

input/fsh/applications/dpi/codesystems/CodeSystem-DpiEncounterType.fsh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CodeSystem: DpiEncounterType
2-
Title: "Dpi Encounter type"
3-
Description: "TODO"
2+
Title: "DPI Type de séjour"
3+
Description: "Type de séjour"
44

55
* ^status = #active
66
* ^content = #complete

input/fsh/applications/dpi/logicals/StructureDefinition-CorePatient.fsh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ Table CORE.PATIENT (DDL)
1212
* firstName 0..1 string "FIRST_NAME"
1313
* gender 0..1 string "GENDER"
1414
* birthDate 0..1 date "BIRTH_DATE"
15+
* nir 0..1 string "NIR"

input/fsh/semantic-layer/codesystems/CodeSystem-SemanticLayerEncounterType.fsh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CodeSystem: SemanticLayerEncounterType
22
Title: "Semantic layer encounter type"
3-
Description: "TODO"
3+
Description: "Semantic layer encounter type"
44

55
* ^status = #active
66
* ^content = #complete

input/fsh/semantic-layer/profiles/StructureDefinition-DMObservationLaboratoryTCA.fsh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Description: """
55
Profil des résultats de TCA - socle commun des EDS
66
"""
77

8-
* code = $loinc#50197-3 "aPTT panel - Platelet poor plasma" (exactly)
8+
* code = $loinc#50197-3 "Temps de céphaline activée panel [-] Plasma pauvre en plaquettes ; Numérique" (exactly)
99

1010
* component ^slicing.discriminator[0].type = #value
1111
* component ^slicing.discriminator[=].path = "code"

input/fsh/semantic-layer/profiles/StructureDefinition-DMObservationLaboratoryUremie.fsh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Description: """
55
Profil des résultats d'urémie du socle commun des EDS
66
"""
77

8-
* code = $loinc#22664-7 "Urea [Moles/volume] in Serum or Plasma" (exactly)
8+
* code = $loinc#22664-7 "Urée [Moles/Volume] Sérum/Plasma ; Numérique" (exactly)
99

1010
* value[x] only Quantity
1111
* valueQuantity.value ^short = "Valeur mesurée"
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
Instance: hl7Gender2OhdsiGender
2+
InstanceOf: ConceptMap
3+
Usage: #definition
4+
5+
* title = "HL7 Gender to OHDSI Gender"
6+
* name = "Hl7Gender2OhdsiGender"
7+
* description = "L'objectif de cet alignement est rendre possible la conversion d'un code 'gender' d'HL7 vers son équivalent dans OHDSI"
8+
* experimental = false
9+
* status = #active
10+
* group[0]
11+
* source = "https://hl7.fr/ig/fhir/core/ValueSet/fr-core-vs-patient-gender-INS"
12+
* target = "https://fhir-terminology.ohdsi.org"
13+
* element[0]
14+
* code = #male
15+
* display = "Male"
16+
* target[0]
17+
* code = #8507
18+
* display = "MALE"
19+
* equivalence = #equivalent
20+
* element[+]
21+
* code = #female
22+
* display = "Female"
23+
* target[0]
24+
* code = #8532
25+
* display = "FEMALE"
26+
* equivalence = #equivalent

input/images-source/core-mpd.plantuml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ entity CORE.PATIENT {
1515
* {field} FIRST_NAME VARCHAR2 (50) NULL
1616
* {field} GENDER CHAR (1) NULL
1717
* {field} BIRTH_DATE DATE NULL
18+
* {field} NIR VARCHAR2 (13) NULL
1819
}
1920

2021
entity CORE.SEJOUR {

input/pagecontent/StructureDefinition-DMObservationBodyHeight-intro.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ Dans le tableau ci-dessous sont référencés tous les cas d'usages présents et
5353

5454
<table style="width: 100%">
5555
<tr><th>Nom</th><th>Description</th></tr>
56-
<tr><td><a href="dm-core.html#variables-socles">Socles pour les EDSH</a></td><td>Les variables socles pour les EDSH.</td></tr>
56+
<tr><td><a href="dm-core.html">Socles pour les EDSH</a></td><td>Les variables socles pour les EDSH.</td></tr>
5757
</table>
5858

5959
### Exemples

input/pagecontent/StructureDefinition-DMObservationBodyWeight-intro.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ Dans le tableau ci-dessous sont référencés tous les cas d'usages présents et
5353

5454
<table style="width: 100%">
5555
<tr><th>Nom</th><th>Description</th></tr>
56-
<tr><td><a href="dm-core.html#variables-socles">Socles pour les EDSH</a></td><td>Les variables socles pour les EDSH.</td></tr>
56+
<tr><td><a href="dm-core.html">Socles pour les EDSH</a></td><td>Les variables socles pour les EDSH.</td></tr>
5757
</table>
5858

5959
### Exemples

input/pagecontent/use-core-conception-fhir.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,10 @@ et les profils Observations pour la taille, le poids.
1414
* Taille : [DMObservationBodyHeight]
1515
* Poids : [DMObservationBodyWeight]
1616

17+
##### L'alignement
18+
Une fois les éléments pertinents de la source identifiés (périmètre final) et les profils FHIR élaborés, il est possible de formaliser les règles d'alignement des premiers vers les seconds via la rédaction d'une structureMap.
19+
20+
Vous pouvez trouver l'alignement formel entre le modèle physique et les profils FHIR [ici](StructureMap-CorePhysical2FHIR.html)
21+
1722

1823
{% include markdown-link-references.md %}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<ol>
2+
<li><a href="Questionnaire-UsageCore.html">Questionnaire des exigences</a></li>
3+
<li><a href="QuestionnaireResponse-qr-test-usage-core.html">QuestionnaireResponse des exigences</a></li>
4+
<li><a href="StructureMap-CoreBusiness2Physical.html">StructureMap de génération du dataset depuis la QuestionnaireResponse</a></li>
5+
<li>DataSet Patient généré par l'éxecution de la StructureMap sur le QuestionnaireResponse :
6+
<pre>{
7+
"patient" : {
8+
"name" : "doe",
9+
"firstName" : "john",
10+
"gender" : "h",
11+
"birthDate" : "1948-07-16",
12+
"nir" : "1234567890123"
13+
}
14+
}</pre></li>
15+
<li><a href="StructureMap-CorePhysical2FHIR.html">StructureMap de génération de la ressource Patient depuis le datasetPatient</a></li>
16+
<li><a href="Patient-8f005d60-b59b-47f7-b04a-f877378f8d68.html">Patient généré par l'éxecution de la StructureMap sur le dataset patient</a></li>
17+
<li><a href="StructureMap-CoreFHIRPatient2OMOP.html">StructureMap de génération de l'entrée OMOP depuis la ressource Patient</a></li>
18+
<li>Entrée de la table OMOP générée par l'éxecution de la StructureMap sur la ressource Patient : <pre>{
19+
"person" : {
20+
"gender_concept_id" : {
21+
"reference" : "Concept/8507"
22+
},
23+
"year_of_birth" : 1948,
24+
"month_of_birth" : 7,
25+
"day_of_birth" : 16,
26+
"birth_datetime" : "1948-07-16",
27+
"person_source_value" : "8f005d60-b59b-47f7-b04a-f877378f8d68",
28+
"gender_source_value" : "male"
29+
}
30+
}</pre></li>
31+
</ol>
32+
33+

input/pagecontent/use-core-instruction.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ Pour l'exemple, nous allons simuler le scénario où l'ensemble des données ide
6464

6565
##### Périmètre final
6666

67-
L'alignement entre le modèle "physique" (modèle de l'application DPI) et le modèle métier issu des exigences en donnée de l'usage permet d'identifier les tables et les champs d'intérêt.
67+
L'alignement du modèle métier, issu des exigences en donnée de l'usage, vers le modèle "physique" (modèle de l'application DPI) permet d'identifier les tables et les champs d'intérêt.
6868

6969
<!-- If the image below is not wrapped in a div tag, the publisher tries to wrap text around the image, which is not desired. -->
7070
<div style="text-align: center;">{%include core-map.svg%}</div>
7171

72-
Vous pouvez trouver l'alignement formel entre le modèle physique et les profils FHIR : [Modèle physique vers FHIR](StructureMap-CorePhysical2FHIR.html)
72+
Vous pouvez trouver l'alignement formel entre le modèle métier et le modèle physique : [Modèle métier vers modèle physique](StructureMap-CoreBusiness2Physical.html)
7373

7474
#### Profilage des données
7575

input/pagecontent/use-core.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,8 @@ Le processus de livraison des données se compose de la manière suivante :
2929

3030
#### Conception de la livraison des données (OMOP)
3131

32-
{% include use-core-conception-omop.md %}
32+
{% include use-core-conception-omop.md %}
33+
34+
#### Exemple de synthèse
35+
36+
{% include use-core-exemple-bout-en-bout.md %}

0 commit comments

Comments
 (0)