| 1 | KBAICSNA   ; CCDCCR/GPL - SNOMED CT ANALYSIS ROUTINES; 10/14/08
 | 
|---|
| 2 |  ;;0.1;CCDCCR;nopatch;noreleasedate
 | 
|---|
| 3 |  ;Copyright 2008 WorldVistA.  Licensed under the terms of the GNU
 | 
|---|
| 4 |  ;General Public License See attached copy of the License.
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  ;This program is free software; you can redistribute it and/or modify
 | 
|---|
| 7 |  ;it under the terms of the GNU General Public License as published by
 | 
|---|
| 8 |  ;the Free Software Foundation; either version 2 of the License, or
 | 
|---|
| 9 |  ;(at your option) any later version.
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ;This program is distributed in the hope that it will be useful,
 | 
|---|
| 12 |  ;but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
|---|
| 13 |  ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
|---|
| 14 |  ;GNU General Public License for more details.
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ;You should have received a copy of the GNU General Public License along
 | 
|---|
| 17 |  ;with this program; if not, write to the Free Software Foundation, Inc.,
 | 
|---|
| 18 |  ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 |  ; THESE ROUTINES ANALYZE THE POTENTIAL RETRIEVAL OF SNOMED CT CODES
 | 
|---|
| 21 |  ; FOR PATIENT DRUG ALLERGIES FOR INCLUSION IN THE CCR OR CCD
 | 
|---|
| 22 |  ; USING THE VISTA LEXICON ^LEX
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 | ANALYZE(BEGIEN,IENCNT) ; SNOMED RETRIEVAL ANALYSIS ROUTINE
 | 
|---|
| 25 |     ; BEGINS AT BEGIEN AND GOES FOR IENCNT DRUGS IN GMRD
 | 
|---|
| 26 |     ; TO RESUME AT NEXT DRUG, USE BEGIEN=""
 | 
|---|
| 27 |     ; USE RESET^KBAICSNA TO RESET TO TOP OF DRUG LIST
 | 
|---|
| 28 |     ;
 | 
|---|
| 29 |     N SNOARY,SNOTMP,SNOI,SNOIEN,RATTR
 | 
|---|
| 30 |     N CCRGLO
 | 
|---|
| 31 |     D ASETUP ; SET UP VARIABLES AND GLOBALS
 | 
|---|
| 32 |     D AINIT ; INITIALIZE ATTRIBUTE VALUE TABLE
 | 
|---|
| 33 |     I '$D(@SNOBASE@("RESUME")) S @SNOBASE@("RESUME")=$O(@GMRBASE@(1)) ;1ST TME
 | 
|---|
| 34 |     S RESUME=@SNOBASE@("RESUME") ; WHERE WE LEFT OFF LAST RUN
 | 
|---|
| 35 |     S SNOIEN=BEGIEN ; BEGIN WITH THE BEGIEN RECORD
 | 
|---|
| 36 |     I SNOIEN="" S SNOIEN=RESUME
 | 
|---|
| 37 |     I +SNOIEN=0 D  Q  ; AT THE END OF THE ALLERGY LIST
 | 
|---|
| 38 |     . W "END OF DRUG LIST, CALL RESET^KBAICSNA",!
 | 
|---|
| 39 |     F SNOI=1:1:IENCNT  D  Q:+SNOIEN=0  ; FOR IENCNT NUMBER OF PATIENTS OR END
 | 
|---|
| 40 |     . ;D CCRRPC^GPLCCR(.CCRGLO,SNOIEN,"CCR","","","") ;PROCESS THE CCR
 | 
|---|
| 41 |     . W SNOIEN,@GMRBASE@(SNOIEN,0),!
 | 
|---|
| 42 |     . N SNORTN,TTERM ; RETURN ARRAY
 | 
|---|
| 43 |     . S TTERM=$P(@GMRBASE@(SNOIEN,0),"^",1)_" ALLERGY"
 | 
|---|
| 44 |     . D TEXTRPC(.SNORTN,TTERM)
 | 
|---|
| 45 |     . I $D(SNORTN) D  ;
 | 
|---|
| 46 |     . . S TVUID=$$GET1^DIQ(120.82,SNOIEN,"VUID")
 | 
|---|
| 47 |     . . W "VUID:",TVUID,!
 | 
|---|
| 48 |     . . K @SNOBASE@("VARS",SNOIEN) ; CLEAR OUT OLD VARS
 | 
|---|
| 49 |     . . I $P(TTMP,"^",1)=1 S @SNOBASE@("VARS",SNOIEN)=TTERM_"^"_TTMP_"^"_SNORTN(0)_"^"_TVUID_"^"_SNORTN("F")
 | 
|---|
| 50 |     . . ;
 | 
|---|
| 51 |     . . ; EVALUATE THE VARIABLES AND CREATE AN ATTRIBUTE MAP
 | 
|---|
| 52 |     . . ;
 | 
|---|
| 53 |     . . S RATTR=$$SETATTR(SNOIEN) ; SET THE ATTRIBUTE STRING BASED ON THE VARS
 | 
|---|
| 54 |     . . S @SNOBASE@("ATTR",SNOIEN)=RATTR ; SAVE THE ATRIBUTES FOR THIS DRUG
 | 
|---|
| 55 |     . . ;
 | 
|---|
| 56 |     . . N CATNAME,CATTBL
 | 
|---|
| 57 |     . . S CATNAME=""
 | 
|---|
| 58 |     . . D CPUSH(.CATNAME,SNOBASE,"SNOTBL",SNOIEN,RATTR) ; ADD TO CATEGORY
 | 
|---|
| 59 |     . . ; W "CATEGORY NAME: ",CATNAME,!
 | 
|---|
| 60 |     . . ;
 | 
|---|
| 61 |     . S SNOIEN=$O(@GMRBASE@(SNOIEN)) ; NEXT RECORD
 | 
|---|
| 62 |     . S @SNOBASE@("RESUME")=SNOIEN ; WHERE WE ARE LEAVING OFF THIS RUN
 | 
|---|
| 63 |     ; D PARY^GPLXPATH(@SNOBASE@("ATTRTBL"))
 | 
|---|
| 64 |     Q
 | 
|---|
| 65 |     ;
 | 
|---|
| 66 | TEXTRPC(ORTN,ITEXT) ; CALL THE LEXICON WITH ITEXT AND RETURN RESULTS IN ORTN
 | 
|---|
| 67 |  ;
 | 
|---|
| 68 |  ;N TTMP
 | 
|---|
| 69 |  W ITEXT,!
 | 
|---|
| 70 |  S TTMP=$$TEXT^LEXTRAN(ITEXT,"","","SCT","ORTN")
 | 
|---|
| 71 |  Q
 | 
|---|
| 72 |  ;
 | 
|---|
| 73 | ASETUP ; SET UP GLOBALS AND VARS SNOBASE AND SNOTBL
 | 
|---|
| 74 |       I '$D(SNOBASE) S SNOBASE=$NA(^TMP("GPLSNO"))
 | 
|---|
| 75 |       I '$D(@SNOBASE) S @SNOBASE=""
 | 
|---|
| 76 |       I '$D(GMRBASE) S GMRBASE=$NA(^GMRD(120.82))
 | 
|---|
| 77 |       I '$D(SNOTBL) S SNOTBL=$NA(^TMP("GPLSNO","SNOTBL","TABLE")) ; ATTR TABLE
 | 
|---|
| 78 |       S ^TMP("GPLSNO","TABLES","SNOTBL")=SNOTBL ; TABLE OF TABLES
 | 
|---|
| 79 |       Q
 | 
|---|
| 80 |       ;
 | 
|---|
| 81 | AINIT ; INITIALIZE ATTRIBUTE TABLE
 | 
|---|
| 82 |       I '$D(SNOBASE) D ASETUP ; FOR COMMAND LINE CALLS
 | 
|---|
| 83 |       K @SNOTBL
 | 
|---|
| 84 |       D APUSH^GPLRIMA(SNOTBL,"CODE")
 | 
|---|
| 85 |       D APUSH^GPLRIMA(SNOTBL,"NOCODE")
 | 
|---|
| 86 |       D APUSH^GPLRIMA(SNOTBL,"MULTICODE")
 | 
|---|
| 87 |       D APUSH^GPLRIMA(SNOTBL,"SUBMULTI")
 | 
|---|
| 88 |       D APUSH^GPLRIMA(SNOTBL,"DONE")
 | 
|---|
| 89 |       Q
 | 
|---|
| 90 | APOST(PRSLT,PTBL,PVAL) ; POST AN ATTRIBUTE PVAL TO PRSLT USING PTBL
 | 
|---|
| 91 |     ; PSRLT AND PTBL ARE PASSED BY NAME. PVAL IS A STRING
 | 
|---|
| 92 |     ; PTBL IS THE NAME OF A TABLE IN @SNOBASE@("TABLES") - "SNOTBL"=ALL VALUES
 | 
|---|
| 93 |     ; PVAL WILL BE PLACED IN THE STRING PRSLT AT $P(X,U,@PTBL@(PVAL))
 | 
|---|
| 94 |     I '$D(SNOBASE) D ASETUP ; FOR COMMANDLINE PROCESSING
 | 
|---|
| 95 |     N USETBL
 | 
|---|
| 96 |     I '$D(@SNOBASE@("TABLES",PTBL)) D  Q  ; NO TABLE
 | 
|---|
| 97 |     . W "ERROR NO SUCH TABLE",!
 | 
|---|
| 98 |     S USETBL=@SNOBASE@("TABLES",PTBL)
 | 
|---|
| 99 |     S $P(@PRSLT,U,@USETBL@(PVAL))=PVAL
 | 
|---|
| 100 |     Q
 | 
|---|
| 101 | SETATTR(SDFN) ; SET ATTRIBUTES BASED ON VARS
 | 
|---|
| 102 |     N SBASE,SATTR
 | 
|---|
| 103 |     S SBASE=$NA(@SNOBASE@("VARS",SDFN))
 | 
|---|
| 104 |     D APOST("SATTR","SNOTBL","DONE")
 | 
|---|
| 105 |     I $P(TTMP,"^",1)=1 D APOST("SATTR","SNOTBL","CODE")
 | 
|---|
| 106 |     I $P(TTMP,"^",1)=-1 D APOST("SATTR","SNOTBL","NOCODE")
 | 
|---|
| 107 |     Q SATTR  ; GPL
 | 
|---|
| 108 |     I $D(@SBASE@("PROBLEMS",1)) D  ;
 | 
|---|
| 109 |     . D APOST("SATTR","SNOTBL","PROBLEMS")
 | 
|---|
| 110 |     . ; W "POSTING PROBLEMS",!
 | 
|---|
| 111 |     I $D(@SBASE@("VITALS",1)) D APOST("SATTR","SNOTBL","VITALS")
 | 
|---|
| 112 |     I $D(@SBASE@("MEDS",1)) D  ; IF THE PATIENT HAS MEDS VARIABLES
 | 
|---|
| 113 |     . D APOST("SATTR","SNOTBL","MEDS")
 | 
|---|
| 114 |     . N ZR,ZI
 | 
|---|
| 115 |     . D GETPA^GPLRIMA(.ZR,SDFN,"MEDS","MEDPRODUCTNAMECODEVALUE") ;CHECK FOR MED CODES
 | 
|---|
| 116 |     . I ZR(0)>0 D  ; VAR LOOKUP WAS GOOD, CHECK FOR NON=NULL RETURN
 | 
|---|
| 117 |     . . F ZI=1:1:ZR(0) D  ; LOOP THROUGH RETURNED VAR^VALUE PAIRS
 | 
|---|
| 118 |     . . . I $P(ZR(ZI),"^",2)'="" D APOST("SATTR","SNOTBL","MEDSCODE") ;CODES
 | 
|---|
| 119 |     . ; D PATD^KBAICSNA(2,"MEDS","MEDPRODUCTNAMECODEVALUE") CHECK FOR MED CODES
 | 
|---|
| 120 |     D APOST("SATTR","SNOTBL","NOTEXTRACTED") ; OUTPUT NOT YET PRODUCED
 | 
|---|
| 121 |     ; W "ATTRIBUTES: ",SATTR,!
 | 
|---|
| 122 |     Q SATTR
 | 
|---|
| 123 |     ;
 | 
|---|
| 124 | RESET ; KILL RESUME INDICATOR TO START OVER. ALSO KILL SNO TMP VALUES
 | 
|---|
| 125 |     K ^TMP("GPLSNO","RESUME")
 | 
|---|
| 126 |     K ^TMP("GPLSNO")
 | 
|---|
| 127 |     Q
 | 
|---|
| 128 |     ;
 | 
|---|
| 129 | CLIST ; LIST THE CATEGORIES
 | 
|---|
| 130 |     ;
 | 
|---|
| 131 |     I '$D(SNOBASE) D ASETUP ; FOR COMMAND LINE CALLS
 | 
|---|
| 132 |     N CLBASE,CLNUM,ZI,CLIDX
 | 
|---|
| 133 |     S CLBASE=$NA(@SNOBASE@("SNOTBL","CATS"))
 | 
|---|
| 134 |     S CLNUM=@CLBASE@(0)
 | 
|---|
| 135 |     F ZI=1:1:CLNUM D  ; LOOP THROUGH THE CATEGORIES
 | 
|---|
| 136 |     . S CLIDX=@CLBASE@(ZI)
 | 
|---|
| 137 |     . W "(",$P(@CLBASE@(CLIDX),"^",1)
 | 
|---|
| 138 |     . W ":",$P(@CLBASE@(CLIDX),"^",2),") "
 | 
|---|
| 139 |     . W CLIDX,!
 | 
|---|
| 140 |     ; D PARY^GPLXPATH(CLBASE)
 | 
|---|
| 141 |     Q
 | 
|---|
| 142 |     ;
 | 
|---|
| 143 | CPUSH(CATRTN,CBASE,CTBL,CDFN,CATTR) ; ADD PATIENTS TO CATEGORIES
 | 
|---|
| 144 |     ; AND PASS BACK THE NAME OF THE CATEGORY TO WHICH THE PATIENT
 | 
|---|
| 145 |     ; WAS ADDED IN CATRTN, WHICH IS PASSED BY REFERENCE
 | 
|---|
| 146 |     ; CBASE IS WHERE TO PUT THE CATEGORIES PASSED BY NAME
 | 
|---|
| 147 |     ; CTBL IS THE NAME OF THE TABLE USED TO CREATE THE ATTRIBUTES,
 | 
|---|
| 148 |     ; PASSED BY NAME AND USED TO CREATE CATEGORY NAMES IE "@CTBL_X"
 | 
|---|
| 149 |     ; WHERE X IS THE CATEGORY NUMBER. CTBL(0) IS THE NUMBER OF CATEGORIES
 | 
|---|
| 150 |     ; CATBL(X)=CATTR STORES THE ATTRIBUTE IN THE CATEGORY
 | 
|---|
| 151 |     ; CDFN IS THE PATIENT DFN, CATTR IS THE ATTRIBUTE STRING
 | 
|---|
| 152 |     ; THE LIST OF PATIENTS IN A CATEGORY IS STORED INDEXED BY CATEGORY
 | 
|---|
| 153 |     ; NUMBER IE CTBL_X(CDFN)=""
 | 
|---|
| 154 |     ;
 | 
|---|
| 155 |     ; N CCTBL,CENTRY,CNUM,CCOUNT,CPATLIST
 | 
|---|
| 156 |     S CCTBL=$NA(@CBASE@(CTBL,"CATS"))
 | 
|---|
| 157 |     ; W "CBASE: ",CCTBL,!
 | 
|---|
| 158 |     ;
 | 
|---|
| 159 |     I '$D(@CCTBL@(CATTR)) D  ; FIRST PATIENT IN THIS CATEGORY
 | 
|---|
| 160 |     . D PUSH^GPLXPATH(CCTBL,CATTR) ; ADD THE CATEGORY TO THE ARRAY
 | 
|---|
| 161 |     . S CNUM=@CCTBL@(0) ; ARRAY ENTRY NUMBER FOR THIS CATEGORY
 | 
|---|
| 162 |     . S CENTRY=CTBL_"_"_CNUM_U_0 ; TABLE ENTRY DEFAULT
 | 
|---|
| 163 |     . S @CCTBL@(CATTR)=CENTRY ; DEFAULT NON INCREMENTED TABLE ENTRY
 | 
|---|
| 164 |     . ; NOTE THAT P1 IS THE CATEGORY NAME MADE UP OF THE TABLE NAME
 | 
|---|
| 165 |     . ; AND CATGORY ARRAY NUMBER. P2 IS THE COUNT WHICH IS INITIALLY 0
 | 
|---|
| 166 |     ;
 | 
|---|
| 167 |     S CCOUNT=$P(@CCTBL@(CATTR),U,2) ; COUNT OF PATIENTS IN THIS CATEGORY
 | 
|---|
| 168 |     S CCOUNT=CCOUNT+1 ; INCREMENT THE COUNT
 | 
|---|
| 169 |     S $P(@CCTBL@(CATTR),U,2)=CCOUNT ; PUT IT BACK
 | 
|---|
| 170 |     ;
 | 
|---|
| 171 |     S CATRTN=$P(@CCTBL@(CATTR),U,1) ; THE CATEGORY NAME WHICH IS RETURNED
 | 
|---|
| 172 |     ;
 | 
|---|
| 173 |     S CPATLIST=$NA(@CBASE@(CTBL,"IENS",CATRTN)) ; BASE OF PAT LIST FOR THIS CAT
 | 
|---|
| 174 |     ; W "IENS BASE: ",CPATLIST,!
 | 
|---|
| 175 |     S @CPATLIST@(CDFN)="" ; ADD THIS PATIENT TO THE CAT PAT LIST
 | 
|---|
| 176 |     ;
 | 
|---|
| 177 |     Q
 | 
|---|
| 178 |     ;
 | 
|---|
| 179 | REUSE ; GET SAVED VALUES FROM ^TMP("GPLSAV") AND PUT THEM IN A DATABASE
 | 
|---|
| 180 |  ;
 | 
|---|
| 181 |  D ASETUP
 | 
|---|
| 182 |  D AINIT
 | 
|---|
| 183 |  N SNOI,SNOJ,SNOK,SNOSNO,SNOSEC,SNOIEN,SNOOLD,SNOSRCH
 | 
|---|
| 184 |  D DO^KBAICX1 ; INITIALIZE GPLSAV VARIABLES
 | 
|---|
| 185 |  ;S SAVBASE=$NA(^TMP("GPLSAV","VARS"))
 | 
|---|
| 186 |  S SAVBASE=$NA(@SNOBASE@("VARS"))
 | 
|---|
| 187 |  S CSVARY=$NA(^TMP("GPLSNO","CSV"))
 | 
|---|
| 188 |  K @CSVARY
 | 
|---|
| 189 |  D PUSH^GPLXPATH(CSVARY,"VUID|VUIDText|MediationCode|MediationText") ; header for CSV file
 | 
|---|
| 190 |  S SNOI=""
 | 
|---|
| 191 |  F  D  Q:$O(@SAVBASE@(SNOI))="" ;THE WHOLE LIST
 | 
|---|
| 192 |  . S SNOI=$O(@SAVBASE@(SNOI))
 | 
|---|
| 193 |  . S SNOJ=@SAVBASE@(SNOI)
 | 
|---|
| 194 |  . S SNOK=$P($P(SNOJ,"^",1)," ALLERGY",1)
 | 
|---|
| 195 |  . S SNOSRCH=$P(SNOJ,"^",1) ;SEARCH TERM USED TO OBTAIN SNOMED CODE
 | 
|---|
| 196 |  . S SNOIEN=$P(SNOJ,"^",3) ; IEN OF ELEMENT IN LEXICON
 | 
|---|
| 197 |  . S SNOSNO=$P(SNOJ,"^",4) ; SNOMED CODE
 | 
|---|
| 198 |  . S SNOSEC=$P(SNOJ,"^",5) ; SECTION OF SNOMED FOR THIS CODE
 | 
|---|
| 199 |  . S SNOOLD=$P(SNOJ,"^",7) ; OLD NUMBER FOR THIS CODE
 | 
|---|
| 200 |  . S SNOVUID=$P(SNOJ,"^",9) ; VUID FOR THIS RECORD
 | 
|---|
| 201 |  . S SNOTXT=$P(SNOJ,"^",10) ; NOMED TEXT FOR CODE
 | 
|---|
| 202 |  . D PUSH^GPLXPATH(CSVARY,SNOVUID_"|"_$P(SNOSRCH," ALLERGY",1)_"|"_SNOSNO_"|"_SNOTXT)
 | 
|---|
| 203 |  . W "SEARCH:",SNOSRCH," IEN:",SNOIEN," CODE:",SNOSNO," SEC:",SNOSEC," OLD:",SNOOLD,!
 | 
|---|
| 204 |  . W SNOK,!
 | 
|---|
| 205 |  . W SNOJ,!
 | 
|---|
| 206 |  S OARY=$NA(@CSVARY@(1)) ; SETUP FOR OUTPUT ROUTINE
 | 
|---|
| 207 |  D PARY^GPLXPATH(CSVARY)
 | 
|---|
| 208 |  S OFILE="GMR_ALLERGY_MAPPING_TABLE.csv"
 | 
|---|
| 209 |  S ODIR="/home/vademo2/"
 | 
|---|
| 210 |  S ZY=$$OUTPUT^GPLXPATH(OARY,OFILE,ODIR)
 | 
|---|
| 211 |  I ZY W "WROTE ",OFILE," to ",ODIR,!
 | 
|---|
| 212 |  Q
 | 
|---|
| 213 |  ;
 | 
|---|