Exemple #1
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     codes = [
         SnomedExpression(
             req.snomed(SnomedLookup.ACE_R_PROCEDURE_ASSESSMENT))
     ]  # noqa
     # add(SnomedLookup.ACE_R_PROCEDURE_ASSESSMENT_SUBSCALE_ATTENTION_ORIENTATION)  # noqa
     # add(SnomedLookup.ACE_R_PROCEDURE_ASSESSMENT_SUBSCALE_MEMORY)
     # add(SnomedLookup.ACE_R_PROCEDURE_ASSESSMENT_SUBSCALE_FLUENCY)
     # add(SnomedLookup.ACE_R_PROCEDURE_ASSESSMENT_SUBSCALE_LANGUAGE)
     # add(SnomedLookup.ACE_R_PROCEDURE_ASSESSMENT_SUBSCALE_VISUOSPATIAL)
     if self.is_complete():  # could refine: is each subscale complete?
         a = self.attn_score()
         m = self.mem_score()
         f = self.fluency_score()
         lang = self.lang_score()
         v = self.vsp_score()
         t = a + m + f + lang + v
         codes.append(
             SnomedExpression(
                 req.snomed(SnomedLookup.ACE_R_SCALE),
                 {
                     req.snomed(SnomedLookup.ACE_R_SCORE):
                     t,
                     req.snomed(SnomedLookup.ACE_R_SUBSCORE_ATTENTION_ORIENTATION):
                     a,  # noqa
                     req.snomed(SnomedLookup.ACE_R_SUBSCORE_MEMORY):
                     m,
                     req.snomed(SnomedLookup.ACE_R_SUBSCORE_FLUENCY):
                     f,
                     req.snomed(SnomedLookup.ACE_R_SUBSCORE_LANGUAGE):
                     lang,
                     req.snomed(SnomedLookup.ACE_R_SUBSCORE_VISUOSPATIAL):
                     v,
                 }))
     return codes
Exemple #2
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     procedure = req.snomed(SnomedLookup.BMI_PROCEDURE_MEASUREMENT)
     if self.is_complete():
         unit = req.snomed(SnomedLookup.UNIT_OF_MEASURE)
         kg = req.snomed(SnomedLookup.KILOGRAM)
         m = req.snomed(SnomedLookup.METRE)
         kg_per_sq_m = req.snomed(SnomedLookup.KG_PER_SQ_M)
         qty_bmi = req.snomed(SnomedLookup.BMI_OBSERVABLE)
         qty_height = req.snomed(SnomedLookup.BODY_HEIGHT_OBSERVABLE)
         qty_weight = req.snomed(SnomedLookup.BODY_WEIGHT_OBSERVABLE)
         return [
             SnomedExpression(procedure, [
                 SnomedAttributeGroup({
                     qty_bmi: self.bmi(),
                     unit: kg_per_sq_m,
                 }),
                 SnomedAttributeGroup({
                     qty_weight: self.mass_kg,
                     unit: kg,
                 }),
                 SnomedAttributeGroup({
                     qty_height: self.height_m,
                     unit: m,
                 }),
             ])
         ]
     else:
         return [SnomedExpression(procedure)]
Exemple #3
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     if not self.is_complete():
         return []
     return [
         SnomedExpression(req.snomed(SnomedLookup.PHOTOGRAPH_PROCEDURE)),
         SnomedExpression(
             req.snomed(SnomedLookup.PHOTOGRAPH_PHYSICAL_OBJECT)),
     ]
Exemple #4
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     procedure = req.snomed(SnomedLookup.PHQ15_PROCEDURE)
     codes = [SnomedExpression(procedure)]
     if self.is_complete():
         scale = req.snomed(SnomedLookup.PHQ15_SCALE)
         score = req.snomed(SnomedLookup.PHQ15_SCORE)
         codes.append(SnomedExpression(scale, {score: self.total_score()}))
     return codes
Exemple #5
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     codes = [SnomedExpression(req.snomed(SnomedLookup.GAD7_PROCEDURE_ASSESSMENT))]  # noqa
     if self.is_complete():
         codes.append(SnomedExpression(
             req.snomed(SnomedLookup.GAD7_SCALE),
             {
                 req.snomed(SnomedLookup.GAD7_SCORE): self.total_score(),
             }
         ))
     return codes
Exemple #6
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     # The BADLS is ALWAYS carer-rated, so it's appropriate to put the
     # SNOMED-CT codes in.
     codes = [
         SnomedExpression(
             req.snomed(SnomedLookup.BADLS_PROCEDURE_ASSESSMENT))
     ]
     if self.is_complete():
         codes.append(
             SnomedExpression(
                 req.snomed(SnomedLookup.BADLS_SCALE),
                 {req.snomed(SnomedLookup.BADLS_SCORE): self.total_score()},
             ))
     return codes
Exemple #7
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     codes = [
         SnomedExpression(req.snomed(
             SnomedLookup.NART_PROCEDURE_ASSESSMENT))
     ]  # noqa
     if self.is_complete():
         codes.append(
             SnomedExpression(
                 req.snomed(SnomedLookup.NART_SCALE),
                 {
                     # Best value debatable:
                     req.snomed(SnomedLookup.NART_SCORE):
                     self.nelson_full_scale_iq(),  # noqa
                 }))
     return codes
Exemple #8
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     expressions = []  # type: List[SnomedExpression]
     procedure_bmi = req.snomed(SnomedLookup.BMI_PROCEDURE_MEASUREMENT)
     unit = req.snomed(SnomedLookup.UNIT_OF_MEASURE)
     if self.is_complete():
         kg = req.snomed(SnomedLookup.KILOGRAM)
         m = req.snomed(SnomedLookup.METRE)
         kg_per_sq_m = req.snomed(SnomedLookup.KG_PER_SQ_M)
         qty_bmi = req.snomed(SnomedLookup.BMI_OBSERVABLE)
         qty_height = req.snomed(SnomedLookup.BODY_HEIGHT_OBSERVABLE)
         qty_weight = req.snomed(SnomedLookup.BODY_WEIGHT_OBSERVABLE)
         expressions.append(
             SnomedExpression(
                 procedure_bmi,
                 [
                     SnomedAttributeGroup(
                         {qty_bmi: self.bmi(), unit: kg_per_sq_m}
                     ),
                     SnomedAttributeGroup(
                         {qty_weight: self.mass_kg, unit: kg}
                     ),
                     SnomedAttributeGroup(
                         {qty_height: self.height_m, unit: m}
                     ),
                 ],
             )
         )
     else:
         expressions.append(SnomedExpression(procedure_bmi))
     if self.waist_cm is not None:
         procedure_waist = req.snomed(
             SnomedLookup.WAIST_CIRCUMFERENCE_PROCEDURE_MEASUREMENT
         )
         cm = req.snomed(SnomedLookup.CENTIMETRE)
         qty_waist_circum = req.snomed(
             SnomedLookup.WAIST_CIRCUMFERENCE_OBSERVABLE
         )
         expressions.append(
             SnomedExpression(
                 procedure_waist,
                 [
                     SnomedAttributeGroup(
                         {qty_waist_circum: self.waist_cm, unit: cm}
                     )
                 ],
             )
         )
     return expressions
Exemple #9
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     codes = [
         SnomedExpression(req.snomed(
             SnomedLookup.HADS_PROCEDURE_ASSESSMENT))
     ]  # noqa
     if self.is_complete():
         codes.append(
             SnomedExpression(
                 req.snomed(SnomedLookup.HADS_SCALE),
                 {
                     req.snomed(SnomedLookup.HADS_ANXIETY_SCORE):
                     self.anxiety_score(),  # noqa
                     req.snomed(SnomedLookup.HADS_DEPRESSION_SCORE):
                     self.depression_score(),  # noqa
                 }))
     return codes
Exemple #10
0
    def get_snomed_codes(self,
                         req: CamcopsRequest,
                         fallback: bool = True) -> List[SnomedExpression]:
        """
        Returns all SNOMED-CT codes for this task.

        Args:
            req: the
                :class:`camcops_server.cc_modules.cc_request.CamcopsRequest`
            fallback: for example, if F32.10 is unknown, should we fall back to
                F32.1?

        Returns:
            a list of
            :class:`camcops_server.cc_modules.cc_snomed.SnomedExpression`
            objects
        """
        if not req.icd10_snomed_supported:
            return []
        snomed_codes = []  # type: List[SnomedExpression]
        # noinspection PyTypeChecker
        for item in self.items:
            concepts = self._get_snomed_concepts(item.code, req, fallback)
            if not concepts:
                continue
            focusconcept = SnomedFocusConcept(concepts)
            snomed_codes.append(SnomedExpression(focusconcept))
        return snomed_codes
Exemple #11
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     codes = [
         SnomedExpression(req.snomed(
             SnomedLookup.WSAS_PROCEDURE_ASSESSMENT))
     ]
     if self.is_complete():
         d = {
             req.snomed(SnomedLookup.WSAS_SCORE): self.total_score(),
             req.snomed(SnomedLookup.WSAS_HOME_MANAGEMENT_SCORE): self.q2,
             req.snomed(SnomedLookup.WSAS_SOCIAL_LEISURE_SCORE): self.q3,
             req.snomed(SnomedLookup.WSAS_PRIVATE_LEISURE_SCORE): self.q4,
             req.snomed(SnomedLookup.WSAS_RELATIONSHIPS_SCORE): self.q5,
         }
         if not self.retired_etc:
             d[req.snomed(SnomedLookup.WSAS_WORK_SCORE)] = self.q1
         codes.append(
             SnomedExpression(req.snomed(SnomedLookup.WSAS_SCALE), d))
     return codes
Exemple #12
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     if not self.is_complete():
         return []
     return [
         SnomedExpression(
             req.snomed(SnomedLookup.PDSS_SCALE), {
                 req.snomed(SnomedLookup.PDSS_SCORE): self.total_score(),
             })
     ]
Exemple #13
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     scale_lookup = SnomedLookup.BDI_SCALE
     if self.bdi_scale in (SCALE_BDI_I, SCALE_BDI_IA):
         score_lookup = SnomedLookup.BDI_SCORE
         proc_lookup = SnomedLookup.BDI_PROCEDURE_ASSESSMENT
     elif self.bdi_scale == SCALE_BDI_II:
         score_lookup = SnomedLookup.BDI_II_SCORE
         proc_lookup = SnomedLookup.BDI_II_PROCEDURE_ASSESSMENT
     else:
         return []
     codes = [SnomedExpression(req.snomed(proc_lookup))]
     if self.is_complete():
         codes.append(
             SnomedExpression(
                 req.snomed(scale_lookup),
                 {req.snomed(score_lookup): self.total_score()},
             ))
     return codes
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     refinement = {}  # type: Dict[SnomedConcept, str]
     if self.note:
         refinement[req.snomed(SnomedLookup.CLINICAL_NOTE)] = self.note
     codes = [
         SnomedExpression(
             req.snomed(SnomedLookup.PROGRESS_NOTE_PROCEDURE),
             refinement=refinement or None,
         )
     ]
     return codes
Exemple #15
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     procedure = req.snomed(
         SnomedLookup.PHQ9_PROCEDURE_DEPRESSION_SCREENING)
     codes = [SnomedExpression(procedure)]
     if self.is_complete():
         scale = req.snomed(SnomedLookup.PHQ9_SCALE)
         score = req.snomed(SnomedLookup.PHQ9_SCORE)
         screen_negative = req.snomed(
             SnomedLookup.PHQ9_FINDING_NEGATIVE_SCREENING_FOR_DEPRESSION)
         screen_positive = req.snomed(
             SnomedLookup.PHQ9_FINDING_POSITIVE_SCREENING_FOR_DEPRESSION)
         if self.is_mds() or self.is_ods():
             # Threshold debatable, but if you have "other depressive
             # syndrome", it seems wrong to say you've screened negative for
             # depression.
             procedure_result = screen_positive
         else:
             procedure_result = screen_negative
         codes.append(SnomedExpression(scale, {score: self.total_score()}))
         codes.append(SnomedExpression(procedure_result))
     return codes
Exemple #16
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     codes = [
         SnomedExpression(
             req.snomed(SnomedLookup.HONOSWA_PROCEDURE_ASSESSMENT))
     ]
     if self.is_complete():
         codes.append(
             SnomedExpression(
                 req.snomed(SnomedLookup.HONOSWA_SCALE),
                 {
                     req.snomed(SnomedLookup.HONOSWA_SCORE):
                     self.total_score(),
                     req.snomed(SnomedLookup.HONOSWA_1_OVERACTIVE_SCORE):
                     self.q1,  # noqa
                     req.snomed(SnomedLookup.HONOSWA_2_SELFINJURY_SCORE):
                     self.q2,  # noqa
                     req.snomed(SnomedLookup.HONOSWA_3_SUBSTANCE_SCORE):
                     self.q3,  # noqa
                     req.snomed(SnomedLookup.HONOSWA_4_COGNITIVE_SCORE):
                     self.q4,  # noqa
                     req.snomed(SnomedLookup.HONOSWA_5_PHYSICAL_SCORE):
                     self.q5,
                     req.snomed(SnomedLookup.HONOSWA_6_PSYCHOSIS_SCORE):
                     self.q6,  # noqa
                     req.snomed(SnomedLookup.HONOSWA_7_DEPRESSION_SCORE):
                     self.q7,  # noqa
                     req.snomed(SnomedLookup.HONOSWA_8_OTHERMENTAL_SCORE):
                     self.q8,  # noqa
                     req.snomed(SnomedLookup.HONOSWA_9_RELATIONSHIPS_SCORE):
                     self.q9,  # noqa
                     req.snomed(SnomedLookup.HONOSWA_10_ADL_SCORE):
                     self.q10,
                     req.snomed(SnomedLookup.HONOSWA_11_LIVINGCONDITIONS_SCORE):
                     self.q11,  # noqa
                     req.snomed(SnomedLookup.HONOSWA_12_OCCUPATION_SCORE):
                     self.q12,  # noqa
                 },
             ))
     return codes
Exemple #17
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     codes = [
         SnomedExpression(
             req.snomed(SnomedLookup.EQ5D5L_PROCEDURE_ASSESSMENT))
     ]  # noqa
     if self.is_complete():
         codes.append(
             SnomedExpression(
                 req.snomed(SnomedLookup.EQ5D5L_SCALE),
                 {
                     # SnomedLookup.EQ5D5L_INDEX_VALUE: not used; see docstring above  # noqa
                     req.snomed(SnomedLookup.EQ5D5L_MOBILITY_SCORE):
                     self.q1,
                     req.snomed(SnomedLookup.EQ5D5L_SELF_CARE_SCORE):
                     self.q2,
                     req.snomed(SnomedLookup.EQ5D5L_USUAL_ACTIVITIES_SCORE):
                     self.q3,  # noqa
                     req.snomed(SnomedLookup.EQ5D5L_PAIN_DISCOMFORT_SCORE):
                     self.q4,  # noqa
                     req.snomed(SnomedLookup.EQ5D5L_ANXIETY_DEPRESSION_SCORE):
                     self.q5,  # noqa
                 }))
     return codes
Exemple #18
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     codes = [
         SnomedExpression(
             req.snomed(SnomedLookup.HONOSCA_PROCEDURE_ASSESSMENT))
     ]  # noqa
     if self.is_complete():
         a = self.section_a_score()
         b = self.section_b_score()
         total = a + b
         codes.append(
             SnomedExpression(
                 req.snomed(SnomedLookup.HONOSCA_SCALE),
                 {
                     req.snomed(SnomedLookup.HONOSCA_SCORE):
                     total,
                     req.snomed(SnomedLookup.HONOSCA_SECTION_A_SCORE):
                     a,
                     req.snomed(SnomedLookup.HONOSCA_SECTION_B_SCORE):
                     b,
                     req.snomed(SnomedLookup.HONOSCA_SECTION_A_PLUS_B_SCORE):
                     total,  # noqa
                 }))
     return codes
Exemple #19
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     if not req.icd9cm_snomed_supported:
         return []
     snomed_codes = []  # type: List[SnomedExpression]
     # noinspection PyTypeChecker
     for item in self.items:
         try:
             concepts = req.icd9cm_snomed(item.code)
         except KeyError:  # no known code
             continue
         if not concepts:
             continue
         focusconcept = SnomedFocusConcept(concepts)
         snomed_codes.append(SnomedExpression(focusconcept))
     return snomed_codes
Exemple #20
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     if not self.is_complete():
         return []
     return [SnomedExpression(req.snomed(SnomedLookup.QOL_SCALE))]
Exemple #21
0
    def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
        refinement = {}  # type: Dict[SnomedConcept, str]

        def add(snomed_lookup: str, contents: Optional[str]) -> None:
            if not contents:
                return
            nonlocal refinement
            concept = req.snomed(snomed_lookup)
            refinement[concept] = contents

        # not location
        # not contact type
        add(SnomedLookup.PSYCLERK_REASON_FOR_REFERRAL, self.reason_for_contact)
        add(SnomedLookup.PSYCLERK_PRESENTING_ISSUE, self.presenting_issue)
        add(SnomedLookup.PSYCLERK_SYSTEMS_REVIEW, self.systems_review)
        add(SnomedLookup.PSYCLERK_COLLATERAL_HISTORY, self.collateral_history)

        add(
            SnomedLookup.PSYCLERK_PAST_MEDICAL_SURGICAL_MENTAL_HEALTH_HISTORY,
            self.diagnoses_medical,
        )
        add(
            SnomedLookup.PSYCLERK_PAST_MEDICAL_SURGICAL_MENTAL_HEALTH_HISTORY,
            self.diagnoses_psychiatric,
        )
        add(SnomedLookup.PSYCLERK_PROCEDURES, self.operations_procedures)
        add(
            SnomedLookup.PSYCLERK_ALLERGIES_ADVERSE_REACTIONS,
            self.allergies_adverse_reactions,
        )
        add(SnomedLookup.PSYCLERK_MEDICATIONS_MEDICAL_DEVICES,
            self.medications)
        add(
            SnomedLookup.PSYCLERK_DRUG_SUBSTANCE_USE,
            self.recreational_drug_use,
        )
        add(SnomedLookup.PSYCLERK_FAMILY_HISTORY, self.family_history)
        add(
            SnomedLookup.PSYCLERK_DEVELOPMENTAL_HISTORY,
            self.developmental_history,
        )
        add(
            SnomedLookup.PSYCLERK_SOCIAL_PERSONAL_HISTORY,
            self.personal_history,
        )
        add(SnomedLookup.PSYCLERK_PERSONALITY, self.premorbid_personality)
        add(
            SnomedLookup.PSYCLERK_PRISON_RECORD_CRIMINAL_ACTIVITY,
            self.forensic_history,
        )
        add(
            SnomedLookup.PSYCLERK_SOCIAL_HISTORY_BASELINE,
            self.current_social_situation,
        )

        add(SnomedLookup.PSYCLERK_MSE_APPEARANCE,
            self.mse_appearance_behaviour)  # duplication
        add(SnomedLookup.PSYCLERK_MSE_BEHAVIOUR,
            self.mse_appearance_behaviour)  # duplication
        add(SnomedLookup.PSYCLERK_MSE_MOOD, self.mse_mood_subjective)  # close
        add(SnomedLookup.PSYCLERK_MSE_AFFECT, self.mse_mood_objective)
        # ... Logic here: "objective mood" is certainly affect (emotional
        # weather). "Subjective mood" is both mood (emotional climate) and
        # affect. Not perfect, but reasonable.
        add(SnomedLookup.PSYCLERK_MSE_THOUGHT, self.mse_thought_form)
        add(SnomedLookup.PSYCLERK_MSE_THOUGHT, self.mse_thought_content)
        # ... No way of disambiguating the two in SNOMED-CT.
        add(SnomedLookup.PSYCLERK_MSE_PERCEPTION, self.mse_perception)
        add(SnomedLookup.PSYCLERK_MSE_COGNITION, self.mse_cognition)
        add(SnomedLookup.PSYCLERK_MSE_INSIGHT, self.mse_insight)

        add(
            SnomedLookup.PSYCLERK_PHYSEXAM_GENERAL,
            self.physical_examination_general,
        )
        add(
            SnomedLookup.PSYCLERK_PHYSEXAM_CARDIOVASCULAR,
            self.physical_examination_cardiovascular,
        )
        add(
            SnomedLookup.PSYCLERK_PHYSEXAM_RESPIRATORY,
            self.physical_examination_respiratory,
        )
        add(
            SnomedLookup.PSYCLERK_PHYSEXAM_ABDOMINAL,
            self.physical_examination_abdominal,
        )
        add(
            SnomedLookup.PSYCLERK_PHYSEXAM_NEUROLOGICAL,
            self.physical_examination_neurological,
        )

        add(SnomedLookup.PSYCLERK_ASSESSMENT_SCALES, self.assessment_scales)
        add(
            SnomedLookup.PSYCLERK_INVESTIGATIONS_RESULTS,
            self.investigations_results,
        )

        add(SnomedLookup.PSYCLERK_SAFETY_ALERTS, self.safety_alerts)
        add(SnomedLookup.PSYCLERK_RISK_ASSESSMENT, self.risk_assessment)
        add(
            SnomedLookup.PSYCLERK_RELEVANT_LEGAL_INFORMATION,
            self.relevant_legal_information,
        )

        add(SnomedLookup.PSYCLERK_CURRENT_PROBLEMS, self.current_problems)
        add(
            SnomedLookup.PSYCLERK_PATIENT_CARER_CONCERNS,
            self.patient_carer_concerns,
        )
        add(SnomedLookup.PSYCLERK_CLINICAL_NARRATIVE, self.impression)
        add(SnomedLookup.PSYCLERK_MANAGEMENT_PLAN, self.management_plan)
        add(SnomedLookup.PSYCLERK_INFORMATION_GIVEN, self.information_given)

        codes = [
            SnomedExpression(
                req.snomed(
                    SnomedLookup.DIAGNOSTIC_PSYCHIATRIC_INTERVIEW_PROCEDURE),
                refinement=refinement or None,
            )
        ]
        return codes
Exemple #22
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     codes = [
         SnomedExpression(req.snomed(SnomedLookup.PROGRESS_NOTE_PROCEDURE))
     ]  # noqa
     return codes
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     codes = [
         SnomedExpression(
             req.snomed(SnomedLookup.PSYCHIATRIC_ASSESSMENT_PROCEDURE))
     ]  # noqa
     return codes
Exemple #24
0
def fhir_observation_component_from_snomed(req: "CamcopsRequest",
                                           expr: SnomedExpression) -> Dict:
    """
    Returns a FHIR ObservationComponent (as a dict in JSON format) for a SNOMED
    CT expression.
    """
    observable_entity = req.snomed(SnomedLookup.OBSERVABLE_ENTITY)
    expr_longform = expr.as_string(longform=True)
    # For SNOMED, we are providing an observation where the "value" is a code
    # -- thus, we use "valueCodeableConcept" as the specific value (the generic
    # being "value<something>" or what FHIR calls "value[x]"). But there also
    # needs to be a coding system, specified via "code".
    return ObservationComponent(
        jsondict={
            # code = "the type of thing reported here"
            # Per https://www.hl7.org/fhir/observation.html#code-interop, we
            # use SNOMED 363787002 = Observable entity.
            Fc.CODE:
            CodeableConcept(
                jsondict={
                    Fc.CODING: [
                        Coding(
                            jsondict={
                                Fc.SYSTEM:
                                Fc.CODE_SYSTEM_SNOMED_CT,
                                Fc.CODE:
                                str(observable_entity.identifier),
                                Fc.DISPLAY:
                                observable_entity.as_string(longform=True),
                                Fc.USER_SELECTED:
                                False,
                            }).as_json()
                    ],
                    Fc.TEXT:
                    observable_entity.term,
                }).as_json(),
            # value = "the value of the thing"; the actual SNOMED code of
            # interest:
            Fc.VALUE_CODEABLE_CONCEPT:
            CodeableConcept(
                jsondict={
                    Fc.CODING: [
                        Coding(
                            jsondict={
                                # http://www.hl7.org/fhir/snomedct.html
                                Fc.SYSTEM:
                                Fc.CODE_SYSTEM_SNOMED_CT,
                                Fc.CODE:
                                expr.as_string(longform=False),
                                Fc.DISPLAY:
                                expr_longform,
                                Fc.USER_SELECTED:
                                False,
                                # ... means "did the user choose it themselves?"  # noqa: E501
                                # version: not used
                            }).as_json()
                    ],
                    Fc.TEXT:
                    expr_longform,
                }).as_json(),
        }).as_json()
Exemple #25
0
 def get_snomed_codes(self, req: CamcopsRequest) -> List[SnomedExpression]:
     codes = [SnomedExpression(req.snomed(SnomedLookup.BPRS1962_SCALE))]
     return codes