[286] | 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)
|
---|
[288] | 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 | . . ;
|
---|
[286] | 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
|
---|
[288] | 185 | ;S SAVBASE=$NA(^TMP("GPLSAV","VARS"))
|
---|
| 186 | S SAVBASE=$NA(@SNOBASE@("VARS"))
|
---|
[286] | 187 | S CSVARY=$NA(^TMP("GPLSNO","CSV"))
|
---|
| 188 | K @CSVARY
|
---|
[288] | 189 | D PUSH^GPLXPATH(CSVARY,"VUID|VUIDText|MediationCode|MediationText") ; header for CSV file
|
---|
[286] | 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
|
---|
[288] | 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)
|
---|
[286] | 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"
|
---|
[288] | 209 | S ODIR="/home/vademo2/"
|
---|
[286] | 210 | S ZY=$$OUTPUT^GPLXPATH(OARY,OFILE,ODIR)
|
---|
| 211 | I ZY W "WROTE ",OFILE," to ",ODIR,!
|
---|
| 212 | Q
|
---|
| 213 | ;
|
---|