Skip to content
Snippets Groups Projects
Commit 87e7db82 authored by hra23's avatar hra23
Browse files

Merge branch 'parsing_mllp' into 'master'

Parsing MLLP

See merge request !6
parents 3fd05f5c 57e793e2
No related branches found
No related tags found
1 merge request!6Parsing MLLP
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)
......
File moved
......@@ -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
......@@ -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__":
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment