diff --git a/main.py b/main.py index a0fd2d09a453081416456924759e635c90ac68f3..d0adabfca47f96804add418bf2b6a7b49626b7c8 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,6 @@ import socket from joblib import load -from utils import process_mllp_message, parse_hl7_message, create_acknowledgement +from utils import process_mllp_message, parse_hl7_message, create_acknowledgement, parse_system_message from constants import DT_MODEL_PATH, REVERSE_LABELS_MAP @@ -28,9 +28,11 @@ def start_server(host="0.0.0.0", port=8440): if hl7_data: message = parse_hl7_message(hl7_data) print("Parsed HL7 Message:") - print(message) - print(type(message)) - + # print(message) + # print(type(message)) + category,mrn,data = parse_system_message(message) #category is type of system message and data consists of age sex if PAS admit or date of blood test and creatanine result + + print(category,mrn,data,'\n') # Create and send ACK message ack_message = create_acknowledgement(message) sock.sendall(ack_message) diff --git a/dt_model.joblib b/model/dt_model.joblib similarity index 100% rename from dt_model.joblib rename to model/dt_model.joblib diff --git a/utils.py b/utils.py index 8dd74c2e8db0838601c1f47403469aa630bae082..8fa741e77508cc636d6e525fdf2fd7950cd2d9d7 100644 --- a/utils.py +++ b/utils.py @@ -20,11 +20,12 @@ def parse_hl7_message(hl7_data): """ Parses the HL7 message and returns the parsed message object. """ - message = hl7.parse(hl7_data.decode("utf-8")) + hl7_string = hl7_data.decode("utf-8").replace('\r', '\n') + message = hl7.parse(hl7_string) return message -def create_acknowledgement(): +def create_acknowledgement(hl7_msg): """ Creates an HL7 ACK message for the received message. """ @@ -84,3 +85,49 @@ def populate_test_results_table(db, path): date = row[j] result = float(row[j+1]) db.insert_test_result(mrn, date, result) + + +def parse_system_message(message): + """ + Parses the HL7 message and returns components of respective message type: PAS, LIMS + Args: + - HL7 message object + Returns the category of message, MRN, [AGE, SEX] if PAS category or [DATE_BLOOD_TEST, CREATININE_VALUE] if LIMS + """ + mrn = 0 + category = '' + data = ['']*2 + segments = str(message).split('\n') + if len(segments) < 4: + parsed_seg = segments[1].split('|') + if len(parsed_seg) > 4: + mrn = parsed_seg[3] + category = 'PAS-admit' + date_of_birth = parsed_seg[7] + data[0] = calculate_age(date_of_birth) + data[1] = parsed_seg[8][0] + else: + mrn = parsed_seg[3].replace('\r','') + category = 'PAS-discharge' + else: + mrn = segments[1].split('|')[3] + category = 'LIMS' + data[0] = segments[2].split('|')[7] #date of blood test + data[1] = float(segments[3].split('|')[5]) + + return category,mrn,data + +def calculate_age(date_of_birth): + """ + Calculate age based on the date of birth provided in the format YYYYMMDD. + """ + # Parse the date of birth string into a datetime object + dob = datetime.datetime.strptime(date_of_birth, "%Y%m%d") + + # Get the current date + current_date = datetime.datetime.now() + + # Calculate the difference between the current date and the date of birth + age = current_date.year - dob.year - ((current_date.month, current_date.day) < (dob.month, dob.day)) + + return age \ No newline at end of file diff --git a/utils_test.py b/utils_test.py index c84c747a983e3ef3a2cd402e521b96b037f296f9..cc7c59a084660295019f5a255739c8d5974daffd 100644 --- a/utils_test.py +++ b/utils_test.py @@ -4,6 +4,8 @@ from utils import ( parse_hl7_message, create_acknowledgement, populate_test_results_table, + calculate_age, + parse_system_message ) from memory_db import InMemoryDatabase import hl7 @@ -53,6 +55,37 @@ class TestUtilsClient(unittest.TestCase): # close the db db.close() self.assertEqual(result, expected_result) + + def test_pas_admit_message(self): + # Mock a PAS admit HL7 message + message = "MSH|^~\&|SIMULATION|SOUTH RIVERSIDE|||20240924102800||ADT^A01|||2.5\nPID|1||722269||SAFFRON CURTIS||19891008|F" + expected_age = calculate_age("19891008") # Assuming current date is fixed or calculate_age is mocked + category, mrn, data = parse_system_message(message) + self.assertEqual(category, "PAS-admit") + self.assertEqual(mrn, "722269") + self.assertEqual(data, [expected_age, "F"]) + + def test_pas_discharge_message(self): + # Mock a PAS discharge HL7 message + message = "MSH|^~\&|SIMULATION|SOUTH RIVERSIDE|||20240924153400||ADT^A03|||2.5\nPID|1||853518" + category, mrn, data = parse_system_message(message) + self.assertEqual(category, "PAS-discharge") + self.assertEqual(mrn, "853518") + self.assertEqual(data, ['', '']) + + def test_lims_message(self): + # Mock a LIMS HL7 message + message = "MSH|^~\&|SIMULATION|SOUTH RIVERSIDE|||20240924153600||ORU^R01|||2.5\nPID|1||54229\nOBR|1||||||20240924153600\nOBX|1|SN|CREATININE||103.56923163550283" + category, mrn, data = parse_system_message(message) + self.assertEqual(category, "LIMS") + self.assertEqual(mrn, "54229") + self.assertTrue(isinstance(data[1], float)) # Ensure that the creatinine value is a float + + def test_incomplete_message(self): + # Mock an incomplete HL7 message + message = "MSH|...|..." + with self.assertRaises(IndexError): # Assuming your function raises IndexError for incomplete messages + parse_system_message(message) if __name__ == "__main__":