source: ccr/branches/ohum/p/C0CSNOA.m@ 1485

Last change on this file since 1485 was 1433, checked in by Sam Habiel, 13 years ago

Update based on OHUM's latest routines

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