def fhir_condition(obj):
    """ Converts Disease to FHIR Condition. """

    condition = cond.Condition()
    condition.id = str(obj['id'])
    condition.code = fhir_codeable_concept(obj['term'])
    # subject is required by Pheno-FHIR mapping Guide and by FHIR, set to 'unknown'
    condition.subject = fhirreference.FHIRReference()
    condition.subject.reference = 'unknown'
    condition.extension = []
    # only adds disease-onset if it's ontology term
    # NOTE it is required element by Pheno-FHIR mapping guide but not Phenopackets
    if check_disease_onset(obj):
        onset_extension = extension.Extension()
        onset_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['disease']['onset']
        onset_extension.valueCodeableConcept = fhir_codeable_concept(
            obj['onset']['age'])
        condition.extension.append(onset_extension)

    if 'disease_stage' in obj.keys():
        for item in obj['disease_stage']:
            disease_stage_extension = extension.Extension()
            disease_stage_extension.url = PHENOPACKETS_ON_FHIR_MAPPING[
                'disease']['disease_stage']
            disease_stage_extension.valueCodeableConcept = fhir_codeable_concept(
                item)
            condition.extension.append(disease_stage_extension)

    return condition.as_json()
Beispiel #2
0
def individual_to_fhir(obj):
    """Converts Individual to FHIR Patient.

    :param obj: Individual json
    :return: FHIR Patient json
    """

    # first validate if phenopackets object is well-formed
    schema_path = os.path.join(SCHEMA_PATH, 'individual_schema.json')
    try:
        validate_schema(schema_path, obj)
    except jsonschema.exceptions.ValidationError:
        raise Exception("The individual object is not valid.")

    patient = p.Patient()
    patient.id = obj['id']
    patient.birthDate = fhirdate.FHIRDate(obj.get('dateOfBirth', None))
    patient.gender = obj.get('sex', None)
    patient.active = obj.get('active', None)
    patient.deceasedBoolean = obj.get('deceased', None)
    patient.extension = list()
    # age
    if 'age' in obj:
        age_extension = age_to_fhir(
            obj, PHENOPACKETS_ON_FHIR_MAPPING['individual']['age'], 'age')
        patient.extension.append(age_extension)
    # karyotypic_sex
    if 'karyotypicSex' in obj:
        karyotypic_sex_extension = extension.Extension()
        karyotypic_sex_extension.url = PHENOPACKETS_ON_FHIR_MAPPING[
            'individual']['karyotypicSex']['url']
        karyotypic_sex_extension.valueCodeableConcept = codeableconcept.CodeableConcept(
        )
        karyotypic_sex_extension.valueCodeableConcept.coding = list()
        coding = c.Coding()
        coding.display = obj.get('karyotypicSex', None)
        coding.code = obj.get('karyotypicSex', None)
        coding.system = PHENOPACKETS_ON_FHIR_MAPPING['individual'][
            'karyotypicSex']['system']
        karyotypic_sex_extension.valueCodeableConcept.coding.append(coding)
        patient.extension.append(karyotypic_sex_extension)
    # taxonomy
    if 'taxonomy' in obj:
        taxonomy_extension = extension.Extension()
        taxonomy_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['individual'][
            'taxonomy']
        taxonomy_extension.valueCodeableConcept = codeableconcept.CodeableConcept(
        )
        taxonomy_extension.valueCodeableConcept.coding = list()
        coding = c.Coding()
        coding.display = obj.get('taxonomy', None).get('label', None)
        coding.code = obj.get('taxonomy', None).get('id', None)
        taxonomy_extension.valueCodeableConcept.coding.append(coding)
        patient.extension.append(taxonomy_extension)
    return patient.as_json()
def fhir_document_reference(obj):
    """ Converts HTS file to FHIR DocumentReference. """

    doc_ref = documentreference.DocumentReference()
    doc_ref.type = fhir_codeable_concept({
        "label": obj['hts_format'],
        "id": obj['hts_format']
    })
    # GA4GH requires status with the fixed value
    doc_ref.status = PHENOPACKETS_ON_FHIR_MAPPING['hts_file']['status']
    doc_ref.content = []
    doc_content = documentreference.DocumentReferenceContent()
    doc_content.attachment = attachment.Attachment()
    doc_content.attachment.url = obj['uri']
    if 'description' in obj.keys():
        doc_content.attachment.title = obj.get('description', None)
    doc_ref.content.append(doc_content)
    doc_ref.indexed = fhirdate.FHIRDate()
    # check what date it should be  - when it's retrieved or created
    doc_ref.indexed.date = datetime.now()
    doc_ref.extension = []
    genome_assembly = extension.Extension()
    genome_assembly.url = PHENOPACKETS_ON_FHIR_MAPPING['hts_file'][
        'genome_assembly']
    genome_assembly.valueString = obj['genome_assembly']
    doc_ref.extension.append(genome_assembly)
    return doc_ref.as_json()
Beispiel #4
0
def hts_file_to_fhir(obj):
    """Converts HTS file to FHIR DocumentReference.

    :param obj: HTS file json
    :return: FHIR DocumentReference json
    """

    schema_path = os.path.join(SCHEMA_PATH, 'hts_file_schema.json')
    try:
        validate_schema(schema_path, obj)
    except jsonschema.exceptions.ValidationError:
        raise Exception("The hts file object is not valid.")
    doc_ref = documentreference.DocumentReference()
    doc_ref.type = fhir_codeable_concept({
        "label": obj['htsFormat'],
        "id": obj['htsFormat']
    })
    # GA4GH requires status with the fixed value
    doc_ref.status = PHENOPACKETS_ON_FHIR_MAPPING['htsFile']['status']
    doc_ref.content = []
    doc_content = documentreference.DocumentReferenceContent()
    doc_content.attachment = attachment.Attachment()
    doc_content.attachment.url = obj['uri']
    if 'description' in obj:
        doc_content.attachment.title = obj['description']
    doc_ref.content.append(doc_content)
    doc_ref.indexed = fhirdate.FHIRDate()
    doc_ref.indexed.date = datetime.now()
    doc_ref.extension = []
    genome_assembly = extension.Extension()
    genome_assembly.url = PHENOPACKETS_ON_FHIR_MAPPING['htsFile'][
        'genomeAssembly']
    genome_assembly.valueString = obj['genomeAssembly']
    doc_ref.extension.append(genome_assembly)
    return doc_ref.as_json()
Beispiel #5
0
def get_responseperiod_x(start,end):

    responseperiod_x = Ext.Extension()
    responseperiod_x.url = 'http://fhir.org/guides/argonaut-questionnaire/StructureDefinition/extension-responsePeriod'
    responseperiod_x.valuePeriod = P.Period()
    responseperiod_x.valuePeriod.start = FD.FHIRDate(start)
    responseperiod_x.valuePeriod.end = FD.FHIRDate(end)
    return responseperiod_x
 def QuestionnaireExtension(questionnaire=questionnaire.Questionnaire):
     from fhirclient.models import extension
     extension = extension.Extension()
     extension.url = 'http://hl7.org/fhir/StructureDefinition/servicerequest-questionnaireRequest'
     reference = fhirreference.FHIRReference()
     reference.reference = f'Questionnaire/{questionnaire.id}'
     extension.valueReference = reference
     return extension
def fhir_specimen(obj):
    """ Converts biosample to FHIR Specimen. """

    specimen = s.Specimen()
    specimen.identifier = []
    # id
    identifier = fhir_indentifier.Identifier()
    identifier.value = obj['id']
    specimen.identifier.append(identifier)
    # individual - subject property in FHIR is mandatory for a specimen
    specimen.subject = fhirreference.FHIRReference()
    specimen.subject.reference = obj.get('individual', 'unknown')
    # sampled_tissue
    specimen.type = codeableconcept.CodeableConcept()
    specimen.type.coding = []
    coding = c.Coding()
    coding.code = obj['sampled_tissue']['id']
    coding.display = obj['sampled_tissue']['label']
    specimen.type.coding.append(coding)
    # description
    if 'description' in obj.keys():
        specimen.note = []
        annotation = a.Annotation()
        annotation.text = obj.get('description', None)
        specimen.note.append(annotation)
    # procedure
    specimen.collection = s.SpecimenCollection()
    specimen.collection.method = fhir_codeable_concept(
        obj['procedure']['code'])
    if 'body_site' in obj['procedure'].keys():
        specimen.collection.bodySite = fhir_codeable_concept(
            obj['procedure']['body_site'])
    # Note on taxonomy from phenopackets specs:
    # Individuals already contain a taxonomy attribute so this attribute is not needed.
    # extensions
    specimen.extension = []
    # individual_age_at_collection
    if 'individual_age_at_collection' in obj.keys():
        ind_age_at_collection_extension = fhir_age(
            obj, PHENOPACKETS_ON_FHIR_MAPPING['biosample']
            ['individual_age_at_collection'], 'individual_age_at_collection')
        specimen.extension.append(ind_age_at_collection_extension)
    concept_extensions = codeable_concepts_fields([
        'histological_diagnosis', 'tumor_progression', 'tumor_grade',
        'diagnostic_markers'
    ], 'biosample', obj)
    for concept in concept_extensions:
        specimen.extension.append(concept)

    if 'is_control_sample' in obj.keys():
        control_extension = extension.Extension()
        control_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['biosample'][
            'is_control_sample']
        control_extension.valueBoolean = obj['is_control_sample']
        specimen.extension.append(control_extension)
    # TODO 2m extensions - references
    return specimen.as_json()
def fhir_patient(obj):
    """ Converts Individual to FHIR Patient. """

    patient = p.Patient()
    patient.id = obj['id']
    patient.birthDate = fhirdate.FHIRDate(obj.get('date_of_birth', None))
    patient.gender = obj.get('sex', None)
    patient.active = obj.get('active', None)
    patient.deceasedBoolean = obj.get('deceased', None)
    patient.extension = list()
    # age
    if 'age' in obj.keys():
        age_extension = fhir_age(
            obj, PHENOPACKETS_ON_FHIR_MAPPING['individual']['age'], 'age')
        patient.extension.append(age_extension)
    # karyotypic_sex
    karyotypic_sex_extension = extension.Extension()
    karyotypic_sex_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['individual'][
        'karyotypic_sex']['url']
    karyotypic_sex_extension.valueCodeableConcept = codeableconcept.CodeableConcept(
    )
    karyotypic_sex_extension.valueCodeableConcept.coding = list()
    coding = c.Coding()
    coding.display = obj.get('karyotypic_sex', None)
    coding.code = obj.get('karyotypic_sex', None)
    coding.system = PHENOPACKETS_ON_FHIR_MAPPING['individual'][
        'karyotypic_sex']['system']
    karyotypic_sex_extension.valueCodeableConcept.coding.append(coding)
    patient.extension.append(karyotypic_sex_extension)
    # taxonomy
    if 'taxonomy' in obj.keys():
        taxonomy_extension = extension.Extension()
        taxonomy_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['individual'][
            'taxonomy']
        taxonomy_extension.valueCodeableConcept = codeableconcept.CodeableConcept(
        )
        taxonomy_extension.valueCodeableConcept.coding = list()
        coding = c.Coding()
        coding.display = obj.get('taxonomy', None).get('label', None)
        coding.code = obj.get('taxonomy', None).get('id', None)
        taxonomy_extension.valueCodeableConcept.coding.append(coding)
        patient.extension.append(taxonomy_extension)
    return patient.as_json()
Beispiel #9
0
    def to_fhir(self) -> extension.Extension:
        fhir_extension = extension.Extension()
        fhir_extension.url = self.extension_url

        fhir_coding = coding.Coding()
        fhir_coding.system = self.system
        fhir_coding.code = self.code
        fhir_coding.display = self.display
        fhir_extension.valueCoding = fhir_coding

        return fhir_extension
Beispiel #10
0
    def to_fhir(self) -> extension.Extension:
        ingredient_extension = extension.Extension()
        ingredient_extension.url = self.url

        extension_coding = coding.Coding()
        extension_coding.system = self.coding_system
        extension_coding.code = self.coding_code
        extension_coding.display = self.coding_display

        ingredient_extension.valueCoding = extension_coding

        return ingredient_extension
def codeable_concepts_fields(field_list, profile, obj):
    """ Converts a list of fields to FHIR CodeableConcepts and returns a list of extensions. """
    concept_extensions = []
    for field in field_list:
        if field in obj.keys():
            codeable_concepts_extension = extension.Extension()
            codeable_concepts_extension.url = PHENOPACKETS_ON_FHIR_MAPPING[
                profile][field]
            codeable_concepts_extension.valueCodeableConcept = fhir_codeable_concept(
                obj[field])
            concept_extensions.append(codeable_concepts_extension)
    return concept_extensions
Beispiel #12
0
def disease_to_fhir(obj):
    """Converts Disease to FHIR Condition.

    :param obj: Disease json
    :return: FHIR Condition json
    """

    schema_path = os.path.join(SCHEMA_PATH, 'disease_schema.json')
    try:
        validate_schema(schema_path, obj)
    except jsonschema.exceptions.ValidationError:
        raise Exception("The disease object is not valid.")
    condition = cond.Condition()
    if 'id' in obj:
        condition.id = str(obj['id'])
    condition.code = fhir_codeable_concept(obj['term'])
    # subject is required by Pheno-FHIR mapping Guide and by FHIR, set to 'unknown'
    condition.subject = fhirreference.FHIRReference()
    condition.subject.reference = 'unknown'
    condition.extension = []
    # only adds disease-onset if it's ontology term
    # NOTE it is required element by Phenopackets IG but not Phenopackets
    # what do to if it's AGE string?
    if check_disease_onset(obj):
        onset_extension = extension.Extension()
        onset_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['disease']['onset']
        onset_extension.valueCodeableConcept = fhir_codeable_concept(
            obj['onset']['age'])
        condition.extension.append(onset_extension)

    if 'diseaseStage' in obj:
        for item in obj['diseaseStage']:
            disease_stage_extension = extension.Extension()
            disease_stage_extension.url = PHENOPACKETS_ON_FHIR_MAPPING[
                'disease']['disease_stage']
            disease_stage_extension.valueCodeableConcept = fhir_codeable_concept(
                item)
            condition.extension.append(disease_stage_extension)

    return condition.as_json()
def fhir_age(obj, mapping, field):
    """ Generic function to convert Age or AgeRange to FHIR Age. """

    age_extension = extension.Extension()
    age_extension.url = mapping

    if isinstance(obj[field]['age'], dict):
        age_extension.valueRange = range.Range()
        age_extension.valueRange.low = quantity.Quantity()
        age_extension.valueRange.low.unit = obj[field]['age']['start']['age']
        age_extension.valueRange.high = quantity.Quantity()
        age_extension.valueRange.high.unit = obj[field]['age']['end']['age']
    else:
        age_extension.valueAge = age.Age()
        age_extension.valueAge.unit = obj[field]['age']
    return age_extension
Beispiel #14
0
def fhir_age(obj, mapping, field):
    """ Generic function to convert Age or AgeRange to FHIR Age. """

    age_extension = extension.Extension()
    age_extension.url = mapping

    if "start" in obj[field]:  # Is an age range
        age_extension.valueRange = range_.Range()
        age_extension.valueRange.low = quantity.Quantity()
        age_extension.valueRange.low.unit = obj[field]['start']['age']
        age_extension.valueRange.high = quantity.Quantity()
        age_extension.valueRange.high.unit = obj[field]['end']['age']
    else:  # Is a precise age
        age_extension.valueAge = age.Age()
        age_extension.valueAge.unit = obj[field]['age']
    return age_extension
Beispiel #15
0
def codeable_concepts_fields(field_list, profile, obj):
    """Converts a list of fields to FHIR CodeableConcepts and returns a list of extensions.

    :param field_list: fields to convert to codeable concepts
    :param profile: name of an object in phenopackets mappings
    :param obj: object to which fields belong to
    :return: list of extensions
    """

    concept_extensions = []
    for field in field_list:
        if field in obj:
            codeable_concepts_extension = extension.Extension()
            codeable_concepts_extension.url = PHENOPACKETS_ON_FHIR_MAPPING[
                profile][field]
            codeable_concepts_extension.valueCodeableConcept = fhir_codeable_concept(
                obj[field])
            concept_extensions.append(codeable_concepts_extension)
    return concept_extensions
Beispiel #16
0
def age_to_fhir(obj, mapping, field):
    """Generic function to convert Phenopackets Age or AgeRange to FHIR Age.

    :param obj: object to which field Age or AgeRange belongs to
    :param mapping: mapping from PHENOPACKETS_ON_FHIR
    :param field: name of the field that stores age
    :return: age extension object
    """

    age_extension = extension.Extension()
    age_extension.url = mapping
    if isinstance(obj[field]['age'], dict):
        age_extension.valueRange = range.Range()
        age_extension.valueRange.low = quantity.Quantity()
        age_extension.valueRange.low.unit = obj[field]['age']['start']['age']
        age_extension.valueRange.high = quantity.Quantity()
        age_extension.valueRange.high.unit = obj[field]['age']['end']['age']
    else:
        age_extension.valueAge = age.Age()
        age_extension.valueAge.unit = obj[field]['age']
    return age_extension
Beispiel #17
0
def getextension(url, valuetype, value):  # fhirextension
    ext = Ext.Extension({'url': url, valuetype: value})
    return (ext)  # note this returning as a list!! TODO fix this
Beispiel #18
0
def biosample_to_fhir(obj):
    """Converts Biosample to FHIR Specimen.

    :param obj: Biosample json
    :return: FHIR Specimen json
    """

    schema_path = os.path.join(SCHEMA_PATH, 'biosample_schema.json')
    try:
        validate_schema(schema_path, obj)
    except jsonschema.exceptions.ValidationError:
        raise Exception("The biosample object is not valid.")
    specimen = s.Specimen()
    specimen.identifier = []
    # id
    identifier = fhir_indentifier.Identifier()
    identifier.value = obj['id']
    specimen.identifier.append(identifier)
    # individual - subject property in FHIR is mandatory for a specimen
    specimen.subject = fhirreference.FHIRReference()
    specimen.subject.reference = obj.get('individual', 'unknown')
    # sampled_tissue
    specimen.type = codeableconcept.CodeableConcept()
    specimen.type.coding = []
    coding = c.Coding()
    coding.code = obj['sampledTissue']['id']
    coding.display = obj['sampledTissue']['label']
    specimen.type.coding.append(coding)
    # description
    if 'description' in obj:
        specimen.note = []
        annotation = a.Annotation()
        annotation.text = obj.get('description', None)
        specimen.note.append(annotation)
    # procedure
    specimen.collection = s.SpecimenCollection()
    specimen.collection.method = fhir_codeable_concept(
        obj['procedure']['code'])
    if 'bodySite' in obj['procedure']:
        specimen.collection.bodySite = fhir_codeable_concept(
            obj['procedure']['bodySite'])
    # Note on taxonomy from phenopackets specs:
    # Individuals already contain a taxonomy attribute so this attribute is not needed.
    # extensions
    specimen.extension = []
    # individual_age_at_collection
    if 'individualAgeAtCollection' in obj:
        ind_age_at_collection_extension = age_to_fhir(
            obj, PHENOPACKETS_ON_FHIR_MAPPING['biosample']
            ['individualAgeAtCollection'], 'individualAgeAtCollection')
        specimen.extension.append(ind_age_at_collection_extension)
    concept_extensions = codeable_concepts_fields([
        'histologicalDiagnosis', 'tumorProgression', 'tumorGrade',
        'diagnosticMarkers'
    ], 'biosample', obj)
    for concept in concept_extensions:
        specimen.extension.append(concept)

    if 'isControlSample' in obj:
        control_extension = extension.Extension()
        control_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['biosample'][
            'isControlSample']
        control_extension.valueBoolean = obj['isControlSample']
        specimen.extension.append(control_extension)
    # TODO 2m extensions - references
    return specimen.as_json()
def fhir_observation(obj):
    """ Converts phenotypic feature to FHIR Observation. """

    observation = obs.Observation()
    if 'description' in obj.keys():
        observation.note = []
        annotation = a.Annotation()
        annotation.text = obj.get('description', None)
        observation.note.append(annotation)
    observation.code = fhir_codeable_concept(obj['type'])
    # required by FHIR specs but omitted by phenopackets, for now set for unknown
    observation.status = 'unknown'
    if 'negated' in obj.keys():
        observation.interpretation = fhir_codeable_concept({
            "label": "Positive",
            "id": "POS"
        })
    else:
        observation.interpretation = fhir_codeable_concept({
            "label": "Negative",
            "id": "NEG"
        })
    observation.extension = []
    concept_extensions = codeable_concepts_fields(
        ['severity', 'modifier', 'onset'], 'phenotypic_feature', obj)
    for c in concept_extensions:
        observation.extension.append(c)
    if 'evidence' in obj.keys():
        evidence = extension.Extension()
        evidence.url = PHENOPACKETS_ON_FHIR_MAPPING['phenotypic_feature'][
            'evidence']['url']
        evidence.extension = []
        evidence_code = extension.Extension()
        evidence_code.url = PHENOPACKETS_ON_FHIR_MAPPING['phenotypic_feature'][
            'evidence']['evidence_code']
        evidence_code.valueCodeableConcept = fhir_codeable_concept(
            obj['evidence']['evidence_code'])
        evidence.extension.append(evidence_code)
        if 'reference' in obj['evidence'].keys():
            evidence_reference = extension.Extension()
            evidence_reference.url = PHENOPACKETS_ON_FHIR_MAPPING[
                'external_reference']['url']
            evidence_reference.extension = []
            evidence_reference_id = extension.Extension()
            evidence_reference_id.url = PHENOPACKETS_ON_FHIR_MAPPING[
                'external_reference']['id_url']
            # GA$GH guide requires valueURL but there is no such property
            evidence_reference_id.valueUri = obj['evidence']['reference']['id']
            evidence_reference.extension.append(evidence_reference_id)
            if 'description' in obj['evidence']['reference'].keys():
                evidence_reference_desc = extension.Extension()
                evidence_reference_desc.url = PHENOPACKETS_ON_FHIR_MAPPING[
                    'external_reference']['description_url']
                evidence_reference_desc.valueString = obj['evidence'][
                    'reference'].get('description', None)
                evidence_reference.extension.append(evidence_reference_desc)
            evidence.extension.append(evidence_reference)
        observation.extension.append(evidence)

    if 'biosample' in obj.keys():
        observation.specimen = fhirreference.FHIRReference()
        observation.specimen.reference = obj.get('biosample', None)
    return observation.as_json()
Beispiel #20
0
    def to_fhir(self) -> extension.Extension:
        fhir_extension = extension.Extension()
        fhir_extension.url = self.extention_url
        fhir_extension.valueDateTime = self.recorded_datetime.to_fhir()

        return fhir_extension
Beispiel #21
0
def phenotypic_feature_to_fhir(obj):
    """Converts Phenotypic feature to FHIR Observation.

    :param obj: PhenotypicFeature json
    :return: FHIR Observation json
    """

    schema_path = os.path.join(SCHEMA_PATH, 'phenotypic_feature_schema.json')
    try:
        validate_schema(schema_path, obj)
    except jsonschema.exceptions.ValidationError:
        raise Exception("The phenotypic feature object is not valid.")

    observation = obs.Observation()
    if 'description' in obj:
        observation.note = []
        annotation = a.Annotation()
        annotation.text = obj.get('description', None)
        observation.note.append(annotation)
    observation.code = fhir_codeable_concept(obj['type'])
    # required by FHIR specs but omitted by phenopackets, for now set for unknown
    observation.status = 'unknown'
    if 'negated' in obj:
        observation.interpretation = fhir_codeable_concept({
            "label": "Positive",
            "id": "POS"
        })
    else:
        observation.interpretation = fhir_codeable_concept({
            "label": "Negative",
            "id": "NEG"
        })
    observation.extension = []
    concept_extensions = codeable_concepts_fields(
        ['severity', 'modifier', 'onset'], 'phenotypicFeature', obj)
    for c in concept_extensions:
        observation.extension.append(c)
    if 'evidence' in obj:
        evidence = extension.Extension()
        evidence.url = PHENOPACKETS_ON_FHIR_MAPPING['phenotypicFeature'][
            'evidence']['url']
        evidence.extension = []
        evidence_code = extension.Extension()
        evidence_code.url = PHENOPACKETS_ON_FHIR_MAPPING['phenotypicFeature'][
            'evidence']['evidenceCode']
        evidence_code.valueCodeableConcept = fhir_codeable_concept(
            obj['evidence']['evidenceCode'])
        evidence.extension.append(evidence_code)
        if 'reference' in obj['evidence']:
            evidence_reference = extension.Extension()
            evidence_reference.url = PHENOPACKETS_ON_FHIR_MAPPING[
                'externalReference']['url']
            evidence_reference.extension = []
            evidence_reference_id = extension.Extension()
            evidence_reference_id.url = PHENOPACKETS_ON_FHIR_MAPPING[
                'externalReference']['idUrl']
            evidence_reference_id.valueUri = obj['evidence']['reference']['id']
            evidence_reference.extension.append(evidence_reference_id)
            if 'description' in obj['evidence']['reference']:
                evidence_reference_desc = extension.Extension()
                evidence_reference_desc.url = PHENOPACKETS_ON_FHIR_MAPPING[
                    'externalReference']['descriptionUrl']
                evidence_reference_desc.valueString = obj['evidence'][
                    'reference'].get('description', None)
                evidence_reference.extension.append(evidence_reference_desc)
            evidence.extension.append(evidence_reference)
        observation.extension.append(evidence)

    if 'biosample' in obj:
        observation.specimen = fhirreference.FHIRReference()
        observation.specimen.reference = obj.get('biosample', None)
    return observation.as_json()
Beispiel #22
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
Beispiel #23
0
    def _generate_patient_fhir_object(self):
        """Creates a test patient using fhirclient.models."""
        Patient = p.Patient()
        HumanName = hn.HumanName()
        HumanName.family = [self.name_last]
        HumanName.given = [self.name_first]
        Patient.name = [HumanName]

        Patient.gender = self.gender

        birthDay = fd.FHIRDate()
        birthDay.date = self.bday
        Patient.birthDate = birthDay

        Address = a.Address()
        Address.country = 'USA'
        Address.postalCode = self.zipcode
        Address.state = self.state
        Address.city = self.city
        Address.line = [f'{self.address_number} {self.address_street}']
        Address.use = 'home'
        Address.type = 'postal'
        Patient.active = True
        Patient.address = [Address]
        PatientCommunication = p.PatientCommunication()
        PatientCommunication.language = self._create_FHIRCodeableConcept(
            'en-US', 'urn:ietf:bcp:47', 'English')
        # PatientCommunication.language = self._create_FHIRCodeableConcept('en-US','http://hl7.org/fhir/ValueSet/languages','English')
        PatientCommunication.preferred = True
        Patient.communication = [PatientCommunication]

        race = e.Extension()
        race.url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-race'
        us_core = e.Extension()
        us_core.url = 'ombCategory'
        us_core.valueCoding = self._create_FHIRCoding(
            self.race_code, 'urn:oid:2.16.840.1.113883.6.238',
            self.race_description)
        race_detailed = e.Extension()
        race_detailed.url = 'detailed'
        race_detailed.valueCoding = self._create_FHIRCoding(
            self.race_code, 'urn:oid:2.16.840.1.113883.6.238',
            self.race_description)
        race_text = e.Extension()
        race_text.url = 'text'
        race_text.valueString = self.race_description
        race.extension = [us_core, race_detailed, race_text]

        ethnicity = e.Extension()
        ethnicity.url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity'

        us_core = e.Extension()
        us_core.url = 'ombCategory'
        us_core.valueCoding = self._create_FHIRCoding(
            self.ethnicity_code, 'urn:oid:2.16.840.1.113883.6.238',
            self.ethnicity_description)
        ethnicity_text = e.Extension()
        ethnicity_text.url = 'text'
        ethnicity_text.valueString = self.ethnicity_description
        ethnicity.extension = [us_core, ethnicity_text]

        Patient.extension = [race, ethnicity]
        Patient.managingOrganization = self._create_FHIRReference(
            self.Organization)

        self._validate(Patient)
        self.response = self.post_resource(Patient)
        Patient.id = self._extract_id()
        self.Patient = Patient
        print(self)