SGHI FHIR Profile Implementation Guide
0.1.0 - ci-build
SGHI FHIR Profile Implementation Guide, published by Kathurima Kimathi. This guide is not an authorized publication; it is the continuous build for version 0.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/savannahghi/sil_fhir_profile_ig/ and changes regularly. See the Directory of published versions
| Active as of 2026-09-15 |
{
"resourceType" : "StructureMap",
"id" : "GlasgowCommaScaleExtract",
"text" : {
"status" : "generated",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p class=\"res-header-id\"><b>Generated Narrative: StructureMap GlasgowCommaScaleExtract</b></p><a name=\"GlasgowCommaScaleExtract\"> </a><a name=\"hcGlasgowCommaScaleExtract\"> </a><pre class=\"fml\">\r\n<span style=\"color: #cc00cc\">/// <b>url</b> = </span><span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/StructureMap/GlasgowCommaScaleExtract'</span>\r\n<span style=\"color: #cc00cc\">/// <b>name</b> = </span><span style=\"color: blue\">'GlasgowCommaScaleExtract'</span>\r\n<span style=\"color: #cc00cc\">/// <b>title</b> = </span><span style=\"color: blue\">'Glasgow Coma Scale Extraction'</span>\r\n<span style=\"color: #cc00cc\">/// <b>status</b> = </span><span style=\"color: blue\">'active'</span>\r\n<span style=\"color: #cc00cc\">/// <b>description</b> = </span><span style=\"color: blue\">'One Observation for the Glasgow Coma Scale, carrying the total as its value, the eye, verbal and motor sub-scores as components, and the severity band the total falls in as its interpretation. The total prefers the calculated total the form submits and falls back to summing the answer weights itself, so the score still extracts from a client that does not evaluate SDC expressions.'</span>\r\n\r\n<b>uses</b><span style=\"color: navy\"> "</span><a href=\"http://hl7.org/fhir/R5/questionnaireresponse.html\" title=\"QuestionnaireResponse\">http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse</a><span style=\"color: navy\">" </span><b>alias </b>QR <b>as </b><b>source</b>\r\n<b>uses</b><span style=\"color: navy\"> "</span><a href=\"http://hl7.org/fhir/R5/bundle.html\" title=\"Bundle\">http://hl7.org/fhir/StructureDefinition/Bundle</a><span style=\"color: navy\">" </span><b>alias </b>Bundle <b>as </b><b>target</b>\r\n<b>uses</b><span style=\"color: navy\"> "</span><a href=\"http://hl7.org/fhir/R5/observation.html\" title=\"Observation\">http://hl7.org/fhir/StructureDefinition/Observation</a><span style=\"color: navy\">" </span><b>alias </b>Observation <b>as </b><b>target</b>\r\n\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">This map used to emit the three sub-scores as three loose Observations and no</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">total, which left nothing to band and nothing to read as "the GCS". It now</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">produces the same shape as ExtractInpatientCriticalCareAssessment: one</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Observation with three components. Nothing was consuming the old shape --</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">the questionnaire typed its three items `group` and hung an answerValueSet off</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">them, and a group carries no answer, so no conformant response ever put a value</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">into those Observations. The questionnaire is fixed alongside this map.</span>\r\n<b>group </b>GlasgowCommaScaleExtract<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">bundle</span><span style=\"color: navy\"> : </span>Bundle<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>bundle.type = <span style=\"color: blue\">'transaction'</span> <i>"setBundleType"</i><span style=\"color: navy\">;</span>\r\n qr<b> where </b><span style=\"color: navy\">(</span>item.where(linkId in ('eye-opening' | 'verbal-response' | 'motor-response')).answer.value.ofType(Coding).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">obs</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span> obs<span style=\"color: navy\">, </span> entry<b> then </b>BuildObsBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"base"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs<b> then </b>SetSurveyCategory<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>"category"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"codeSystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'9269-2'</span> <i>"codeCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Glasgow coma score total'</span> <i>"codeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"code"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">The submitted total wins; otherwise sum the answers. The form's total item</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">carries the same sum as an SDC calculatedExpression, so the two paths are</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">the same arithmetic and cannot disagree; the fallback is there for a client</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">that does not evaluate SDC.</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">One lookup covers all three sub-scores. Eye runs 1 to 4, verbal 1 to 5 and</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">motor 1 to 6, and no LOINC answer code appears in more than one of the</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">three lists, so a code determines its weight on its own.</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">Guarded on all three sub-scores being present. A GCS of 7 summed from eye</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">and motor alone reads as a comatose patient; the components still extract,</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">but the total does not, because a partial GCS is not a GCS.</span>\r\n qr<b> where </b><span style=\"color: navy\">(</span>item.where(linkId in ('eye-opening' | 'verbal-response' | 'motor-response')).answer.value.ofType(Coding).count() = 3<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>obs.value = evaluate<span style=\"color: navy\">(</span>qr<span style=\"color: navy\">, </span>iif(item.where(linkId = 'gcs-total').answer.value.exists(), item.where(linkId = 'gcs-total').answer.value, item.where(linkId in ('eye-opening' | 'verbal-response' | 'motor-response')).answer.value.ofType(Coding).code.select(iif($this in ('LA6553-7' | 'LA6557-8' | 'LA6562-8'), 1, iif($this in ('LA6554-5' | 'LA6558-6' | 'LA6563-6'), 2, iif($this in ('LA6555-2' | 'LA6559-4' | 'LA6564-4'), 3, iif($this in ('LA6556-0' | 'LA6560-2' | 'LA6565-1'), 4, iif($this in ('LA6561-0' | 'LA6566-9'), 5, iif($this = 'LA6567-7', 6, 0))))))).aggregate($this + $total, 0))<span style=\"color: navy\">)</span> <i>"totalValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"totalRule"</i><span style=\"color: navy\">;</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'eye-opening') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span>obs.component<b> as </b><span style=\"color: maroon\">comp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>comp.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"codeSystem"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'9267-6'</span> <i>"codeCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Glasgow coma score eye opening'</span> <i>"codeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"eyeCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>comp<b> then </b>SetComponentCodedValue<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span> <i>"eyeValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"eyeRule"</i><span style=\"color: navy\">;</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'verbal-response') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span>obs.component<b> as </b><span style=\"color: maroon\">comp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>comp.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"codeSystem"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'9270-0'</span> <i>"codeCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Glasgow coma score verbal'</span> <i>"codeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"verbalCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>comp<b> then </b>SetComponentCodedValue<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span> <i>"verbalValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"verbalRule"</i><span style=\"color: navy\">;</span>\r\n qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'motor-response') and answer.value.exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span>obs.component<b> as </b><span style=\"color: maroon\">comp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>comp.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> it<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>"codeSystem"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'9268-4'</span> <i>"codeCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Glasgow coma score motor'</span> <i>"codeDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codeCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"motorCode"</i><span style=\"color: navy\">;</span>\r\n it<span style=\"color: navy\"><b> -> </b></span>comp<b> then </b>SetComponentCodedValue<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span> <i>"motorValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"motorRule"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs<b> then </b>AddGlasgowInterpretation<span style=\"color: navy\">(</span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>"interpretation"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"glasgowRule"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The band</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Teasdale and Jennett's three tiers, as every ward and ambulance service reads</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">them: 13-15 mild, 9-12 moderate, 3-8 severe. Lower is worse, and the scale</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">bottoms out at 3, not 0.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">This is an Observation.interpretation and not a RiskAssessment. A Glasgow Coma</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Score says what a patient's consciousness is now; RiskAssessment models the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">likelihood of a future outcome. Braden and Morse do predict one -- a pressure</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">injury, a fall -- and keep their RiskAssessments; this does not.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The published wording is "mild, moderate and severe brain injury", which is</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">how the scale was introduced and how trauma services still say it. It is</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">written as impairment of consciousness here because the same scale is read on</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">a patient in a diabetic coma or a post-ictal state, where nothing has injured</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">the brain and the tier still means what it means.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The coding comes from SGHIObservationInterpretation, the value set this IG</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">binds Observation.interpretation to, which offers LL, L, N, H, HH and A.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Mild and moderate both take L. The low axis has two rungs, and the threshold</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">worth spending LL on is 8 -- the point below which a patient stops reliably</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">protecting their own airway. That is what a consumer escalates on. Nothing is</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">minted to separate mild from moderate: the tier is a published function of a</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">number this same Observation already carries in its value, so a consumer that</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">needs the exact tier reads the score rather than a second code.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">A Glasgow Coma Score of 15 is normal and still reads L, because the published</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">band is 13-15 and one code has to cover it. Flagging a normal score is the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">safe direction to be wrong in; missing a deficit is not.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<b>group </b>AddGlasgowInterpretation<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation, <b>target</b> <span style=\"color: maroon\">tgt</span><span style=\"color: navy\"> : </span>Observation<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> obs<b> where </b><span style=\"color: navy\">(</span>value.ofType(integer) <= 8<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span>tgt.interpretation<b> as </b><span style=\"color: maroon\">interp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> obs<span style=\"color: navy\"><b> -> </b></span>interp.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> obs<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation'</span> <i>"interpSystem"</i><span style=\"color: navy\">;</span>\r\n obs<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'LL'</span> <i>"interpCode"</i><span style=\"color: navy\">;</span>\r\n obs<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Critical low'</span> <i>"interpDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"interpCoding"</i><span style=\"color: navy\">;</span>\r\n obs<span style=\"color: navy\"><b> -> </b></span>interp.text = <span style=\"color: blue\">'Severe impairment of consciousness (GCS 3-8)'</span> <i>"interpText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"glasgowSevere"</i><span style=\"color: navy\">;</span>\r\n obs<b> where </b><span style=\"color: navy\">(</span>(value.ofType(integer) >= 9) and (value.ofType(integer) <= 12)<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span>tgt.interpretation<b> as </b><span style=\"color: maroon\">interp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> obs<span style=\"color: navy\"><b> -> </b></span>interp.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> obs<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation'</span> <i>"interpSystem"</i><span style=\"color: navy\">;</span>\r\n obs<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'L'</span> <i>"interpCode"</i><span style=\"color: navy\">;</span>\r\n obs<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Low'</span> <i>"interpDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"interpCoding"</i><span style=\"color: navy\">;</span>\r\n obs<span style=\"color: navy\"><b> -> </b></span>interp.text = <span style=\"color: blue\">'Moderate impairment of consciousness (GCS 9-12)'</span> <i>"interpText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"glasgowModerate"</i><span style=\"color: navy\">;</span>\r\n obs<b> where </b><span style=\"color: navy\">(</span>value.ofType(integer) >= 13<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span>tgt.interpretation<b> as </b><span style=\"color: maroon\">interp</span><b> then</b><span style=\"color: navy\"> {\r\n</span> obs<span style=\"color: navy\"><b> -> </b></span>interp.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> obs<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation'</span> <i>"interpSystem"</i><span style=\"color: navy\">;</span>\r\n obs<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'L'</span> <i>"interpCode"</i><span style=\"color: navy\">;</span>\r\n obs<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Low'</span> <i>"interpDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"interpCoding"</i><span style=\"color: navy\">;</span>\r\n obs<span style=\"color: navy\"><b> -> </b></span>interp.text = <span style=\"color: blue\">'Mild impairment of consciousness (GCS 13-15)'</span> <i>"interpText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"glasgowMild"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Shared scaffolding. Repeated in each map rather than imported: the transform</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">engine resolves `imports` against whatever StructureMaps happen to be on the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">server, and a form that stops extracting because a shared map was not</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">uploaded is a worse failure than a duplicated group.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Two notes on what the publisher's StructureMap validator says about this file.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Source parameters below are left untyped on purpose. Writing `: Element` makes</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">the validator compare QuestionnaireResponse.item against the literal 'Element'</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">and report them as incompatible with each other, which is noise, not a finding.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Untyped, it says only that it cannot check the paths.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">`evaluate(context, expression)` is flagged as "takes 1 parameter but 2 were</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">found". Leave it. The FML parser in the same jar refuses the one-argument form</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">outright -- it wants a parameter, a comma, then the FHIRPath -- so the publisher</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">is objecting to what its own compiler emits. Two arguments is the only form that</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">compiles, and it is what the R5 transform engine executes.</span>\r\n<b>group </b>BuildObsBase<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>obs.id = <b>uuid</b><span style=\"color: navy\">(</span><span style=\"color: navy\">)</span><b> then </b>SetObservationFullUrl<span style=\"color: navy\">(</span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>"idAndFullUrl"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>entry.request<b> as </b><span style=\"color: maroon\">request</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>request.method = <span style=\"color: blue\">'POST'</span> <i>"requestMethod"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>request.url = <span style=\"color: blue\">'Observation'</span> <i>"requestUrl"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"entryRequest"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>obs.status = <span style=\"color: blue\">'final'</span> <i>"status"</i><span style=\"color: navy\">;</span>\r\n qr.subject<b> as </b><span style=\"color: maroon\">s</span><span style=\"color: navy\"><b> -> </b></span>obs.subject = <span style=\"color: maroon\">s</span><span style=\"color: navy\">;</span>\r\n qr.encounter<b> as </b><span style=\"color: maroon\">e</span><span style=\"color: navy\"><b> -> </b></span>obs.encounter = <span style=\"color: maroon\">e</span><span style=\"color: navy\">;</span>\r\n qr.authored<b> as </b><span style=\"color: maroon\">t</span><span style=\"color: navy\"><b> -> </b></span>obs.effective = <span style=\"color: maroon\">t</span> <i>"effective"</i><span style=\"color: navy\">;</span>\r\n qr.source<b> as </b><span style=\"color: maroon\">src</span><span style=\"color: navy\"><b> -> </b></span>obs.performer = <span style=\"color: maroon\">src</span> <i>"performerFromSource"</i><span style=\"color: navy\">;</span>\r\n qr<b> where </b><span style=\"color: navy\">(</span>source.exists().not()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr.author<b> as </b><span style=\"color: maroon\">a</span><span style=\"color: navy\"><b> -> </b></span>obs.performer = <span style=\"color: maroon\">a</span> <i>"performerFromAuthor"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"performerFallback"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">A stored response's id already reads "QuestionnaireResponse/<id>", so it is a</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">relative reference as it stands. The hasValue() guard is what stops an</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">unsaved response -- one posted straight to $extract rather than saved first --</span>\r\n <span style=\"color: navy\">// </span><span style=\"color: green\">from writing "QuestionnaireResponse/null" into the record.</span>\r\n qr.id<b> as </b><span style=\"color: maroon\">qid</span><b> where </b><span style=\"color: navy\">(</span>$this.hasValue()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -> </b></span> obs.derivedFrom = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Reference'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">ref</span><span style=\"color: navy\">, </span> ref.reference = <span style=\"color: maroon\">qid</span> <i>"linkQuestionnaireResponse"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetComponentCodedValue<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">it</span>, <b>target</b> <span style=\"color: maroon\">comp</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span> a.value<b> as </b><span style=\"color: maroon\">cv</span><span style=\"color: navy\"><b> -> </b></span>comp.value = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'CodeableConcept'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">cc</span><b> then</b><span style=\"color: navy\"> {\r\n</span> cv<span style=\"color: navy\"><b> -> </b></span>cc.coding = <span style=\"color: maroon\">cv</span> <i>"valueCoding"</i><span style=\"color: navy\">;</span>\r\n cv.display<b> as </b><span style=\"color: maroon\">d</span><span style=\"color: navy\"><b> -> </b></span>cc.text = <span style=\"color: maroon\">d</span> <i>"valueText"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"codedValue"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"componentAnswer"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetSurveyCategory<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>obs.category<b> as </b><span style=\"color: maroon\">cat</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>cat.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span> qr<span style=\"color: navy\"><b> -> </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/observation-category'</span> <i>"categorySystem"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.code = <span style=\"color: blue\">'survey'</span> <i>"categoryCode"</i><span style=\"color: navy\">;</span>\r\n qr<span style=\"color: navy\"><b> -> </b></span>coding.display = <span style=\"color: blue\">'Survey'</span> <i>"categoryDisplay"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"categoryCoding"</i><span style=\"color: navy\">;</span>\r\n <span style=\"color: navy\">}</span> <i>"category"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetObservationFullUrl<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span> obs.id<b> as </b><span style=\"color: maroon\">id</span><span style=\"color: navy\"><b> -> </b></span>entry.fullUrl = <b>append</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/Observation/'</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">id</span><span style=\"color: navy\">)</span> <i>"assignFullUrl"</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span></pre></div>"
},
"url" : "https://fhir.slade360.co.ke/fhir/StructureMap/GlasgowCommaScaleExtract",
"version" : "0.1.0",
"name" : "GlasgowCommaScaleExtract",
"title" : "Glasgow Coma Scale Extraction",
"status" : "active",
"date" : "2026-09-15T11:40:24+00:00",
"publisher" : "Kathurima Kimathi",
"contact" : [
{
"name" : "Kathurima Kimathi",
"telecom" : [
{
"system" : "url",
"value" : "https://www.linkedin.com/in/kathurima-kimathi/"
},
{
"system" : "email",
"value" : "kathurimakimathi415@gmail.com"
}
]
},
{
"name" : "Oscar John",
"telecom" : [
{
"system" : "email",
"value" : "oscarjohnotieno@gmail.com",
"use" : "work"
}
]
},
{
"name" : "Kennedy Omondi",
"telecom" : [
{
"system" : "email",
"value" : "kennankole@gmail.com",
"use" : "work"
}
]
}
],
"description" : "One Observation for the Glasgow Coma Scale, carrying the total as its value, the eye, verbal and motor sub-scores as components, and the severity band the total falls in as its interpretation. The total prefers the calculated total the form submits and falls back to summing the answer weights itself, so the score still extracts from a client that does not evaluate SDC expressions.",
"structure" : [
{
"url" : "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse",
"mode" : "source",
"alias" : "QR"
},
{
"url" : "http://hl7.org/fhir/StructureDefinition/Bundle",
"mode" : "target",
"alias" : "Bundle"
},
{
"url" : "http://hl7.org/fhir/StructureDefinition/Observation",
"mode" : "target",
"alias" : "Observation"
}
],
"group" : [
{
"name" : "GlasgowCommaScaleExtract",
"documentation" : "This map used to emit the three sub-scores as three loose Observations and no\r\ntotal, which left nothing to band and nothing to read as \"the GCS\". It now\r\nproduces the same shape as ExtractInpatientCriticalCareAssessment: one\r\nObservation with three components. Nothing was consuming the old shape --\r\nthe questionnaire typed its three items `group` and hung an answerValueSet off\r\nthem, and a group carries no answer, so no conformant response ever put a value\r\ninto those Observations. The questionnaire is fixed alongside this map.",
"input" : [
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "bundle",
"type" : "Bundle",
"mode" : "target"
}
],
"rule" : [
{
"name" : "setBundleType",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "bundle",
"element" : "type",
"transform" : "copy",
"parameter" : [
{
"valueString" : "transaction"
}
]
}
]
},
{
"name" : "glasgowRule",
"source" : [
{
"context" : "qr",
"condition" : "item.where(linkId in ('eye-opening' | 'verbal-response' | 'motor-response')).answer.value.ofType(Coding).exists()"
}
],
"target" : [
{
"context" : "bundle",
"element" : "entry",
"variable" : "entry"
},
{
"context" : "entry",
"element" : "resource",
"variable" : "obs",
"transform" : "create",
"parameter" : [
{
"valueString" : "Observation"
}
]
}
],
"rule" : [
{
"name" : "base",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs"
},
{
"context" : "entry"
}
],
"dependent" : [
{
"name" : "BuildObsBase",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "obs"
},
{
"valueId" : "entry"
}
]
}
]
},
{
"name" : "category",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs"
}
],
"dependent" : [
{
"name" : "SetSurveyCategory",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueId" : "obs"
}
]
}
]
},
{
"name" : "code",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "code",
"variable" : "code"
}
],
"rule" : [
{
"name" : "codeCoding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "code",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "codeSystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "9269-2"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Glasgow coma score total"
}
]
}
]
}
]
}
]
},
{
"name" : "totalRule",
"source" : [
{
"context" : "qr",
"condition" : "item.where(linkId in ('eye-opening' | 'verbal-response' | 'motor-response')).answer.value.ofType(Coding).count() = 3"
}
],
"rule" : [
{
"name" : "totalValue",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "value",
"transform" : "evaluate",
"parameter" : [
{
"valueId" : "qr"
},
{
"valueString" : "iif(item.where(linkId = 'gcs-total').answer.value.exists(), item.where(linkId = 'gcs-total').answer.value, item.where(linkId in ('eye-opening' | 'verbal-response' | 'motor-response')).answer.value.ofType(Coding).code.select(iif($this in ('LA6553-7' | 'LA6557-8' | 'LA6562-8'), 1, iif($this in ('LA6554-5' | 'LA6558-6' | 'LA6563-6'), 2, iif($this in ('LA6555-2' | 'LA6559-4' | 'LA6564-4'), 3, iif($this in ('LA6556-0' | 'LA6560-2' | 'LA6565-1'), 4, iif($this in ('LA6561-0' | 'LA6566-9'), 5, iif($this = 'LA6567-7', 6, 0))))))).aggregate($this + $total, 0))"
}
]
}
]
}
],
"documentation" : "The submitted total wins; otherwise sum the answers. The form's total item\r\ncarries the same sum as an SDC calculatedExpression, so the two paths are\r\nthe same arithmetic and cannot disagree; the fallback is there for a client\r\nthat does not evaluate SDC.\r\nOne lookup covers all three sub-scores. Eye runs 1 to 4, verbal 1 to 5 and\r\nmotor 1 to 6, and no LOINC answer code appears in more than one of the\r\nthree lists, so a code determines its weight on its own.\r\nGuarded on all three sub-scores being present. A GCS of 7 summed from eye\r\nand motor alone reads as a comatose patient; the components still extract,\r\nbut the total does not, because a partial GCS is not a GCS."
},
{
"name" : "eyeRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'eye-opening') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "eyeCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "code"
}
],
"rule" : [
{
"name" : "codeCoding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "code",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "codeSystem",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "9267-6"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Glasgow coma score eye opening"
}
]
}
]
}
]
}
]
},
{
"name" : "eyeValue",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "verbalRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'verbal-response') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "verbalCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "code"
}
],
"rule" : [
{
"name" : "codeCoding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "code",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "codeSystem",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "9270-0"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Glasgow coma score verbal"
}
]
}
]
}
]
}
]
},
{
"name" : "verbalValue",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "motorRule",
"source" : [
{
"context" : "qr",
"element" : "item",
"variable" : "it",
"condition" : "(linkId = 'motor-response') and answer.value.exists()"
}
],
"target" : [
{
"context" : "obs",
"element" : "component",
"variable" : "comp"
}
],
"rule" : [
{
"name" : "motorCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp",
"element" : "code",
"variable" : "code"
}
],
"rule" : [
{
"name" : "codeCoding",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "code",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "codeSystem",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://loinc.org"
}
]
}
]
},
{
"name" : "codeCode",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "9268-4"
}
]
}
]
},
{
"name" : "codeDisplay",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Glasgow coma score motor"
}
]
}
]
}
]
}
]
},
{
"name" : "motorValue",
"source" : [
{
"context" : "it"
}
],
"target" : [
{
"context" : "comp"
}
],
"dependent" : [
{
"name" : "SetComponentCodedValue",
"parameter" : [
{
"valueId" : "it"
},
{
"valueId" : "comp"
}
]
}
]
}
]
},
{
"name" : "interpretation",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs"
}
],
"dependent" : [
{
"name" : "AddGlasgowInterpretation",
"parameter" : [
{
"valueId" : "obs"
},
{
"valueId" : "obs"
}
]
}
]
}
]
}
]
},
{
"name" : "AddGlasgowInterpretation",
"documentation" : "─────────────────────────────────────────────────────────────────────────────\r\nThe band\r\nTeasdale and Jennett's three tiers, as every ward and ambulance service reads\r\nthem: 13-15 mild, 9-12 moderate, 3-8 severe. Lower is worse, and the scale\r\nbottoms out at 3, not 0.\r\nThis is an Observation.interpretation and not a RiskAssessment. A Glasgow Coma\r\nScore says what a patient's consciousness is now; RiskAssessment models the\r\nlikelihood of a future outcome. Braden and Morse do predict one -- a pressure\r\ninjury, a fall -- and keep their RiskAssessments; this does not.\r\nThe published wording is \"mild, moderate and severe brain injury\", which is\r\nhow the scale was introduced and how trauma services still say it. It is\r\nwritten as impairment of consciousness here because the same scale is read on\r\na patient in a diabetic coma or a post-ictal state, where nothing has injured\r\nthe brain and the tier still means what it means.\r\nThe coding comes from SGHIObservationInterpretation, the value set this IG\r\nbinds Observation.interpretation to, which offers LL, L, N, H, HH and A.\r\nMild and moderate both take L. The low axis has two rungs, and the threshold\r\nworth spending LL on is 8 -- the point below which a patient stops reliably\r\nprotecting their own airway. That is what a consumer escalates on. Nothing is\r\nminted to separate mild from moderate: the tier is a published function of a\r\nnumber this same Observation already carries in its value, so a consumer that\r\nneeds the exact tier reads the score rather than a second code.\r\nA Glasgow Coma Score of 15 is normal and still reads L, because the published\r\nband is 13-15 and one code has to cover it. Flagging a normal score is the\r\nsafe direction to be wrong in; missing a deficit is not.\r\n─────────────────────────────────────────────────────────────────────────────",
"input" : [
{
"name" : "obs",
"type" : "Observation",
"mode" : "source"
},
{
"name" : "tgt",
"type" : "Observation",
"mode" : "target"
}
],
"rule" : [
{
"name" : "glasgowSevere",
"source" : [
{
"context" : "obs",
"condition" : "value.ofType(integer) <= 8"
}
],
"target" : [
{
"context" : "tgt",
"element" : "interpretation",
"variable" : "interp"
}
],
"rule" : [
{
"name" : "interpCoding",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "interp",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "interpSystem",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation"
}
]
}
]
},
{
"name" : "interpCode",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "LL"
}
]
}
]
},
{
"name" : "interpDisplay",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Critical low"
}
]
}
]
}
]
},
{
"name" : "interpText",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "interp",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Severe impairment of consciousness (GCS 3-8)"
}
]
}
]
}
]
},
{
"name" : "glasgowModerate",
"source" : [
{
"context" : "obs",
"condition" : "(value.ofType(integer) >= 9) and (value.ofType(integer) <= 12)"
}
],
"target" : [
{
"context" : "tgt",
"element" : "interpretation",
"variable" : "interp"
}
],
"rule" : [
{
"name" : "interpCoding",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "interp",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "interpSystem",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation"
}
]
}
]
},
{
"name" : "interpCode",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "L"
}
]
}
]
},
{
"name" : "interpDisplay",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Low"
}
]
}
]
}
]
},
{
"name" : "interpText",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "interp",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Moderate impairment of consciousness (GCS 9-12)"
}
]
}
]
}
]
},
{
"name" : "glasgowMild",
"source" : [
{
"context" : "obs",
"condition" : "value.ofType(integer) >= 13"
}
],
"target" : [
{
"context" : "tgt",
"element" : "interpretation",
"variable" : "interp"
}
],
"rule" : [
{
"name" : "interpCoding",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "interp",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "interpSystem",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation"
}
]
}
]
},
{
"name" : "interpCode",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "L"
}
]
}
]
},
{
"name" : "interpDisplay",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Low"
}
]
}
]
}
]
},
{
"name" : "interpText",
"source" : [
{
"context" : "obs"
}
],
"target" : [
{
"context" : "interp",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Mild impairment of consciousness (GCS 13-15)"
}
]
}
]
}
]
}
]
},
{
"name" : "BuildObsBase",
"documentation" : "─────────────────────────────────────────────────────────────────────────────\r\nShared scaffolding. Repeated in each map rather than imported: the transform\r\nengine resolves `imports` against whatever StructureMaps happen to be on the\r\nserver, and a form that stops extracting because a shared map was not\r\nuploaded is a worse failure than a duplicated group.\r\n─────────────────────────────────────────────────────────────────────────────\r\nTwo notes on what the publisher's StructureMap validator says about this file.\r\nSource parameters below are left untyped on purpose. Writing `: Element` makes\r\nthe validator compare QuestionnaireResponse.item against the literal 'Element'\r\nand report them as incompatible with each other, which is noise, not a finding.\r\nUntyped, it says only that it cannot check the paths.\r\n`evaluate(context, expression)` is flagged as \"takes 1 parameter but 2 were\r\nfound\". Leave it. The FML parser in the same jar refuses the one-argument form\r\noutright -- it wants a parameter, a comma, then the FHIRPath -- so the publisher\r\nis objecting to what its own compiler emits. Two arguments is the only form that\r\ncompiles, and it is what the R5 transform engine executes.",
"input" : [
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "obs",
"type" : "Observation",
"mode" : "target"
},
{
"name" : "entry",
"mode" : "target"
}
],
"rule" : [
{
"name" : "idAndFullUrl",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "id",
"transform" : "uuid"
}
],
"dependent" : [
{
"name" : "SetObservationFullUrl",
"parameter" : [
{
"valueId" : "obs"
},
{
"valueId" : "entry"
}
]
}
]
},
{
"name" : "entryRequest",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "entry",
"element" : "request",
"variable" : "request"
}
],
"rule" : [
{
"name" : "requestMethod",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "request",
"element" : "method",
"transform" : "copy",
"parameter" : [
{
"valueString" : "POST"
}
]
}
]
},
{
"name" : "requestUrl",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "request",
"element" : "url",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Observation"
}
]
}
]
}
]
},
{
"name" : "status",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "status",
"transform" : "copy",
"parameter" : [
{
"valueString" : "final"
}
]
}
]
},
{
"name" : "subject",
"source" : [
{
"context" : "qr",
"element" : "subject",
"variable" : "s"
}
],
"target" : [
{
"context" : "obs",
"element" : "subject",
"transform" : "copy",
"parameter" : [
{
"valueId" : "s"
}
]
}
]
},
{
"name" : "encounter",
"source" : [
{
"context" : "qr",
"element" : "encounter",
"variable" : "e"
}
],
"target" : [
{
"context" : "obs",
"element" : "encounter",
"transform" : "copy",
"parameter" : [
{
"valueId" : "e"
}
]
}
]
},
{
"name" : "effective",
"source" : [
{
"context" : "qr",
"element" : "authored",
"variable" : "t"
}
],
"target" : [
{
"context" : "obs",
"element" : "effective",
"transform" : "copy",
"parameter" : [
{
"valueId" : "t"
}
]
}
]
},
{
"name" : "performerFromSource",
"source" : [
{
"context" : "qr",
"element" : "source",
"variable" : "src"
}
],
"target" : [
{
"context" : "obs",
"element" : "performer",
"transform" : "copy",
"parameter" : [
{
"valueId" : "src"
}
]
}
]
},
{
"name" : "performerFallback",
"source" : [
{
"context" : "qr",
"condition" : "source.exists().not()"
}
],
"rule" : [
{
"name" : "performerFromAuthor",
"source" : [
{
"context" : "qr",
"element" : "author",
"variable" : "a"
}
],
"target" : [
{
"context" : "obs",
"element" : "performer",
"transform" : "copy",
"parameter" : [
{
"valueId" : "a"
}
]
}
]
}
]
},
{
"name" : "linkQuestionnaireResponse",
"source" : [
{
"context" : "qr",
"element" : "id",
"variable" : "qid",
"condition" : "$this.hasValue()"
}
],
"target" : [
{
"context" : "obs",
"element" : "derivedFrom",
"variable" : "ref",
"transform" : "create",
"parameter" : [
{
"valueString" : "Reference"
}
]
},
{
"context" : "ref",
"element" : "reference",
"transform" : "copy",
"parameter" : [
{
"valueId" : "qid"
}
]
}
],
"documentation" : "A stored response's id already reads \"QuestionnaireResponse/<id>\", so it is a\r\nrelative reference as it stands. The hasValue() guard is what stops an\r\nunsaved response -- one posted straight to $extract rather than saved first --\r\nfrom writing \"QuestionnaireResponse/null\" into the record."
}
]
},
{
"name" : "SetComponentCodedValue",
"input" : [
{
"name" : "it",
"mode" : "source"
},
{
"name" : "comp",
"mode" : "target"
}
],
"rule" : [
{
"name" : "componentAnswer",
"source" : [
{
"context" : "it",
"element" : "answer",
"listMode" : "first",
"variable" : "a"
}
],
"rule" : [
{
"name" : "codedValue",
"source" : [
{
"context" : "a",
"element" : "value",
"variable" : "cv"
}
],
"target" : [
{
"context" : "comp",
"element" : "value",
"variable" : "cc",
"transform" : "create",
"parameter" : [
{
"valueString" : "CodeableConcept"
}
]
}
],
"rule" : [
{
"name" : "valueCoding",
"source" : [
{
"context" : "cv"
}
],
"target" : [
{
"context" : "cc",
"element" : "coding",
"transform" : "copy",
"parameter" : [
{
"valueId" : "cv"
}
]
}
]
},
{
"name" : "valueText",
"source" : [
{
"context" : "cv",
"element" : "display",
"variable" : "d"
}
],
"target" : [
{
"context" : "cc",
"element" : "text",
"transform" : "copy",
"parameter" : [
{
"valueId" : "d"
}
]
}
]
}
]
}
]
}
]
},
{
"name" : "SetSurveyCategory",
"input" : [
{
"name" : "qr",
"type" : "QR",
"mode" : "source"
},
{
"name" : "obs",
"type" : "Observation",
"mode" : "target"
}
],
"rule" : [
{
"name" : "category",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "obs",
"element" : "category",
"variable" : "cat"
}
],
"rule" : [
{
"name" : "categoryCoding",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "cat",
"element" : "coding",
"variable" : "coding"
}
],
"rule" : [
{
"name" : "categorySystem",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "system",
"transform" : "copy",
"parameter" : [
{
"valueString" : "http://terminology.hl7.org/CodeSystem/observation-category"
}
]
}
]
},
{
"name" : "categoryCode",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "code",
"transform" : "copy",
"parameter" : [
{
"valueString" : "survey"
}
]
}
]
},
{
"name" : "categoryDisplay",
"source" : [
{
"context" : "qr"
}
],
"target" : [
{
"context" : "coding",
"element" : "display",
"transform" : "copy",
"parameter" : [
{
"valueString" : "Survey"
}
]
}
]
}
]
}
]
}
]
},
{
"name" : "SetObservationFullUrl",
"input" : [
{
"name" : "obs",
"type" : "Observation",
"mode" : "source"
},
{
"name" : "entry",
"mode" : "target"
}
],
"rule" : [
{
"name" : "assignFullUrl",
"source" : [
{
"context" : "obs",
"element" : "id",
"variable" : "id"
}
],
"target" : [
{
"context" : "entry",
"element" : "fullUrl",
"transform" : "append",
"parameter" : [
{
"valueString" : "https://fhir.slade360.co.ke/fhir/Observation/"
},
{
"valueId" : "id"
}
]
}
]
}
]
}
]
}