NCPI FHIR Implementation Guide v2 - Local Development build (v0.1.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions
Official URL: https://nih-ncpi.github.io/ncpi-fhir-ig-2/StructureDefinition/ncpi-condition
Version:
0.1.0
Draft
as of 2024-11-25
Computable Name: NcpiCondition
Information about a condition related to a research participant
Key Guidelines
The NCPI Condition profile is based on the standard resource type, Observation and is intended to represent a condition or phenotype associated with a participant in a research study.
Added Profile Restrictions
In order to ensure that our resources are interoperable across studies, we have employed a number of restrictions that should make consuming Patient resources more consistent.
participantID should be a globally unique identifier associated with the patient. This practice is intended to make constructing queries for the same patient compatible across different servers (such as QA vs PROD) but also to make the resource URLs more meaningful.
Recommended Practices
NCPI Condition requests codes for conditions and condition information where possible rather than the use of free text; However, providing free text is an option in the conditionText field of the profile.
NCPI FHIR Mappings
The following fields from the shared data model are to be mapped into the NCPI Condition as shown below:
The age at which this condition was resolved, abated, or cured. Should be left empty in cases of current active status. Could be expressed with a term, an age, or an age range.
Location information, such as site and/or laterality, of the condition. Multiple values should be interpreted cumulatively, so complex location information, such as "right lung" and "left kidney" may require multiple condition rows.
Where or how was this this assertion about the Participant recorded? This can support understanding the differences between surveys, automated EHR extraction, manual chart abstraction, etc.
The date or age at which this condition is being asserted. Could be expressed with a term, an age, or an age range. (for ages use http://hl7.org/fhir/StructureDefinition/cqf-relativeDateTime)
Location information, such as site and/or laterality, of the condition. Multiple values should be interpreted cumulatively, so complex location information, such as "right lung" and "left kidney" may require multiple condition rows.
Where or how was this this assertion about the Participant recorded? This can support understanding the differences between surveys, automated EHR extraction, manual chart abstraction, etc.
The age at which this condition was resolved, abated, or cured. Should be left empty in cases of current active status. Could be expressed with a term, an age, or an age range.
Measurements and simple assertions 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
Does this condition represent a specific "type" of condition, such as "Phenotypic Feature" vs "Disease" in a rare disease setting. Binding: ObservationCategoryCodes (preferred): Codes for high level observation categories.
The date or age at which this condition is being asserted. Could be expressed with a term, an age, or an age range. (for ages use http://hl7.org/fhir/StructureDefinition/cqf-relativeDateTime)
Location information, such as site and/or laterality, of the condition. Multiple values should be interpreted cumulatively, so complex location information, such as "right lung" and "left kidney" may require multiple condition rows. Binding: SNOMEDCTBodyStructures (example): SNOMED CT Body site concepts
Where or how was this this assertion about the Participant recorded? This can support understanding the differences between surveys, automated EHR extraction, manual chart abstraction, etc. Binding: ObservationMethods (example): Methods for simple observations.
The age at which this condition was resolved, abated, or cured. Should be left empty in cases of current active status. Could be expressed with a term, an age, or an age range.
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.exists() and ('#'+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(uri) = '#').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()
Measurements and simple assertions 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
Contained, inline Resources dom-r4b: Containing new R4B resources within R4 resources may cause interoperability issues if instances are shared with R4 systems
Does this condition represent a specific "type" of condition, such as "Phenotypic Feature" vs "Disease" in a rare disease setting. Binding: ObservationCategoryCodes (preferred): Codes for high level observation categories.
The date or age at which this condition is being asserted. Could be expressed with a term, an age, or an age range. (for ages use http://hl7.org/fhir/StructureDefinition/cqf-relativeDateTime)
Location information, such as site and/or laterality, of the condition. Multiple values should be interpreted cumulatively, so complex location information, such as "right lung" and "left kidney" may require multiple condition rows. Binding: SNOMEDCTBodyStructures (example): SNOMED CT Body site concepts
Where or how was this this assertion about the Participant recorded? This can support understanding the differences between surveys, automated EHR extraction, manual chart abstraction, etc. Binding: ObservationMethods (example): Methods for simple observations.
The age at which this condition was resolved, abated, or cured. Should be left empty in cases of current active status. Could be expressed with a term, an age, or an age range.
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.exists() and ('#'+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(uri) = '#').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()
dom-r4b
warning
Observation.contained
Containing new R4B resources within R4 resources may cause interoperability issues if instances are shared with R4 systems : ($this is Citation or $this is Evidence or $this is EvidenceReport or $this is EvidenceVariable or $this is MedicinalProductDefinition or $this is PackagedProductDefinition or $this is AdministrableProductDefinition or $this is Ingredient or $this is ClinicalUseDefinition or $this is RegulatedAuthorization or $this is SubstanceDefinition or $this is SubscriptionStatus or $this is SubscriptionTopic) implies (%resource is Citation or %resource is Evidence or %resource is EvidenceReport or %resource is EvidenceVariable or %resource is MedicinalProductDefinition or %resource is PackagedProductDefinition or %resource is AdministrableProductDefinition or %resource is Ingredient or %resource is ClinicalUseDefinition or %resource is RegulatedAuthorization or %resource is SubstanceDefinition or %resource is SubscriptionStatus or %resource is SubscriptionTopic)
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()
The date or age at which this condition is being asserted. Could be expressed with a term, an age, or an age range. (for ages use http://hl7.org/fhir/StructureDefinition/cqf-relativeDateTime)
Location information, such as site and/or laterality, of the condition. Multiple values should be interpreted cumulatively, so complex location information, such as "right lung" and "left kidney" may require multiple condition rows.
Where or how was this this assertion about the Participant recorded? This can support understanding the differences between surveys, automated EHR extraction, manual chart abstraction, etc.
The age at which this condition was resolved, abated, or cured. Should be left empty in cases of current active status. Could be expressed with a term, an age, or an age range.
Measurements and simple assertions 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
Does this condition represent a specific "type" of condition, such as "Phenotypic Feature" vs "Disease" in a rare disease setting. Binding: ObservationCategoryCodes (preferred): Codes for high level observation categories.
The date or age at which this condition is being asserted. Could be expressed with a term, an age, or an age range. (for ages use http://hl7.org/fhir/StructureDefinition/cqf-relativeDateTime)
Location information, such as site and/or laterality, of the condition. Multiple values should be interpreted cumulatively, so complex location information, such as "right lung" and "left kidney" may require multiple condition rows. Binding: SNOMEDCTBodyStructures (example): SNOMED CT Body site concepts
Where or how was this this assertion about the Participant recorded? This can support understanding the differences between surveys, automated EHR extraction, manual chart abstraction, etc. Binding: ObservationMethods (example): Methods for simple observations.
The age at which this condition was resolved, abated, or cured. Should be left empty in cases of current active status. Could be expressed with a term, an age, or an age range.
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.exists() and ('#'+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(uri) = '#').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()
Measurements and simple assertions 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
Contained, inline Resources dom-r4b: Containing new R4B resources within R4 resources may cause interoperability issues if instances are shared with R4 systems
Does this condition represent a specific "type" of condition, such as "Phenotypic Feature" vs "Disease" in a rare disease setting. Binding: ObservationCategoryCodes (preferred): Codes for high level observation categories.
The date or age at which this condition is being asserted. Could be expressed with a term, an age, or an age range. (for ages use http://hl7.org/fhir/StructureDefinition/cqf-relativeDateTime)
Location information, such as site and/or laterality, of the condition. Multiple values should be interpreted cumulatively, so complex location information, such as "right lung" and "left kidney" may require multiple condition rows. Binding: SNOMEDCTBodyStructures (example): SNOMED CT Body site concepts
Where or how was this this assertion about the Participant recorded? This can support understanding the differences between surveys, automated EHR extraction, manual chart abstraction, etc. Binding: ObservationMethods (example): Methods for simple observations.
The age at which this condition was resolved, abated, or cured. Should be left empty in cases of current active status. Could be expressed with a term, an age, or an age range.
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.exists() and ('#'+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(uri) = '#').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()
dom-r4b
warning
Observation.contained
Containing new R4B resources within R4 resources may cause interoperability issues if instances are shared with R4 systems : ($this is Citation or $this is Evidence or $this is EvidenceReport or $this is EvidenceVariable or $this is MedicinalProductDefinition or $this is PackagedProductDefinition or $this is AdministrableProductDefinition or $this is Ingredient or $this is ClinicalUseDefinition or $this is RegulatedAuthorization or $this is SubstanceDefinition or $this is SubscriptionStatus or $this is SubscriptionTopic) implies (%resource is Citation or %resource is Evidence or %resource is EvidenceReport or %resource is EvidenceVariable or %resource is MedicinalProductDefinition or %resource is PackagedProductDefinition or %resource is AdministrableProductDefinition or %resource is Ingredient or %resource is ClinicalUseDefinition or %resource is RegulatedAuthorization or %resource is SubstanceDefinition or %resource is SubscriptionStatus or %resource is SubscriptionTopic)
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()