X-Git-Url: https://code.agnibho.com/repo?p=ddstorm.git;a=blobdiff_plain;f=ddstorm.py;fp=ddstorm.py;h=2b6664cba4a77ad2ebfe03cebe3dcd142256077a;hp=7fb300a32eb3b6c0eb13cecf64cecb0f20da1774;hb=717bb15e56a14b4d814054c5bd5d15a9b4c9e20f;hpb=ad3c926d180f5d843b77db44c2b2449cdffeec34 diff --git a/ddstorm.py b/ddstorm.py index 7fb300a..2b6664c 100644 --- a/ddstorm.py +++ b/ddstorm.py @@ -1,53 +1,94 @@ #! /usr/bin/python3 -# DDStorm -# ------- -# Copyright (c) 2015 Agnibho Mondal -# All rights reserved +''' +DDStorm is a python application for finding differential diagnosis for +a given list of symptoms. +''' +''' +Copyright (c) 2015 Agnibho Mondal +All rights reserved -# This file is part of DDStorm. +This file is part of DDStorm. -# DDStorm is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +DDStorm is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. -# DDStorm is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +DDStorm is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -# You should have received a copy of the GNU General Public License -# along with DDStorm. If not, see . +You should have received a copy of the GNU General Public License +along with DDStorm. If not, see . +''' + +import sys +import os -import sys, os from compile import Compile from conf import Conf from index import Index class DDStorm: + ''' Provides the class for finding differential diagnosis. ''' conf=False + def __init__(self, comp=False, conf=False): + ''' + Initiate the diagnosis finder. + + Parameters: + comp - Recompiles the data files if set to True + conf - Supply a Conf object + ''' if(conf): self.conf=conf else: self.conf=Conf() + self.compiler=Compile(conf) if(comp): - self.compiler=Compile(conf).compile() + self.compiler.compile() self.index=Index(conf) def dd(self, symptoms): + ''' + Find the differential diagnosis list. + + Parameter: + symptom - list of strings containing symptoms + + Return value: + List of strings containing the differential diagnosis + ''' + + # Return empty list if symptom list is empty if(not symptoms): return + + # Find DD of first symptom and discard it diff1=self._getDiff(symptoms.pop(0)) + + # Loop through the rest of the list for s in symptoms: + + # Find DD of the current item in the list diff2=self._getDiff(s) + + # List for temporary holding the DDs temp=[] + + # Make both lists the same length by appending empty strings to the end if(len(diff1)>len(diff2)): diff2+=[""]*(len(diff1)-len(diff2)) elif(len(diff2)>len(diff1)): diff1+=[""]*(len(diff2)-len(diff1)) + + # Loop over both lists for (s1, s2) in zip(diff1, diff2): + + # Add s1 to temp if s1 or any of its upstream ancestor is common to both list if((s1 not in temp) and (len(s1)>0)): if(s1 in diff2): temp.append(s1) @@ -56,6 +97,8 @@ class DDStorm: for i in us: if(i in diff2): temp.append(i) + + # Add s2 to temp if s2 or any of its upstream ancestor is common to both list if((s2 not in temp) and (len(s2)>0)): if(s2 in diff1): temp.append(s2) @@ -64,10 +107,14 @@ class DDStorm: for i in us: if(i in diff1): temp.append(i) + + # Copy temp to first list diff1=list(temp) + return diff1 def _getDiff(self, symptom): + ''' Return differential diagnosis for a single symptom ''' diff=[] symptom=symptom.lower().replace("_"," ").replace("-", " ") if(os.path.isfile(self.conf.get("module_path")+symptom+".module")): @@ -77,12 +124,26 @@ class DDStorm: return diff def symptoms(self): + ''' + Return a full list of available symptoms + + Return value: + List of string containing symptoms + ''' symp=[] for n in os.listdir(self.conf.get("module_path")): symp.append(os.path.splitext(os.path.basename(n))[0].capitalize()) return symp def main(): + ''' + Find differential diagnosis in command line mode. + Accepts symptoms as command line arguments. Prints a list of + avialable symptoms if called without any argument. + + Command line arguments: + A list of symptoms separated by space + ''' s=DDStorm() if(len(sys.argv)>1): for d in s.dd(sys.argv[1:]):