def fhir_specimen_collection(obj):
    """ Converts Procedure to FHIR Specimen collection. """

    collection = s.SpecimenCollection()
    collection.id = str(obj['id'])
    collection.method = fhir_codeable_concept(obj['code'])
    if 'body_site' in obj.keys():
        collection.bodySite = fhir_codeable_concept(obj['body_site'])
    return collection.as_json()
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()
Exemple #3
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()