Esempio n. 1
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()
Esempio n. 2
0
    def to_fhir(self):
        route_coding = coding.Coding()
        route_coding.system = self.system
        route_coding.code = self.code
        route_coding.display = self.display

        return route_coding
Esempio n. 3
0
    def to_fhir(self) -> coding.Coding:
        ingredient_coding = coding.Coding()
        ingredient_coding.system = self.system
        ingredient_coding.code = self.code
        ingredient_coding.display = self.display

        return ingredient_coding
Esempio n. 4
0
    def __init__(self, Organization=None):
        """
        Uses fhirclient.models to create and post practitoner resource. Currently, using class variables.

        :param smart: fhirclient.client.FHIRClient object.
        :returns: practitioner id created by server
        """
        if Organization is None:
            self.Organization = generateorganization.GenerateOrganization(
            ).Organization
        else:
            self.Organization = Organization

        Practitioner = pr.Practitioner()
        PractitionerQualification = pr.PractitionerQualification()
        CodeableConcept = cc.CodeableConcept()
        Coding = c.Coding()
        Coding.code = random.choice(['MD', 'DO'])
        Coding.system = 'https://www.hl7.org/fhir/v2/0360/2.7/index.html'
        CodeableConcept.coding = [Coding]
        PractitionerQualification.code = CodeableConcept
        Practitioner.qualification = [PractitionerQualification]
        name = hn.HumanName()
        self.family, self.given, Practitioner.gender = self._generate_person()
        name.family = [self.family]
        name.given = [self.given]
        Practitioner.name = name
        self._validate(Practitioner)
        self.response = self.post_resource(Practitioner)
        Practitioner.id = self._extract_id()
        self.Practitioner = Practitioner
        print(self)
Esempio n. 5
0
    def to_fhir(self) -> coding.Coding:
        fhir_coding = coding.Coding()
        fhir_coding.system = self.system
        fhir_coding.code = self.code
        fhir_coding.display = self.display

        return fhir_coding
Esempio n. 6
0
def _get_section_object(nested_obj, title):
    """Internal function to convert phenopacket m2m objects to Composition section.

    :param nested_obj: m2m relationship object
    :param title: field name that holds m2m relationship
    :return: section content object
    """

    section_content = comp.CompositionSection()
    section_values = PHENOPACKETS_ON_FHIR_MAPPING['phenopacket'][title]
    section_content.title = section_values['title']
    section_content.code = codeableconcept.CodeableConcept()
    section_content.code.coding = []
    coding = c.Coding()
    coding.system = section_values['code']['system']
    coding.version = section_values['code']['version']
    coding.code = section_values['code']['code']
    coding.display = section_values['code']['display']
    section_content.code.coding.append(coding)

    section_content.entry = []
    for item in nested_obj:
        entry = fhirreference.FHIRReference()
        if item.get('id'):
            entry.reference = str(item['id'])
        elif item.get('uri'):
            entry.reference = item['uri']
        else:
            # generate uuid when no 'id' or 'uri' present
            entry.reference = str(uuid.uuid1())
        section_content.entry.append(entry)
    return section_content
Esempio n. 7
0
def mkCoding(**keywords):
    '''
    returns a Coding using keyword/values
    '''
    cod = c.Coding()
    for key in keywords:
        setattr(cod, key, keywords[key])
    return cod
Esempio n. 8
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
Esempio n. 9
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
Esempio n. 10
0
def map_cc(concept):
    # create CodeableConcept based on slot data
    cc = CC.CodeableConcept()
    cc.coding = []
    cc.text = concept.text
    try:
        cc_coding = Coding.Coding()
        for translation in concept.coding:
            cc_coding.code = translation.code
            cc_coding.display = translation.display
            cc_coding.system = translation.system
            cc.coding.append(cc_coding)
    except TypeError:  # coding missing
        pass
    return (cc)
Esempio n. 11
0
def getcoding(code, system, display, extension):  # fhircoding
    coding = C.Coding()
    # attempt to fix this using the standard Argo extension made more difficult. easier to support both especially when contained vs.
    try:
        for ext in extension:
            if ext.url == 'http://hl7.org/fhir/StructureDefinition/valueset-ordinalValue':
                ext.url = 'http://hl7.org/fhir/StructureDefinition/valueset-ordinalValue'
        coding.extension = extension
    except TypeError:  # extension missing
        pass
    try:
        coding.code = code
        coding.display = display
        coding.system = system
    except TypeError:  # coding missing
        pass
    return(coding)
Esempio n. 12
0
def build_keyword(study_keywords):
    """
    Build the keywords up
    :param keywords:
    :return:
    """
    keywords = []
    for term in study_keywords:
        cc = codeableconcept.CodeableConcept()
        cc.text = term
        cc.coding = [
            coding.Coding(
                dict(code=quote(term),
                     system="https://example.org",
                     display=term))
        ]
        keywords.append(cc)
    return keywords
Esempio n. 13
0
def build_focus(mesh_terms):
    """
    Build the ResearchStudy.focus
    :param conditions:
    :param interventions:
    :return:
    """
    # assuming mesh term here
    focus = []
    for study_term_type, terms in mesh_terms.items():
        print("{}: {}".format(study_term_type, terms))
        for term in terms:
            cc = codeableconcept.CodeableConcept()
            cc.text = term
            cc.coding = [
                coding.Coding(
                    dict(code=term, system="https://mesh.org", display=""))
            ]
            focus.append(cc)
    return focus
Esempio n. 14
0
def write(server_url, system, code, patient, value):
    observation = o.Observation()
    observation.status = "final"

    observation.subject = fr.FHIRReference()
    observation.subject.reference = ("Patient/%s" % patient)

    observation.code = cc.CodeableConcept()
    tmp = c.Coding()
    tmp.system = system
    tmp.code = code
    observation.code.coding = [tmp]

    observation.valueString = str(value)
    observation.effectiveDateTime = fd.FHIRDate("2017-11-28T00:00:00+00:00")

    #write json obj
    json_obj = observation.as_json()
    json_obj["resourceType"] = "Observation"
    print(json.dumps(json_obj))
    requests.post(server_url + "Observation", json=json_obj)
Esempio n. 15
0
    def __init__(self,
                 Patient=None,
                 Provider=None,
                 Location=None,
                 Condition=None,
                 Period=None,
                 status='in-progress',
                 fhir_class='outpatient'):
        """Uses fhirclient.models to create encounter resource"""

        if Patient is not None and Condition is not None:
            if Patient.id != Condition.Patient.id:
                raise ValueError(
                    'Patient.id must equal Conditition.Patient.id.')
            self.Patient = Patient
            self.Condition = Condition
        elif Condition is None and Patient is None:
            self.Condition = generatecondition.GenerateCondition().Condition
            self.Patient = self.Condition.Patient
        elif Condition is not None and Patient is None:
            self.Condition = Condition
            self.Patient = self.Condition.Patient
        elif Condition is None and Patient is not None:
            self.Patient = Patient
            self.Condition = generatecondition.GenerateCondition(
                Patient=self.Patient).Condition
        else:
            raise ValueError('Error with Patient and Condition values')

        if Location == None:
            self.Location = generatelocation.GenerateLocation().Location
        else:
            self.Location = Location

        if Period == None:
            self.Period = self._create_FHIRPeriod()
        else:
            self.Period = Period

        if Provider == None:
            self.Practitioner = generatepractitioner.GeneratePractitioner(
            ).Practitioner
        else:
            self.Practitioner = Provider

        self.status = status
        self.fhir_class = fhir_class

        Encounter = enc.Encounter()
        Coding = c.Coding()
        Coding.code = self.fhir_class
        Encounter.class_fhir = Coding

        Encounter.status = self.status

        EncounterLocation = enc.EncounterLocation()
        EncounterLocation.location = self._create_FHIRReference(self.Location)
        Encounter.location = [EncounterLocation]

        Encounter.subject = self._create_FHIRReference(self.Patient)

        EncounterDiagnosis = enc.EncounterDiagnosis()
        EncounterDiagnosis.condition = self._create_FHIRReference(
            self.Condition)
        Encounter.diagnosis = [EncounterDiagnosis]

        EncounterParticipant = enc.EncounterParticipant()
        EncounterParticipant.individual = self._create_FHIRReference(
            self.Practitioner)
        Encounter.participant = [EncounterParticipant]

        Encounter.period = self.Period

        # self._validate(Encounter)
        self.response = Encounter.create(server=self.connect2server().server)
        Encounter.id = self._extract_id()

        self.Encounter = Encounter
        self.Encounter.Patient = self.Patient
        self.Encounter.Condition = self.Condition
        self.Encounter.Location = self.Location
        self.Encounter.Period = self.Period
        self.Encounter.Practitioner = self.Practitioner
Esempio n. 16
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
Esempio n. 17
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()