FHIR to CDISC Joint Mapping Implementation Guide, published by HL7 International - BR&R Work Group. This guide is not an authorized publication; it is the continuous build for version 1.0.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/HL7/fhir-cdisc-mapping/ and changes regularly. See the Directory of published versions
Procedures, in FHIR, use the Procedure resource. However, like Observations, the notion of Procedure is quite broad. It includes counseling, education and physio-therapy as well as more traditional concepts such as surgery. One area of interest relevant to CDISC mapping that has not yet been decided in the FHIR standard is how best to handle the ordering and administration of non-drug therapies that involve the notion of 'dose' - for example radiation, light therapy, etc. Options being considered include expanding the scope of the Medication resources, adding dose elements or extensions to Procedure, or defining a separate set of resources. Because this area is not yet settled, no mappings are provided for the dose-relevant elements.
In some cases, procedure information may be captured only in document form (as DocumentReferences) or as the associated Encounter. Because of the limited metadata available in these, no mappings are provided.
Guidance on interpreting the tables can be found here.
CDISC | FHIR map (or gap) | Comment | |||
---|---|---|---|---|---|
Label | CDASH | SDTM | Element | FHIRPath | |
Study Identifier |
STUDYID
Core: HR Type: Char |
STUDYID
Core: Req Type: Char |
ResearchStudy.identifier
0..* Identifier |
ResearchSubject.where(subject=Observation.subject).study.resolve().partOf.resolve().identifier Procedure.extension(workflow-researchstudy).valueReference.resolve().partOf.resolve().identifier |
Mapping is based on presumption that research subject will be tied to site-specific ResearchStudy, which will then be part of overall ResearchStudy. The path using the extension will only exist if the system maintaining the Observation is aware of its relevance to the Study. ResearchStudy links to Patient. Observation links to Patient. If the patients are the same, that establishes the linkage. There's also an extension that allows direct linkage to a 'study' from any resource - if the source system has actually established such a linkage. ResearchStudy links to Patient. Observation links to Patient. If the patients are the same, that establishes the linkage. There's also an extension that allows direct linkage to a 'study' from any resource - if the source system has actually established such a linkage. |
Study Site Identifier |
SITEID
Core: HR Type: Char |
DM.SITEID
Core: Req Type: Char |
ResearchStudy.site
0..* Reference |
ResearchSubject.where(subject=Observation.subject).study.resolve().identifier Procedure.extension(workflow-researchstudy).valueReference.resolve().identifier |
Mapping is based on presumption that research subject will be tied to site-specific ResearchStudy, which will then be part of overall ResearchStudy. The path using the extension will only exist if the system maintaining the Observation is aware of its relevance to the Study. |
Subject Identifier for the Study |
SUBJID
Core: HR Type: Char |
DM.SUBJID
Core: Req Type: Char |
ResearchSubject.identifier
0..* Identifier |
ResearchSubject.where(individual=Procedure.subject).identifier |
Study subject is found by finding the StudySubject that corresponds to the same Patient and ResearchStudy as the Procedure. No standard way to decide which subject identifier to use |
Any Procedures Performed |
PRYN
Core: O Type: Char |
In FHIR, this would be determined by searching for Procedures with a given subject (possibly also filtered by research study) and excluding those that were entered in error. It might also be necessary to search for education, massage, cognitive therapy and various other data to determine all procedures. | |||
Procedure Category |
PRCAT
Core: O Type: Char |
PRCAT
Core: Perm Type: Char |
Procedure.category
0..1 CodeableConcept Binding: ProcedureCategory example |
Procedure.category |
FHIR doesn't have 2 distinct category levels. The option exists to have as many categorizations with whatever axes and granularities needed or desired. When mapping data to a particular study, it would be necessary to decide what category values best correspond to CAT vs. SCAT. A standard extension will be needed to convey multiple repetitions in R4. (Procedure.category does repeat in the draft of R5) The SNOMED binding is an example, which means that any codes can be used. Even if the binding were stronger, alternate codes would be possible on other repetitions. |
Procedure Subcategory |
PRSCAT
Core: O Type: Char |
PRSCAT
Core: Perm Type: Char |
Procedure.category
0..1 CodeableConcept Binding: ProcedureCategory example |
Procedure.category |
FHIR doesn't have 2 distinct category levels. Instead, Procedure.category repeats. The option exists to have as many categorizations with whatever axes and granularities needed or desired. When mapping data to a particular study, it would be necessary to decide what category values best correspond to CAT vs. SCAT. |
Procedure Sponsor-Defined Identifier |
PRSPID
Core: O Type: Char |
PRSPID
Core: Perm Type: Char |
Procedure.identifier
0..* Identifier |
Procedure.identifier |
|
Reported Name of Procedure |
PRTRT
Core: HR Type: Char |
PRTRT
Core: Req Type: Char |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code.coding.display | Procedure.code.text |
The name as expressed by or displayed to the user goes in code.text. The name associated with the selected code goes in code.coding.display. |
Standardized Procedure Name |
PRDECOD
Core: O Type: Char |
PRDECOD
Core: Perm Type: Char |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
Translation of the source-system-determined procedure code to the study-defined value set may need to be performed by the sponsor. PRDECOD is the dictionary or the sponsor-defined standardized text description of PRTRT, or the modified topic variable (PRMODIFY), if applicable. This means it is the standardized term for the procedure. |
Modified Procedure Name |
PRMODIFY
Core: O Type: Char |
PRMODIFY* | Coding translations are conducted by the sponsor. In FHIR, there's no need to modify the PRTERM. The text which was actually saw/typed (errors and all) is present and the various codes encoding it and the display names for those codes. If there was a need to capture a corrected text that was submitted to a post-coding process, that would be an extension |
||
Procedure prespecified |
PRPRESP
Core: O Type: Char |
PRPRESP
Core: Perm Type: Char |
This likely to be a Questionnaire question than something that would directly be captured in a record. This could possibly be an extension on the Procedure/MedicationAdministration/MedicationStatement. | ||
Procedure Occurrence |
PROCCUR
Core: O Type: Char |
PROCCUR
Core: Perm Type: Char |
Procedure.status
1..1 code Binding: ProcedureStatus required |
Procedure.status |
Coding translations are left to the sponsor. Status of 'not-done', 'entered-in-error' would indicate that it didn't happen, 'active', 'in-progress', 'on-hold', 'completed' would indicate that it did. 'stopped' would indicate that it started, but was abnormally terminated - where that should go depends on the study's definition of 'occur'. |
Procedure Reason for Occur Value |
PRREASOC
Core: O Type: Char |
SUPPPR.QVAL |
Procedure.reasonCode
0..* CodeableConcept Binding: ProcedureReason example |
Procedure.reasonCode |
Note that reasonReference would need to be turned into a code or string. Reason[x] indicates reason for doing the procedure; statusReason when status=not-done would be reason for non-occurrence |
Procedure.reasonReference
0..* Reference |
Procedure.reasonReference |
||||
Procedure.statusReason
0..1 CodeableConcept Binding: ProcedureNegationReason example |
Procedure.statusReason |
||||
Procedure Reason Not Done |
PRREASND
Core: O Type: Char |
PRREASND* |
Procedure.statusReason
0..1 CodeableConcept Binding: ProcedureNegationReason example |
Procedure.statusReason.where(%resource.status IN {'not-done'| 'stopped'}) |
|
Prior Procedure |
PRPRIOR
Core: O Type: Char |
PRSTRTPT
Core: Perm Type: Char values: AFTER, BEFORE, COINCIDENT, UPRSTRF* |
Procedure.performedDateTime
0..1 dateTime |
Procedure.performedDateTime.extension('cqf-relativeDateTime').extension(relationship).valueCode |
Typically, this extension won't exist, or won't be expressed relative to the subjects participation in the study. In such cases, the value for this element will need to be derived by the sponsor through comparision of procedure dates with study participation dates. If available, then the codes 'before-start' and 'before' map to 'true' and the rest map to false. |
Procedure Start Date |
PRSTDAT
Core: R/C Type: Char |
PRSTDTC
Core: Exp Type: Char values: ISO 8601 |
Procedure.performedDateTime
0..1 dateTime |
Procedure.performedDateTime |
FHIR also allows performedString, but there is no way to map that to CDISC. The performedRange mapping is imprecise because it indicates imprecision around the performance rather than a specific start time. |
Procedure.performedPeriod
0..1 Period |
Procedure.performedPeriod.start |
||||
Procedure.performedRange
0..1 Range |
Procedure.performedRange.low |
||||
Ongoing Procedure |
PRONGO
Core: O Type: Char |
PRENRTPT
Core: Perm Type: Char values: AFTER, BEFORE, COINCIDENT, ONGOING, UPRENRF* |
Procedure.status
1..1 code Binding: ProcedureStatus required |
Procedure.status |
This supports the necessity of separating procedures and medication. An example of ongoing procedure, "hemodialysis with frequency of three times a week". If the status is 'in-progress'/'active', then it's ongoing. |
Procedure End Date |
PRENDAT
Core: R/C Type: Char |
PRENDTC
Core: Perm Type: Char values: ISO 8601 |
Procedure.performedDateTime
0..1 dateTime |
Procedure.performedDateTime |
FHIR also allows performedString, but there is no way to map that to CDISC. The performedRange mapping is imprecise because it indicates imprecision around the performance rather than a specific end time. |
Procedure.performedPeriod
0..1 Period |
Procedure.performedPeriod.end |
||||
Procedure.performedRange
0..1 Range |
Procedure.performedRange.high |
||||
Procedure Indication |
PRINDC
Core: O Type: Char |
PRINDC
Core: Perm Type: Char |
Procedure.reasonCode
0..* CodeableConcept Binding: ProcedureReason example |
Procedure.reasonCode |
Note that reasonReference would need to be turned into a code or string. |
Procedure.reasonReference
0..* Reference |
Procedure.reasonReference |
||||
Related Adverse Event ID |
PRAENO
Core: O Type: Char |
AdverseEvent.identifier
0..1 Identifier |
Procedure.reasonReference.resolve().where(type='AdverseEvent').identifier |
||
Related Medical History Event ID |
PRMHNO
Core: O Type: Char |
If FHIR IDs are used for RELREC, then the sponsor should evaluate its use case as necessary prior to mapping. | |||
Dose Description |
PRDOSTXT
Core: Perm Type: Char |
If FHIR IDs are used for RELREC, then the sponsor should evaluate its use case as necessary prior to mapping. | |||
Procedure Dose Unit |
PRDOSU
Core: O Type: Char |
PRDOSU
Core: Perm Type: Char |
If FHIR IDs are used for RELREC, then the sponsor should evaluate its use case as necessary prior to mapping. | ||
Procedure Frequency per Interval |
PRDOSFRQ
Core: O Type: Char |
Procedure.extension
0..* Extension |
Procedure.extension('R5/occurrenceTiming').repeat.frequency |
||
Procedure Route of Administration |
PRROUTE
Core: O Type: Char |
PRROUTE
Core: Perm Type: Char |
This is a known gap. Procedure Route of Administration interval does NOT exist for 'Procedure'. | ||
Location of Procedure |
PRLOC
Core: O Type: Char |
PRLOC
Core: Perm Type: Char |
Procedure.bodySite
0..* CodeableConcept Binding: BodySite example |
Procedure.bodySite |
|
Procedure Laterality |
PRLAT
Core: O Type: Char |
PRLAT
Core: Perm Type: Char |
BodyStructure.locationQualifier
0..* CodeableConcept Binding: BodyStructureQualifier example |
Procedure.extension(procedure-targetBodyStructure).valueReference.resolve().locationQualifier |
This is frequently pre-coordinated into Procedure.bodySite. Multiple qualifiers are possible. Laterality will need to be recognized by code and/or system |
Procedure Directionality |
PRDIR
Core: O Type: Char |
PRDIR
Core: Perm Type: Char |
BodyStructure.locationQualifier
0..* CodeableConcept Binding: BodyStructureQualifier example |
Procedure.extension(procedure-targetBodyStructure).valueReference.resolve().locationQualifier |
This is frequently pre-coordinated into Procedure.bodySite. Multiple qualifiers are possible. Directionality will need to be recognized by code and/or system |
Procedure Portion or Totality |
PRPORTOT
Core: O Type: Char |
PRPORTOT
Core: Perm Type: Char |
Typically this would be pre-coordinated into Procedure.code and would be captured in dosage instructions text for medications. If captured as a separate element, if would need to be an extension. | ||
Procedure Fasting Status |
PRFAST
Core: O Type: Char |
PRFAST* | This would be handled as an extension. Could propose as standard extension. | ||
Procedure Intended Dose Regimen |
PRDOSRGM
Core: O Type: Char |
PRDOSRGM
Core: Perm Type: Char |
An administration could be based on more than one thing (recommendation, plan, order) and in theory the intended dose would be different for each. | ||
Procedure Adjusted |
PRDOSADJ
Core: O Type: Char |
This would be handled as an extension. Would appear on Procedure/MedicationAdministration/MedicationStatement.basedOn. Might consider proposing it as a standard extension. | |||
Reason for Procedure Adjustment |
PRADJ
Core: O Type: Char |
PRADJ* | This would be handled as an extension. Would appear on Procedure/MedicationAdministration/MedicationStatement.basedOn. Might consider proposing it as a standard extension. | ||
Completed Procedure |
PRTRTCMP
Core: O Type: Char |
SUPPPR.QVAL | Not all potential mapping/FHIR resources/attributes will be addressed in this implementation guide. All data requires review and analysis to ensure the data is relevant and understood. | ||
Procedure Interrupted |
PRITRPYN
Core: O Type: Char |
Procedure.status
1..1 code Binding: ProcedureStatus required |
Procedure.status |
If something is currently interrupted, the status would either be on-hold or stopped. If there was a temporary interruption and the procedure has since resumed or completed, the only way to detect the interruption would be an extension or to review the history. | |
Reason Procedure Interrupted |
PRITRPRS
Core: O Type: Char |
SUPPPR.QVAL |
Procedure.statusReason
0..1 CodeableConcept Binding: ProcedureNegationReason example |
Procedure.statusReason |
If the status is on-hold or stopped, statusReason would convey the reason. If there was a temporary interruption and the procedure has since resumed or completed, the only way to detect the interruption would be an extension or to review the history. |
Procedure Interruption Duration |
PRCINTD
Core: O Type: Char |
SUPPPR.QVAL | This would have to be an extension. Typically, you'd just look at history to see when something was suspended, then resumed. | ||
Procedure Interruption Duration Units |
PRCINTDU
Core: O Type: Char |
SUPPPR.QVAL | This would have to be part of the previous extension. Typically, reviewing the history of the procedure will indicate if it was suspended and then resumed. | ||
Procedure Lowest Level Term |
PRLLT
Core: O Type: Char |
SUPPPR.QVAL |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
Translation of Procedure.code to MeDRA will typically be performed by the sponsor and not provided in FHIR source data. Procedure.code can contain many codings and at various levels of granularity. Granularity will be determined by reviewing the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
Procedure Lowest Level Term Code |
PRLLTCD
Core: O Type: Num |
SUPPPR.QVAL |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
Translation of Procedure.code to MeDRA will typically be performed by the sponsor and not provided in FHIR soure data. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities) Note: Not clear how many of these would be populated for a procedure. |
Procedure Preferred Term Code |
PRPTCD
Core: O Type: Num |
SUPPPR.QVAL |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
Procedure High Level Term |
PRHLT
Core: O Type: Char |
SUPPPR.QVAL |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
Procedure High Level Term Code |
PRHLTCD
Core: O Type: Num |
SUPPPR.QVAL |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
Procedure High Level Group Term |
PRHLGT
Core: O Type: Char |
SUPPPR.QVAL |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
Procedure High Level Group Term Code |
PRHLGTCD
Core: O Type: Num |
SUPPPR.QVAL |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
PR Primary System Organ Class |
PRSOC
Core: O Type: Char |
SUPPPR.QVAL |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
PR Primary System Organ Class Code |
PRSOCCD
Core: O Type: Num |
SUPPPR.QVAL |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
FHIR map (or gap) | CDISC | Comment | |||
---|---|---|---|---|---|
Label | Element | FHIRPath | CDASH | SDTM | |
Study Identifier |
ResearchStudy.identifier
0..* Identifier |
ResearchSubject.where(subject=Observation.subject).study.resolve().partOf.resolve().identifier Procedure.extension(workflow-researchstudy).valueReference.resolve().partOf.resolve().identifier |
STUDYID
Core: HR Type: Char |
STUDYID
Core: Req Type: Char |
Mapping is based on presumption that research subject will be tied to site-specific ResearchStudy, which will then be part of overall ResearchStudy. The path using the extension will only exist if the system maintaining the Observation is aware of its relevance to the Study. ResearchStudy links to Patient. Observation links to Patient. If the patients are the same, that establishes the linkage. There's also an extension that allows direct linkage to a 'study' from any resource - if the source system has actually established such a linkage. ResearchStudy links to Patient. Observation links to Patient. If the patients are the same, that establishes the linkage. There's also an extension that allows direct linkage to a 'study' from any resource - if the source system has actually established such a linkage. |
Study Site Identifier |
ResearchStudy.site
0..* Reference |
ResearchSubject.where(subject=Observation.subject).study.resolve().identifier Procedure.extension(workflow-researchstudy).valueReference.resolve().identifier |
SITEID
Core: HR Type: Char |
DM.SITEID
Core: Req Type: Char |
Mapping is based on presumption that research subject will be tied to site-specific ResearchStudy, which will then be part of overall ResearchStudy. The path using the extension will only exist if the system maintaining the Observation is aware of its relevance to the Study. |
Subject Identifier for the Study |
ResearchSubject.identifier
0..* Identifier |
ResearchSubject.where(individual=Procedure.subject).identifier |
SUBJID
Core: HR Type: Char |
DM.SUBJID
Core: Req Type: Char |
Study subject is found by finding the StudySubject that corresponds to the same Patient and ResearchStudy as the Procedure. No standard way to decide which subject identifier to use |
Any Procedures Performed | In FHIR, this would be determined by searching for Procedures with a given subject (possibly also filtered by research study) and excluding those that were entered in error. It might also be necessary to search for education, massage, cognitive therapy and various other data to determine all procedures. |
PRYN
Core: O Type: Char |
|||
Procedure Category |
Procedure.category
0..1 CodeableConcept Binding: ProcedureCategory example |
Procedure.category |
PRCAT
Core: O Type: Char |
PRCAT
Core: Perm Type: Char |
FHIR doesn't have 2 distinct category levels. The option exists to have as many categorizations with whatever axes and granularities needed or desired. When mapping data to a particular study, it would be necessary to decide what category values best correspond to CAT vs. SCAT. A standard extension will be needed to convey multiple repetitions in R4. (Procedure.category does repeat in the draft of R5) The SNOMED binding is an example, which means that any codes can be used. Even if the binding were stronger, alternate codes would be possible on other repetitions. |
Procedure Subcategory |
Procedure.category
0..1 CodeableConcept Binding: ProcedureCategory example |
Procedure.category |
PRSCAT
Core: O Type: Char |
PRSCAT
Core: Perm Type: Char |
FHIR doesn't have 2 distinct category levels. Instead, Procedure.category repeats. The option exists to have as many categorizations with whatever axes and granularities needed or desired. When mapping data to a particular study, it would be necessary to decide what category values best correspond to CAT vs. SCAT. |
Procedure Sponsor-Defined Identifier |
Procedure.identifier
0..* Identifier |
Procedure.identifier |
PRSPID
Core: O Type: Char |
PRSPID
Core: Perm Type: Char |
|
Reported Name of Procedure |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code.coding.display | Procedure.code.text |
PRTRT
Core: HR Type: Char |
PRTRT
Core: Req Type: Char |
The name as expressed by or displayed to the user goes in code.text. The name associated with the selected code goes in code.coding.display. |
Standardized Procedure Name |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
PRDECOD
Core: O Type: Char |
PRDECOD
Core: Perm Type: Char |
Translation of the source-system-determined procedure code to the study-defined value set may need to be performed by the sponsor. PRDECOD is the dictionary or the sponsor-defined standardized text description of PRTRT, or the modified topic variable (PRMODIFY), if applicable. This means it is the standardized term for the procedure. |
Modified Procedure Name | Coding translations are conducted by the sponsor. In FHIR, there's no need to modify the PRTERM. The text which was actually saw/typed (errors and all) is present and the various codes encoding it and the display names for those codes. If there was a need to capture a corrected text that was submitted to a post-coding process, that would be an extension |
PRMODIFY
Core: O Type: Char |
PRMODIFY* | ||
Procedure prespecified | This likely to be a Questionnaire question than something that would directly be captured in a record. This could possibly be an extension on the Procedure/MedicationAdministration/MedicationStatement. |
PRPRESP
Core: O Type: Char |
PRPRESP
Core: Perm Type: Char |
||
Procedure Occurrence |
Procedure.status
1..1 code Binding: ProcedureStatus required |
Procedure.status |
PROCCUR
Core: O Type: Char |
PROCCUR
Core: Perm Type: Char |
Coding translations are left to the sponsor. Status of 'not-done', 'entered-in-error' would indicate that it didn't happen, 'active', 'in-progress', 'on-hold', 'completed' would indicate that it did. 'stopped' would indicate that it started, but was abnormally terminated - where that should go depends on the study's definition of 'occur'. |
Procedure Reason for Occur Value |
Procedure.reasonCode
0..* CodeableConcept Binding: ProcedureReason example |
Procedure.reasonCode |
PRREASOC
Core: O Type: Char |
SUPPPR.QVAL | Note that reasonReference would need to be turned into a code or string. Reason[x] indicates reason for doing the procedure; statusReason when status=not-done would be reason for non-occurrence |
Procedure.reasonReference
0..* Reference |
Procedure.reasonReference |
||||
Procedure.statusReason
0..1 CodeableConcept Binding: ProcedureNegationReason example |
Procedure.statusReason |
||||
Procedure Reason Not Done |
Procedure.statusReason
0..1 CodeableConcept Binding: ProcedureNegationReason example |
Procedure.statusReason.where(%resource.status IN {'not-done'| 'stopped'}) |
PRREASND
Core: O Type: Char |
PRREASND* | |
Prior Procedure |
Procedure.performedDateTime
0..1 dateTime |
Procedure.performedDateTime.extension('cqf-relativeDateTime').extension(relationship).valueCode |
PRPRIOR
Core: O Type: Char |
PRSTRTPT
Core: Perm Type: Char values: AFTER, BEFORE, COINCIDENT, UPRSTRF* |
Typically, this extension won't exist, or won't be expressed relative to the subjects participation in the study. In such cases, the value for this element will need to be derived by the sponsor through comparision of procedure dates with study participation dates. If available, then the codes 'before-start' and 'before' map to 'true' and the rest map to false. |
Procedure Start Date |
Procedure.performedDateTime
0..1 dateTime |
Procedure.performedDateTime |
PRSTDAT
Core: R/C Type: Char |
PRSTDTC
Core: Exp Type: Char values: ISO 8601 |
FHIR also allows performedString, but there is no way to map that to CDISC. The performedRange mapping is imprecise because it indicates imprecision around the performance rather than a specific start time. |
Procedure.performedPeriod
0..1 Period |
Procedure.performedPeriod.start |
||||
Procedure.performedRange
0..1 Range |
Procedure.performedRange.low |
||||
Ongoing Procedure |
Procedure.status
1..1 code Binding: ProcedureStatus required |
Procedure.status |
PRONGO
Core: O Type: Char |
PRENRTPT
Core: Perm Type: Char values: AFTER, BEFORE, COINCIDENT, ONGOING, UPRENRF* |
This supports the necessity of separating procedures and medication. An example of ongoing procedure, "hemodialysis with frequency of three times a week". If the status is 'in-progress'/'active', then it's ongoing. |
Procedure End Date |
Procedure.performedDateTime
0..1 dateTime |
Procedure.performedDateTime |
PRENDAT
Core: R/C Type: Char |
PRENDTC
Core: Perm Type: Char values: ISO 8601 |
FHIR also allows performedString, but there is no way to map that to CDISC. The performedRange mapping is imprecise because it indicates imprecision around the performance rather than a specific end time. |
Procedure.performedPeriod
0..1 Period |
Procedure.performedPeriod.end |
||||
Procedure.performedRange
0..1 Range |
Procedure.performedRange.high |
||||
Procedure Indication |
Procedure.reasonCode
0..* CodeableConcept Binding: ProcedureReason example |
Procedure.reasonCode |
PRINDC
Core: O Type: Char |
PRINDC
Core: Perm Type: Char |
Note that reasonReference would need to be turned into a code or string. |
Procedure.reasonReference
0..* Reference |
Procedure.reasonReference |
||||
Related Adverse Event ID |
AdverseEvent.identifier
0..1 Identifier |
Procedure.reasonReference.resolve().where(type='AdverseEvent').identifier |
PRAENO
Core: O Type: Char |
||
Related Medical History Event ID | If FHIR IDs are used for RELREC, then the sponsor should evaluate its use case as necessary prior to mapping. |
PRMHNO
Core: O Type: Char |
|||
Dose Description | If FHIR IDs are used for RELREC, then the sponsor should evaluate its use case as necessary prior to mapping. |
PRDOSTXT
Core: Perm Type: Char |
|||
Procedure Dose Unit | If FHIR IDs are used for RELREC, then the sponsor should evaluate its use case as necessary prior to mapping. |
PRDOSU
Core: O Type: Char |
PRDOSU
Core: Perm Type: Char |
||
Procedure Frequency per Interval |
Procedure.extension
0..* Extension |
Procedure.extension('R5/occurrenceTiming').repeat.frequency |
PRDOSFRQ
Core: O Type: Char |
||
Procedure Route of Administration | This is a known gap. Procedure Route of Administration interval does NOT exist for 'Procedure'. |
PRROUTE
Core: O Type: Char |
PRROUTE
Core: Perm Type: Char |
||
Location of Procedure |
Procedure.bodySite
0..* CodeableConcept Binding: BodySite example |
Procedure.bodySite |
PRLOC
Core: O Type: Char |
PRLOC
Core: Perm Type: Char |
|
Procedure Laterality |
BodyStructure.locationQualifier
0..* CodeableConcept Binding: BodyStructureQualifier example |
Procedure.extension(procedure-targetBodyStructure).valueReference.resolve().locationQualifier |
PRLAT
Core: O Type: Char |
PRLAT
Core: Perm Type: Char |
This is frequently pre-coordinated into Procedure.bodySite. Multiple qualifiers are possible. Laterality will need to be recognized by code and/or system |
Procedure Directionality |
BodyStructure.locationQualifier
0..* CodeableConcept Binding: BodyStructureQualifier example |
Procedure.extension(procedure-targetBodyStructure).valueReference.resolve().locationQualifier |
PRDIR
Core: O Type: Char |
PRDIR
Core: Perm Type: Char |
This is frequently pre-coordinated into Procedure.bodySite. Multiple qualifiers are possible. Directionality will need to be recognized by code and/or system |
Procedure Portion or Totality | Typically this would be pre-coordinated into Procedure.code and would be captured in dosage instructions text for medications. If captured as a separate element, if would need to be an extension. |
PRPORTOT
Core: O Type: Char |
PRPORTOT
Core: Perm Type: Char |
||
Procedure Fasting Status | This would be handled as an extension. Could propose as standard extension. |
PRFAST
Core: O Type: Char |
PRFAST* | ||
Procedure Intended Dose Regimen | An administration could be based on more than one thing (recommendation, plan, order) and in theory the intended dose would be different for each. |
PRDOSRGM
Core: O Type: Char |
PRDOSRGM
Core: Perm Type: Char |
||
Procedure Adjusted | This would be handled as an extension. Would appear on Procedure/MedicationAdministration/MedicationStatement.basedOn. Might consider proposing it as a standard extension. |
PRDOSADJ
Core: O Type: Char |
|||
Reason for Procedure Adjustment | This would be handled as an extension. Would appear on Procedure/MedicationAdministration/MedicationStatement.basedOn. Might consider proposing it as a standard extension. |
PRADJ
Core: O Type: Char |
PRADJ* | ||
Completed Procedure | Not all potential mapping/FHIR resources/attributes will be addressed in this implementation guide. All data requires review and analysis to ensure the data is relevant and understood. |
PRTRTCMP
Core: O Type: Char |
SUPPPR.QVAL | ||
Procedure Interrupted |
Procedure.status
1..1 code Binding: ProcedureStatus required |
Procedure.status |
PRITRPYN
Core: O Type: Char |
If something is currently interrupted, the status would either be on-hold or stopped. If there was a temporary interruption and the procedure has since resumed or completed, the only way to detect the interruption would be an extension or to review the history. | |
Reason Procedure Interrupted |
Procedure.statusReason
0..1 CodeableConcept Binding: ProcedureNegationReason example |
Procedure.statusReason |
PRITRPRS
Core: O Type: Char |
SUPPPR.QVAL | If the status is on-hold or stopped, statusReason would convey the reason. If there was a temporary interruption and the procedure has since resumed or completed, the only way to detect the interruption would be an extension or to review the history. |
Procedure Interruption Duration | This would have to be an extension. Typically, you'd just look at history to see when something was suspended, then resumed. |
PRCINTD
Core: O Type: Char |
SUPPPR.QVAL | ||
Procedure Interruption Duration Units | This would have to be part of the previous extension. Typically, reviewing the history of the procedure will indicate if it was suspended and then resumed. |
PRCINTDU
Core: O Type: Char |
SUPPPR.QVAL | ||
Procedure Lowest Level Term |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
PRLLT
Core: O Type: Char |
SUPPPR.QVAL | Translation of Procedure.code to MeDRA will typically be performed by the sponsor and not provided in FHIR source data. Procedure.code can contain many codings and at various levels of granularity. Granularity will be determined by reviewing the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
Procedure Lowest Level Term Code |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
PRLLTCD
Core: O Type: Num |
SUPPPR.QVAL | Translation of Procedure.code to MeDRA will typically be performed by the sponsor and not provided in FHIR soure data. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities) Note: Not clear how many of these would be populated for a procedure. |
Procedure Preferred Term Code |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
PRPTCD
Core: O Type: Num |
SUPPPR.QVAL | Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
Procedure High Level Term |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
PRHLT
Core: O Type: Char |
SUPPPR.QVAL | Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
Procedure High Level Term Code |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
PRHLTCD
Core: O Type: Num |
SUPPPR.QVAL | Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
Procedure High Level Group Term |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
PRHLGT
Core: O Type: Char |
SUPPPR.QVAL | Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
Procedure High Level Group Term Code |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
PRHLGTCD
Core: O Type: Num |
SUPPPR.QVAL | Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
PR Primary System Organ Class |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
PRSOC
Core: O Type: Char |
SUPPPR.QVAL | Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |
PR Primary System Organ Class Code |
Procedure.code
0..1 CodeableConcept Binding: ProcedureCode example |
Procedure.code |
PRSOCCD
Core: O Type: Num |
SUPPPR.QVAL | Procedure Code is performed by the sponsor - not expected to receive this from the site or FHIR. Procedure.code can contain as many codings as you like at whatever granularity you like. You would distinguish what granularity it was by looking at the code system and/or having knowledge of the codes within the same code system (where one code system can express content at multiple granularities). |