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



GSoC Coding Phase 2 Week 3 & 4

Second Evaluation for GSoC just ended and for this coding phase I have bootstrap the new UI for radiology and fix all bugs I was having with the UI and now ready to use real data from the database with the Angular HTTPModule.

I was also able to deploy my app as an Open Web Apps. In the another blog post, I’ll give a tutorial for creating an Open Web App with Angular 2 and successfully deploy it.

This session was the most interesting one. I was able to pickup Angular 2 on the fly and build my UI.

You can access the code of my work so far from

Below is a screencast of the new UI

GSoC Coding Phase 2 Week 2

The second week of GSoC coding phase 2 just ended. This week has mostly been about learning Angular 2.

I also took some time out to follow up on my US nonimmigrant visa to attend the Open Source Summit North America. I traveled to the capital city for my visa interview on Friday July 7th as I had my interview on Monday the 10th of July. It was an 8 hours bus ride. My visa interview was successful and on I collected my visa the next day July 11 and since it was already late to return home, I traveled back to my city the next day July 12.

During this time I was also learning angular from the At the same time working on the UI. Built some components already.

New Radiology dashboard built with Angular 2. The header and the footer are separate reusable components and the dashboard itself is another component. It’s still not complete though.

Screen Shot 2017-07-17 at 10.31.20 AM



New report authoring.

Screen Shot 2017-07-17 at 10.32.09 AM

GSoC Coding Phase 2 Week 1

It’s a little over a week since the GSoC first evaluation ended on June 30th, 2017. Glad to say I passed the first evaluation with good remarks from my mentors. The radiology back end code can now save radiology reports using MRRT templates. That’s a great achievement.

For the phase 2 of the program I’ll be working on a new UI for radiology. We’ll be leaving the legacy OpenMRS UI and build a new user interface based on web components. The initial idea was to use Polymer for this but Angular 2 changed the story. Angular 2 is component based and perfect fit for out goals.

The front end will be an Open Web App which is supported by the LH Toolkit thanks to the OpenMRS Open Web Apps module. The web app will be an Angular 4 + Twitter bootstrap project. And it will communicate with Toolkit via REST.

I’m fairly new to all the technologies to be used for the front end so I started off by enrolling to an Angular 4 course on Udemy using my GSoC stipend. I also watched some videos about twitter bootstrap. I’m also learning Angular 2 from the tutorials. I’ve still not covered enough angular to complete the front end but I’m making much progress with angular and I’m confident to meet my 2nd evaluation goals.

I’ve setup an Angular project for LibreHealth Radiology and hosted it on GitHub. I’ll be updating the app as I get more understanding of Angular while moving on with the course.

GSoC First Evaluation Report


The first coding phase of GSoC just ended and here is my report.

The milestone for this phase was to make it possible to create radiology reports using MRRT report templates. And I’m happy to say the milestone was achieved and it’s now possible to create MRRT reports instead of the traditional free text reports. First I’ll demonstrate how to use it then I’ll go throw my implementation details.

Create an MRRT Report

This still in development so you’ll have to build the radiology module to test this. To build it clone my repo on gitlab

git clone

Then checkout the gsoc2017 branch

cd lh-radiology

git checkout gsoc2017

Now build a the .omod file

mvn clean install

You can now deploy your module to toolkit/core server. To setup a server see standard OpenMRS or LibreHealth Toolkit documentation for instructions. The following instructions assume you already have a server running OpenMRS 2.0.5. For rapid development I setup my server using the OpenMRS SDK. The server runs openmrs version 2.0.5. But any 2.x version should work fine.

To create a radiology report using an MRRT template, first you have to make sure you have at least one MRRT template imported into the system. To import a template, visit the Report Templates Tab on the radiology dashboard. And click on upload new template and select your template file.

Screen Shot 2017-06-28 at 9.13.37 PM

Now if template import is successful then you are one step closer to been ready to use these templates to create a radiology report.

These reports are saved as html files on the file system. We needed to make it possible to query these reports when querying observations for a patient. So instead of the radiology module taking care of saving the file, it’s uses an OpenMRS API Complex Obs. All the radiology module has to do is create a complex obs and set it’s complex data to the contents of the report and hand it over to the openmrs api to save the complex obs with the report. To use complex obs you must have at least one complex concept in the system. Concepts are normally added via a standard concept dictionary or via metadata sharing module. But for development and testing you can go ahead and manually create a complex concept. For that click on the ‘Dictionary’ link on the home page and click add new concept.

Screen Shot 2017-06-28 at 9.29.35 PM

The concept data type must be complex and handler TextHandler

Screen Shot 2017-06-28 at 9.32.16 PM

Save the concept and proceed to creating your report.

To create a report you need a completed radiology order obviously. We are reporting the findings of performing a radiology procedure after all.

Screen Shot 2017-06-28 at 9.35.24 PM

Save your order and you can now claim your report. If you you used the old version of the module you’ll release a drop down that specifies the kind of report you want to create. If you select Free text then you’ll proceed with creating a normal radiology report with using a template file. But if you select MRRT, you’ll be presented with a search box to search a template to use.

Screen Shot 2017-06-28 at 9.39.59 PM

Click on a template from the suggestions

Screen Shot 2017-06-28 at 9.41.23 PM

Click on claim report and you’ll be presented with a report editor that uses the MRRT template as a starting point.

Screen Shot 2017-06-28 at 9.47.16 PM

Fill your report and save it by hitting Complete.

See my next blog post about my implementation of the above feature.

GSoC Week 3

The third week of GSoC ended a few days ago and this my report. During week two updates I reported that I was able to save radiology reports as files on the file system but I didn’t use Complex Obs for that. But due to the different advantages we’ll have in saving as complex obs including making it possible to query a report when all observations on patients are been queried, my mentor Judy requested I save it as an obs and since this is a file we have to use complex obs since it handles files well.

Here is my merge request

To see it work you need at least one complex concept in the system. This concept will normally be added via a standard concept dictionary but for development purposes you can go ahead and manually create a complex concept and copy it’s uuid as shown on the screenshot. Make sure to select TextHandler

Screen Shot 2017-06-20 at 8.01.55 AM

Then copy the uuid of your complex concept and paste it to the radiology global property Complex Concept. For that go to Administration -> Settings -> Radiology  and you’ll see a setting called Complex Concept and paste your uuid there. See screenshot below

Screen Shot 2017-06-20 at 8.11.16 AM.png

Now you can go ahead claim a report for a completed order or just create your new order and set it’s status to completed then claim the report. After saving the report you can see your obs by going to

Administration -> Manage Observations search observations by patient name and you’ll see a link to your report file.

Screen Shot 2017-06-20 at 8.15.35 AM.png

Next steps

The system currently saves only free text reports as complex obs. I’m adding support for saving MRRT reports too. I have already worked on the backend code for handling reports created with MRRT templates and I’m now working on the front end to have something that I can demo.

GSoC Week #2

GSoC Week 2 just ended and I did not accomplish much. I spent a lot of time on making the radiology module a fhir server. I’m moving back to primary goals of my GSoC project this week by moving on the next phase of my timeline which says radiology reports should be stored as files. Here is my first commit to that end Right now when  a report is saved, the contents of the report are been saved in a file on the server and the location of this file is saved in a RadiologyReport.path.

I did not use Complex Obs for this but as per the discussions here, last comment, saving it as complex obs will make it easier for users to see completed report from patient dashboard obs section.

GSoC Week #1

Official coding for GSoC began 30th of May and here is an update of what I have been doing.

My task is to make the radiology module a fhir server. I am following this tutorial and using this code as reference. I kept on having issues with making the radiology module a fhir server. After implementing all the classes in radiology as documented in the fhir docs, my builds kept failing. Also the tutorial does not explain much about the different parts of the example server code on github so I have to make guesses about some things. So I decided to build a fhir server from scratch out of radiology just so I can understand the differents parts of the fhir server architecture. The problem I’ve been having so far is knowing which dependencies I should declare in my pom. The code on github is a multi module maven project and some dependencies in the parent pom have nothing to do with setting up a fhir jpa but they are declared in the pom just because another module needs them. Also there are some dependencies that are declared in the pom that are not directly used in the code.

I joined the fhir mailing list and posted the problems I was having there and though my problem was not directly solved I was pointed to another sample code that sets up a fhir server. This is easier to work with as it’s not a multi module project hence all dependencies in the pom will probably be what’s necessary to setup a fhir server. And this has been helpful, I am beginning to understand why I kept on having build failures and trying to resolve them. But still the same I still have to figure things out just by looking at the code.

Here is the link to fhir server I’m working on I used spring boot. I’ve just implemented the single class necessary to setup a fhir server(a class that extends one of the dstu base classes in this case dstu3). Now when I run the tests spring is unable to initialize the application context due to some missing dependencies. Currently working on that.

GSoC 2017 Community Bonding Week Two

For this week I was working on my internship report for my school defense. We received a short notice that we’ll be defending our internships from the 22 – 24th of May 2017. My internship project was never complete since we had a long strike that interrupted school businesses. I’m trying to wrap up the first part of the project at least and present in school.

Will continue work actively on my GSoC project after the 24th.

GSoC 17 Community Bonding Week 1

The first week of community bonding just ended and here is a report of what I did.


Community bonding involves getting to know your organization and mentors and refine your project proposal and timeline together with the help of mentors. This also involves working on issues that may not be directly related to your GSoC project.

Work Done

For this week, to get to understand my project properly I have been working on a pre gsoc task. This involves making the radiology module a fhir server. For that I’m following this tutorial fhir jpa server. While implementing the classes necessary for making the radiology module a fhir server as explained in the tutorial. I noticed that the class CorsConfiguration which is a spring class was not available in my class path. This was because the version of spring use did not yet have that class. For me to proceed I had to first update the spring version in core/toolkit. Upgrading to the latest spring version which is 4.3.x, made a lot of tests to fail so I had to upgrade from 4.1x to 4.2.x since the CorsConfiguration class was added in that version. Here is a merge request for that

I changed the openmrs dependency in radiology module to refer to 2.1.0-SNAPSHOT since I’ve upgraded spring in that version. Now just adding dependencies for fhir make tests fail with the error below when I run mvn clean install. But these tests pass when I run them directly from intelij. Error

I will investigate more into this. But right now I’m concentrating on getting my internship report ready for my defense in school which is in 10 days.