[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

one simple app, coumadin gui work



For anyone who might interested I have done some major rewrite of the
coumadin regimen app
and thought I would share it with debian med for further comment.

I would particularly interested in cleaning up the code.

Karsten, I also have managed to make the Target INR selectable.
Much more work than I thought but I like the solution.

G
note. Run GUI.py initially to start.

Thanks,all
(im going to bed now)
G
import decimal
from Tkinter import *
import CR

TargetINR = ["1.5-2.5","2.0-3.0","2.5-3.5"]
class Main:
    def __init__(self, parent):
        self.parent = parent

        Label(parent, text="Select Target INR").grid(row=2)
        self.INRList= Listbox(parent,selectmode=SINGLE,
                         height=3,
                         takefocus=0,
                         exportselection=0)
        self.INRList.grid(row=2,column=1)
        [self.INRList.insert(END, item) for item in TargetINR]
        self.INRList.select_set(1)

        Label(parent, text="Current INR?").grid(row=3)
        self.INREntry = Entry(parent)
        self.INREntry.grid(row=3,column=1)
 
        Label (parent, text="Coumadin increment?").grid(row=4)
        self.UnitDose= Entry(parent)
        self.UnitDose.grid(row=4,column=1)
        
        Label (parent, text = "Monday's dose?").grid(row=5)
        self.MondayEntry = Entry(parent)
        self.MondayEntry.grid(row=5,column=1)
        
        Label (parent, text = "Tuedays's dose?").grid(row=6)
        self.TuesdayEntry = Entry(parent)
        self.TuesdayEntry.grid(row=6,column=1)
        
        Label (parent, text = "Wednesday's dose?").grid(row=7)
        self.WednesdayEntry = Entry(parent)
        self.WednesdayEntry.grid(row=7,column=1)
        
        Label (parent, text = "Thursday's dose?").grid(row=8)
        self.ThursdayEntry = Entry(parent)
        self.ThursdayEntry.grid(row=8,column=1)
        
        Label (parent, text = "Friday's dose?").grid(row=9)
        self.FridayEntry = Entry(parent)
        self.FridayEntry.grid(row=9,column=1)

        Label (parent, text = "Saturday's dose?").grid(row=10)
        self.SaturdayEntry = Entry(parent)
        self.SaturdayEntry.grid(row=10,column=1)
        
        Label (parent, text = "Sunday's dose?").grid(row=11)
        self.SundayEntry = Entry(parent)
        self.SundayEntry.grid(row=11,column=1)
        
        Label (parent, text = "Manual Percent Change?").grid(row=12)
        self.ManualPercentChangeEntry = Entry(parent)
        self.ManualPercentChangeEntry.grid(row=12,column=1)
        
        SubmitButton = Button(parent, text="Submit?", background="green")
        SubmitButton.grid(row=13,columnspan=2)
        SubmitButton.bind("<Button-1>", self.SubmitClick)
        SubmitButton.bind("<Return>", self.SubmitClick)

        Label(parent, text = "Current Total Dose").grid(row=15)
        self.CurrentTotalDoseText = Text(parent, width=20,height=1)
        self.CurrentTotalDoseText.grid(row=15,column=1)


        Label(parent, text = "Percent Change").grid(row=16)
        self.PercentChangeText = Text(parent,width=20,height=1)
        self.PercentChangeText.grid(row=16,column=1)

        Label(parent, text = "New Current Dose").grid(row=17)
        self.NewTotalDoseText = Text(parent,width=20,height=1)
        self.NewTotalDoseText.grid(row=17,column=1)

        Label(parent, text = "New Coumadin Regimen").grid(row=18,columnspan=2)
        self.NewRegimenText = Text(parent, width="60", height="5")
        self.NewRegimenText.grid(row=19,columnspan=2)

        ExitButton = Button(parent, text="EXIT?", background="red")
        ExitButton.grid(row=100,columnspan=2)
        ExitButton.bind("<Button-1>", self.ExitClick)
        ExitButton.bind("<Return>", self.ExitClick)
       
    def SubmitClick (self,event):
        CurrentINR = decimal.Decimal(self.INREntry.get())
        UnitDose = decimal.Decimal(self.UnitDose.get())
        Monday = decimal.Decimal(self.MondayEntry.get())
        Tuesday = decimal.Decimal(self.TuesdayEntry.get())
        Wednesday = decimal.Decimal(self.WednesdayEntry.get())
        Thursday = decimal.Decimal(self.ThursdayEntry.get())
        Friday = decimal.Decimal(self.FridayEntry.get())
        Saturday = decimal.Decimal(self.SaturdayEntry.get())
        Sunday = decimal.Decimal(self.SundayEntry.get())
        ManualPercentChange = self.ManualPercentChangeEntry.get()
        TargetINRSelection = self.INRList.curselection() #Dont'covert this to a float as you can leave it empty


        OUTPUT = CR.CoumadinRegimen(CurrentINR,UnitDose,
                                    Monday,Tuesday,Wednesday,
                                    Thursday,Friday,Saturday,
                                    Sunday,ManualPercentChange,
                                    TargetINRSelection[0])


        self.CurrentTotalDoseText.delete(1.0,END)
        self.CurrentTotalDoseText.insert(END,str(OUTPUT[0])+"mgs")

        self.PercentChangeText.delete(1.0,END)
        self.PercentChangeText.insert(END,str(OUTPUT[2]*100)+"%")

        self.NewTotalDoseText.delete(1.0,END)
        self.NewTotalDoseText.insert(END,str(str(OUTPUT[1])+"mgs"))

        self.NewRegimenText.delete(1.0,END)
        self.NewRegimenText.insert(END,str(OUTPUT[3]))

    def ExitClick(self,event):
        self.parent.destroy()


root = Tk()
root.title("Coumadin Regimen Calculator")
main = Main(root)
root.mainloop()
import inr
import math
import decimal
def CoumadinRegimen (CurrentINR,
                     UnitDose,
                     Monday,
                     Tuesday,
                     Wednesday,
                     Thursday,
                     Friday,
                     Saturday,
                     Sunday,
                     ManualPercentChange = None,
                     TargetINR = None
                    ):
              
    """Accept Coumadin dosing regimen and return new dosing regimen.

    This function is an attemp to merge the coumadinRegimen functions.
    It accepts
    1. CurrentINR: the patient's current INR
    2. UnitDose: ths is the smallest increment that you can change a patient's
        dose. Ie if you are using 2mg tablets then the smaller change would
        be splitting the tablet which would be 1mg which is what you enter.
    3. Monday-Sunday: Just enter the actual coumadin dose
    4. ManualPercentChange: Allows the doctor to change the percent adjustment
    5. TargetINR: not implemented yet, but will adjust suggest precent
        adjustments depending on what your goal is, 2, 2.5, 3, which would
        represent 1.5-2.5,2-3, and 2.5-3.5
    """


    CurrentWeekDose = {"Monday":Monday,
                           "Tuesday":Tuesday,
                           "Wednesday":Wednesday,
                           "Thursday":Thursday,
                           "Friday":Friday,
                           "Saturday":Saturday,
                           "Sunday":Sunday}
  
    CoumadinValuesList  = CurrentWeekDose.values()
    CurrentTotal = sum(CoumadinValuesList)
    CurrentDoseUnit = CurrentTotal/UnitDose #This is needed since we are trying to be decide how to spread the increments (pill), not actual mg

    if ManualPercentChange == None:
        PercentChange = inr.INRadjust(CurrentINR,TargetINR)
    elif ManualPercentChange == '':
        PercentChange = inr.INRadjust(CurrentINR,TargetINR)
    else:
        PercentChange = decimal.Decimal(ManualPercentChange)/decimal.Decimal(100)
        
    UnitIncrease = decimal.Decimal(str(CurrentDoseUnit))*(PercentChange)
    NewUnitTotal = CurrentDoseUnit + UnitIncrease
    NewDoseUnitRounded = math.ceil(NewUnitTotal)
    NewTotal = decimal.Decimal(str(NewDoseUnitRounded))*UnitDose
    Regimen = divmod(NewDoseUnitRounded,7) #This is the key math to figure out who to distribute the new doses

    WeekReference = { 0:"No left over doses",
                      1:"Monday",
                      2:"Monday Thursday",
                      3:"Monday Wednesday Friday",
                      4:"Monday Wednesday Friday Saturday",
                      5:"Monday Wednesday Friday Saturday Sunday",
                      6:"Monday Tuesday Wednesday Friday Saturday Sunday"
                      }

    WeekOrderedlist = 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday','Sunday'


    if Regimen[1] == 0:
        SingleTextLineOfRegimen = str((UnitDose * decimal.Decimal(str(Regimen[0])))) + "mg of coumadin every day."
    else:
        SingleTextLineOfRegimen = str((UnitDose * decimal.Decimal(str(Regimen[0]))))\
                                  +"mg of coumadin every day except "\
                                  + str ((UnitDose*decimal.Decimal(str(Regimen[0]))+UnitDose))\
                                  + "mg on "\
                                  + WeekReference[Regimen[1]]
    return CurrentTotal, NewTotal, PercentChange, SingleTextLineOfRegimen
import decimal

def d(X):
    return decimal.Decimal(str(X))

def INRadjust (CurrentINR,target_inr=1):
    """
    Takes current INR and returns suggested percentage change in coumadin dose.
    The target INR selections are:
    case 0: 1.5-2.5
    case 1:2.0-3.0
    case 2:2.5-3.5
    """
    
    cases = [(1.5,2.5), (2.0, 3.0), (2.5, 3.5)]
    percent_change=0

    try:
        low_range, high_range = cases[int(target_inr)]
    except IndexError:
        print "Case assignment failed"
        return
    
    delta_low = d(low_range) - d(CurrentINR)
    delta_high = d(CurrentINR) - d(high_range)

#note some weight stuff going on with >=
# str >= int always equal true
# dec >= int always equal true

    if target_inr==1 and (d(3)>=d(CurrentINR)>=d(2)):
        percent_change=0
        return percent_change
    elif target_inr==0 and (d(2.5)>=d(CurrentINR)>=d(1.5)):
        percent_change=0
        return percent_change
    elif target_inr==2 and (d(3.5)>=d(CurrentINR)>=d(2.5)):
        percent_change=0
        return percent_change
    else: pass
    
    if delta_low >= d(0.5):
        percent_change= 0.15
    elif d(0.5) > delta_low >= d(0.25):
        percent_change = .10
    elif d(0.25) > delta_low >d(0.01):
        percent_change =0.05
    elif d(0.5) > delta_high >= d(0.01):
        percent_change = -0.05
    elif d(1) > delta_high >= d(0.5):
        percent_change = -0.10
    elif d(1.5) > delta_high >= d(1):
        percent_change= -0.125
    elif d(2) > delta_high >= d(1.5):
        percent_change = -0.15
    elif d(2.5) > delta_high >= d(2.0):
        percent_change = -0.175
    elif d(3) > delta_high >= d(2.5):
        percent_change = -0.20
    elif d(3.5) > delta_high >= d(3):
        percent_change = -0.25
    elif d(4) > delta_high >= d(3.5):
        percent_change = -0.30
    elif d(4.5) > delta_high >= d(4):
        percent_change = -0.35
    elif delta_high >= d(4.5):
        percent_change = -0.40
    else:
        print "percent_change assigntment failed."

    return decimal.Decimal(str(percent_change))

Reply to: