Canadian Baseline, published by HL7 Canada - FHIR Implementation Work Group. This guide is not an authorized publication; it is the continuous build for version 1.2.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/HL7-Canada/ca-baseline/ and changes regularly. See the Directory of published versions
Official URL: http://hl7.org/fhir/ca/baseline/StructureDefinition/profile-observation
Version:
1.2.0
Draft
as of 2024-08-09
Computable Name: ObservationProfile
Proposed constraints on the Observation Resource for general use. This profile sets minimum expectations for the Observation resource to represent various observations if no other, more specific profile is applicable. An observation is a measurement or assertion about a subject (person, group, device, location, or another subject).
CA Baseline Observation (General Use) Profile
While this profile does not currently apply MS constraints on the hasMember or component elements, this profile is seeking community and implementer feedback on how both elements are being used to assess whether consistent patterns can be identified for use in the Canadian landscape.
Feedback can be provided through the Simplifier issue log for this profile.
This profile sets minimum expectations for the Observation resource to represent various observations if no other, more specific profile is applicable. An observation is a measurement or assertion about a subject (person, group, device, location, or another subject).
This profile defines localization concepts for use in the Canadian context.
Mandatory Data Elements
All elements or attributes within the FHIR specification have cardinality as part of their definition - a minimum number of required appearances and a maximum number of allowable appearances.
Most elements in the FHIR specification have a minimum cardinality of 0, so most elements are not required and subsequently they may be missing from a resource when it is exchanged between systems.
Required elements in the Observation (General Use) profile:
status of the result value (Observation.status)
type of observation (Observation.code)
subject of the observation (Observation.subject)
Must Support Data Elements
Some elements are marked as Must Support. This means that implementations generating, receiving, or otherwise using resources with Must Support elements SHALL provide support for those elements in some meaningful way (see Must Support definition).
The following elements are marked as Must Support in the Observation (General Use) profile:
component value (if implementer supports component)
Usage Note
Observation (General Use) is intended to capture data associated with most observations; it is not intended to capture data in some cases where a more appropriate profile is applicable (see below). Data typically consists of measurements or assertions about a subject. Observation (General Use) can capture data in eclectic use cases as it incorporates multiple categories of observations and datatypes. Observation (General Use) can capture data such as:
Clinical observations such as clinical finding, diagnosis, disorder
Demographic information
Device measurements
Determinants of health such as housing status, income, family support
Observation (General Use) should not be used if one of the following profiles is applicable:
Observation Profile dom-2: If the resource is contained in another resource, it SHALL NOT contain nested Resources dom-3: If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource dom-4: If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated dom-5: If a resource is contained in another resource, it SHALL NOT have a security label dom-6: A resource should have narrative for robust management obs-6: dataAbsentReason SHALL only be present if Observation.value[x] is not present obs-7: If Observation.code is the same as an Observation.component.code then the value element associated with the code SHALL NOT be present
Extensions that cannot be ignored even if unrecognized ele-1: All FHIR elements must have a @value or children ext-1: Must have either extensions or value[x], not both
If the resource is contained in another resource, it SHALL NOT contain nested Resources : contained.contained.empty()
dom-3
error
Observation
If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource : contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().as(canonical) | %resource.descendants().as(uri) | %resource.descendants().as(url))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(canonical) = '#').exists()).not()).trace('unmatched', id).empty()
dom-4
error
Observation
If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated : contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()
dom-5
error
Observation
If a resource is contained in another resource, it SHALL NOT have a security label : contained.meta.security.empty()
dom-6
best practice
Observation
A resource should have narrative for robust management : text.`div`.exists()
ele-1
error
**ALL** elements
All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count())
ext-1
error
**ALL** extensions
Must have either extensions or value[x], not both : extension.exists() != value.exists()
obs-6
error
Observation
dataAbsentReason SHALL only be present if Observation.value[x] is not present : dataAbsentReason.empty() or value.empty()
obs-7
error
Observation
If Observation.code is the same as an Observation.component.code then the value element associated with the code SHALL NOT be present : value.empty() or component.code.where(coding.intersect(%resource.code.coding).exists()).empty()
Observation Profile obs-6: dataAbsentReason SHALL only be present if Observation.value[x] is not present obs-7: If Observation.code is the same as an Observation.component.code then the value element associated with the code SHALL NOT be present
If the resource is contained in another resource, it SHALL NOT contain nested Resources : contained.contained.empty()
dom-3
error
Observation
If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource : contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().as(canonical) | %resource.descendants().as(uri) | %resource.descendants().as(url))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(canonical) = '#').exists()).not()).trace('unmatched', id).empty()
dom-4
error
Observation
If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated : contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()
dom-5
error
Observation
If a resource is contained in another resource, it SHALL NOT have a security label : contained.meta.security.empty()
dom-6
best practice
Observation
A resource should have narrative for robust management : text.`div`.exists()
ele-1
error
**ALL** elements
All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count())
ext-1
error
**ALL** extensions
Must have either extensions or value[x], not both : extension.exists() != value.exists()
obs-3
error
Observation.referenceRange
Must have at least a low or a high or text : low.exists() or high.exists() or text.exists()
obs-6
error
Observation
dataAbsentReason SHALL only be present if Observation.value[x] is not present : dataAbsentReason.empty() or value.empty()
obs-7
error
Observation
If Observation.code is the same as an Observation.component.code then the value element associated with the code SHALL NOT be present : value.empty() or component.code.where(coding.intersect(%resource.code.coding).exists()).empty()
Observation Profile dom-2: If the resource is contained in another resource, it SHALL NOT contain nested Resources dom-3: If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource dom-4: If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated dom-5: If a resource is contained in another resource, it SHALL NOT have a security label dom-6: A resource should have narrative for robust management obs-6: dataAbsentReason SHALL only be present if Observation.value[x] is not present obs-7: If Observation.code is the same as an Observation.component.code then the value element associated with the code SHALL NOT be present
Extensions that cannot be ignored even if unrecognized ele-1: All FHIR elements must have a @value or children ext-1: Must have either extensions or value[x], not both
If the resource is contained in another resource, it SHALL NOT contain nested Resources : contained.contained.empty()
dom-3
error
Observation
If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource : contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().as(canonical) | %resource.descendants().as(uri) | %resource.descendants().as(url))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(canonical) = '#').exists()).not()).trace('unmatched', id).empty()
dom-4
error
Observation
If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated : contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()
dom-5
error
Observation
If a resource is contained in another resource, it SHALL NOT have a security label : contained.meta.security.empty()
dom-6
best practice
Observation
A resource should have narrative for robust management : text.`div`.exists()
ele-1
error
**ALL** elements
All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count())
ext-1
error
**ALL** extensions
Must have either extensions or value[x], not both : extension.exists() != value.exists()
obs-6
error
Observation
dataAbsentReason SHALL only be present if Observation.value[x] is not present : dataAbsentReason.empty() or value.empty()
obs-7
error
Observation
If Observation.code is the same as an Observation.component.code then the value element associated with the code SHALL NOT be present : value.empty() or component.code.where(coding.intersect(%resource.code.coding).exists()).empty()
Observation Profile obs-6: dataAbsentReason SHALL only be present if Observation.value[x] is not present obs-7: If Observation.code is the same as an Observation.component.code then the value element associated with the code SHALL NOT be present
If the resource is contained in another resource, it SHALL NOT contain nested Resources : contained.contained.empty()
dom-3
error
Observation
If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource : contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().as(canonical) | %resource.descendants().as(uri) | %resource.descendants().as(url))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(canonical) = '#').exists()).not()).trace('unmatched', id).empty()
dom-4
error
Observation
If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated : contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()
dom-5
error
Observation
If a resource is contained in another resource, it SHALL NOT have a security label : contained.meta.security.empty()
dom-6
best practice
Observation
A resource should have narrative for robust management : text.`div`.exists()
ele-1
error
**ALL** elements
All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count())
ext-1
error
**ALL** extensions
Must have either extensions or value[x], not both : extension.exists() != value.exists()
obs-3
error
Observation.referenceRange
Must have at least a low or a high or text : low.exists() or high.exists() or text.exists()
obs-6
error
Observation
dataAbsentReason SHALL only be present if Observation.value[x] is not present : dataAbsentReason.empty() or value.empty()
obs-7
error
Observation
If Observation.code is the same as an Observation.component.code then the value element associated with the code SHALL NOT be present : value.empty() or component.code.where(coding.intersect(%resource.code.coding).exists()).empty()
Additional codes that translate or map to the Observation code or category codes are allowed (see CodeableConcept data type).
Examples:
providing both a local code and LOINC code
providing more specific category codes
providing a SNOMED CT concept
providing system specific codes
Category
The Observation.category specifies a code that classifies the type of observation. The Observation.category element is a CodeableConcept data type, and more than one code is allowed.
For interoperability reasons, one of the codes SHOULD be from the FHIR standard defined Observation Category Codes.
Local codes are allowed as well. In the case of using local codes, in order to classify the type of observation both category.coding.system and category.coding.code SHOULD be provided.
Code
The Observation.code element describes what was observed. Sometimes this is called the observation "name".
Observation (General Use) uses a name-value pair to code data. When the value for the actual observation is not known, i.e., the value for Observation.value[x] is not available, then Observation.value[x] will not be present and the Observation.dataAbsentReason SHALL be present and will provide a reason why the expected value is missing.
Also, the Observation.dataAbsentReason SHALL only be present if and only if the value for Observation.value[x] is not present.
The same rule applies when Observation.component is used. I.e., if Observation.component.value[x] is missed, then Observation.component.dataAbsentReason SHALL be present with the reason.