Пример #1
0
    def to_fhir(self):
        fhir_medication = medication.Medication()

        fhir_meta = meta.Meta()
        fhir_meta.profile = [self.meta_profile]
        fhir_medication.meta = fhir_meta

        fhir_medication.ingredient = [self.ingredient.to_fhir()]

        return fhir_medication
Пример #2
0
    def add_phased_relationship_obv(self):
        patient_reference = reference.FHIRReference(
            {"reference": "Patient/" + self.patientID})
        self.sequence_rels \
            = get_sequence_relation(self.phased_rec_map)
        for index in self.sequence_rels.index:
            siduid = "sid-" + uuid4().hex[:13]
            self.result_ids.append(siduid)

            observation_sid = observation.Observation()
            observation_sid.resource_type = "Observation"
            observation_sid.id = siduid
            observation_sid.meta = meta.Meta({
                "profile":
                [("http://hl7.org/fhir/uv/" + "genomics-reporting/" +
                  "StructureDefinition/" + "sequence-phase-relationship")]
            })
            observation_sid.status = "final"
            observation_sid.category = [
                concept.CodeableConcept({
                    "coding": [{
                        "system": ("http://terminology.hl7.org/" +
                                   "CodeSystem/observation-category"),
                        "code":
                        "laboratory"
                    }]
                })
            ]
            observation_sid.code = concept.CodeableConcept({
                "coding": [{
                    "system": "http://loinc.org",
                    "code": "82120-7",
                    "display": "Allelic phase"
                }]
            })
            observation_sid.subject = patient_reference
            observation_sid.valueCodeableConcept = concept.CodeableConcept({
                "coding": [{
                    "system":
                    ("http://hl7.org/fhir/uv/" + "genomics-reporting/" +
                     "CodeSystem/seq-phase-relationship"),
                    "code":
                    self.sequence_rels.at[index, 'Relation'],
                    "display":
                    self.sequence_rels.at[index, 'Relation']
                }]
            })
            self.report.contained.append(observation_sid)
Пример #3
0
    def to_fhir(self) -> procedure.Procedure:
        fhir_procedure = procedure.Procedure()

        fhir_meta = meta.Meta()
        fhir_meta.profile = [self.profile_url]
        fhir_procedure.meta = fhir_meta

        fhir_procedure.status = self.status
        fhir_procedure.category = self.category.to_fhir()
        fhir_procedure.code = self.procedure_code.to_fhir()
        fhir_procedure.subject = self.pat_reference.to_fhir()

        if type(self.performed) == FhirDatetime:
            fhir_procedure.performedDateTime = self.performed.to_fhir()
        elif type(self.performed) == FhirPeriod:
            fhir_procedure.performedPeriod = self.performed.to_fhir()

        return fhir_procedure
Пример #4
0
 def initalize_report(self):
     patient_reference = reference.FHIRReference(
         {"reference": "Patient/" + self.patientID})
     self.report.id = "dr-" + uuid4().hex[:13]
     self.report.meta = meta.Meta({
         "profile": [("http://hl7.org/fhir/uv/genomics-reporting" +
                      "/StructureDefinition/genomics-report")]
     })
     self.report.status = "final"
     self.report.code = concept.CodeableConcept({
         "coding": [{
             "system": "http://loinc.org",
             "code": "81247-9",
             "display": "Master HL7 genetic variant reporting panel"
         }]
     })
     self.report.subject = patient_reference
     self.report.issued = date.FHIRDate(get_fhir_date())
     self.report.contained = []
Пример #5
0
    def to_fhir(self) -> medicationstatement.MedicationStatement:
        fhir_med_statement = medicationstatement.MedicationStatement()

        fhir_meta = meta.Meta()
        fhir_meta.profile = [self.profile_url]
        fhir_med_statement.meta = fhir_meta

        fhir_med_statement.status = self.status

        # References
        # TODO: some of the references may be optional!!
        fhir_med_statement.medicationReference = self.med_reference.to_fhir()
        fhir_med_statement.subject = self.pat_reference.to_fhir()
        fhir_med_statement.partOf = [self.proc_reference.to_fhir()]

        if type(self.timestamp) == EffectivePeriod:
            fhir_med_statement.effectivePeriod = self.timestamp.to_fhir()
        elif type(self.timestamp) == FhirDateTime:
            fhir_med_statement.effectiveDateTime = self.timestamp.to_fhir()

        fhir_med_statement.dosage = [self.dosage.to_fhir()]

        return fhir_med_statement
Пример #6
0
 def meta(self):
     return mt.Meta({"profile":
                     ["http://hl7.org/fhir/StructureDefinition/vitalsigns"]})
Пример #7
0
 def add_regionstudied_obv(self, ref_seq, reportable_query_regions,
                           nocall_regions):
     if reportable_query_regions.empty and nocall_regions.empty:
         return
     patient_reference = reference.FHIRReference(
         {"reference": "Patient/" + self.patientID})
     contained_uid = "rs-" + uuid4().hex[:13]
     self.result_ids.append(contained_uid)
     # Region Studied Obeservation
     observation_rs = observation.Observation()
     contained_rs = observation_rs
     contained_rs.id = contained_uid
     observation_rs.resource_type = "Observation"
     contained_rs.meta = meta.Meta({
         "profile": [("http://hl7.org/fhir/uv/" + "genomics-reporting/" +
                      "StructureDefinition/region-studied")]
     })
     observation_rs.code = concept.CodeableConcept({
         "coding": [{
             "system": "http://loinc.org",
             "code": "53041-0",
             "display": "DNA region of interest panel"
         }]
     })
     observation_rs.status = "final"
     observation_rs.category = [
         concept.CodeableConcept({
             "coding": [{
                 "system": ("http://terminology.hl7.org/" +
                            "CodeSystem/observation-category"),
                 "code":
                 "laboratory"
             }]
         })
     ]
     observation_rs.subject = patient_reference
     observation_rs_component2 = observation.ObservationComponent()
     observation_rs_component2.code = concept.CodeableConcept({
         "coding": [{
             "system": "http://loinc.org",
             "code": "92822-6",
             "display": "Genomic coord system"
         }]
     })
     observation_rs_component2\
         .valueCodeableConcept = concept.CodeableConcept(
             {
                 "coding": [
                     {
                         "system": "http://loinc.org",
                         "code": "LA30102-0",
                         "display": "1-based character counting"
                     }
                 ]
             }
         )
     observation_rs_component3 = observation.ObservationComponent()
     observation_rs_component3.code = concept.CodeableConcept({
         "coding": [{
             "system": "http://loinc.org",
             "code": "48013-7",
             "display": "Genomic reference sequence ID"
         }]
     })
     observation_rs_component3\
         .valueCodeableConcept = concept.CodeableConcept(
             {
                 "coding": [
                     {
                         "system": "http://www.ncbi.nlm.nih.gov/nuccore",
                         "code": ref_seq
                     }
                 ]
             }
         )
     observation_rs_components = self._get_region_studied_component(
         reportable_query_regions, nocall_regions)
     observation_rs.component = [
         observation_rs_component2, observation_rs_component3
     ] + observation_rs_components
     # Observation structure : described-variants
     self.report.contained.append(contained_rs)
Пример #8
0
    def add_variant_obv(self, record, ref_seq, ratio_ad_dp):
        # collect all the record with similar position values,
        # to utilized later in phased sequence relationship
        self._add_phase_records(record)
        patient_reference = reference.FHIRReference(
            {"reference": "Patient/" + self.patientID})
        alleles = get_allelic_state(record, ratio_ad_dp)
        dvuid = "dv-" + uuid4().hex[:13]
        self.fhir_report.update({str(record.POS): dvuid})
        self.result_ids.append(dvuid)
        observation_dv = observation.Observation()
        observation_dv.resource_type = "Observation"
        observation_dv.id = dvuid
        observation_dv.meta = meta.Meta({
            "profile": [("http://hl7.org/fhir/uv/" +
                         "genomics-reporting/StructureDefinition/variant")]
        })
        observation_dv.status = "final"
        observation_dv.category = [
            concept.CodeableConcept({
                "coding": [{
                    "system": ("http://terminology.hl7.org/" +
                               "CodeSystem/observation-category"),
                    "code":
                    "laboratory"
                }]
            })
        ]
        observation_dv.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "69548-6",
                "display": "Genetic variant assessment"
            }]
        })
        observation_dv.subject = patient_reference
        observation_dv.valueCodeableConcept = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "LA9633-4",
                "display": "present"
            }]
        })
        observation_dv.component = []

        observation_dv_component1 = observation.ObservationComponent()
        observation_dv_component1.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "62374-4",
                "display": "Human reference sequence assembly version"
            }]
        })
        observation_dv_component1\
            .valueCodeableConcept = concept.CodeableConcept(
                {
                    "coding": [
                        {
                            "system": "http://loinc.org",
                            "code": "LA14029-5",
                            "display": "GRCh37"
                        }
                    ]
                }
            )
        observation_dv.component.append(observation_dv_component1)

        observation_dv_component2 = observation.ObservationComponent()
        observation_dv_component2.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "48013-7",
                "display": "Genomic reference sequence ID"
            }]
        })
        observation_dv_component2\
            .valueCodeableConcept = concept.CodeableConcept(
                {
                    "coding": [
                        {
                            "system": "http://www.ncbi.nlm.nih.gov/nuccore",
                            "code": ref_seq
                        }
                    ]
                }
            )
        observation_dv.component.append(observation_dv_component2)

        if alleles['CODE'] != "" or alleles['ALLELE'] != "":
            observation_dv_component3 = observation.ObservationComponent()
            observation_dv_component3.code = concept.CodeableConcept({
                "coding": [{
                    "system": "http://loinc.org",
                    "code": "53034-5",
                    "display": "Allelic state"
                }]
            })
            observation_dv_component3\
                .valueCodeableConcept = concept.CodeableConcept(
                    {
                        "coding": [
                            {
                                "system": "http://loinc.org",
                                "code": alleles['CODE'],
                                "display": alleles['ALLELE']
                            }
                        ]
                    }
                )
            observation_dv.component.append(observation_dv_component3)

        observation_dv_component4 = observation.ObservationComponent()
        observation_dv_component4.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "69547-8",
                "display": "Genomic Ref allele [ID]"
            }]
        })
        observation_dv_component4.valueString = record.REF
        observation_dv.component.append(observation_dv_component4)

        observation_dv_component5 = observation.ObservationComponent()
        observation_dv_component5.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "69551-0",
                "display": "Genomic Alt allele [ID]"
            }]
        })
        observation_dv_component5.valueString = record.ALT[0].sequence
        observation_dv.component.append(observation_dv_component5)

        observation_dv_component6 = observation.ObservationComponent()
        observation_dv_component6.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "92822-6",
                "display": "Genomic coord system"
            }]
        })
        observation_dv_component6\
            .valueCodeableConcept = concept.CodeableConcept(
                {
                    "coding": [
                        {
                            "system": "http://loinc.org",
                            "code": "LA30102-0",
                            "display": "1-based character counting"
                        }
                    ]
                }
            )
        observation_dv.component.append(observation_dv_component6)

        observation_dv_component7 = observation.ObservationComponent()
        observation_dv_component7.code = concept.CodeableConcept({
            "coding": [{
                "system": ("http://hl7.org/fhir/uv/" +
                           "genomics-reporting/CodeSystem/tbd-codes"),
                "code":
                "exact-start-end",
                "display":
                "Variant exact start and end"
            }]
        })
        observation_dv_component7.valueRange = valRange.Range(
            {"low": {
                "value": int(record.POS)
            }})
        observation_dv.component.append(observation_dv_component7)

        self.report.contained.append(observation_dv)
Пример #9
0
def getEmptyFhirJSON(patientID, start, end, refSeq, nocall=False):
    logging.info("[FHIR: Converting XML to JSON]")
    noCallRegion, queryRange = getNoCallableData(NO_CALL_FILE,
                                                 QUERY_RANGE_FILE)
    nocallRows = len(noCallRegion.index)
    start = queryRange.at[0, "START"]
    end = queryRange.at[0, "END"]

    if not noCallRegion.empty:
        if noCallRegion['START'].iloc[0] <= queryRange['START'].iloc[0]:
            noCallRegion['START'].iloc[0] = queryRange['START'].iloc[0]

        if noCallRegion['END'].iloc[-1] >= queryRange['END'].iloc[0]:
            noCallRegion['END'].iloc[-1] = queryRange['END'].iloc[0]
    else:
        nocall = False

    contained_uid = uuid4().hex[:13]
    patient_reference = reference.FHIRReference(
        {"reference": "Patient/" + patientID})
    variant_reference = reference.FHIRReference(
        {"reference": "#rs-" + contained_uid})

    report = dr.DiagnosticReport()
    report.id = "dr-" + uuid4().hex[:13]
    report.meta = meta.Meta({
        "profile": [
            "http://hl7.org/fhir/uv/genomics-reporting/StructureDefinition/diagnosticreport"
        ]
    })
    report.code = concept.CodeableConcept({
        "coding": [{
            "system": "http://loinc.org",
            "code": "53041-0",
            "display": "DNA region of interest panel"
        }]
    })
    report.status = "final"
    report.subject = patient_reference
    report.issued = date.FHIRDate(Utilities.getFhirDate())
    report.result = [variant_reference]

    observation_rs = observation.Observation()
    contained_rs = observation_rs
    observation_dv = observation.Observation()
    contained_dv = observation_dv
    observation_sid = observation.Observation()
    contained_sid = observation_sid

    contained_rs.id = "rs-" + contained_uid
    observation_rs.resource_type = "Observation"
    contained_rs.meta = meta.Meta({
        "profile": [
            "http://hl7.org/fhir/uv/genomics-reporting/StructureDefinition/obs-region-studied"
        ]
    })
    observation_rs.code = concept.CodeableConcept({
        "coding": [{
            "system": "http://loinc.org",
            "code": "53041-0",
            "display": "DNA region of interest panel"
        }]
    })
    observation_rs.status = "final"
    observation_rs.category = [
        concept.CodeableConcept({
            "coding": [{
                "system":
                "http://terminology.hl7.org/CodeSystem/observation-category",
                "code": "laboratory"
            }]
        })
    ]
    observation_rs.subject = patient_reference
    observation_rs_component1 = observation.ObservationComponent()
    observation_rs_component1.code = concept.CodeableConcept({
        "coding": [{
            "system": "http://loinc.org",
            "code": "51959-5",
            "display": "Range(s) of DNA sequence examined"
        }]
    })
    observation_rs_component1.valueRange = valRange.Range({
        "low": {
            "value": int(start)
        },
        "high": {
            "value": int(end)
        }
    })

    observation_rs_component2 = observation.ObservationComponent()
    observation_rs_component2.code = concept.CodeableConcept({
        "coding": [{
            "system": "http://loinc.org",
            "code": "tbd-coordinate system",
            "display": "Genomic coordinate system"
        }]
    })
    observation_rs_component2.valueCodeableConcept = concept.CodeableConcept({
        "coding": [{
            "system":
            "http://hl7.org/fhir/uv/genomics-reporting/CodeSystem/genetic-coordinate-system",
            "code": "1"
        }]
    })

    observation_rs_component3 = observation.ObservationComponent()
    observation_rs_component3.code = concept.CodeableConcept({
        "coding": [{
            "system": "http://loinc.org",
            "code": "48013-7",
            "display": "Genomic reference sequence ID"
        }]
    })
    observation_rs_component3.valueCodeableConcept = concept.CodeableConcept({
        "coding": [{
            "system": "http://www.ncbi.nlm.nih.gov/nuccore",
            "code": refSeq
        }]
    })

    if nocall:
        #component Region-studied (No call region)

        nocallComponents = []
        for i in range(nocallRows):
            nocallComponents.append('observation_rs_component' + str(i + 4))

        observation_rs_components = []
        for (index, i) in zip(noCallRegion.index, nocallComponents):
            i = observation.ObservationComponent()
            i.code = concept.CodeableConcept({
                "coding": [{
                    "system": "http://loinc.org",
                    "code": "TBD-noCallRegion",
                    "display": "No call region"
                }]
            })
            observation_rs_components.append(i)

    if nocall:
        observation_rs.component = [
            observation_rs_component2, observation_rs_component3
        ] + observation_rs_components
    else:
        observation_rs.component = [
            observation_rs_component2, observation_rs_component3
        ]

    response = report.as_json()
    od = OrderedDict()
    od["resourceType"] = response['resourceType']
    od["id"] = response['id']
    od["meta"] = response['meta']
    od["contained"] = response['contained']
    od["status"] = response['status']
    od["code"] = response['code']
    od["subject"] = response['subject']
    od["issued"] = response['issued']
    od["result"] = response['result']

    with open(FHIR_JSON_RESULT + 'fhir.json', 'w') as fp:
        json.dump(od, fp, indent=4)

    return FHIR_JSON_RESULT
Пример #10
0
def getFhirJSON(cleanVcf,
                nextelem,
                patientID,
                refSeq,
                noCall=False,
                gender="M"):

    dvuids = {}
    siduids = []

    alleles = getAllelicState(cleanVcf, nextelem, gender)
    sequenceRels = getSequenceRelation(cleanVcf, nextelem)

    noCallRegion, queryRange = getNoCallableData(NO_CALL_FILE,
                                                 QUERY_RANGE_FILE)
    nocallRows = len(noCallRegion.index)
    start = queryRange.at[0, "START"]
    end = queryRange.at[0, "END"]

    if not noCallRegion.empty:
        if noCallRegion['START'].iloc[0] <= queryRange['START'].iloc[0]:
            noCallRegion['START'].iloc[0] = queryRange['START'].iloc[0]

        if noCallRegion['END'].iloc[-1] >= queryRange['END'].iloc[0]:
            noCallRegion['END'].iloc[-1] = queryRange['END'].iloc[0]
    else:
        noCall = False

    contained_uid = uuid4().hex[:13]
    patient_reference = reference.FHIRReference(
        {"reference": "Patient/" + patientID})
    variant_reference = reference.FHIRReference(
        {"reference": "#rs-" + contained_uid})

    report = dr.DiagnosticReport()
    report.id = "dr-" + uuid4().hex[:13]
    report.meta = meta.Meta({
        "profile": [
            "http://hl7.org/fhir/uv/genomics-reporting/StructureDefinition/genomics-report"
        ]
    })
    report.status = "final"
    report.code = concept.CodeableConcept({
        "coding": [{
            "system": "http://loinc.org",
            "code": "81247-9",
            "display": "Master HL7 genetic variant reporting panel"
        }]
    })
    report.subject = patient_reference
    report.issued = date.FHIRDate(Utilities.getFhirDate())

    observation_rs = observation.Observation()
    contained_rs = observation_rs

    contained_rs.id = "rs-" + contained_uid
    observation_rs.resource_type = "Observation"
    contained_rs.meta = meta.Meta({
        "profile": [
            "http://hl7.org/fhir/uv/genomics-reporting/StructureDefinition/region-studied"
        ]
    })
    observation_rs.code = concept.CodeableConcept({
        "coding": [{
            "system": "http://loinc.org",
            "code": "53041-0",
            "display": "DNA region of interest panel"
        }]
    })
    observation_rs.status = "final"
    observation_rs.category = [
        concept.CodeableConcept({
            "coding": [{
                "system":
                "http://terminology.hl7.org/CodeSystem/observation-category",
                "code": "laboratory"
            }]
        })
    ]
    observation_rs.subject = patient_reference
    observation_rs_component1 = observation.ObservationComponent()
    observation_rs_component1.code = concept.CodeableConcept({
        "coding": [{
            "system": "http://loinc.org",
            "code": "51959-5",
            "display": "Range(s) of DNA sequence examined"
        }]
    })
    observation_rs_component1.valueRange = valRange.Range({
        "low": {
            "value": int(start)
        },
        "high": {
            "value": int(end)
        }
    })

    observation_rs_component2 = observation.ObservationComponent()
    observation_rs_component2.code = concept.CodeableConcept({
        "coding": [{
            "system": "http://loinc.org",
            "code": "92822-6",
            "display": "Genomic coord system"
        }]
    })
    observation_rs_component2.valueCodeableConcept = concept.CodeableConcept({
        "coding": [{
            "system": "http://loinc.org",
            "code": "LA30102-0",
            "display": "1-based character counting"
        }]
    })

    observation_rs_component3 = observation.ObservationComponent()
    observation_rs_component3.code = concept.CodeableConcept({
        "coding": [{
            "system": "http://loinc.org",
            "code": "48013-7",
            "display": "Genomic reference sequence ID"
        }]
    })
    observation_rs_component3.valueCodeableConcept = concept.CodeableConcept({
        "coding": [{
            "system": "http://www.ncbi.nlm.nih.gov/nuccore",
            "code": refSeq
        }]
    })

    if noCall:
        #component Region-studied (No call region)
        nocallComponents = []
        for i in range(nocallRows):
            nocallComponents.append('observation_rs_component' + str(i + 4))

        observation_rs_components = []
        for (index, i) in zip(noCallRegion.index, nocallComponents):
            i = observation.ObservationComponent()
            i.code = concept.CodeableConcept({
                "coding": [{
                    "system": "http://loinc.org",
                    "code": "TBD-noCallRegion",
                    "display": "No call region"
                }]
            })
            observation_rs_components.append(i)
        observation_rs.component = [
            observation_rs_component2, observation_rs_component3
        ] + observation_rs_components
    else:
        observation_rs.component = [
            observation_rs_component2, observation_rs_component3
        ]

    # Observation structure : described-variants
    obsContained = [contained_rs]
    for index in alleles.index:
        dvuid = uuid4().hex[:13]
        dvuids.update({str(alleles.at[index, 'POS']): dvuid})

        observation_dv = observation.Observation()
        observation_dv.resource_type = "Observation"
        observation_dv.id = "dv-" + dvuid
        observation_dv.meta = meta.Meta({
            "profile": [
                "http://hl7.org/fhir/uv/genomics-reporting/StructureDefinition/variant"
            ]
        })
        observation_dv.status = "final"
        observation_dv.category = [
            concept.CodeableConcept({
                "coding": [{
                    "system":
                    "http://terminology.hl7.org/CodeSystem/observation-category",
                    "code": "laboratory"
                }]
            })
        ]
        observation_dv.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "69548-6",
                "display": "Genetic variant assessment"
            }]
        })
        observation_dv.subject = patient_reference
        observation_dv.valueCodeableConcept = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "LA9633-4",
                "display": "present"
            }]
        })

        observation_dv_component1 = observation.ObservationComponent()
        observation_dv_component1.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "62374-4",
                "display": "Human reference sequence assembly version"
            }]
        })
        observation_dv_component1.valueCodeableConcept = concept.CodeableConcept(
            {
                "coding": [{
                    "system": "http://loinc.org",
                    "code": "LA14029-5",
                    "display": "GRCh37"
                }]
            })

        observation_dv_component2 = observation.ObservationComponent()
        observation_dv_component2.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "48013-7",
                "display": "Genomic reference sequence ID"
            }]
        })
        observation_dv_component2.valueCodeableConcept = concept.CodeableConcept(
            {
                "coding": [{
                    "system": "http://www.ncbi.nlm.nih.gov/nuccore",
                    "code": refSeq
                }]
            })

        observation_dv_component3 = observation.ObservationComponent()
        observation_dv_component3.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "53034-5",
                "display": "Allelic state"
            }]
        })
        observation_dv_component3.valueCodeableConcept = concept.CodeableConcept(
            {
                "coding": [{
                    "system": "http://loinc.org",
                    "code": alleles.at[index, 'CODE'],
                    "display": alleles.at[index, 'ALLELE']
                }]
            })

        observation_dv_component4 = observation.ObservationComponent()
        observation_dv_component4.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "69547-8",
                "display": "Genomic Ref allele [ID]"
            }]
        })
        observation_dv_component4.valueString = alleles.at[index, 'REF']

        observation_dv_component5 = observation.ObservationComponent()
        observation_dv_component5.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "69551-0",
                "display": "Genomic Alt allele [ID]"
            }]
        })
        observation_dv_component5.valueString = alleles.at[index, 'ALT']

        observation_dv_component6 = observation.ObservationComponent()
        observation_dv_component6.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "92822-6",
                "display": "Genomic coord system"
            }]
        })
        observation_dv_component6.valueCodeableConcept = concept.CodeableConcept(
            {
                "coding": [{
                    "system": "http://loinc.org",
                    "code": "LA30102-0",
                    "display": "1-based character counting"
                }]
            })

        observation_dv_component7 = observation.ObservationComponent()
        observation_dv_component7.code = concept.CodeableConcept({
            "coding": [{
                "system":
                "http://hl7.org/fhir/uv/genomics-reporting/CodeSystem/tbd-codes",
                "code": "exact-start-end",
                "display": "Variant exact start and end"
            }]
        })
        observation_dv_component7.valueRange = valRange.Range(
            {"low": {
                "value": int(alleles.at[index, 'POS'])
            }})

        observation_dv.component = [
            observation_dv_component1, observation_dv_component2,
            observation_dv_component3, observation_dv_component4,
            observation_dv_component5, observation_dv_component6,
            observation_dv_component7
        ]
        obsContained.append(observation_dv)

    # Obesrvation structure: sequence-phase relatons
    siduids = []

    for index in sequenceRels.index:
        dvRef1 = dvuids.get(str(sequenceRels.at[index, 'POS1']))
        dvRef2 = dvuids.get(str(sequenceRels.at[index, 'POS2']))
        siduid = uuid4().hex[:13]
        siduids.append(siduid)

        observation_sid = observation.Observation()
        observation_sid.resource_type = "Observation"
        observation_sid.id = "sid-" + siduid
        observation_sid.meta = meta.Meta({
            "profile": [
                "http://hl7.org/fhir/uv/genomics-reporting/StructureDefinition/sequence-phase-relationship"
            ]
        })
        observation_sid.status = "final"
        observation_sid.category = [
            concept.CodeableConcept({
                "coding": [{
                    "system":
                    "http://terminology.hl7.org/CodeSystem/observation-category",
                    "code": "laboratory"
                }]
            })
        ]
        observation_sid.code = concept.CodeableConcept({
            "coding": [{
                "system": "http://loinc.org",
                "code": "82120-7",
                "display": "Allelic phase"
            }]
        })
        observation_sid.subject = patient_reference
        observation_sid.valueCodeableConcept = concept.CodeableConcept({
            "coding": [{
                "system":
                "http://hl7.org/fhir/uv/genomics-reporting/CodeSystem/seq-phase-relationship",
                "code": sequenceRels.at[index, 'Relation'],
                "display": sequenceRels.at[index, 'Relation']
            }]
        })
        obsContained.append(observation_sid)

    report.contained = obsContained

    reportResult = [variant_reference]
    for pos, uid in dvuids.items():
        reportResult.append(
            reference.FHIRReference({"reference": "#dv-" + uid}))

    for uid in siduids:
        reportResult.append(
            reference.FHIRReference({"reference": "#sid-" + uid}))

    report.result = reportResult
    response = report.as_json()

    od = OrderedDict()
    od["resourceType"] = response['resourceType']
    od["id"] = response['id']
    od["meta"] = response['meta']
    od["contained"] = response['contained']
    od["status"] = response['status']
    od["code"] = response['code']
    od["subject"] = response['subject']
    od["issued"] = response['issued']
    od["result"] = response['result']

    odCodeCoding = OrderedDict()
    odCodeCoding["system"] = od["code"]["coding"][0]["system"]
    odCodeCoding["code"] = od["code"]["coding"][0]["code"]
    odCodeCoding["display"] = od["code"]["coding"][0]["display"]
    od["code"]["coding"][0] = odCodeCoding

    sidIndex = 0
    for index, fhirReport in enumerate(od['contained']):
        if (fhirReport['id'].startswith('sid-')):
            sidIndex = index
            break

    for index, (sequenceRel, fhirReport) in enumerate(
            zip(sequenceRels.index, od['contained'][sidIndex:])):
        dvRef1 = dvuids.get(str(sequenceRels.at[index, 'POS1']))
        dvRef2 = dvuids.get(str(sequenceRels.at[index, 'POS2']))
        if (fhirReport['id'].startswith('sid-')):
            derivedFromDV1 = {}
            derivedFromDV2 = {}
            derivedFromDV1['reference'] = "#dv-" + dvRef1
            derivedFromDV2['reference'] = "#dv-" + dvRef2
            derivedFrom = [derivedFromDV1, derivedFromDV2]
            fhirReport['derivedFrom'] = derivedFrom

    for k, i in enumerate(od['contained']):
        if (i['category'][0]['coding'][0]):
            odCategoryCoding = OrderedDict()
            odCategoryCoding["system"] = i['category'][0]['coding'][0][
                "system"]
            odCategoryCoding["code"] = i['category'][0]['coding'][0]["code"]
            od['contained'][k]['category'][0]['coding'][0] = odCategoryCoding

        if (i['code']['coding'][0]):
            odCodeCoding = OrderedDict()
            odCodeCoding["system"] = i['code']['coding'][0]["system"]
            odCodeCoding["code"] = i['code']['coding'][0]["code"]
            odCodeCoding["display"] = i['code']['coding'][0]["display"]
            od['contained'][k]['code']['coding'][0] = odCodeCoding

        if 'valueCodeableConcept' in i.keys():
            odValueCodeableConceptCoding = OrderedDict()
            odValueCodeableConceptCoding["system"] = i['valueCodeableConcept'][
                'coding'][0]["system"]
            odValueCodeableConceptCoding["code"] = i['valueCodeableConcept'][
                'coding'][0]["code"]
            odValueCodeableConceptCoding["display"] = i[
                'valueCodeableConcept']['coding'][0]["display"]
            od['contained'][k]['valueCodeableConcept']['coding'][
                0] = odValueCodeableConceptCoding

        if ((i['id'].startswith('dv-')) or (i['id'].startswith('rs-'))):
            for l, j in enumerate(i['component']):
                odComponentCodeCoding = OrderedDict()
                if j['code']['coding'][0]["system"]:
                    odComponentCodeCoding["system"] = j['code']['coding'][0][
                        "system"]
                if j['code']['coding'][0]["code"]:
                    odComponentCodeCoding["code"] = j['code']['coding'][0][
                        "code"]
                if j['code']['coding'][0]["display"]:
                    odComponentCodeCoding["display"] = j['code']['coding'][0][
                        "display"]
                if od['contained'][k]['component'][l]['code']['coding'][0]:
                    od['contained'][k]['component'][l]['code']['coding'][
                        0] = odComponentCodeCoding

                odComponentvalueCodeableConcept = OrderedDict()
                if 'valueCodeableConcept' in j.keys():
                    odComponentvalueCodeableConcept["system"] = j[
                        'valueCodeableConcept']['coding'][0]["system"]
                    if 'code' in j['valueCodeableConcept']['coding'][0].keys():
                        odComponentvalueCodeableConcept["code"] = j[
                            'valueCodeableConcept']['coding'][0]["code"]
                    if 'display' in j['valueCodeableConcept']['coding'][
                            0].keys():
                        odComponentvalueCodeableConcept["display"] = j[
                            'valueCodeableConcept']['coding'][0]["display"]
                    od['contained'][k]['component'][l]['valueCodeableConcept'][
                        'coding'][0] = odComponentvalueCodeableConcept

        if (i['id'].startswith('rs-')):
            odRS = OrderedDict()
            odRS["resourceType"] = i['resourceType']
            odRS["id"] = i['id']
            odRS["meta"] = i['meta']
            odRS["status"] = i['status']
            odRS["category"] = i['category']
            odRS["code"] = i['code']
            odRS["subject"] = i['subject']
            odRS["component"] = i['component']
            od['contained'][k] = odRS

        if (i['id'].startswith('dv-')):
            odDV = OrderedDict()
            odDV["resourceType"] = i['resourceType']
            odDV["id"] = i['id']
            odDV["meta"] = i['meta']
            odDV["status"] = i['status']
            odDV["category"] = i['category']
            odDV["code"] = i['code']
            odDV["subject"] = i['subject']
            odDV["valueCodeableConcept"] = i['valueCodeableConcept']
            odDV["component"] = i['component']
            od['contained'][k] = odDV

        if (i['id'].startswith('sid-')):
            odSID = OrderedDict()
            odSID["resourceType"] = i['resourceType']
            odSID["id"] = i['id']
            odSID["meta"] = i['meta']
            odSID["status"] = i['status']
            odSID["category"] = i['category']
            odSID["code"] = i['code']
            odSID["subject"] = i['subject']
            odSID["valueCodeableConcept"] = i['valueCodeableConcept']
            odSID["derivedFrom"] = i['derivedFrom']
            od['contained'][k] = odSID

    with open(FHIR_JSON_RESULT + 'fhir.json', 'w') as fp:
        json.dump(od, fp, indent=4)

    return FHIR_JSON_RESULT
Пример #11
0
    def create_fhir_object(self):
        """
        Generate a fhirclient.Patient class object and store in the protected attribute _fhir
        :return:
            None
        """
        # Patient object must be persistent to generate FHIR attributes
        ins = inspect(self)
        if ins.persistent:
            # Initialize Patient resource
            fhir_pt = fhir_patient.Patient()

            # Set resource logical identifier
            fhir_pt.id = self.get_url()

            # Build and assign Meta resource for Patient object
            fhir_meta = meta.Meta()
            fhir_meta.lastUpdated = fhir_gen_datetime(value=self.updated_at, error_out=False, to_date=False)
            fhir_meta.versionId = str(self.version_number)
            fhir_meta.profile = ['http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient']
            fhir_pt.meta = fhir_meta

            # Patient name represented as HumanName resource
            fhir_pt.name = []
            fhir_pt.name.append(fhir_gen_humanname(use='usual', first_name=self.first_name, last_name=self.last_name,
                                                   middle_name=self.middle_name, suffix=self.suffix,
                                                   prefix=self.prefix))
            # Display MRN as identifier codeable concept = Patient.identifier.codeableconcept.coding
            # Initialize Identifier resource
            id_mrn = identifier.Identifier()
            id_mrn.use = 'usual'
            id_mrn.system = 'http://unkani.com'
            id_mrn.value = str(self.uuid)

            # Initialize CodeableConcept resource
            mrn_cc = codeableconcept.CodeableConcept()
            mrn_cc.text = 'Medical Record Number'

            # Initialize Coding resource
            mrn_coding = coding.Coding()
            mrn_coding.system = 'http://hl7.org/fhir/v2/0203'
            mrn_coding.code = 'MR'
            mrn_coding.display = 'Medical Record Number'

            # Assign Coding resource to CodeableConcept
            mrn_cc.coding = [mrn_coding]

            # Assign CodeableConcept to Identifier
            id_mrn.type = mrn_cc

            # Assign CodeableConcept to Patient
            fhir_pt.identifier = [id_mrn]

            # Display SSN as identifier codeable concept = Patient.identifier.codeableconcept.coding
            if self.ssn:
                # Initialize Identifier resource
                id_ssn = identifier.Identifier()
                id_ssn.use = 'usual'
                id_ssn.system = 'http://hl7.org/fhir/sid/us-ssn'
                id_ssn.value = self.ssn

                # Initialize CodeableConcept resource
                ssn_cc = codeableconcept.CodeableConcept()
                ssn_cc.text = 'Social Security Number'

                # Initialize Coding resource
                ssn_coding = coding.Coding()
                ssn_coding.system = 'http://hl7.org/fhir/v2/0203'
                ssn_coding.code = 'SS'
                ssn_coding.display = 'Social Security Number'

                # Assign Coding resource to CodeableConcept
                ssn_cc.coding = [ssn_coding]

                # Assign CodeableConcept to Identifier
                id_ssn.type = ssn_cc

                # Assign CodeableConcept to Patient
                fhir_pt.identifier.append(id_ssn)

            if self.marital_status:
                marital_status_cc = codeableconcept.CodeableConcept()
                marital_status_url = 'http://hl7.org/fhir/ValueSet/marital-status'
                marital_status_concept = ValueSet.get_valueset_concept(marital_status_url, self.marital_status)
                if marital_status_concept:
                    marital_status_cc.text = getattr(marital_status_concept, 'display')
                marital_status_coding = coding.Coding()
                marital_status_coding.code = self.marital_status
                marital_status_coding.system = marital_status_url
                marital_status_coding.display = marital_status_cc.text

                marital_status_cc.coding = [marital_status_coding]
                fhir_pt.maritalStatus = marital_status_cc

            if self.race:
                ext_race = extension.Extension()
                ext_race.url = 'http://hl7.org/fhir/StructureDefinition/us-core-race'
                race_url = 'http://hl7.org/fhir/us/core/ValueSet/omb-race-category'
                cc_race = codeableconcept.CodeableConcept()
                race_concept = ValueSet.get_valueset_concept(race_url, self.race)
                if race_concept:
                    cc_race.text = getattr(race_concept, 'display')
                coding_race = coding.Coding()
                coding_race.system = race_url
                coding_race.code = self.race
                coding_race.display = cc_race.text
                cc_race.coding = [coding_race]
                ext_race.valueCodeableConcept = cc_race
                try:
                    fhir_pt.extension.append(ext_race)
                except AttributeError:
                    fhir_pt.extension = [ext_race]

            if self.ethnicity:
                ext_ethnicity = extension.Extension()
                ext_ethnicity.url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity'
                cc_ethnicity = codeableconcept.CodeableConcept()
                cc_ethnicity.text = ethnicity_dict.get(self.ethnicity)[0].capitalize()
                coding_ethnicity = coding.Coding()
                coding_ethnicity.system = 'http://hl7.org/fhir/us/core/ValueSet/omb-ethnicity-category'
                coding_ethnicity.code = self.race
                coding_ethnicity.display = cc_ethnicity.text
                cc_ethnicity.coding = [coding_ethnicity]
                ext_ethnicity.valueCodeableConcept = cc_ethnicity

                try:
                    fhir_pt.extension.append(ext_ethnicity)
                except AttributeError:
                    fhir_pt.extension = [ext_ethnicity]

            if self.sex:
                sex_dict = {"administrativeGender": {"M": "male", "F": "female", "u": "unknown", "o": "other"},
                            "usCoreBirthSex": {"M": "M", "F": "F", "U": "UNK", "O": "UNK"}}

                fhir_pt.gender = sex_dict['administrativeGender'][str(self.sex).upper()]

                ext_birth_sex = extension.Extension()
                ext_birth_sex.url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex'
                ext_birth_sex.valueCode = sex_dict['usCoreBirthSex'][str(self.sex).upper()]

                try:
                    fhir_pt.extension.append(ext_birth_sex)
                except AttributeError:
                    fhir_pt.extension = [ext_birth_sex]

            if self.dob:
                fhir_pt.birthDate = fhir_gen_datetime(value=self.dob, to_date=True)

            fhir_pt.active = self.active

            fhir_pt.deceasedBoolean = self.deceased

            if self.deceased_date:
                fhir_pt.deceasedDateTime = fhir_gen_datetime(value=self.deceased_date, to_date=False)

            if self.preferred_language:
                fhir_comm = fhir_patient.PatientCommunication()
                fhir_comm.preferred = True
                fhir_lang_cc = codeableconcept.CodeableConcept()
                fhir_lang_coding = coding.Coding()
                fhir_lang_coding.code = self.preferred_language
                fhir_lang_url = 'http://hl7.org/fhir/ValueSet/languages'
                fhir_lang_coding.system = fhir_lang_url
                fhir_lang_concept = ValueSet.get_valueset_concept(fhir_lang_url, self.preferred_language)
                if fhir_lang_concept:
                    fhir_lang_coding.display = fhir_lang_concept.display
                    fhir_lang_cc.text = fhir_lang_coding.display
                fhir_lang_cc.coding = [fhir_lang_coding]
                fhir_comm.language = fhir_lang_cc
                fhir_pt.communication = [fhir_comm]

            contact_point_list = []

            phone_list = self.phone_numbers.all()
            if phone_list:
                for ph in phone_list:
                    contact_point_list.append(ph.fhir)

            email_list = self.email_addresses.all()
            if email_list:
                for em in email_list:
                    contact_point_list.append(em.fhir)

            if contact_point_list:
                fhir_pt.telecom = contact_point_list

            address_list = self.addresses.all()
            if address_list:
                fhir_pt.address = []
                for addr in address_list:
                    fhir_pt.address.append(addr.fhir)

            xhtml = render_template('fhir/patient.html', fhir_patient=fhir_pt, patient=self)
            fhir_pt.text = narrative.Narrative()
            fhir_pt.text.status = 'generated'
            fhir_pt.text.div = xhtml

            self._fhir = fhir_pt