Xltek Troubleshooting Guide

The following are common issues I run into with Natus Xltek EEG software v8. This guide is intended for anyone providing IT/Biomed support for Natus EEG v8 software. For EEG techs/end users, always check all your connections, verify equipment is plugged in and on. Re-booting the machine can fix many issues, don’t hesitate to try that first.

Network Issues

Always verify you have a network connection. Some machines are set up to connect with an ethernet cable or by wifi. Here’s an example of what you might see in the Windows taskbar:

No local network (LAN) connection. This could indicate the cable is not plugged in, not seated all the way, or you have plugged it into a dead network jack.

Local network but no internet access. You’re connected to a local network but there’s no gateway to reach the internet. In some hospitals, this could be normal if they block the internet from the EEG machines.

Local network and internet connection. This is good! You have connectivity.

Video Errors

The Xltek software can be prone to a lot of video error issues related to several different things. If you experience video errors, for end-users, I suggest doing a simple reboot of the machine. This will restart some of the services the Xltek software uses for video plus reset your network connection.

XLMediaServer (Advanced)

Go to services.msc and make sure XLMediaServer is running, I always set this service to auto restart on failure. This service must be running for the video to record.


Disk is full

Check to see if the local drive is full. If the drive is full, the video will not be able to record. The video window pops open then shuts down and continues to do this in a loop. Look in D:\Neuroworks\DBData and  D:\Neuroworks\Deleter and delete the contents of those folders.

IP Camera Connectivity

Verify you can connect to the camera over the LAN. Open SNC toolbox and hit search. You should see the camera listed with the static IP assigned. I always set my machine’s camera to 192.168.2.100 with the local NIC as 192.168.2.10 (needs to be in the same subnet). Double-click the device listed and that should open the camera’s web page, verify that is working.

Video Configuration

If you’re using an IP Camera, run Video Configuration and verify IP is set for the selected camera type. If you’re using a USB analog input or webcam, use local.

Machine Manager 

In Machine Manager, verify your camera IP settings. Make sure you have the correct IP configured. Set stream mode to Unicast if not using Multicast. Verify the password is correct for the camera, Sony default is admin.

‘Video not available’ Error

If you see this error with a grey window and no video, check that Windows has a working sound driver. The Xltek software will not play video without a working sound driver.

If you’re working in a VM environment such as Azure, you will need to install a virtual sound driver like this one https://vb-audio.com/Cable/.

PTZ Controls greyed out

Go to services.msc and make sure XLPTZServer is running. I also set this service to auto restart on failure.

For end-users (EEG Techs), do a reboot and this should restart this service on boot-up.

Database Issues

The first thing you should check if you cannot refresh or access the database is your network connection. See above for Network Issues. If you are not accessing the network, you cannot access the global database.

Database greyed out (Advanced)

Check the network connection to the SQL server, make sure you can ping it. ICMP pings have to be able to reach the server for the database to work.

Go to services.msc and make sure the local SQL Express instance is running. It will be the default instance (MSSQLSERVER).

Storage Resource

In the Natus software, go to Tools>Options>Storage tab and verify the UNC path to the file server. Verify the database password is correct and select Test… to test the storage resource.

Local Database Corrupt (Advanced)

Check your local Neuroworks database. Open SQL Management Studio, verify the Neuroworks database is not corrupt. If it is, you can delete it and create a new one. You can use this SQL script below to create a new Neuroworks database (rename the file extension to .sql and run it in SQL Management Studio).

Neuroworks


Alternatively, you can follow these steps to create a new Neuroworks database

Delete Neuroworks database from SQL management studio (take offline first, then delete).

Delete:
D:\Neuroworks\Neuroworks.mdf
D:\Neuroworks\Neuroworks_log.sql
D:\Neuroworks\Neuroworks.dsn

Run D:\Neuroworks\MigrateDB.exe and create a new database.

Check ‘new’
Log file: Neuroworks
Source directory: D:\Neuroworks

Open Natus DB and the new DB will now take some time to sync with the global database.

Hardware Errors

If you’re having headbox connection issues with a USB connected communication box, make sure the communication box is being recognized by the PC with the proper driver. Go into device manager and you should see XLTEK USB Devices. If not, check your USB cable.

To open Device Manager:

  1. Press the Windows + R keys on your keyboard at the same time to bring up the Run utility.
  2. Type in “devmgmt.msc” without the quotations marks, then hit the OK button. This is going to launch the Device Manager in a separate window.

If you’re getting a ‘Device Descriptor Request Failed (Unknown USB Device)’ error try the following:

Expand the Universal Serial Bus controllers section, then select the Unknown USB Device (Device Descriptor Request Failed) from the list.

Expand the Universal Serial Bus controllers section, then select the Unknown USB Device (Device Descriptor Request Failed) from the list.

Right-click and hit Uninstall. Reboot the PC and it should re-install the proper driver.

Replace the USB cable

If none of this works, plug your USB cable into a different port. If that does not work, you may have a bad USB cable. Replace the USB cable. Natus uses a USB-A to USB-B cable.

Study Errors

If you come across this error, ‘No data recorded’ you may have a corrupt .STC file (Study Table of Contents). To fix this, run studytool.exe located in your Neuroworks folder (usually d:\neuroworks).

To find the study folder name, from the Natus database, right-click the study and select ‘info’, take note of the file path.

Now open studytool.exe and browse to that study file path, in the example below my server UNC path is \\orion\neuroworks\DBdata\, orion is the hostname of my file server, yours will be different. Once you have browsed to the study folder, select .STC from file type and select the .STC file and hit ‘Repair STC’.  You should now be able to open the study from the Natus database. You should see your .STC file change in file size from 1KB to something greater, depending on the length of the study.

Activation Errors

“Your activation code was not accepted by the system”

When activating, make sure your current user account has full or local administrative rights. You may even need to right-click Natus and select “Run as administrator.” The default local ‘xluser’ account should have local admin rights.

Verify you have write permissions to the following registry key:

HKLM\SOFTWARE\WOW6432Node\ExcelTech\Starter\License\XLTNW

You can give permissions to HKLM\SOFTWARE\WOW6432Node\ExcelTech for ‘everyone’ if needed, although this is not the best for security.

Verify you have read/write permissions to the following path where the activation BIN file is located.

C:\users\public\documents\licenses\

VNC

Xltek comes pre-loaded with a program called WinVNC. VNC (Virtual Network Computing) is a program that allows you to remotely view the EEG PC from another PC. There are many different flavors and variants of VNC.

If you hover your mouse over the taskbar icons you should see the WinVNC icon, this means that it is running in the background. If you can’t connect to the machine from another review machine using VNC, the Windows firewall or third-party virus protection software could be blocking the incoming port (TCP 5900).

Registry Hacks

SEEG (Show more tracings)

[HKEY_CURRENT_USER\Software\ExcelTech\NeuroWorks EEG\Settings]
“MinTracePitchInPixels”=dword:00000007

Neuroworks Reference Manual

With the Natus Database open, you can simply go to Help>Natus Database Help and this will open the Neuroworks Reference Manual PDF for your version of Neuroworks. There’s a lot of end-user information in this manual on using the software that can be very helpful.

For further help reach out to the Natus Xltek helpdesk at ots@natus.com.

DISCLAIMER: I do not work for Natus. I do not guarantee this guide. If you utilize this guide you do so at your own risk. Always make a backup of anything you choose to delete/modify first. Contact your IT/Biomed or Xltek support.

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.

Freesurfer Brain and SEEG Electrodes in CURRY

Importing Freesurfer pial surface into CURRY gives great visual representation of SEEG electrode locations. In the figure above, the screenshot was taken of a left lateral view of the pial surface model and then copied into PowerPoint where the labels were added.

In CURRY 8 you can import Freesurfer segmentation results such as the pial surface (lh.pial and rh.pial) files. You will need to co-register the Freesurfer files using the T1.mgz image data file.

To import your Freesurfer anatomy files into CURRY follow these steps:

  1. You will need lh.pial, rh.pial & T1mgz.
  2. Add T1.mgz to (Insert Image Data File) to the patient study
  3. Switch to Freesurfer coordinates (Freesurfer, NiftTi (R,A,S)
  4. Go to the Results panel, right-click on Surfaces and load lh.pial, hit OK.
  5. Hit No when asked to Add color intensity.
  6. CURRY will then ask you if you want to load the contents of rh.pial. Hit Yes.
  7. When finished, you should see lh.pial rh.pial in the Results and Objects list. Both left and right hemispheres have been combined.
  8. You now have your Freesurfer brain.

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.

Proposed CMS Changes for LTM EEG 2020

Timeline for implementation:
• July 2019 – Proposed values for codes published in Medicare Physician Fee Schedule Proposed
Rule
• August 2019 – AMA CPT Manual for 2020 becomes available with the full description of the
codes and CPT introductory language.
• November 2019 – Medicare Physician Fee Schedule Final Rule published with final values
• January 1, 2020 – New codes take effect

NAEC Coding Changes Handout

Proposed 2020 Medicare Physician Fee Schedule

Pages 400-410 LTM EEG Proposed Changes

Proposed 2020 Medicare Physician Fee Schedule Filed 11-1-2019 (Unpublished)

Vulnerabilities Discovered in Natus Xltek NeuroWorks Software

ICS-CERT issued an advisory following the discovery of 8 vulnerabilities in Natus NeuroWorks v8.

If the vulnerabilities are exploited they can allow a malicious hacker to crash the vulnerable device or trigger a buffer overflow condition that would allow remote code execution.

You should update your version of Neuroworks to 8.5 GMA 3 or later. It is available free of charge for users of NeuroWorks/SleepWorks Version 8.0, 8.1, 8.4, or 8.5. The Natus Neuro technical support department should be contacted for further information or download here.

SEEG/ECOG electrode locations in Brainstorm

Localization of intracranial electrodes is critical for invasive epilepsy evaluations and to confirm or not confirm the epileptic zone hypothesis. Various methods exist using various open-source and commercial software. Here is one method using some latest updates to the Brainstorm software.

Required imaging:

  • Pre-implantation T1 without contrast 1mm 3D volume scan
  • Post-implantation CT scan without contrast 1mm 3D volume scan

Assuming you are already familiar with Brainstorm and have already created anatomy files using Freesurfer:

Import Freesurfer anatomy

Choose Freesurfer folder

Change file type to Freesurfer

Set fiducial points & compute MNI coordinates

Convert CT to .nii.gz first with MRIcroGL (drag and drop)

Import CT by selecting ‘Import MRI’

Select the CT .nii file

Apply transformation

Register

Register on default MRI

CT overlay in MRI Viewer

Import ECOG data

Edit channel file

Change channel type to ECOG

Go to CT, Display, Overlay on default MRI (MRI Viewer)

Right click, Electrodes, Set electrode position

View in 3D

http://neuroimage.usc.edu/brainstorm/

 

Freesurfer Guide (Mac)

FreeSurfer is an open source software suite for extracting the cortex from an MRI, and more.

I’m using Brainstorm, but Brainstorm cannot extract the cortex from the MRI so I need to do this with FreeSurfer. There are also other utilities like BrainSuite that can do this as well.

Step 1

Download Freesurfer here.

Step 2

Register for a license key here.

Step 3

Follow the installation instructions. Create a license.txt file, copy the key into it and save in the freesurfer folder.

Sourcing FreeSurfer Mac from terminal:

$> export FREESURFER_HOME=/Applications/freesurfer
$> source $FREESURFER_HOME/SetUpFreeSurfer.sh

Step 4

Navigate to your DICOM folder in terminal.

Run the recon-all command

recon-all -i file.dcm -subject NAME -all

Where file.dcm should be one of the DICOM files in your folder (e.g. 00000001.dcm or just 00000001). Freesurfer will automatically get the rest of the images in the series.

After the -subject argument NAME should be the name you want to call the study/subject. There will be a folder created with this name in the Applications/FreeSurfer/Subjects folder.

The process can take 10-20 hours, for me, it took ~10hrs on my 2011 core i5 Macbook Pro.

screen-shot-terminal-freesurfer

Once it is done you can proceed to import your Freesurfer anatomy into Brainstorm. See the tutorial here.