def testCreateTriggerLabelsPairLists(self): trigger1 = text_format.Parse( """ event_time { value_us: 1417392000000000 } # "2014-12-01T00:00:00+00:00" source { encounter_id { value: "1" } } """, google_extensions_pb2.EventTrigger()) trigger2 = text_format.Parse( """ event_time { value_us: 1417428000000000 } # "2014-12-01T01:00:00+00:00" """, google_extensions_pb2.EventTrigger()) label1 = text_format.Parse( """ patient { patient_id { value: "14" } } type { code { value: "test1" } } event_time { value_us: 1417392000000000 } # "2014-12-01T00:00:00+00:00" source { encounter_id { value: "1" } } """, google_extensions_pb2.EventLabel()) label2 = text_format.Parse( """ patient { patient_id { value: "14" } } type { code { value: "test2" } } event_time { value_us: 1417428000000000 } # "2014-12-01T01:00:00+00:00" label { class_name { system { value: "urn:test:label" } code { value: "green" } } } """, google_extensions_pb2.EventLabel()) with test_pipeline.TestPipeline() as p: event_labels_pcoll = ( p | "CreateEventLabels" >> beam.Create([label1, label2])) result = bundle_to_seqex.CreateTriggerLabelsPairLists( event_labels_pcoll) def check_result(got): try: self.assertLen(got, 1) (got_key, got_trigger_labels_pairs_list) = got[0] self.assertEqual(b"Patient/14", got_key) self.assertLen(got_trigger_labels_pairs_list, 2) # Sort got_trigger_labels_pairs_list by trigger.event_time, so that # the ordering is always consistent in ordering. sorted_list = sorted( got_trigger_labels_pairs_list, key=lambda x: x[0].event_time.value_us) (got_trigger1, got_label_list1) = sorted_list[0] self.assertProtoEqual(got_trigger1, trigger1) self.assertLen(got_label_list1, 1) self.assertProtoEqual(got_label_list1[0], label1) (got_trigger2, got_label_list2) = sorted_list[1] self.assertProtoEqual(got_trigger2, trigger2) self.assertLen(got_label_list2, 1) self.assertProtoEqual(got_label_list2[0], label2) except AssertionError as err: raise util.BeamAssertException(err) util.assert_that(result, check_result)
def ComposeLabel(patient, enc, label_name, label_val, label_time): """Compose an event_label proto given inputs. Args: patient: patient proto enc: encounter proto label_name: name of label label_val: value of label. label_time: datetime of label. Returns: event_label proto. """ event_label = google_extensions_pb2.EventLabel() # set patient_id event_label.patient.patient_id.value = patient.id.value event_label.type.system.value = GOOGLE_FHIR_LABEL_SYTEM event_label.type.code.value = label_name event_label.event_time.value_us = ToMicroSeconds(label_time) event_label.source.encounter_id.value = enc.id.value label = google_extensions_pb2.EventLabel.Label() label.class_name.system.value = GOOGLE_FHIR_LABEL_SYTEM label.class_name.code.value = label_val event_label.label.add().CopyFrom(label) return event_label
def testKeyEventLabelByPatientIdFn(self): event_label = text_format.Parse( """ patient { patient_id { value: "14" } } type { code { value: "test2" } } event_time { value_us: 1417428000000000 } # "2014-12-01T01:00:00+00:00" label { class_name { system { value: "urn:test:label" } code { value: "green" } } } """, google_extensions_pb2.EventLabel()) with test_pipeline.TestPipeline() as p: result = ( p | "CreateEventLabels" >> beam.Create([event_label]) | "KeyEventLabelByPatientId" >> beam.ParDo( bundle_to_seqex.KeyEventLabelByPatientIdFn())) def check_result(got): try: self.assertLen(got, 1) (got_key, got_event_label) = got[0] self.assertEqual(b"Patient/14", got_key) self.assertProtoEqual(got_event_label, event_label) except AssertionError as err: raise util.BeamAssertException(err) util.assert_that(result, check_result)
def setUp(self): self._test_data_dir = os.path.join(absltest.get_default_test_srcdir(), _TESTDATA_PATH) self._enc = resources_pb2.Encounter() with open(os.path.join(self._test_data_dir, 'encounter_1.pbtxt')) as f: text_format.Parse(f.read(), self._enc) self._patient = resources_pb2.Patient() self._patient.id.value = 'Patient/1' self._expected_label = google_extensions_pb2.EventLabel() with open(os.path.join(self._test_data_dir, 'label_1.pbtxt')) as f: text_format.Parse(f.read(), self._expected_label)
def test_get_trigger_labels_from_input_labels(self): trigger1 = text_format.Parse( """ event_time { value_us: 1417392000000000 } # "2014-12-01T00:00:00+00:00" source { encounter_id { value: "1" } } """, google_extensions_pb2.EventTrigger()) trigger2 = text_format.Parse( """ event_time { value_us: 1417428000000000 } # "2014-12-01T01:00:00+00:00" """, google_extensions_pb2.EventTrigger()) label1 = text_format.Parse( """ patient { patient_id { value: "14" } } type { code { value: "test1" } } event_time { value_us: 1417392000000000 } # "2014-12-01T00:00:00+00:00" source { encounter_id { value: "1" } } """, google_extensions_pb2.EventLabel()) label2 = text_format.Parse( """ patient { patient_id { value: "14" } } type { code { value: "test2" } } event_time { value_us: 1417428000000000 } # "2014-12-01T01:00:00+00:00" label { class_name { system { value: "urn:test:label" } code { value: "green " } } } """, google_extensions_pb2.EventLabel()) got_list = bundle_to_seqex_util.get_trigger_labels_from_input_labels( [label1, label2]) self.assertLen(got_list, 2) (got_trigger_1, got_label_list1) = got_list[0] (got_trigger_2, got_label_list2) = got_list[1] self.assertProtoEqual(got_trigger_1, trigger1) self.assertLen(got_label_list1, 1) self.assertProtoEqual(got_label_list1[0], label1) self.assertProtoEqual(got_trigger_2, trigger2) self.assertLen(got_label_list2, 1) self.assertProtoEqual(got_label_list2[0], label2)
def testSingleTriggerAndLabel(self): event_trigger = text_format.Parse( """ event_time { value_us: 1420102800000000 } source { encounter_id { value: "1" } } """, google_extensions_pb2.EventTrigger()) event_label = text_format.Parse( """ patient { patient_id { value: "14" } } type { code { value: "test1" }} event_time { value_us: 1420102800000000 } label { class_name { system { value: "urn:test:label" } code { value: "red" } } } """, google_extensions_pb2.EventLabel()) event_trigger_labels = ( event_trigger, (event_label,), ) event_trigger_labels_list = (event_trigger_labels,) bundle = text_format.Parse( """ entry { resource { patient { id { value: "14" } } } } entry { resource { condition { id { value: "1" } subject { patient_id { value: "14" } } code { coding { system { value: "http://hl7.org/fhir/sid/icd-9-cm/diagnosis" } code { value: "bar" } } } asserted_date { value_us: 1417392000000000 # "2014-12-01T00:00:00+00:00" } } } } entry { resource { condition { id { value: "2" } subject { patient_id { value: "14" } } code { coding { system { value: "http://hl7.org/fhir/sid/icd-9-cm/diagnosis" } code { value: "baz" } } } asserted_date { value_us: 1420099200000000 # "2015-01-01T08:00:00+00:00" } } } } entry { resource { composition { id { value: "1" } subject { patient_id { value: "14" } } encounter { encounter_id { value: "1" } } section { text { div { value: "test text" } } } date { value_us: 1420102800000000 timezone: "UTC" precision: SECOND } } } } entry { resource { encounter { id { value: "1" } subject { patient_id { value: "14" } } class_value { system { value: "http://hl7.org/fhir/v3/ActCode" } code { value: "IMP" } } reason { coding { system { value: "http://hl7.org/fhir/sid/icd-9-cm/diagnosis" } code { value: "191.4" } display { value: "Malignant neoplasm of occipital lobe" } } } period { start { value_us: 1420099200000000 # "2015-01-01T08:00:00+00:00" } end { value_us: 1420102800000000 # "2015-01-01T09:00:00+00:00" } } } } } """, resources_pb2.Bundle()) # pylint: disable=line-too-long expected_seqex = text_format.Parse( """ context: { feature { key: "currentEncounterId" value { int64_list { value: 1420099200 } } } feature { key: "label.test1.class" value { bytes_list { value: "red" } } } feature { key: "label.test1.timestamp_secs" value { int64_list { value: 1420102800 } } } feature { key: "patientId" value { bytes_list { value: "14" } } } feature { key: "sequenceLength" value { int64_list { value: 5 } } } feature { key: "timestamp" value { int64_list { value: 1420102800 } } } } feature_lists: { feature_list { key: "Composition.meta.lastUpdated" value { feature { int64_list { } } feature { int64_list { } } feature { int64_list { } } feature { int64_list { value: 1420102800 } } feature { int64_list { } } } } feature_list { key: "Composition.date" value { feature { int64_list { } } feature { int64_list { } } feature { int64_list { } } feature { int64_list { value: 1420102800 } } feature { int64_list { } } } } feature_list { key: "Composition.section.text.div.tokenized" value { feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { value: "test" value: "text" } } feature { bytes_list { } } } } feature_list { key: "Condition.meta.lastUpdated" value { feature { int64_list { value: 1417392000 } } feature { int64_list { value: 1420099200 } } feature { int64_list { } } feature { int64_list { } } feature { int64_list { } } } } feature_list { key: "Condition.code" value { feature { bytes_list { value: "icd9:bar" } } feature { bytes_list { value: "icd9:baz" } } feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { } } } } feature_list { key: "Condition.code.icd9" value { feature { bytes_list { value: "bar" } } feature { bytes_list { value: "baz" } } feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { } } } } feature_list { key: "Condition.assertedDate" value { feature { int64_list { value: 1417392000 } } feature { int64_list { value: 1420099200 } } feature { int64_list { } } feature { int64_list { } } feature { int64_list { } } } } feature_list { key: "Encounter.class" value { feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { value: "actcode:IMP" } } feature { bytes_list { } } feature { bytes_list { value: "actcode:IMP" } } } } feature_list { key: "Encounter.meta.lastUpdated" value { feature { int64_list { } } feature { int64_list { } } feature { int64_list { value: 1420099200 } } feature { int64_list { } } feature { int64_list { value: 1420102800 } } } } feature_list { key: "Encounter.period.start" value { feature { int64_list { } } feature { int64_list { } } feature { int64_list { value: 1420099200 } } feature { int64_list { } } feature { int64_list { value: 1420099200 } } } } feature_list { key: "Encounter.period.end" value { feature { int64_list { } } feature { int64_list { } } feature { int64_list { } } feature { int64_list { } } feature { int64_list { value: 1420102800 } } } } feature_list { key: "Encounter.reason" value { feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { value: "icd9:191.4" } } } } feature_list { key: "Encounter.reason.icd9" value { feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { value: "191.4" } } } } feature_list { key: "Encounter.reason.icd9.display.tokenized" value { feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { } } feature { bytes_list { value: "malignant" value: "neoplasm" value: "of" value: "occipital" value: "lobe" } } } } feature_list { key: "encounterId" value { feature { int64_list { value: 1417392000 } } feature { int64_list { value: 1420099200 } } feature { int64_list { value: 1420099200 } } feature { int64_list { value: 1420099200 } } feature { int64_list { value: 1420099200 } } } } feature_list { key: "eventId" value { feature { int64_list { value: 1417392000 } } feature { int64_list { value: 1420099200 } } feature { int64_list { value: 1420099200 } } feature { int64_list { value: 1420102800 } } feature { int64_list { value: 1420102800 } } } } } """, example_pb2.SequenceExample()) # pylint: enable=line-too-long _ = self._runTest( "Patient/14", bundle, event_trigger_labels_list, (("Patient/14:0-5@1420102800:Encounter/1", expected_seqex, 5),))
def test_get_trigger_labels_pair(self): # pylint: disable=line-too-long bundle = text_format.Parse( """ entry { resource { patient { id { value: "20" } } } } entry { resource { encounter { id { value: "1" } extension { url { value: "https://g.co/fhir/StructureDefinition/eventTrigger" } extension { url { value: "type" } value { coding { system { value: "urn:test:trigger"} code { value: "at_discharge" } } } } extension { url { value: "eventTime" } value { date_time { value_us: 1388566800000000 # "2014-01-01T09:00:00+00:00" } } } } extension { url { value: "https://g.co/fhir/StructureDefinition/eventLabel" } extension { url { value: "type" } value { coding { system { value: "urn:test:label" } code { value: "test1" } } } } extension { url { value: "eventTime" } value { date_time { value_us: 1388566800000000 } } } extension { url { value: "source" } value { reference { encounter_id { value: "1" } } } } } } } } entry { resource { encounter { id { value: "2" } extension { url { value: "https://g.co/fhir/StructureDefinition/eventTrigger" } extension { url { value: "type" } value { coding { system { value: "urn:test:trigger"} code { value: "at_discharge" } } } } extension { url { value: "eventTime" } value { date_time { value_us: 1420102800000000 # "2015-01-01T09:00:00+00:00" } } } } extension { url { value: "https://g.co/fhir/StructureDefinition/eventLabel" } extension { url { value: "type" } value { coding { system { value: "urn:test:label" } code { value: "test1" } } } } extension { url { value: "source" } value { reference { encounter_id { value: "2" } } } } extension { url { value: "label" } extension { url { value: "className" } value { coding { system { value: "urn:test:label:test1" } code { value: "red" } } } } } } } } } """, resources_pb2.Bundle()) trigger1 = text_format.Parse( """ type { system { value: "urn:test:trigger" } code { value: "at_discharge" } } event_time { value_us: 1388566800000000 } # "2014-01-01T09:00:00+00:00" """, google_extensions_pb2.EventTrigger()) trigger2 = text_format.Parse( """ type { system { value: "urn:test:trigger" } code { value: "at_discharge" } } event_time { value_us: 1420102800000000 } # "2015-01-01T09:00:00+00:00" """, google_extensions_pb2.EventTrigger()) label1 = text_format.Parse( """ type { system { value: "urn:test:label" } code { value: "test1" } } event_time { value_us: 1388566800000000 } source { encounter_id { value: "1" } } """, google_extensions_pb2.EventLabel()) label2 = text_format.Parse( """ type { system { value: "urn:test:label" } code { value: "test1" } } source { encounter_id { value: "2" } } label { class_name { system { value: "urn:test:label:test1" } code { value: "red" } } } """, google_extensions_pb2.EventLabel()) # pylint: enable=line-too-long (filtered_count, got_list) = bundle_to_seqex_util.get_trigger_labels_pair( bundle, [b"test1"], b"at_discharge") self.assertEqual(0, filtered_count) self.assertLen(got_list, 2) (got_trigger_1, got_label_list1) = got_list[0] (got_trigger_2, got_label_list2) = got_list[1] self.assertProtoEqual(got_trigger_1, trigger1) self.assertLen(got_label_list1, 1) self.assertProtoEqual(got_label_list1[0], label1) self.assertProtoEqual(got_trigger_2, trigger2) self.assertLen(got_label_list2, 1) self.assertProtoEqual(got_label_list2[0], label2)