Goals:
- Extract key content from DICOM SR (AI result, measurement report, etc.) into FHIR resources, Observation
- Make mapping independent of final discussion around DiagnosticReport vs Composition
- Bidirectional mapping is out-of-scope.
- Publish an IG
Questions
- What is the level to map within SR?
- Tentative: TID1410 / TID1411 map to FHIR observation
- Tentative: TID1420 maps to FHIR observation with components?
- Should we use TID1500 as described in IHE AIR?
- Start with lower level
- IHE AIR uses TID 1500. Tentative: all primitives be mapped to FHIR Observation or ImageReference?
- IHE AIR Primitives
- Qualitative Finding
- Measurements
- Locations
- Regions
- Tracking Identifiers
- Image References
- Other IODs(non-SR content) included in AIR, How should we address these?
- Parametric Maps
- Segmentation
- IHE AIR Primitives
- IHE AIW transcodes AIR SR results to HL7 v2 Observations for Reading worklist prioritization
- uses AIR Primitives. Should be aligned with encoding to FHIR Observation
- Qualitative Findings
- Measurements
- uses AIR Primitives. Should be aligned with encoding to FHIR Observation
- What about Supplement 219?
- Not directly impacting this workitem
- Look at CDA to FHIR mappings as a sanity check
- SR to CDA to FHIR = SR to FHIR
- See https://build.fhir.org/ig/HL7/cda-core-2.0/index.html for CDA to FHIR mapping
- https://build.fhir.org/ig/HL7/cda-core-2.0/StructureDefinition-Observation.html for CDA to Observation
- Observation UID and Tracking UID
- Both identifiers with different types?
- Define tracking UID as an identifier type
- Jonathan Whitby Get 2nd opinion from FHIR-I
- Define tracking UID as an identifier type
- Look at extensions:
- Both identifiers with different types?
Notes:
- Observation UID is not in TIDs but in core DICOM attributes for SR content
- See if there are more non-TID elements that should be included in the mapping
- Tentatively no
- See if there are more non-TID elements that should be included in the mapping
- Is this a bundle of observations or is the output a FHIR Diagnostic report?
- Pros for bundle of observations is probably a bit easier. Harder to group them in terms of DICOM SR
- all observations related to an event
- same accession #
- Diagnostic report because they are collected for a single diagnostic report. This is what an EHR would expect?
- bundle path could be a composition.
- review the CDA to FHIR mapping.
- what do you do with ancillary data for a diagnostic report?
- Out of scope or use composition
- Need to ask O&O what they would expect.
- Need EMR vendors
- Would payors need to know the resultant data
- Composition makes sense for AI results?
- What is the context for the observation?
- Could be either, just focus on 1500 to single observation or panel of observations
- Could be either composition or a diagnostic report based on specific use case
- Custom FHIR resource?
- Imaging selection is the discriminator.
- Input is TID 1500
Needed: SR IOD Equipment Module to Device Resource
TID 1410 Parameters
Container: EV (125007, DCM, "Measurement Group") | |||||
---|---|---|---|---|---|
Concept Name | VT | VM | Req Type | DICOM SR Parameter/Value Set Constraint | Description |
DT (112039, DCM, "Tracking Identifier") | |||||
EV (112040, DCM, "Tracking Unique Identifier") | |||||
DTID 1419 “ROI Measurements” | |||||
$Measurement | NUM | 1-n | M | UNITS=$Units | |
$Measurement | Coded term or Context Group for Concept Name of measurement | ||||
$Units | Units for the measurement | ||||
$ModType | Modifier Name for Concept Name of measurement | ||||
$ModType | CODE | 1-n | U | $ModValue | Modifier Value for Concept Name of measurement |
EV (370129005, SCT, "Measurement Method") | code | 1 | U | $Method | Value for Measurement Method |
EV (121401, DCM, "Derivation") | $Derivation | Value for Measurement Derivation | |||
EV (363698007, SCT, "Finding Site") | code | 1-n | U | $TargetSite | Value for Anatomic Location of measurement |
> DT (106233006, SCT, "Topographical modifier") | code | 1 | U | $TargetSiteMod | Modifier Value for Anatomic Location of measurement |
>EV (272741003, SCT, "Laterality") | code | 1 | U | DCID 244 “Laterality” | |
$Equation | Coded term or Context Group for the equation or table from which the measurement was derived or computed | ||||
$RefAuthority | Bibliographic reference or authority for statistical properties of a reference population | ||||
$RangeAuthority | Bibliographic reference or authority for the normal range of the measurement | ||||
Not mapped | $DerivationParameter | Coded term or Context Group for Concept Name of a derivation parameter | |||
Not Mapped | $DerivationParameterUnits | Units of derivation parameter | |||
$QualType | Evaluations encoded with code or text responses | ||||
$QualValue | Value of evaluations encoded with code responses | ||||
Not mapped | $QualModType | Modifier Name of evaluations encoded with code or text responses | |||
Not Mapped | $QualModValue | Modifier Value of evaluations encoded with code or text responses | |||
EV (121071, DCM, "Finding") | $FindingType | Type of the finding | |||
DTID 4019 “Algorithm Identification” | |||||
DTID 310 “Measurement Properties” | $RefAuthority = $RefAuthority $RangeAuthority = $RangeAuthority |
Draft SR Mapping to Observation
DICOM SR Content | Observation Name | Flags | Card. | FHIR Type | |||
---|---|---|---|---|---|---|---|
IN | DomainResource | Measurements and simple assertions | |||||
Σ | 0..* | Identifier | Business Identifier for observation | ||||
Content Item: Observation UID (0040,A171) | identifier:ObservationUID | Σ | 0..1 | Unique Measurement Identifier | |||
EV(112040,DCM,"Tracking Unique Identifier") | identifier:TrackingUID | Σ | 0..1 | Unique Tracking Identifier | |||
EV(112039,DCM,"Tracking Identifier") | identifier:TrackingID | Σ | 0..1 | Human Readable Tracking identifier | |||
EV (C67447, NCIt, "Activity Session") | identifier:ActivitySession | Σ | 0..1 | ||||
Referenced Request Sequence(0040,A370) | Σ | 0..* | Reference(CarePlan | DeviceRequest | | Request fulfilled | |||
>Placer Order Number/Imaging Service Request(0040,2016) >Order Placer Identifier Sequence(0040,0026) | BasedOn:ServiceRequest | Σ | 0..1 | ServiceRequest.Identifier.type=order | |||
>Placer Filler Number/Imaging Service Request(0040,2017) >Order Placer Identifier Sequence(0040,0027) | BasedOn:ServiceRequest | Σ | 0..1 | ServiceRequest.Identifier.type=FILL | |||
>Accession Number(0008,0050) >Issuer of Accession Number Sequence(0008,0051) | BasedOn:ServiceRequest | Σ | 0..1 | ServiceRequest.Identifier.type=ACSN | |||
Σ | 0..* | Reference( Open Question: ImagingReference or ImagingStudy? | Part of referenced event | ||||
>Study Instance UID(0020,000D) | Σ | 0..1 | ImagingStudy.Identifier.type=SIUID | ||||
>Requested Procedure ID(0040,1001) >Requested Procedure Description(0032,1060) >Requested Procedure Code Sequence(0032,1064) >Reason for the Requested Procedure(0040,1002) >Reason for Requested Procedure Code Sequence(0040,100A) | Σ | 0..1 | |||||
Preliminary Flag(0040,A496) = preliminary Verification Flag(0040,A493) = final | ?!Σ | 1..1 | code | registered | preliminary | final | amended + ObservationStatus (Required) | |||
CATAGORY = Imaging | 0..* | CodeableConcept | Classification of type of observation Observation Category Codes (Preferred) | ||||
EV (121071, DCM, "Finding") | Σ | 1..1 | CodeableConcept | Type of observation (code / type) LOINC Codes (Example) | |||
Patient Module | Σ | 0..1 | Reference(Patient | Group | Device | Location) | Who and/or what the observation is about | |||
Content Date (0008,0023) Content Time (0008,0033) | Σ | 0..1 | instant | Date/Time this version was made available | |||
Person or responsible for the analysis Author Observer Sequence (0040,A078) Bring more in | Σ | 0..* | Reference(Practitioner | PractitionerRole | Organization | CareTeam | Patient | RelatedPerson) | Who is responsible for the observation | |||
ΣI | 0..1 | Actual result | |||||
$Measurement | valueQuantity | Quantity | |||||
$QualValue | valueCodeableConcept | CodeableConcept | |||||
text value if $QualType is text | valueString | string | |||||
Boolean value if $QualType is boolean | valueBoolean | boolean | |||||
valueInteger | integer | ||||||
$measurement as Range | valueRange | Range | |||||
$measurement as Ratio | valueRatio | Ratio | |||||
valueSampledData | SampledData | ||||||
Value Time | valueTime | time | |||||
Value Date Time | valueDateTime | dateTime | |||||
0..* | CodeableConcept | High, low, normal, etc. Observation Interpretation Codes (Extensible) | |||||
interpretation:Abnormality | Σ | 0..1 | HL7 V2 | ||||
interpretation:ActionableFinding | Σ | 0..1 | CID 7035 “Actionable Finding Classification” | ||||
EV (363698007, SCT, "Finding Site")=$TargetSite | 0..1 | CodeableConcept | Observed body part SNOMED CT Body Structures (Example) | ||||
$TargetSiteLaterality | DCID 244 “Laterality” | ||||||
$TargetSiteMod | |||||||
EV (370129005, SCT, "Measurement Method") | 0..1 | CodeableConcept | How it was done Observation Methods (Example) | ||||
SR IOD Equipment Module as Device Resource DTID 4019 “Algorithm Identification” | 0..1 | Reference(Device | DeviceMetric) | (Measurement) Device | ||||
I | 0..* | BackboneElement | Provides guide for interpretation + Rule: Must have at least a low or a high or text | ||||
DCID 223 “Normal Range Values” - low | low | I | 0..1 | SimpleQuantity | Low Range, if relevant | ||
DCID 223 “Normal Range Values” - High | high | I | 0..1 | SimpleQuantity | High Range, if relevant | ||
$RefAuthority $RangeAuthority | type | 0..1 | CodeableConcept | Reference range qualifier Observation Reference Range Meaning Codes (Preferred) | |||
appliesTo | 0..* | CodeableConcept | Reference range population Observation Reference Range Applies To Codes (Example) | ||||
age | 0..1 | Range | Applicable age range, if relevant | ||||
text | 0..1 | string | Text based reference range in an observation | ||||
hasMember | Σ | 0..* | Reference(Observation | | Related resource that belongs to the Observation group | |||
ImagingReference to images or other DICOM IODs the measurement was derived from TID 1420 has observations the result is derived from | derivedFrom | Σ | 0..* | Reference(DocumentReference | ImagingStudy | Media | QuestionnaireResponse | Observation | MolecularSequence| ImagingReference) | Related measurements the observation is made from | ||
when do we use components vs multiple observations in SR? Component example: RECIST. This would be explanatory text in the IG. | component | Σ | 0..* | BackboneElement | Component results | ||
code | Σ | 1..1 | CodeableConcept | Type of component observation (code / type) LOINC Codes (Example) | |||
value[x] | Σ | 0..1 | Actual component result | ||||
valueQuantity | Quantity | ||||||
valueCodeableConcept | CodeableConcept | ||||||
valueString | string | ||||||
valueBoolean | boolean | ||||||
valueInteger | integer | ||||||
valueRange | Range | ||||||
valueRatio | Ratio | ||||||
valueSampledData | SampledData | ||||||
valueTime | time | ||||||
valueDateTime | dateTime | ||||||
valuePeriod | Period | ||||||
dataAbsentReason | I | 0..1 | CodeableConcept | Why the component result is missing DataAbsentReason (Extensible) | |||
interpretation | 0..* | CodeableConcept | High, low, normal, etc. Observation Interpretation Codes (Extensible) | ||||
referenceRange | 0..* | see referenceRange | Provides guide for interpretation of component result |
9 Comments
Bob Peeters
Thanks for this good initiative and clear goals. Also good input for discussion. I have one major comment on the mapping of Tracking identifiers. The (112039, DCM, "Tracking Identifier") and (112040, DCM, "Tracking Unique Identifier") should not be mapped to the Observation.identifier. The Observation.identifier is the identifier of the Observation instance. The tracking identifiers should refer to the real world object under observation (e.g. a lesion); this should be a reference (Foreign key) to another resource instance, representing the real world object (e.g. a BodyStructure or similar TBD).
Jonathan Whitby
Potential solution: Observation.focus referencing BodySite.identifier
Bob Peeters
For BodySite.identifier please read BodyStructure.identifier
Diana Ovelgoenne
I am struggling with the multiple flags on DICOM SR getting mapped to status. Which value is equivalent to what in order to do a round trip from DICOM to FHIR to DICOM without losing any value
Jonathan Whitby
Hi Diana, we talked a little about this on the last call. I think the tentative conclusion we reached was that Observation.status should match Preliminary Flag (0040,A496) only.
Completion Flag (0040,A491) is document level and does not seem to apply to a single observation extracted from an SR.
Similarly Verification Flag (0040,A493) seems like it is more appropriate to a DiagnosticReport or a Composition that includes SR-based observations rather than the observation itself.
Additionally, round trip conversion is not part of the proposed scope of this IG. In future we may look at more document-level SR-to-FHIR mappings but the focus for now is on extracting observation-level SR content.
Happy to discuss further. The next call is at 11AM Eastern time.
Diana Ovelgoenne
If I chose Diagnostic Report for encapsulating the SR Observations, which would be the code to be used? The same question applies for a Composition.section.code
Anand Jahagirdar
Observation vs Observation components:
Any comments/suggestions?
Bob Peeters
In general FHIR does not encourage using components.
Ad 1. Please read my comment on Component example: RECIST in the table above.
Anand Jahagirdar
FHIR Observation effective[x] : Which of the DICOM SR tags would map to Observation.effective ( Clinically relevant time/time-period for observation). Content Date/Time?