This wiki has undergone a migration to Confluence found Here

Difference between revisions of "Laboratory Results"

From HL7 Argonaut Project Wiki
Jump to navigation Jump to search
Line 57: Line 57:
 
* a time indicating when the measurement was taken
 
* a time indicating when the measurement was taken
 
* a reference range if available
 
* a reference range if available
 +
Each Observation may have:
 +
* references to other observation if it represents a panel
  
 
===Laboratory Results Table===
 
===Laboratory Results Table===

Revision as of 05:02, 18 April 2016

Back to Argonaut Implementation Guide

Introduction

The Argonaut Laboratory Results guide provides the API documentation for searching and fetching Laboratory Results. This IG covers two resources - Observation and DiagnosticReport. It is based on the Data Access Framework (DAF) Laboratory Results and draws requirements from Argonaut Sprint 6. The search criteria provided in the Quick Start are intended to support the 2015 Edition ONC Certification criterion Data Category Request 170.315(g)(8). This IG covers two resources - Observation and DiagnosticReport - It is split into two Sections.

Argonaut Success Criteria

Clients

Servers

  • A server is capable of returning all of a patient's laboratory diagnostic reports using GET [base]/DiagnosticReport?patient=[id].
  • A server is capable of returning all of a patient's laboratory results using GET [base]/Observation?patient=[id].
  • A server has ensured that every API request includes a valid Authorization token, supplied via:Authorization: Bearer {server-specific-token-here}
  • A server has rejected any unauthorized requests by returning an HTTP 401 Unauthorized response code.

Mandatory Data Elements

The following data-elements in the Observation resource are mandatory (i.e data MUST be present). These are presented below in simple human-readable explanation and a more thorough summary of the requirements. Refer to the table for additional quidance and examples for the various laboratory tests.

Each DiagnosticReport must have:

(big issue is do we support both DR and Obs do we create separate IGs)

  • a patient
  • a code (preferably a LOINC code) which tells you what is being measured
    • note: additional codes that translate or map to these are allowed - e.g. method specific LOINC Codes, SNOMED CT concepts, system specific codes
  • at least one result (an Observation reference)
    • note: if there is no numeric result then you have to supply a reason
  • a status
  • a category code of 'LAB'
    • note: additional category codes that translate or map to these are allowed - e.g. more specific category codes such as "CH" (chemistry), SNOMED CT concepts, system specific codes
  • a time indicating when the measurement was taken
  • a time indicating when the measurement was reported
  • who issues the report


Each Observation must have:

  • a patient
  • a LOINC code which tells you what is being measured
    • note: additional codes that translate or map to these are allowed - e.g. method specific LOINC Codes, SNOMED CT concepts, system specific codes
  • a result value and if the result value is a numeric quantity, a standard UCUM unit
    • note: if there is no result then you have to supply a reason unless Observation is being used to group a panel then there is no value. Instead, it just includes composite values or related links
  • a status
  • a category code of 'laboratory'
    • note: additional category codes that translate or map to these are allowed - e.g. more specific category codes such as "chemistry', SNOMED CT concepts, system specific codes

Each Observation should have:

  • a time indicating when the measurement was taken
  • a reference range if available

Each Observation may have:

  • references to other observation if it represents a panel

Laboratory Results Table

The attached table is derived from the LOINC Top 2000+ Lab Observations and lists common LOINC observation codes for quantitative and qualitative tests for common chemistry, hematology and urinalysis results. It also list the corresponding UCUM units of measure codes for quantitative tests. The qualitative results include both 'ordinal' and 'nominal' scale. This Argonaut profile does not make the presence or absence of any of these mandatory and is provided for guidance only.

Example Laboratory tests and results

LOINC # Long Common Name UCUM Comment Example
2160-0 Creatinine [Mass/volume] in Serum or Plasma mg/dL Quantitative Test Example
718-7 Hemoglobin [Mass/volume] in Blood g/dL Quantitative Test, This is the the code included in the CBC auto. It is NOT obtained via the automated counting but uses a chemistry method just like most other hemoglobins Example
2823-3 Potassium [Moles/volume] in Serum or Plasma mmol/L Quantitative Test Example
2951-2 Sodium [Moles/volume] in Serum or Plasma mmol/L Quantitative Test Example
3094-0 Urea nitrogen [Mass/volume] in Serum or Plasma mg/dL Quantitative Test, Usually called BUN Example
2028-9 Carbon dioxide, total [Moles/volume] in Serum or Plasma mmol/L Quantitative Test Example
2075-0 Chloride [Moles/volume] in Serum or Plasma mmol/L Quantitative Test Example
789-8 Erythrocytes [#/volume] in Blood by Automated count 10*6/uL Quantitative Test Example
786-4 Erythrocyte mean corpuscular hemoglobin concentration [Mass/volume] by Automated count g/dL Quantitative Test Example
785-6 Erythrocyte mean corpuscular hemoglobin [Entitic mass] by Automated count pg Quantitative Test Example
17861-6 Calcium [Mass/volume] in Serum or Plasma mg/dL Quantitative Test Example
2339-0 Glucose [Mass/volume] in Blood mg/dL Quantitative Test Example
1975-2 Bilirubin.total [Mass/volume] in Serum or Plasma mg/dL Quantitative Test, Total bilirubin = direct + indirect. Example
770-8 Neutrophils/100 leukocytes in Blood by Automated count % Quantitative Test, This cell type is counted by all modern automated differential machines; so most results will be reported under the LOINC code with method of automated count. Example
5778-6 Color of Urine Qualitative Test (Nominal) Example
32167-9 Clarity of Urine Qualitative Test (Nominal) Example
25428-4 Glucose [Presence] in Urine by Test strip Qualitative Test (Ordinal) Example
5770-3 Bilirubin.total [Presence] in Urine by Test strip Qualitative Test (Ordinal) Example
2514-8 Ketones [Presence] in Urine by Test strip Qualitative Test (Ordinal) Example
5811-5 Specific gravity of Urine by Test strip Quantitative Test Example
5803-2 pH of Urine by Test strip [pH] Quantitative Test Example
20454-5 Protein [Presence] in Urine by Test strip Qualitative Test (Ordinal) Example
20405-7 Urobilinogen [Mass/volume] in Urine by Test strip mg/dL Quantitative Test Example
5802-4 Nitrite [Presence] in Urine by Test strip Qualitative Test (Ordinal) Example
5794-3 Hemoglobin [Presence] in Urine by Test strip Qualitative Test (Ordinal) Example
5799-2 Leukocyte esterase [Presence] in Urine by Test strip Qualitative Test (Ordinal) Example
11279-7 Urine sediment comments by Light microscopy Narrative Narrative Test Example
25145-4 Bacteria [Presence] in Urine sediment by Light microscopy Qualitative Test (Ordinal) Example
5787-7 Epithelial cells [#/area] in Urine sediment by Microscopy high power field /[HPF] Semi-Quantitative Test. Although reported as a range this is probably an ordinal list ( e.g. 1-10, 10-40, 40+) Example
5821-4 Leukocytes [#/area] in Urine sediment by Microscopy high power field /[HPF] Semi-Quantitative Test Although reported as a range this is probably an ordinal list ( e.g. 1-10, 10-40, 40+) Example
13945-1 Erythrocytes [#/area] in Urine sediment by Microscopy high power field /[HPF] Semi-Quantitative Test Although reported as a range this is probably an ordinal list ( e.g. 1-10, 10-40, 40+) Example
... ... ... ... ...

Complete Summary of the Mandatory Requirements

  1. One status in Observation.status
  2. One category in Observation.category which must have:
  3. One code in Observation.code which must have
    • a fixed Observation.code.coding.system="http://loinc.org"
    • a LOINC code in Observation.code.coding.code
    • Other additional codes are allowed - e.g. method specific LOINC Codes, SNOMED CT concepts, system specific codes. All codes SHALL have an system value
  4. Either one Observation.value[x] or, if there is no value, one code in Observation.DataAbsentReason (Note: An exception is when the Observation.code is a panel )
    • Each Observation.valueQuantity must have:
      • One numeric value in Observation.valueQuantity.value
      • a fixed Observation.valueQuantity.system="http://unitsofmeasure.org"
      • a UCUM unit code in Observation.valueQuantity.code taken from the "Units" column in the table
    • Observation.DataAbsentReason is bound to Observation Value Absent Reason Value set (Code set)
    • Each Observation.valueCodeableConcept must have either a:
      • a code in Observation.valueCodeableConcept.coding.code and code system in Observation.valueCodeableConcept.coding.sytem
        • SNOMED CT is preferred
      • OR a text in Observation.valueCodeableConcept.text
  5. When using a panel code to group observations, one or more reference to Observations in Observation.related.target (Note: for panels there is no value in Observation.value[x] or Observation.dataAbsentReason )
    • a fixed Observation.related.type="has-member"
  6. One patient in Observation.subject

Each Observation should have:

  1. A date and time in effectiveDateTime or effectivePeriod
  2. Each Observation should have a Observation.referenceRange if applicable

Quick Start

Below is a quick overview of the required search and read operations

GET [base]/DiagnosticReport?patient=[id]&category=LAB

Support: Mandatory to support search by category code = LAB.

Implementation Notes: Search based on diagnostic report category code = 'LAB'. This fetches a bundle of all lab related DiagnosticReports resources for the specified patient (how to search by reference) and (how to search by token).

Response Class:

  • (Status 200): successful operation
  • (Status 400): invalid parameter
  • (Status 401/4xx): unauthorized request
  • (Status 403): insufficient scope

Example:

[GET http://spark.furore.com/fhir/DiagnosticReport?patient=f201&category=LAB]

GET [base]/Observation?patient=[id]&category=laboratory

Support: Mandatory to support search by category code = laboratory

Implementation Notes: Search based on laboratory category code = "laboratory". This fetches a bundle of all Observation resources with laboratory categories for the specified patient (how to search by reference) and (how to search by token).

Response Class:

  • (Status 200): successful operation
  • (Status 400): invalid parameter
  • (Status 401/4xx): unauthorized request
  • (Status 403): insufficient scope

Example:

[GET https://fhir-open-api-dstu2.smarthealthit.org/Observation?patient=1134281&category=laboratory]

GET [base]/DiagnosticReport?patient=[id]&code=[Laboratory order LOINC]

Support: SHOULD support search DiagnosticReport by laboratory order codes

Implementation Notes: Search based on Diagnostic report code. This fetches a bundle of all DiagnosticReport resources for a specific diagnostic order code for the specified patient (how to search by reference) and (how to search by token).

Response Class:

  • (Status 200): successful operation
  • (Status 400): invalid parameter
  • (Status 401/4xx): unauthorized request
  • (Status 403): insufficient scope

Example:)

Search for all heart rate observations for a patient:
[GET https://fhir-open-api-dstu2.smarthealthit.org/DiagnosticOrder?patient=1186747&code=8867-4] 

GET [base]/Observation?patient=[id]&code=[Laboratory order LOINC]

Support: SHOULD support search Observation by laboratory LOINCs.

Implementation Notes: Search based on laboratory LOINC code. This fetches a bundle of all DiagnosticReport resources for a specific observation LOINC code for the specified patient (how to search by reference) and (how to search by token).

Response Class:

  • (Status 200): successful operation
  • (Status 400): invalid parameter
  • (Status 401/4xx): unauthorized request
  • (Status 403): insufficient scope

Example:)

Search for all heart rate observations for a patient:
[GET https://fhir-open-api-dstu2.smarthealthit.org/Observation?patient=1186747&code=8867-4]

GET [base]/Observation?patient=[id]&code=[lab1 LOINC, lab2 LOINC, etc]

(TODO_repeat for DR)

Support: SHOULD support Observation search by multiple LOINCs. .

Implementation Notes: Search based on multiple laboratory LOINC codes. This fetches a bundle of all Observation resources for specific laboratory results listed in the table above for the specified patient (how to search by reference) and (how to search by token) and (how to search for multiple values)

Response Class:

  • (Status 200): successful operation
  • (Status 400): invalid parameter
  • (Status 401/4xx): unauthorized request
  • (Status 403): insufficient scope

Example:

Search for all heart rate, respiratory rate and blood pressure observations for a patient
[GET https://fhir-open-api-dstu2.smarthealthit.org/Observation?patient=1186747&code=8867-4,9279-1,55284-4]

GET [base]/Observation?patient=[id]&category=laboratory=[eq|lt|gt|geyyyy-mm-dd]

(repeat for DR)

Support: SHOULD support search by category code and date

Implementation Notes: Search based on laboratory category code and date. This fetches a bundle of all Observation resources with category 'vital-signs' for the specified patient for a specified time period (how to search by reference)and (how to search by token) and (how to search by date).

Response Class:

  • (Status 200): successful operation
  • (Status 400): invalid parameter
  • (Status 401/4xx): unauthorized request
  • (Status 403): insufficient scope

Example:

Find all the laboratory results after 2013-03-14
[GET http://fhir2.healthintersections.com.au/open/Observation?patient=555580&category=laboratory&date=ge2015-01-14]

Open Issues

Issues for the vitals IG have been identified and tracked HERE

TODO - complete examples for qualitative tests.


Resources

Formalized testing with test scripts and objective results reporting is available through the participation of AEGIS and MITRE (Crucible). The testscript provided can be used to test servers: [todo]

References



Back to Argonaut Implementation Guide