Ocean EhrGate - Composition Builder programming example

Introduction

In this example, the content of an openEHR Composition is created using a 'Template Data Object' (TDO), generated from an openEHR Template. The method set in the TDO corresponds to specific nodes and names within the template.

Example

An example is shown below illustrating how to get a CompositionBuilder instance and how to build a composition. 

Example: build composition for a Lipid report.

Step 1: Ensure having the following archetypes and template:

  • openEHR-EHR-COMPOSITION.report.v1
  • openEHR-EHR-OBSERVATION.laboratory-lipids.v1 
  • template id: lab_report

Step 2: [Get an EhrGate instance and log into ehrGate]

Step 3: [Finding and opening an EHR.]

Step 4: Begin a contribution for the current EHR.

ehrGate.CreateContribution();

Step 5-a: Get a CompositionBuilder instance with the known composition archetype ID.

OpenEhrV1.Composition.ICompositionBuilder lipidCompositionBuilder =
            ehrGate.CreateComposition("openEHR-EHR-COMPOSITION.report.v1");

Step 5-b: Get a CompositionBuilder instance with the known template ID. If you want to create a composition from an existing template, then you can use the code below.

OpenEhrV1.Composition.ICompositionBuilder lipidCompositionBuilder =
            ehrGate.CreateComposition("Lipids");

Step 6: Set composition name (e.g. Lipid Report) and composer name (e.g. EhrGateUnit)

lipidCompositionBuilder.SetComposition("Lipid Report", "EhrGateUnit");

Step 7: Set composition context values. Note that the appropriate EHR path (e.g. "/context/other_context/items[at0002]/items[at0004]") is required to indicate where to set the value.

// set report time and health care facility name
lipidCompositionBuilder.SetContext(new Iso8601DateTime(DateTime.Now), "Pathlab");

// Set requesting clinician name
lipidCompositionBuilder.SetTextValue(
  "/context/other_context/items[at0002]/items[at0004]",
  "Sam Heard");

// Set report Id
lipidCompositionBuilder.SetTextValue(
"/context/other_context/items[at0006]/items[at0007]",
"reportId");

// Set report status, "at0015" is an internal code, means "Final"
lipidCompositionBuilder .SetCodedValue(
"/context/other_context/items[at0006]/items[at0014]", "at0015");

// Set report issued date/time
lipidCompositionBuilder .SetDateTimeValue(
"/context/other_context/items[at0006]/items[at0013]", new Iso8601DateTime(DateTime.Now));

Step 8: Add an observation to the composition and the observation path is returned.

string observationPath = lipidCompositionBuilder .AddObservation
("/content","openEHR-EHR-OBSERVATION.laboratory-lipids.v1", "Lipids");

Step 9: Set total cholestrol value

// set total cholestrol value
string totalCholestrolPath = observationPath +
 "/data[at0001]/events[at0002] and name/value='Any event']
  /data[at0003]/items[at0013.1]";
lipidCompositionBuilder.SetQuantityValue(totalCholestrolPath, 5.2, "mmol/l");

Step 10: Set triglycerides value

// set triglycerides value
string triglyceridesPath = observationPath + "/data[at0001]/events
[at0002 and name/value='Any event']/data[t0003]/items[at0013.2]";
lipidCompositionBuilder.SetQuantityValue(triglyceridesPath, 2.2, "mmol/l");

Step 11: Set HDL value

// set HDL value
string hdlPath = observationPath +
" /data[at0001]/events[at0002 and
 name/value='Any event']/data[at0003]/items[at0011.1 and
 name/value='Fractions']/items[at0013.3 and
 name/value='HDL-Cholesterol']";
lipidCompositionBuilder.SetQuantityValue(hdlPath, 2.3, "mmol/l", hdlNormalRange);

Step 12: Set LDL value

// set LDL value
string ldlPath = observationPath +
"/data\[at0001]/events[at0002 and{color}
 name/value='Any event']/data[at0003]/items[at0011.1 and
 name/value='Fractions']/items[at0013.4 and
 name/value='LDL-Cholesterol']";
lipidCompositionBuilder .SetQuantityValue(ldlPath, 3.1, "mmol/l");

Step 13: Set ratio

// set ratio
string ratioPath = observationPath +
"/data[at0001]/events[at0002 and
 name/value='Any event']/data\[at0003]/items[at0011.1 and
 name/value='Fractions']/items[at0013.5]";
lipidCompositionBuilder .SetProportionValue(
                         ratioPath,
                         4.0F, 1F,
                         OceanEhr.OpenEhrV1.DataTypes.Quantity.ProportionKind.pkRatio,
                         true, 0);

Step 14: Set protocol details

// set speciman details
string dateTimeReceivedPath = observationPath +
 "/protocol[at0033]/items[at0039]/items[at0040]";
lipidCompositionBuilder .SetDateTimeValue(dateTimeReceivedPath,
                              new Iso8601DateTime("20070202T103234+1030"));
// Set the date and time value when the speciman was processed.
string dateTimeProcessedPath = observationPath +
"/protocol[at0033]/items[at0039]/items[at0041]";
lipidCompositionBuilder .SetDateTimeValue(dateTimeProcessedPath,
                               new Iso8601DateTime("20070202T153234+1030"));
Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.
  1. Jan 03

    Heath Frankel says:

    This composition builder approach to composing compositions was a very early imp...

    This composition builder approach to composing compositions was a very early implementation that formed a good basis for other approaches was not very appealing to developers with little experience in openEHR or XPath. It was also very verbose, error prone, hard to maintain and runtime issues when paths changed. From my perspective, this is not a viable approach.