If you’re an OpenClinica administrator somewhere, the chances are good somebody has asked you: “Can OpenClinica handle HL7 messaging?”
“No, it doesn’t,” you’ve said.
You probably said that with a sigh of relief because HL7 is a byzantine data exchange standard whose complexity keeps an army of consultants employed and drives neophytes like myself to madness. The HL7 2.X specification uses eye-fatiguing pipes (“|”) and hats (“^”) as delimiters and has been referred to by experts as the “non-standard standard” (see this). Unfortunately, it is also the lingua franca of health-care messaging currently, and will likely continue to be for a long time to come.
So, it is with a heavy sense of resignation that we here at Geneuity are taking up the challenge to make OpenClinica fluent in HL7. As a contract clinical laboratory, we are particularly interested in having OpenClinica able to digest HL7 ORU messages that convey lab results. This article details our first pass at the problem.
Our approach is shown in Figure 1. It makes use of Mirth and a new web service in OpenClinica developed by Geneuity called EventDataInsert. As shown, an HL7 message containing a lab result is sent by TCP to a Mirth channel which is configured to transform it into a SOAP message palatable to EventDataInsert. EventDataInsert reads the message and then sees if the specimen has already been accessioned into OpenClinica. If so, it inserts the data into the underlying database and signals a successful entry. If not, it does nothing and signals a rejection. These signals are transmitted back to Mirth which issues a standard HL7 acknowledgment (ACK) message coded with either ‘AA’ for ‘Application Accept’ or ‘AR’ for ‘Application Reject’. It is the responsibility of whoever (or whatever) sent the HL7 message in the first place to follow up when a lab result is rejected.
To develop this strategy, we used several tools. To generate HL7 test messages, we utilized the HL7 generator (freely available here) made by the people responsible for the ELINCS initiative. To send and receive HL7 messages to and from Mirth via TCP, we used Netcat, another freely available utility.
And there you have it! Of course, the HL7 standard covers much more than the delivery of lab results, but this exercise is most relevant to our concerns and represents an important first step in making OpenClinica talk the talk when it comes to HL7.
Figure 1: HL7 Strategy for OpenClinica
First, a HL7 message conveying lab results is sent to a Mirth channel listening for TCP requests. Mirth parses the message and transforms it into a SOAP message which it then hands off to the EventDataInsert webservice listening within OpenClinica. EventDataInsert looks to see if the specimen to which the lab result pertains has been accessioned into OpenClinica’s underlying database. If so, it inserts the results and signals back to Mirth that fact. If not, it enters nothing and signals back to Mirth that it did nothing. Mirth digests these signals and sends back to the sender an appropriately configured ACK message via TCP.