Coding An Electronic EEG Logbook [Part 2]

Welcome to Part 2 of “Coding An Electronic EEG Logbook.” In this post, I will outline the dashboard, email notifications, my main SQL table structure, and adding ICD-10 codes.

Dashboard

For my dashboard I used Highcharts. Here is an example of ~6 months of data entered for 2018 displaying the volume of patients from each unit. I have two separate files, one to display the data, and one to query the database.

Highcharts PHP/HTML displaying the chart:

[pastacode lang=”php” manual=”%3C!DOCTYPE%20HTML%3E%0A%3Chtml%3E%0A%3Chead%3E%0A%3Cmeta%20http-equiv%3D%22Content-Type%22%20content%3D%22text%2Fhtml%3B%20charset%3Dutf-8%22%3E%0A%3Ctitle%3EUnit%20Volume%202018%3C%2Ftitle%3E%0A%0A%3Cscript%20type%3D%22text%2Fjavascript%22%20src%3D%22code%2Fhighcharts.js%22%20%3E%3C%2Fscript%3E%0A%0A%3Cscript%20src%3D%22http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fjquery%2F1.8.1%2Fjquery.min.js%22%3E%3C%2Fscript%3E%0A%0A%3Cscript%20type%3D%22text%2Fjavascript%22%3E%0A%24(document).ready(function()%20%7B%0Avar%20options%20%3D%20%7B%0Achart%3A%20%7B%0ArenderTo%3A%20’container’%2C%0AplotBackgroundColor%3A%20null%2C%0AplotBorderWidth%3A%20null%2C%0AplotShadow%3A%20false%0A%7D%2C%0Atitle%3A%20%7B%0Atext%3A%20’Unit%20Volume%202018’%0A%7D%2C%0A%20%20%20%20xAxis%3A%20%7B%0A%20%20%20%20%20%20%20%20type%3A%20’category’%2C%0A%20%20%20%20%20%20%20%20labels%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20rotation%3A%20-45%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20style%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fontSize%3A%20’13px’%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fontFamily%3A%20’Verdana%2C%20sans-serif’%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20yAxis%3A%20%7B%0A%20%20%20%20%20%20%20%20min%3A%200%2C%0A%20%20%20%20%20%20%20%20title%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20’Volume’%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0Atooltip%3A%20%7B%0Aformatter%3A%20function()%20%7B%0Areturn%20’%3Cb%3E’%2B%20this.point.name%20%2B’%3C%2Fb%3E%3A%20’%2B%20this.y%20%2B’%20’%3B%0A%7D%0A%7D%2C%0AplotOptions%3A%20%7B%0Abar%3A%20%7B%0AallowPointSelect%3A%20true%2C%0Acursor%3A%20’pointer’%2C%0AdataLabels%3A%20%7B%0Aenabled%3A%20true%2C%0Acolor%3A%20’%23000000’%2C%0AconnectorColor%3A%20’%23000000’%2C%0Aformatter%3A%20function()%20%7B%0Areturn%20’%3Cb%3E’%2B%20this.point.name%20%2B’%3C%2Fb%3E%3A%20’%2B%20this.y%20%2B’%20’%3B%0A%7D%0A%7D%0A%7D%0A%7D%2C%0Aseries%3A%20%5B%7B%0Atype%3A%20’column’%2C%0AdataLabels%3A%20%7B%0Aenabled%3A%20true%2C%7D%2C%0AcolorByPoint%3A%20true%2C%0Aname%3A%20’Unit%20Volume’%2C%0Adata%3A%20%5B%5D%0A%7D%5D%0A%7D%0A%20%0A%24.getJSON(%22unit_data2018.php%22%2C%20function(json)%20%7B%0Aoptions.series%5B0%5D.data%20%3D%20json%3B%0Achart%20%3D%20new%20Highcharts.Chart(options)%3B%0A%7D)%3B%0A%20%0A%20%0A%20%0A%7D)%3B%0A%3C%2Fscript%3E%0A%3C%2Fhead%3E%0A%3Cbody%3E%0A%3Cdiv%20id%3D%22container%22%20style%3D%22min-width%3A%20400px%3B%20height%3A%20400px%3B%20margin%3A%200%20auto%22%3E%3C%2Fdiv%3E%0A%3C%2Fbody%3E%0A%3C%2Fhtml%3E” message=”” highlight=”” provider=”manual”/]

Highcharts PHP data file to run the MYSQL query (See the SQL query highlighted):

[pastacode lang=”php” manual=”%3C%3Fphp%20%0A%24con%20%3D%20mysql_connect(%22localhost%22%2C%22username%22%2C%22password%22)%3B%20%0Aif%20(!%24con)%20%0A%09%7B%20%0A%09die(‘Could%20not%20connect%3A%20’%20.%20mysql_error())%3B%20%0A%09%7D%20%0A%09%0Amysql_select_db(%22mate2%22%2C%20%24con)%3B%20%0A%0A%24result%20%3D%20mysql_query(%0A%22SELECT%20%20COUNT(*)%20location_count%2C%20b.unit%0AFROM%20%20%20%20eeg_reading%20a%0AINNER%20JOIN%20location_table%20b%0AON%20a.location_unit%20%3D%20b.id%0AWHERE%20YEAR(date_recorded)%3D2018%0AGROUP%20BY%20b.unit%0A%22%0A)%3B%20%0A%0A%2F%2F%20while(%24row%20%3D%20mysql_fetch_array(%24result))%20%0A%09%2F%2F%20%7B%20%0A%09%2F%2F%20echo%20%09%24row%5B’reading_md’%5D%20.%20%22%5Ct%22%20.%20%0A%09%09%09%2F%2F%20%24row%5B’reading_md_count’%5D.%20%22%5Cn%22%3B%20%0A%09%2F%2F%20%7D%20%0A%09%0A%20%0A%24rows%20%3D%20array()%3B%0Awhile(%24r%20%3D%20mysql_fetch_array(%24result))%20%7B%0A%24row%5B0%5D%20%3D%20%24r%5B1%5D%3B%0A%24row%5B1%5D%20%3D%20%24r%5B0%5D%3B%0Aarray_push(%24rows%2C%24row)%3B%0A%09%7D%0Aprint%20json_encode(%24rows%2C%20JSON_NUMERIC_CHECK)%3B%0A%09%0Amysql_close(%24con)%3B%20%0A%3F%3E” message=”” highlight=”11-17″ provider=”manual”/]

Example JSON output:

[[” Program Admit”,466],[“Clinic EEG”,719],[“Clinic JPB PT EEG”,50],[“EEG INPT”,360],[“EEG Other (ISAT\/PET)”,24],[“EEG Program Admit”,318],[“EEG UH 4920”,244],[“EEG UH ICU”,485],[“INPT 5000”,828],[“INPT EEG”,55],[“INPT EEG H8000”,591],[“INPT EEG ICU”,927],[“INPT EEG PICU”,244]]

HTML/JQUERY output column chart displaying unit volume:

Automatic email notifications 

Now that you have data coming into your database, you can find scripts online or write your own that will simply query your database with an SQL statement and then email you or others with the results. This can be helpful for daily/weekly/monthly reports. I used the following script to query my database and send monthly results to our accounting team.

Here is a Github link to an example script I used. You will need to set up a CRON job on your webserver. No relation to StudiOwens but I do like the name.

https://github.com/StudiOwens/email-mysql-csv

MySql database structure for the EEG Logbook table

You should start off with a unique id for every row, (e.g. id). For the ‘id’ row make it an integer that is set so AUTO_INCREMENT, this will assign it a new unique id number for every entry in the database.

For any file data you wish to upload, like pictures or Word documents, make it a BLOB. In my database I have one medium blob called file_data, this is for uploading the EEG reports.

Adding ICD-10 codes to your database

You can easily download all of the ICD-10 diagnosis codes in a text file from the CMS website here.

Extract and open this file in any text editor like Textwrangler for Mac or Notepad++ for Windows and you will see the entire list. I extracted only the pertinent epilepsy codes from the list and imported them into my SQL database. I use PhpMyAdmin to import and administer my MySQL database.

Example of the ICD-10 codes in a drop-down from our MEG/MSI database:

Stay tuned for Part 3, I’ll upload a demo with anonymous data and talk about putting the database into the cloud for ease of access with secure authentication and HIPAA compliance.

Coding An Electronic EEG Logbook [Part 1]

Around the beginning of 2018, after I took my new position at our practice as Clinical Technology Manager, I took it upon myself to come up with a solution to an enormous problem in our company. Data management, billing and overall tracking of our LTM and clinical EEG studies was a complete mess. We were living in the dark ages, log books just like everyone else. But on top of that, another logbook with patient demographics, the reading doctor, number of hours recorded, pruned/cropped and archived and so on and so forth. All of this had historically been a full-time job for somebody, but as time went on and the practice grew, things needed to change to improve efficiency.

Back in 2008 we had acquired new business performing PICU and NICU EEG telemetry at another hospital and needed a way to track what we were doing there not just for the EEG department but also for billing.

I found some code online called MySqlTableAjaxEditor. These days code like this is referred to as a CRUD (Create, read, update and delete). Basically it’s code for a webpage that allows you an easy way to manipulate a database.

With this code, I was able to create a simple web-based database on our local intranet to track all of our outreach EEG studies being performed at this remote hospital. It worked great and our billing department had a way to see what had been done and check off when they had the report for the study and they had billed for it.

Back to 2018. I needed to take this code and expand it for our core business. Let me just point out that the code I was using still had not been further developed for many years but the website was still up. I searched and tried out many other CRUDs and similar scripts and none of them had all of the functionality I was looking for. Also, I was already familiar with it so I went with what I knew.

What I needed to do in a nutshell:

  1. Build an electronic version of our EEG logbook including patient demographics, EEG numbers, total hours recorded and more.
  2. Have a way for doctors to check off when they had completed the studies and then attached the reports to the database.
  3. Give our medical records department a way to attach reports and/or take attached reports and upload them into the EMR system.
  4. Have a way for our billing department to see when the EEG reports had been completed, prompting them to start the billing process.
  5. Have a way for the accounting department to track what’s been billed, which reports are outstanding and overdue etc.
  6. Give our accounting team access to a dashboard that will give them a daily glance of all EEG numbers, reporting and billing stats.

The main page:

The front page displays many icons, but I wanted to make it as simple for the end-users as possible so I thought about how IOS is laid out on an iPhone, something everyone is familiar with. For now, this is what I went with, an icon and page for each logbook and each location.

The top icons are the logbooks for each of our units/clinics. There are corresponding real-life logbooks for each of these, and they are red which is why I chose these icons. These digital logbooks contain all patient demographics, EEG numbers, total hours recorded, room number, unit, type of equipment.

After the EEG study is entered, it shows up in the doctor’s list as an unread study. They click on their respective pages and see the studies that show up. If a study is unread for greater than 21 days, for instance, the code will see that and highlight the study in yellow and shift it to the top, like a sticky, so that it gets noticed and read.

The second row of icons displays the second tier in the process, medical records. After the EEG logbook data is entered, the medical records staff looks to see when the doctors have checked a box that the study has been read. When in a read status it shows up on their respective pages as read. They will then go into the EMR and retrieve the report and attach it to the database and mark the study as being entered into EMR.

After medical records has done their part and check off the box that the study is read and in the EMR, it’s ready to be billed. These two tables equaling Yes means they will show up in the respective billing pages. Certain billers are tasked with billing different clinics and EMUs.

Once the billing department has submitted billing with the proper CPT code based on the total hours recorded and type of study it’s now marked as completed. This data is viewable in the dashboard for the administrative and accounting departments.

Here’s a quick look at part of the dashboard:

At any given moment you can pop in and see how many reports are pending and by which physician or location. I used Highcharts to create the dashboard.

Here’s a look at the doctor’s reading page:

If the ‘Days Pending’ column is ≥ 21 days the study is highlighted in yellow and shifted to the top of the list to attract the attention of the reader. Notice the ‘Report Done’ column all show ‘No.’ Start time and stop time are entered and the Study duration column is then calculated.

Stay tuned for part 2 where I will outline creating the dashboard, email notifications, SQL table structure, and ICD-10 codes.