Oxaliplatin-induced lung fibrosis

Great case of somethin’ !  This is actually a known entity but the change from prior is pretty striking.


Oxaliplatin-induced lung fibrosis

Oxaliplatin-Induced Lung Toxicity.


xelox pulm fibrosis after


xelox pulm fibrosis



Adapting to a Suboptimal Teleradiology Reading Environment – Part I

This post is the start of chronicle of  improvements that can be made with thoughtful introspection into workflow.  It is in no way intended to disparage the reading environment, but rather takes a look at the barriers to information transfer and how to overcome them on a personal basis.  All of these were my own developments to streamline my reading environment, improve patient care and reduce stress for the radiologist.

The environment uses a RIS that is web based, running on a coldfusion server.  The appropriate link activates a java based application that launches from the link.  The images are stored on one of two servers and an annotation is there that tells the rad which link to click.  Whether clicking the “O” link “B” link is a pseudorandom pattern.  Some studies are preferentially on one server but it is inconsistent.  I don’t know the reasons, nor do they matter.

While this seems like a trivial matter, over the course of a shift, that is around 100 times of finding the text, clicking the link, and then reading the study.

One of the problems is that because of the presentation of text, which link to use can be in a different spot on every single page.


generic screencap

This is what a generic patient link looks like before modification.

generic screencap

Annotations showing which link to use and the actual link is above it.

So to make my life a little easier, I inject some color with javascript and greasemonkey in firefox.  The colors do not match the “o” and “b” but that will make sense in a follow up post.

generic screencap

The correct link to use is now highlighted.

This is just the first step in optimizing the display of images.  More to follow.

Analysis of Radiology Report Word Frequency – Part I

The point of this programming exercise is to find outlier words that speech recognition shouldn’t, but does, insert into the dictated reports.  By taking a large sample size for a user, the word frequency can be used to remove inappropriate words from the user dictionary.

As an example, I had the word “heber” escape my proofreading at one point and it made it into the list.  I’ve removed it now, but the ultimate goal is to check each report for outlier words, and when they fall below a frequency threshold, to flag them for review.

You can see that there are some words that just don’t belong.  This frequency analysis allows removal from the lexicon and by doing so, should improve reports AND recognition. There are a few problems with the data that are fixable.

  • Indexing of unimportant elements
    • Numbers
    • Measurements (cm, mm, g …)
    • HTML tags
    • Technique (modalities and technique description)
  • Punctuation filtering
    • gives rise to concatenated words


From the radiologist’s perspective, if you are going to give a diagnosis that you’ve never given before, it should not be taken lightly.  This follows the axiom that an uncommon presentation of a common disease is more common than a rare disease.  If at all possible, try to have another radiologist consult and confirm your suspicions and for heaven’s sake, if there is a differential, please give it.

I have frequently seen radiologists try to hit a “home run” by naming a rare disease, not giving a differential, and flubbing the case because it’s actually a common disease with an unusual presentation.

The point of that aside is that a frequency analysis can prompt the radiologist to ask “do I really mean to use that word” and if you do, it will make you think about whether that is the correct and only differential consideration you want to give.

All too often, technology solutions in medicine increase the burden on the physician rather than facilitate the practice of medicine.  EMRs are a perfect example.  You spend more time clicking than caring.  The eventual goal will be a real time prompt on signing a report that keeps the rad out of trouble and produces a polished professional report.  At the end of the day, the report is the indelible work product.

Parsing Radiology Exam Data with Python Class

I’ve had a really clunky program to track what I do.  It lets me know how much volume I’m reading calculated each 30 min based a logfile.

I’ve decided to get a little more sophisticated with the program because it has grown to the point where it’s painful for me to edit, and if I wrote it, it must be completely abstruse to someone else.

I have never used a class in python but it solves many issues for me:

  • Cleans up the code
  • Moves functions to a module for importing and repurposing
  • Teaches me how to construct a class properly
  • Allows parsing of text with a structure that makes sense
    • Class instance attributes now make inherent sense
  • Eliminates having to bring global var into functions for modification
    • The class instance can access global counters
    • The class output can eliminate the need for global counters
  • Allows me to expand to the class to perform other manipulation
    • calculating age of patient
    • SQL archival
  • Works in python 2 and 3
  • Uses the Regex from hell


import re

class Parser:
    A class to parse data strings into components
    from parser_fx import *
    result = Parser()     ## Instantiate class
    result.parse(study)   ## Pass the instance a study string
    result.XXXXXXX        ## Attributes of result now available

    def __init__(self):
        """ Simply establishes the regex expression"""
        self.regex = re.compile(r'([\'A-Z\s-]+)(\[.+||\s])\s*'
                                '(CURRENT STUDY:)([A-Z\s/\[\]]+)'

    def parse(self, study_string=('SIMPSON HOMER J[Prelim  report]CURRENT STUDY:'
        'CT HEAD 2016-01-01 23:59:59 [DOB: 1111/1/11 ] [ID: 1234567]')):
        """Parser with failure options"""
        self.study_string = study_string
            self.matchobj = self.regex.match(self.study_string)
            ## Attributes: name, prelim/final, study, date, time dob, ID 
            self.name = self.matchobj.group(1)
            self.type = self.matchobj.group(2)[1:7].rstrip()
            self.study_name = self.matchobj.group(4)
            self.date = self.matchobj.group(5)
            self.time = self.matchobj.group(6)
            self.DOB = self.matchobj.group(7)
            self.ID = self.matchobj.group(8)[1:-1]
            print("REGEX Match Failed")

    """  Leaving here as an example to follow 
    def ID(self):
        ''' returns study  '''
        self.ID = self.matchobj.group(8)
        return self.ID   

study= ('SIMPSON HOMER J[Prelim  report]CURRENT STUDY:'
        'CT HEAD 2016-01-01 23:59:59 [DOB: 1111/1/11 ] [ID: 1234567]')
result = Parser()
print("%s | %s | %s | %s | %s | %s" %(result.type, result.name,
        result.study_name, result.date, result.time, result.ID))


After testing for a week, I’ll report back on success or failure.

A setup for mesenteric ischemia

ER case.  Likely unimportant in the current presentation but potentially important down the road.  2 vessel comp.png

  • Salient Points
    • Chronically occluded proximal SMA
    • >50% and probably 70% stenosis of Celiac origin
  • My recall from Sabistons book says that a single vessel can be ligated with impunity.  2 Vessels and the patient is on the threshold.  If this patient were to thrombose a collateral reconstituting the SMA or the Celiac, there could be a large territory of dead bowel.

Pneumomediastinum and pulmonary interstitial emphysema

I think this is the first time I’ve ever seen PIE in without trauma.  The patient has bad colitis and I caught the pneumomediastinum on the inferior slices of the chest.  Went back and scanned the chest and no visible esophageal perf, but lots of air.



I was not familiar with the term:

The Macklin effect: pulmonary interstitial emphysema and pneumomediastinum

I’m only used to seeing PIE in infants, but this is a rock solid demonstration of it.

Belly GIF: rocker_loop.gif