Skip to content

Results Section

Template ID: 2.16.840.1.113883.10.20.22.2.3.1 Version: R2.1 (2015-08-01) Badge: Core Section

Overview

The Results Section contains laboratory test results, diagnostic test results, and other clinical observations grouped into panels or organizers. This section is fundamental for documenting diagnostic findings and monitoring patient health status over time.

Clinical Purpose and Context

The Results Section records: - Laboratory test results (chemistry, hematology, microbiology) - Diagnostic test results (imaging reports as observations, pathology) - Panel/battery results grouped logically - Reference ranges and interpretations - Result status (preliminary, final, corrected)

This information is essential for: - Clinical diagnosis and monitoring - Treatment decision-making - Disease progression tracking - Quality measurement and reporting - Care coordination across providers - Meeting Meaningful Use requirements

When to Include

The Results Section is commonly included in: - Continuity of Care Documents (CCD) - Discharge Summaries - Consultation Notes - Progress Notes - Transfer Summaries

The section is optional in many document types but highly recommended when laboratory or diagnostic test results are relevant to patient care.

Template Details

Official OID

  • Root: 2.16.840.1.113883.10.20.22.2.3.1
  • Extension: 2015-08-01 (V3)

Conformance Level

  • Conformance: MAY or SHOULD (depending on document type)
  • Section Code: 30954-2 (LOINC - "Relevant diagnostic tests and/or laboratory data")

Cardinality

  • Section: 0..1 (Optional in most document types)
  • Entries: 1..* (If section is present, at least one Result Organizer entry is required)
  • Result Organizer (V3): 2.16.840.1.113883.10.20.22.4.1:2015-08-01
  • Result Observation (V3): 2.16.840.1.113883.10.20.22.4.2:2015-08-01

Protocol Requirements

The results data model uses two protocols: ResultObservationProtocol for individual test results and ResultOrganizerProtocol for grouping related results into panels.

ResultObservationProtocol (Individual Test)

Required Properties

Property Type Description
test_name str Name of the test (e.g., "Glucose", "Hemoglobin")
test_code str LOINC code for the test
value str Measured value (numeric or text)
status str Status: 'completed', 'preliminary', 'final', 'corrected'
effective_time date or datetime Date and time the test was performed

Optional Properties

Property Type Description
unit Optional[str] Unit of measurement (UCUM)
value_type Optional[str] Type: "PQ" (quantity), "CD" (coded), "ST" (string)
interpretation Optional[str] Interpretation: "N", "H", "L", "HH", "LL"
reference_range_low Optional[str] Lower bound of reference range
reference_range_high Optional[str] Upper bound of reference range
reference_range_unit Optional[str] Unit for reference range

ResultOrganizerProtocol (Panel/Battery)

Required Properties

Property Type Description
panel_name str Name of the panel (e.g., "Complete Blood Count")
panel_code str LOINC code for the panel
status str Status: 'completed', 'active', 'aborted'
effective_time date or datetime Date when panel was collected/performed
results Sequence[ResultObservationProtocol] List of result observations

Data Types and Constraints

  • test_name/panel_name: Human-readable test or panel name
  • test_code/panel_code: LOINC codes (preferred vocabulary for lab tests)
  • value: String representation of measurement (numeric values as strings)
  • unit: UCUM standard units (e.g., "mg/dL", "g/dL", "10*3/uL")
  • value_type: Determines XML representation (PQ for quantities, ST for text)
  • interpretation: Standard observation interpretation codes
  • status: Reflects completion state and reliability
  • effective_time: When specimen was collected or test performed

Code Example

Here's a complete working example using ccdakit to create a Results Section:

from datetime import datetime
from ccdakit.builders.sections.results import ResultsSection
from ccdakit.core.base import CDAVersion

# Define a result observation
class ResultObservation:
    def __init__(self, test_name, test_code, value, status, effective_time,
                 unit=None, value_type=None, interpretation=None,
                 reference_range_low=None, reference_range_high=None,
                 reference_range_unit=None):
        self.test_name = test_name
        self.test_code = test_code
        self.value = value
        self.unit = unit
        self.status = status
        self.effective_time = effective_time
        self.value_type = value_type
        self.interpretation = interpretation
        self.reference_range_low = reference_range_low
        self.reference_range_high = reference_range_high
        self.reference_range_unit = reference_range_unit

# Define a result organizer
class ResultOrganizer:
    def __init__(self, panel_name, panel_code, status, effective_time, results):
        self.panel_name = panel_name
        self.panel_code = panel_code
        self.status = status
        self.effective_time = effective_time
        self.results = results

# Create result observations for a Complete Blood Count panel
collection_time = datetime(2023, 10, 18, 8, 30)

cbc_results = [
    ResultObservation(
        test_name="Hemoglobin",
        test_code="718-7",
        value="14.5",
        unit="g/dL",
        status="final",
        effective_time=collection_time,
        interpretation="N",
        reference_range_low="12.0",
        reference_range_high="16.0",
        reference_range_unit="g/dL"
    ),
    ResultObservation(
        test_name="Hematocrit",
        test_code="4544-3",
        value="42.0",
        unit="%",
        status="final",
        effective_time=collection_time,
        interpretation="N",
        reference_range_low="36.0",
        reference_range_high="46.0",
        reference_range_unit="%"
    ),
    ResultObservation(
        test_name="White Blood Cell Count",
        test_code="6690-2",
        value="7.2",
        unit="10*3/uL",
        status="final",
        effective_time=collection_time,
        interpretation="N",
        reference_range_low="4.5",
        reference_range_high="11.0",
        reference_range_unit="10*3/uL"
    ),
    ResultObservation(
        test_name="Platelet Count",
        test_code="777-3",
        value="250",
        unit="10*3/uL",
        status="final",
        effective_time=collection_time,
        interpretation="N",
        reference_range_low="150",
        reference_range_high="400",
        reference_range_unit="10*3/uL"
    )
]

# Create result observations for a Basic Metabolic Panel
bmp_results = [
    ResultObservation(
        test_name="Glucose",
        test_code="2345-7",
        value="105",
        unit="mg/dL",
        status="final",
        effective_time=collection_time,
        interpretation="H",
        reference_range_low="70",
        reference_range_high="100",
        reference_range_unit="mg/dL"
    ),
    ResultObservation(
        test_name="Creatinine",
        test_code="2160-0",
        value="0.9",
        unit="mg/dL",
        status="final",
        effective_time=collection_time,
        interpretation="N",
        reference_range_low="0.6",
        reference_range_high="1.2",
        reference_range_unit="mg/dL"
    ),
    ResultObservation(
        test_name="Sodium",
        test_code="2951-2",
        value="140",
        unit="mmol/L",
        status="final",
        effective_time=collection_time,
        interpretation="N",
        reference_range_low="135",
        reference_range_high="145",
        reference_range_unit="mmol/L"
    ),
    ResultObservation(
        test_name="Potassium",
        test_code="2823-3",
        value="4.2",
        unit="mmol/L",
        status="final",
        effective_time=collection_time,
        interpretation="N",
        reference_range_low="3.5",
        reference_range_high="5.0",
        reference_range_unit="mmol/L"
    )
]

# Create result organizers
organizers = [
    ResultOrganizer(
        panel_name="Complete Blood Count",
        panel_code="58410-2",
        status="completed",
        effective_time=collection_time,
        results=cbc_results
    ),
    ResultOrganizer(
        panel_name="Basic Metabolic Panel",
        panel_code="51990-0",
        status="completed",
        effective_time=collection_time,
        results=bmp_results
    )
]

# Build the Results Section
section_builder = ResultsSection(
    result_organizers=organizers,
    title="Results",
    version=CDAVersion.R2_1
)

# Generate XML element
section_element = section_builder.build()

# Convert to XML string (for demonstration)
from lxml import etree
xml_string = etree.tostring(section_element, pretty_print=True, encoding='unicode')
print(xml_string)

Official Reference

For complete specification details, refer to the official HL7 C-CDA R2.1 documentation: - HL7 C-CDA R2.1 Implementation Guide - Section: 5.48 - Results Section (entries required)

Additional resources: - LOINC Database - UCUM Unit Codes

Best Practices

Common Patterns

  1. Use LOINC Codes Consistently
  2. LOINC is the required vocabulary for laboratory tests
  3. Use specific codes (e.g., 2345-7 for serum glucose)
  4. Panel codes group related tests (e.g., 58410-2 for CBC)
  5. Verify codes in LOINC database

  6. Group Related Tests in Organizers

  7. Use organizers to represent laboratory panels
  8. Common panels: CBC, CMP, BMP, Lipid Panel, Liver Function
  9. Maintains clinical context and ordering relationships
  10. Supports laboratory workflow representation

  11. Include Reference Ranges

  12. Reference ranges provide context for interpretation
  13. Essential for automated decision support
  14. May vary by age, sex, and laboratory
  15. Include both low and high bounds when applicable

  16. Document Result Interpretations

  17. Use standard codes: N (Normal), H (High), L (Low), HH (Critically High), LL (Critically Low)
  18. Supports clinical alerting and decision support
  19. Helps identify abnormal values quickly
  20. Important for quality measurement

  21. Track Result Status

  22. 'preliminary' for unverified results
  23. 'final' for verified results
  24. 'corrected' for amended results
  25. Supports laboratory workflow and clinical confidence

Validation Tips

  1. Section Code Validation
  2. Ensure section code is 30954-2 (LOINC)
  3. This is automatically set by the builder

  4. Template ID Validation

  5. Verify template ID includes extension="2015-08-01"
  6. V3 is the current version for R2.1

  7. LOINC Code Validation

  8. Verify test codes are valid LOINC codes
  9. Verify panel codes represent batteries/panels
  10. Use LOINC search tool for validation
  11. Check for deprecated codes

  12. Unit Validation

  13. Use UCUM standard units
  14. Case-sensitive: "mg/dL" not "MG/DL"
  15. Special syntax: "10*3/uL" for thousands per microliter
  16. Validate with UCUM validator

  17. Value Type Consistency

  18. PQ (Physical Quantity): numeric values with units
  19. ST (String): text values without units
  20. CD (Coded): coded values from value sets
  21. Choose appropriate type for result

Gotchas to Avoid

  1. Missing Organizer Structure
  2. Results must be wrapped in organizers
  3. Don't add observations directly to section
  4. Even single results need an organizer
  5. Organizer represents the order/panel

  6. Incorrect UCUM Units

  7. Must use exact UCUM syntax
  8. Case-sensitive
  9. Special characters: "10*3/uL" not "K/uL"
  10. Brackets for special units: "[pH]"

  11. Incomplete Reference Ranges

  12. Include both low and high when possible
  13. Use same units as result value
  14. Some tests only have upper or lower limit
  15. Don't fabricate ranges if unknown

  16. Status Confusion

  17. Organizer status vs. observation status
  18. Both should typically be aligned
  19. 'completed' organizer contains 'final' observations
  20. Track amendments with 'corrected' status

  21. Missing Interpretation

  22. While optional, interpretations are valuable
  23. Supports clinical decision-making
  24. Required for many quality measures
  25. Can be calculated if reference range provided

  26. Date/Time Precision

  27. Use collection time, not report time
  28. Time precision important for serial measurements
  29. Supports trending and correlation
  30. Use datetime for time-critical tests

  31. Panel Code Selection

  32. Use specific panel codes, not generic ones
  33. Different panels have different LOINC codes
  34. "Basic Metabolic Panel" ≠ "Comprehensive Metabolic Panel"
  35. Check laboratory's panel definition

  36. Mixing Panel Components

  37. Keep panel components together in one organizer
  38. Don't split CBC components across organizers
  39. Maintains clinical and workflow context
  40. Reflects how tests were ordered

  41. Text vs. Numeric Values

  42. Use appropriate value_type
  43. Numeric values should use PQ (with unit)
  44. Text results (e.g., "Positive") should use ST or CD
  45. Don't put text in PQ values

  46. Microbiology Results

    • Microbiology can be complex (organism, sensitivity)
    • Consider using CD for organism identification
    • Susceptibility testing may need multiple observations
    • May require specialized result structures
  47. Imaging Results

    • Brief imaging findings can be observations
    • Full reports should be in Imaging Results section or as external document
    • Don't put lengthy narrative in result value
    • Consider DICOM references for images
  48. Critical Values

    • Use HH (Critically High) or LL (Critically Low)
    • Important for clinical alerting
    • May trigger specific workflows
    • Document follow-up actions
  49. Historical Results

    • Consider including previous results for trending
    • Use separate organizers for different collection times
    • Don't mix results from different dates in same organizer
    • Temporal context is critical
  50. Corrected Results

    • Use status='corrected' for amendments
    • Consider including original value in comments
    • Document reason for correction if known
    • Important for patient safety
  51. Narrative-Entry Consistency

    • Ensure narrative table matches structured entries
    • Builder handles this automatically
    • Include key details: value, unit, interpretation, reference range in narrative
    • Critical for human readers
  52. Pending Results

    • Don't include results that haven't been resulted yet
    • Use status='preliminary' for unverified results
    • Don't use placeholder values
    • Results section is for actual results, not orders