Tuesday, October 6, 2020

V38 Technical Documentation

 The link to our v38 technical documentation is here: [link]

V38 Released

As of about 9:30 am Eastern on October 6, 2020 we released versions of our products which support v38 of the US federal grouping algorithm, which version went into service on October 1st, 2020.

We were a bit delayed by COVID-19 related issues and an ancient bug in our exclusions loader (there are many new exclusions in this year's version).

For a list of what is new and different in this version, please refer to our latest documentation (link to PDF available on our etail site or this blog's main page).


Friday, April 10, 2020

Lowering AIX Support

Since we do not sell enough of them on-line to warrant putting them on-line every year,
we are dropping the AIX version of DRGFilt. We are still able to produce the product, so
we will be making it an on-demand item for at least the coming year. If you want to purchase
the AIX DRGFilt, you will have to send us an email, probably via this tech blog.

Please note that it may take us up to 5 business days to compile, validate and ship the item after we receive payment for an on-line invoice.

While we are on the topic, we can build DRGFilt for many more Unix systems than we do. Currently we do not charge extra for custom requests, but we reserve the right to do so.

V37b Released (CMS 37.1 R1)

The group responsible for defining the DRGs each year are the Centers for Medicare and Medicaid Services (CMS).  They are a part of the US federal government.

Normally, each version DRGs is released on October 1st, the start of their fiscal year. So it was with version 37 on October 1st, 2019. A little while later we followed suit with our implementation of their algorithm.

On April 1st, 2020, CMS 37.1 release 1 (37.1 R1 in their terms) was released in response to the COVID-19 pandemic. This is a link to an AHA article on the subject.

This update also includes provision to support diagnosis of vaping. You can find a CMS bulletin about the support here.

Since this release supercedes v37 and v37a, we are replacing our v37 offerings with their v37b counterparts. For the most part, you can tell the difference by looking at the software's internal version number, which should be reported as "v37b".

However, in order to minimize the pain of upgrading, all the software still expects "v37" as the input and output version numbers and the masks file has the same name. You can tell the difference between the mask files, despite their names, by their md5sum values:

0056716453280971ae09e915fb2c738a  drgmasks.v37 <---------v37b
dec337b97acaa2c50fb6738a6727b332  drgmasks.v37.0 <-------v37 & v37a

Any customer who purchased a V37 product will be offered a free upgrade.

Any customer who purchases a V37 product going forward will be v37b.

You can confirm that you are running v37b by using either of the two new diagnosis codes and seeing that they are properly handled:

CodeDescriptionCCMDCDRGs
U07.0Vaping-related disorderN04205, 206
U07.1COVID-19MCC04177, 178, 179
15791, 793
25974, 975, 976

Thursday, February 6, 2020

Bug Fix For DRGFilt

When validating some of our other software, we discovered a long-standing bug in our DRGFilt product which supports ICD10 codes, both the Linux and Windows implementations. This bug is in versions v33, v34 and v34a, v35 and v35a, v36 and v37.

The patched versions are as follows:

  • v33a
  • v34b
  • v35b
  • v36a
  • v37a

The bug does not affect DRG assignment; it only affects reporting of the DRG weight. Specifically, unpatched executables  report the DRG weight as 10 times greater than it is. Thus 1.2345 was reported as 12.3450.

The good news is that if you are using the weights for their usual purpose, predicting relative resource consumption, you code worked because all the weights were increased by the same factor.

The bad news is that the weights were wrong.

Here are the steps we have taken to correct this issue:

  1. We have patched the sources and built new DRGFilt executables: v33a, v34b, v35a, v36a and v37a.
  2. We have sent updated versions to any and all clients who purchased the buggy products.
  3. We have updated our on-line store with the new executables.
  4. We have posted this message on our Tech Blog
  5. We are updating our QA process to make sure that we do not have weight reporting problems ever again.

Thursday, January 30, 2020

Updated VB.NET Sample Code

We recently had to help a customer get our DLL to work in their VB.Net environment because our sample code was so out of date. In order to spare other customers this pain, we post this code example. Note that this code is for version 37 (v37); change the version to match your particular situation.


Option Explicit On
Imports System.Deployment
Imports System.Runtime.InteropServices

Module Module1
    Private Declare Function mhdllver Lib "vbdrgv37.dll" (ByVal Buf As String,
    ByVal BufLen As Int32) As Integer

    Private Declare Function mhdrg1 Lib "vbdrgv37.dll" (ByRef drg As Int32,
    ByVal DRGVersion As String, ByVal MasksPath As String, ByVal DischStat As String,
    ByVal PtAge As String, ByVal PtGender As String, ByVal DXList As String,
    ByVal ProcList As String, ByVal POAPresent As String, ByVal ExemptFlag As String) As Int32

    Private Declare Sub mhinfo Lib "vbdrgv37.dll" (ByVal drg As Int32,
    ByVal DRGVersion As String, ByVal MasksPath As String, ByRef mdc As Int32,
    ByRef weight As Double, ByRef los As Double, ByVal Desc As String, ByVal DescLen As Int32)

    Private Declare Function mhdrgver Lib "vbdrgv37.dll" (ByVal MPath As String,
    ByVal Buf As String, ByVal BufLen As Int32) As Int32

    Private Declare Sub mherrdesc Lib "vbdrgv37.dll" (ByVal errBuffer As String, ByVal errLength As Int32)


    Sub Main()
        AssignDRG()
    End Sub

    Public Function AssignDRG()
        Dim ReturnCode As Integer
        Dim drg As Int32, mdc As Int32
        Dim Desc As String
        Dim descLen As Int32
        Dim weight As Double, los As Double
        Dim masksdir As String

        Dim myver As String, mydstat As String, myage As String, mysex As String, myexempt As String, mypoa As String
        Dim mydxstring As String
        Dim mypxstring As String
        Dim pos As Int32

        ' Hardcoded in this example
        masksdir = "C:\Program Files (x86)\MandH\MASKS\" & ControlChars.NullChar
' Ideally, got from registry. Old VB-for-Access example:
' masksdir = QueryValue("Software\MandH\", "BaseDir") & "\Masks\"

        myver = "v37e" ' version 37, exempt from HAC rules
        mydstat = "1"
        myage = "77"
        mysex = "1"
        mydxstring = "I2119^" ' ^ terminates the string; any of ,|-+ separate fields; ~ is followed by PoA
        mypxstring = "02703ZZ^"
        mypoa = "N" ' no POA because no HAC rules
        myexempt = "X" ' crazy way this works: X = exempt, Z = not exempt
        descLen = 80 ' left over from dumb ASCII terminal days; use whatever you like

        ' these should come back from the DLL call
        drg = 0
        mdc = 0
        weight = 150
        los = 10
        Desc = Space(descLen)

' confirm which DLL we have loaded
        drg = mhdllver(Desc, descLen)
        ' deal with char ASCIIz (null-terminated string)
        pos = InStr(1, Desc, ControlChars.NullChar, CompareMethod.Binary)
        Console.WriteLine("DLL Version: " & Desc.Substring(0, pos))

' Assign the DRG for this age, sex, discharge status, exemption, diagnoses and procedures
        ReturnCode = mhdrg1(drg, myver, masksdir, mydstat, myage, mysex, mydxstring, mypxstring, mypoa, myexempt)
        Console.WriteLine("DLL.mhdrg1 returned RC=" & ReturnCode.ToString)

        If ReturnCode = 0 Then
            Console.WriteLine("DLL.mhdrg1 returned DRG=" & drg.ToString)
            Call mhinfo(drg, myver, masksdir, mdc, weight, los, Desc, descLen)
            Console.WriteLine("DLL.mhinfo returned ver=" & myver & " " _
                              & "MDC=" & mdc.ToString & " " _
                              & "Weight=" & weight.ToString & " " _
                              & "LOS=" & los.ToString & " ")
            Console.WriteLine("Desc=[" & Desc & "]")
        Else
            Call mherrdesc(Desc, descLen)
            Console.WriteLine("Error: " & Desc)
        End If

' Should produce this output:
' DLL Version: mhdrgv37.dll v2.10 (c) 2015 M+H Consulting, LLC: v37
' DLL.mhdrg1 returned RC=0
' DLL.mhdrg1 returned DRG=251
' DLL.mhinfo returned ver=v37e MDC=5 Weight=1.683 LOS=2.2
' Desc=[PERC CARDIOVASC PROC W/O CORONARY ARTERY STENT W/O MCC                          ]

        Return ReturnCode
    End Function

End Module