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.

Google Summer of Code 2017


I have been accepted for the second time as a GSoC student. I’m so excited to be part of this program for the second time. This year I’ll be working with LibreHealth. My GSoC 2017 project is a continuation of my last year GSoC project. This year I’ll be doing the second part of the project.

About LibreHealth

LibreHealth is collaobrative community for free & open source software projects in Health IT, and is a member project of Software Freedom Conservancy. LibreHealth is an umbrella project for other open source health IT softwares.

I’m so excited to be part of LibreHealth as GSoC student because since they are new and still building their architecture I get the chance to learn first hand and be part of the team that made it great. I know I will learn a lot during my time hear as a GSoCer and I hope to make great impact at Librehealth.

About My Project

For GSoC 2017 I will be working on LibreHealth Radiology. LibreHealth Radiology is a fork of the OpenMRS Radiology module. My project is a continuation of last year Radiology Report Enhancement which was under OpenMRS. The goal of the project is to make it possible to create radiology reports based on radiology templates from within lh-radiology. Last summer me and my mentors were able to make the radiology module import and validate radiology report templates. But these templates are not used for the creation of radiology reports yet. This summer I’ll be working on making it possible to use the imported templates for report creation. I’ll also be involved in implementing the fhir standard in the EHR. I will also work on a new UI for lh-radiology by building web components.

My Expectations

I look forward to having a great time as GSoC intern at LibreHealth. I trust I’ll learn a lot during GSoC with LibreHealth.


OpenMRS Implementers Meeting 2016 Experience

I have procrastinated for a long time about writing this. Especially since I’ve been busy with GCI16 mentoring, OpenMRS help desk, internship and other personal adventures. But its finally here.

I have been around OpenMRS for two years now since I saw an OpenMRS flyer in a friends note book I borrowed. Can’t remember what the flyer was about though, but that is how I got to know OpenMRS.

My contributions to OpenMRS involves bug fixes and implementing new features. I also help other community members especially new comers with the technical issues they are having since I had much help to from the community when I was starting. And community members like Daniel Kayiwa would not sleep unless my problem was solved. It felt good giving back to the community. I participated for my first in GSoC as a student with OpenMRS. Currently I’m a GCI-2016 Mentor with OpenMRS. I am also one of the help desk managers at OpenMRS. Where I coordinate cases and make sure issues are responded to by the right team and in time. I also follow up with issue creators to make sure their problems are solved and they are satisfied or if they need more assistance.

My story about the OpenMRS 2016 implementers meeting began a little after GSoC 2016. After I had passed the final evaluations, few weeks later I received a mail my mentor Judy Gichoya telling me about a mail from Google Summer of Code which says she can endorse her GSoC student for a $500 travel stipend to attend any conference. Knowing much about my desire to attend conferences and also to finally meet the OpenMRS Community physically, she told me to apply for the stipend and also apply for an OpenMRS Scholarship which I did. The $500 stipend was approved within 24 hours but due to the massive amount of OpenMRS scholarship applicantions my approval came about 6 weeks after my application. I received a mail from Jeff Neiman about my scholarship approval. OpenMRS funded my flight expenses, hotel reservation for 6 days at the Speke Resort, Muyonyo and my conference registration.

I arrived Uganda on the 6th of December 2016 and suprisenly OpenMRS had already arranged for my transportation from the airport.


The drive from the airport to the hotel where the conference was taking place was a long one and 1 hour later I finally met with the OpenMRS community members in person. This was  a really amazing experience. I introduced my self to everyone I recognized, Jan Flowers,Darius Jazayeri , Burke Mamlin, Sri Maurya Kummamuru, Daniel Kayiwa, Kawesi Joseph, Jeff Neiman, Paul Biondich, Theresa Cullen, Suranga Kasthurirathne, Mike Seaton, etc, etc. The list is really long. It was so nice to finally meet all of them. The OpenMRS community is like no other I’ve seen. I’m glad to be part of this awesome community.

Me, Sri Maurya Kummamuru, Darius Jazayeri (from left to right)

Conference started with the singing of the Uganda national anthem.

Photo by Jeff Neiman

I enjoyed the sessions. I learnt a lot about OpenMRS and Bahmni. And now I perfectly sure of which distribution I need to start an OpenMRS implementation here in Cameroon.

Photo taken just before the start of unconference sessions.
Shruthi Pitta from Bahmni talk about Bahmni distribution.



We also visited sites using OpenMRS. My group visited the Kisugu Health Centre.

Uganda EMR in use.

Listening to Matthew Ssemakadde lead a session about OpeMRS education was really awesome. We talked about how make the OpenMRS implementers and developer certifications successful.

OpenMRS Certification Program session

Unlike most conferences, OpenMRS 2016 was not only about talk, talk, talk. There was also entertainment. There was football match of Uganda vs The rest of the world which I think ended in a draw. I last played football in primary school. Which is about 10 years ago. So yes I’m not in field. lol


We also had entertainment during dinner at the Lake side on Thursday Dec 8.

Photo download from Burkes twitter post

We all dressed in our OpenMRS T-shirt in time for the group photosczjpubjusaa5ylq

I volunteered to lead the OpenMRS hackerthon with a tutorial for using the OpenMRS SDK which I ended up learning a lot my self.


Shruthi Pitta submitted her first pull request to openmrs after fixing a bug during the hackerthon.


The hackerthon ended the last day Sunday Dec 11, 2016 with good bye selfies.

Selfie taken by Tadeo

The experience was an amazing one and I say a big thank you to OpenMRS for the funding to attend and Google for the travel stipend. This wouldn’t have been possible without them.