GSoC 2017 Final Report

It’s the end of the GSoC 2017 and here is my final report.

The photo below is from my colleague Ujjwal Arora‘s blog. I hope he doesn’t sue me :D.



Project Title

Radiology Reporting Enhancements Continuation


The LibreHealth Radiology Module provides features of a Radiology Information System powered by LibreHealth Toolkit. In the past the module could only create free text reports. To report a completed radiology order such as an x-ray examination, users of the module were presented with simple text field that they fill in their reports and on submission this text is stored inside the database as a string. But this was too limiting as radiologists use templates to create reports.

My task as GSoC student was to provide a means where users of this module will be able to use already developed templates to report their observations and store them as Complex Obs. Some of these templates can be downloaded from These templates are in HTML 5 format.

Note support for MRRT report templates was provided last year during GSoC 2016. After GSoC 2016 the module was able to import MRRT report templates but it did not use these templates in the creation of reports yet.


  • Student (me)
  • Mentors
    • Judy Gichoya (Radiologist, US)
    • Ankit Rastogi (Medical Doctor, Canada)

I’d also like to acknowledge the org admin for  LibreHealth Robert (Robby) O’Connor for the smooth running of the programming and always making sure we don’t miss any GSoC deadline. Thank you.

Both LibreHealth and the OpenMRS community helped me a lot with my queries. At OpenMRS Daniel Kayiwa was always there to answer my questions on IRC and A lot of other community members in OpenMRS also responded to my queries.

Work Done

Backend work

None of my code has been merged and hardly reviewed. I communicated my progress to my mentors using screenshots of the working software and documentations on my weekly blogs. All the work that was done for the backend can be found in the gsoc2017 branch on my fork of LibreHealth Radiology.

I started the coding phase by trying to make the radiology module a fhir server. I thought it was theoretically impossible as the docs on implementing a fhir server talked of java web applications with their own web.xml deployment descriptor while the radiology module was not a web application on it’s own but need a server which was the actual web application and I may be right. After spending almost half of the first coding phase working on this with no progress, my mentors decided I continue with the primary goals of my GSoC project which was to use MRRT report templates in the creation of reports and also build a new UI for the radiology module. For more information on this, visit the links below

The two major changes to the backend was the creation of radiology reports using MRRT report templates and storing them as Complex Obs and refining of the REST API.

Create reports using MRRT templates

Modified the claim report section of the radiology order details page to provide option for creating MRRT reports

Screen Shot 2017-08-26 at 11.54.44 PM

Author report using an imported MRRT report template

Screen Shot 2017-08-27 at 12.07.58 AM

Once your report is saved, you can view it in the editor and can also download a copy of it as html since it’s been stored as Complex Obs and complex obs handles the saving of the report as a file.

I turned off template validation. It was decided that the module will not validate these templates. That validation will be left for

Commit Save radiology reports as complex obs. This commit actually holds a lot more than it’s title suggest. Since my code was not been reviewed and merged during the program, I found my self pushing to this branch and having too many unmerged commits to follow up at once so I had to squash all in one commit.

For documentation on how to use this feature, visit


I also worked on the REST API for the radiology module. I faced a lot of difficulties here as the REST module was not properly documented and it was kind of hard to figure things out on my own. I sometimes had to place breakpoints in the code and run it in debug mode and followed the workflow just to understand how things work and how to make modifications. Sometimes I figured things out by a lot of tries and errors.

I implemented the REST endpoint for /radiologyorder to GET/POST/DELETE radiologyorders

Screen Shot 2017-08-27 at 1.27.08 AM

Commit Implement the newDelegate and save methos to create radiology order


After research and discussions with my mentors we decided to use Angular 4 for our frontend. Angular 4 is component based and really easy to work with.

I had to pick up Angular on the fly. I had no previous experience working with Angular so I started with a course on Udemy. But I didn’t finish the course. Was going to take a while to finish it so I just used the Angular docs.

The code for the new UI is hosted on my github repo


Screen Shot 2017-08-27 at 1.37.03 AM

Add order

Screen Shot 2017-08-27 at 1.38.43 AM

Order detail

Screen Shot 2017-08-27 at 1.40.28 AM

Edit report

Screen Shot 2017-08-27 at 1.41.43 AM.png

Report templates

Screen Shot 2017-08-27 at 1.42.42 AM.png

The above screenshot show some components of the UI.

The UI is simple, user friendly and responsive. And at the back it’s built with reusability in mind.

My next plans

  • code, code, code
  • Run my Java User Group
  • Have fun
  • continue working on LibreHealth Radiology
  • Travel for Open Source Summit North America
  • Travel for QCon San Francisco
  • Mentor Google Code-in 2017
  • Mentor Google Summer of Code 2018

I’m currently the only one contributing code to the radiology module. There’s a lot of work left to make the radiology module ready for it’s first release. I plan to form a team to work on the radiology module. I run a Java User Group in my community and I’ll be bringing in two enthusiastic members from the group to join me work on the module. This will be great a experience for us. For me I’ll be gaining experience running a team and for them it’ll be good learning experience and first time exposure to open source.

Together we’ll

  • Remove the legacyui from the radiology module so the module is left only with the Java API and REST API. We’ll be using the new UI moving forward.
  • Implement REST endpoints for the other radiology resources /radiologyreport, /mrrtreporttemplate and /radiologymodality
  • Clean up the UI code and move it to LibreHealth GitLab repo.
  • Work on packs server integration
  • Design and implement a more feasible solution for FHIR integration with radiology


Save radiology reports as complex obs

Implement the newDelegate and save methos to create radiology order

Skills Acquired

I picked up Angular 4 on the fly

Learned how to work with minimal supervision

Understood more about the codebase and what improvements are needed.


Since LibreHealth Radiology is a fork of the OpenMRS Radiology module. I made use of the OpenMRS forums to get a wider audience to my problems. Below is a list threads I opened in OpenMRS



Creating a Radiology Report using MRRT Report template LibreHealth Radiology


As of last year the LibreHealth Radiology module which was at that time under OpenMRS supported MRRT report templates. But these templates where not used in the creation of reports yet. This year during GSoC coding phase one, the MRRT templates are been used in creation of radiology reports.

This feature is not stable yet but for the purpose of GSoC evaluations I’m documenting it though a lot will change after GSoC evaluations are over. But the workflow will stay the same. The changes to be made about this feature will not be visible to end users but developers. The current way the report templates are been stored adds unnecessary complexity to the codebase and I already made a proposal to my mentors about refactoring and it was approved.


Get the module

This code is not yet merged into LibreHealth so you’d have to clone of my own version of the code from and checkout the gsoc2017 branch and build then deploy to a running LibreHealth Toolkit 2.0 server. Also install the Open Web Apps Module and the Webservices module.


Before you can go ahead and use the module to create orders and reports there are some configurations that need to be made before you can create orders and reports.

You need to set your orderable concepts before you can create an order.

Also you need to set a complex concept for the reporting tool to use when creating radiology reports. Radiology reports are saved as complex obs. To create complex obs you need to have at least one complex concept in your system. With my new proposal to change how the reports and templates are been stored, you won’t need to configure this. It will be removed but for now just bare with it.

Set Orderable Concepts

The screenshot below shows the property you need to set.

Screen Shot 2017-08-19 at 9.55.46 PM

You need to set the UUID of all concept classes you’ll want to be orderable. For this tutorial we are going to use the concept class Test


Go to Administration/Manage Concept Classes and click on the Test concept class then copy the UUID.

Go to Administration/Settings/Radiology and paste the UUID in the Radiology Concept Classes box as shown above.

Set Complex Obs for Reports

As mentioned above, reports are saved as complex obs. For this there needs to be at least one complex concept in the system. You normally add concepts via a concept dictionary but for this we’ll go ahead and create one just for testing purposes.

Create a complex concept

Go to Dictionary and click add new concept. For testing purposes you can name your concept anything. The most important thing is to make sure it’s datatype is set to Complex and the handler is set to TextHandler

Screen Shot 2017-08-21 at 12.06.57 PM

Save your concept and copy it’s UUID

Screen Shot 2017-08-21 at 12.09.53 PM.png

Go to Administration/Settings/Radiology and paste the UUID to the complex class box

Screen Shot 2017-08-21 at 12.12.10 PM

You are now set up to create Orders and Reports.

Create an Order

In the Radiology dashboard under the Orders tab

Screen Shot 2017-08-21 at 12.22.41 PM

Click on Add Radiology Order to add a new order. To be able to report this order you must set it’s status to Completed.

Screen Shot 2017-08-21 at 12.32.59 PM.png

Under the report section you’ll notice a dropdown with a default of Free Text Report. We are going to create an MRRT report and for that you need to have an MRRT Report template.

You can add an MRRT template by importing it from the Report Templates Tab on the Radiology dashboard

Screen Shot 2017-08-21 at 12.35.36 PM

When creating a report select MRRT Report and search for a template to use for your report. I have one template in my system so I’ll search of Cardiac MRI

Screen Shot 2017-08-21 at 12.39.09 PM

Select your template and click claim report. You’ll be presented with a template editor that uses the template you selected.

Screen Shot 2017-08-21 at 12.40.21 PM

Enter principal results interpreter/Provider and complete your report.

GSoC Final Coding Phase Week 1

The first week of the final coding phase just concluded and for this phase my job was to fetch actual data from the backend via REST.

The screenshot below shows actual orders that are fetched from the backend via REST

Screen Shot 2017-08-06 at 2.51.27 PM

And below are reports fetched from the backend

Screen Shot 2017-08-06 at 2.51.41 PM

More work still needs to be done on how the data is displayed on the tables. I intend to make the table paginated so that it will reduce the load time when reports are been fetched. There are some angular components for data tables that implement pagination but I’ll implement mine. I’ve tried a couple that didn’t work and were not very user friendly.

The app currently only interacts with the backend by fetching data. The next step is adding data. The starting point is radiology orders. And that is the complicated one as during the order creation process a lot of REST calls have to be made to the backend.

When creating an order, you need a patient, provider, imaging procedure, etch and all have these have to be obtained via REST search. See order dialog below

Screen Shot 2017-08-06 at 2.51.59 PM

Once we are able to add orders via REST, the next hard part to implement via REST is Report Template import.

Commits this week