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
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)
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
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 = []
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
def meta(self): return mt.Meta({"profile": ["http://hl7.org/fhir/StructureDefinition/vitalsigns"]})
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)
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)
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
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
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