- ATXAPI ;GDIT/HS/ALA-Taxonomy APIs ; 13 Feb 2012 12:02 PM
- ;;5.1;TAXONOMY;**11,13**;FEB 4, 1997;Build 13
- ;
- BLDSV(FILEREF,VAL,TARGET) ;PEP - Add a single value to a target
- ;Description
- ; Use this if no taxonomy was given but an individual code
- ;Input
- ; FILEREF - File where the code resides
- ; VAL - Value
- ; TARGET - reference where entry is to be placed
- ;
- ; The LOINC x-ref in LAB does not use the check digit (piece 2).
- NEW INDEX,VAL,FILE,IEN,END,NAME
- I FILEREF=95.3 S FILE="^LAB(60)",INDEX="AF",VAL=$P(VAL,"-")
- I FILEREF=80 S FILE="^ICD9",INDEX="BA"
- I FILEREF=80.1 S FILE="^ICD0",INDEX="BA"
- I FILEREF=81 S FILE="^ICPT",INDEX="BA"
- S END=VAL
- ;
- ; Backup one entry so loop can find all the entries in the range.
- S VAL=$O(@FILE@(INDEX,VAL),-1)
- F S VAL=$O(@FILE@(INDEX,VAL)) Q:VAL="" Q:$$CHECK(VAL,END) D
- .S IEN=""
- .F S IEN=$O(@FILE@(INDEX,VAL,IEN)) Q:IEN="" D
- ..S NAME=$P($G(@FILE@(IEN,0)),U,1)
- ..S @TARGET@(IEN)=NAME
- ;
- K FILEREF,FILE,INDEX,VAL,END,NAME,IEN,TARGET
- Q
- ;
- CHECK(V,E) ;EP
- N Z
- I V=E Q 0
- S Z(V)=""
- S Z(E)=""
- I $O(Z(""))=E Q 1
- Q 0
- ;
- BLDTAX(TAX,TARGET,TAXIEN,TAXTYP) ; PEP - Expand a taxonomy into a target
- ;
- ; Takes a taxonomy name and builds an array that can then be used
- ; to scan various V-File cross-references to see which records
- ; match an entry in the Taxonomy.
- ;
- ; Currently supported Taxonomies are as follows:
- ; (where FILE is field #.15 in the TAXONOMY file #9002226)
- ; ICD9 Diagnoses via ICD9 codes (^ICD9 - FILE 80)
- ; ICD9 Procedures via ICD9 codes (^ICD0 - FILE 80.1)
- ; CPT Procedures via CPT codes (^ICPT - FILE 81)
- ; Medications via NDC codes (^PSDRUG - FILE 2)
- ; Medications via MED IEN (^PSDRUG - FILE 50)
- ; Laboratory tests via LOINC codes (^LAB(60) - FILE 95.3)
- ; Patient Education Topics by name (^AUTTEDT - FILE 9999999.09)
- ; NOTE: Use BLDTAX1 below if providing a list of partial Patient Education Topic Codes to match.
- ; Immunizations via HL7/CVX codes (^AUTTIMM - FILE 9999999.14)
- ; Health Factors by Name (^AUTTHF - FILE 9999999.64)
- ; (where FILE is field #.09 in the LAB TAXONOMY file #9002228)
- ; Laboratory tests via LAB IEN (^LAB(60) - FILE 60)
- ; VA Drug Class (^PS(50.605 - FILE 50.605)
- ; Community (^AUTTCOM - FILE 9999999.05)
- ; Clinics (^DIC(40.7 - FILE 40.7)
- ; Dental ADA codes (^AUTTDA - FILE 9999999.31)
- ;
- ; Input:
- ; TAX = Name of Taxonomy from ATXAX or ATXLAB file.
- ; (required)
- ; TARGET = Closed array reference where the output will be stored.
- ; (required)
- ; This can be a local variable or global reference.
- ; (Ex. TARGET="ARRAY" or TARGET="^TMP($J)"
- ; TAXIEN = IEN of Taxonomy from ATXAX or ATXLAB file.
- ; TAXTYP = 'L' for lab, assumes ATXAX
- ;
- ; Output:
- ; An array in the local or global TARGET of the form:
- ; @TARGET@(IEN)=NAME (.01 field)
- ;
- ; NOTE: Kill the output array before calling the function unless
- ; you intend to group several Taxonomies of the same type.
- ;
- N FILEREF,TAXREF,ENTRY,VALUE,VAL,END,FILE,INDEX,IEN,NAME,SYS,SYSN,SYSNM
- N QFL,ATXNCAN
- ;
- I $G(TARGET)=""!($G(TAX)="") Q
- S TAXTYP=$G(TAXTYP,"")
- ;
- I $G(TAXIEN)'="" D
- . I $G(TAXTYP)="L" S TAXREF="^ATXLAB" Q
- . S TAXREF="^ATXAX"
- . I $P($G(@TAXREF@(TAXIEN,0)),U,1)'=TAX S TAXTYP="L",TAXREF="^ATXLAB"
- ;
- I $G(TAXIEN)="" D
- . I $G(TAXTYP)="L" S TAXIEN=$O(^ATXLAB("B",TAX,0)),TAXREF="^ATXLAB" Q
- . S TAXIEN=$O(^ATXAX("B",TAX,0)),TAXREF="^ATXAX"
- ;
- I TAXIEN="" Q
- ;
- I TAXREF="^ATXAX" S FILEREF=$$GET1^DIQ(9002226,TAXIEN,.15,"I"),ATXNCAN=$$GET1^DIQ(9002226,TAXIEN,.13,"I")
- I TAXREF="^ATXLAB" S FILEREF=$$GET1^DIQ(9002228,TAXIEN,.09,"I")
- ; The following file references from Taxonomy are supported:
- ;I $F(",40.7,80,80.1,81,50.67,50,95.3,9999999.09,9999999.14,9999999.64,60,50.605,9999999.05,",","_FILEREF_",")=0 Q
- I '$D(^ATXTYPE("C",FILEREF)) Q
- S ENTRY=0
- F S ENTRY=$O(@TAXREF@(TAXIEN,21,ENTRY)) Q:'ENTRY D
- .S VALUE=@TAXREF@(TAXIEN,21,ENTRY,0)
- .S VAL=$P(VALUE,U,1),END=$P(VALUE,U,2),SYS=$P(VALUE,U,3)
- .I FILEREF=80 D
- ..S SYSN=$S(SYS'="":SYS,1:1)
- ..S SYS=$S(SYS'="":$P(^ICDS(SYS,0),U,2),1:$P(^ICDS(1,0),U,2))
- ..S SYSNM=$P(^ICDS(SYSN,0),U,1)
- .I FILEREF=80.1 D
- ..S SYSN=$S(SYS'="":SYS,1:2)
- ..S SYS=$S(SYS'="":$P(^ICDS(SYS,0),U,2),1:$P(^ICDS(2,0),U,2))
- ..S SYSNM=$P(^ICDS(SYSN,0),U,1)
- .I +$G(ATXNCAN)=0 S QFL=1 D Q:QFL
- ..I FILEREF'=9999999.06,FILEREF'=9999999.09 S QFL=0 Q
- ..;I FILEREF=9999999.05 S QFL=0 Q
- ..;I FILEREF=9999999.64 S QFL=0 Q
- ..S FILE=$$ROOT^DILFD(FILEREF,"",1)
- ..I $E(VAL,$L(VAL))=" " S VAL=$E(VAL,1,$L(VAL)-1)
- ..I $E(END,$L(END))=" " S END=$E(END,1,$L(END)-1)
- ..I FILEREF=9999999.06 S NAME=$P($G(^DIC(4,VAL,0)),U,1),@TARGET@(VAL)=NAME Q
- ..I FILEREF=9999999.09,VAL'?.N S QFL=0 Q
- ..S NAME=$P($G(@FILE@(VAL,0)),U,1),@TARGET@(VAL)=NAME
- .D SRCH(FILEREF)
- Q
- ;
- BLDEDU(TAX,TARGET) ;PEP - EDUCATION
- ;
- ; Takes a list of partial Patient Education topic names and
- ; builds an array that can then be used to scan a V-File
- ; cross-reference to see which records match an entry in the
- ; list.
- ;
- ; This tag only supports Patient Education:
- ; (where FILE is field #.15 in the TAXONOMY file #9002226)
- ; Patient Education Topic Codes (^AUTTEDT - FILE 9999999.09)
- ;
- ; Input:
- ; TAX = PATIENT EDUCATION TOPIC CODE LIST to search for
- ; (required)
- ;
- ; Example: "CD-,-CD,AOD-,-AOD"
- ; Example: "*BGP HIV/AIDS DXS"
- ;
- ; Returns items where the MNEMONIC field for the Patient
- ; Education entry contains one of the listed values.
- ;
- ; Second example shows an ICD taxonomy name.
- ; If used, will search for any Patient Education entry
- ; containing one of the values in that Taxonomy.
- ;
- ; TARGET : Closed array reference where the output will be stored.
- ; This can be a local variable or global reference.
- ; (Ex. TARGET="ARRAY" or TARGET="^TMP($J)"
- ;
- ; Output:
- ; An array in the local or global TARGET of the form:
- ; @TARGET@(IEN)=NAME (.01 field)
- ;
- ; NOTE: Kill the output array before calling the function unless
- ; you intend to group several Taxonomies of the same type.
- ;
- N VAL,IEN,NAME,MNEMONIC,TAX1,I,ICDIEN,FLG
- F I=1:1:$L(TAX,",") S TAX1=$P(TAX,",",I) I $E(TAX1)="*" D BLDTAX($E(TAX1,2,$L(TAX1)),"ICDIEN")
- S VAL=""
- F S VAL=$O(^AUTTEDT("B",VAL)) Q:VAL="" D
- .S IEN=""
- .F S IEN=$O(^AUTTEDT("B",VAL,IEN)) Q:IEN="" D
- ..S NAME=$$GET1^DIQ(9999999.09,IEN,.01,"I"),MNEMONIC=$$GET1^DIQ(9999999.09,IEN,1,"I"),FLG=0
- ..F I=1:1:$L(TAX,",") S TAX1=$P(TAX,",",I) I $E(TAX1)'="*",MNEMONIC[TAX1 S @TARGET@(IEN)=NAME_U_MNEMONIC,FLG=1 Q
- ..I FLG=1 Q
- ..S I=""
- ..;If an ICD is used as the MNEMONIC it will be formatted as "ICD-abbreviation".
- ..;For example, if the ICD is "042." and the patient education is 'alcohol or drugs' then the MNEMONIC would be "042.-AOD".
- ..F S I=$O(ICDIEN(I)) Q:I="" S TAX1=ICDIEN(I)_"-" I MNEMONIC[TAX1 S @TARGET@(IEN)=NAME_U_MNEMONIC,FLG=1 Q
- ..I FLG=1 Q
- ..Q
- .Q
- Q
- ;
- ICD(TAXDX,TAX,TAXTY) ;PEP - Checks to see if ICD code is found in certain taxonomy
- ; Input:
- ; TAXDX=dx ifn
- ; TAX=taxonomy
- ; TAXTY=9 for dx or 0 for proc 1 for cpt
- NEW TAXICD,TAXBEG,TAXEND,TAXFLG,TAXIEN,TAXREF,TAXARR
- I TAX?.N S TAXIEN=TAX
- I TAX'?.N D
- . S TAXIEN=$O(^ATXAX("B",TAX,0)),TAXREF="^ATXAX"
- S TAXFLG=0 I '$D(TAXDX)!'$D(TAXIEN)!'$D(TAXTY) Q TAXFLG
- I (TAXDX="")!(TAXIEN="") Q TAXFLG
- ;I TAXTY=9 S SYS=$$CSI^ICDEX(80,TAXDX) S:SYS="" SYS=1
- ;I TAXTY=0 S SYS=$$CSI^ICDEX(80.1,TAXDX) S:SYS="" SYS=2
- ;S TAXICD=$S(TAXTY=1:$P($$CPT^ICPTCOD(TAXDX),U,2),1:$P($$ICDDX^ICDEX(SYS,TAXDX),U,2))
- ;IHS/CMI/LAB GDIT/ARLIS - MODIFIED TO USE AC IF IT EXISTS
- S TAXARR=$NA(^ATXAX(TAXIEN,21,"AC"))
- I '$D(^ATXAX(TAXIEN,21,"AC")) D BLDTAX($P(^ATXAX(TAXIEN,0),U),.TAXARR,TAXIEN)
- I $D(^ATXAX(TAXIEN,21,"AC",TAXDX)) Q 1
- Q TAXFLG
- ;
- SRCH(FILEREF) ; Search for values
- ; LAB entries use the IEN and only specify one value.
- I FILEREF=60 D Q
- .S NAME=$P($G(^LAB(60,VAL,0)),U,1),@TARGET@(VAL)=NAME
- ; MED entries use the IEN and only specify one value.
- I FILEREF=50.605 D Q
- .NEW X,NVAL
- .S NVAL=$O(^PS(50.605,"B",VAL,"")) Q:NVAL=""
- .S X="" F S X=$O(^PSDRUG("VAC",NVAL,X)) Q:X="" D
- ..S NAME=$P($G(^PSDRUG(X,0)),U,1),@TARGET@(X)=NAME
- I FILEREF=50 D Q
- .S NAME=$P($G(^PSDRUG(VAL,0)),U,1),@TARGET@(VAL)=NAME
- I FILEREF=40.7 D Q
- .S NAME=$P($G(^DIC(40.7,VAL,0)),U,1),@TARGET@(VAL)=NAME
- ; Otherwise, treat all items as ranges (even if there is only one entry).
- I END="" S END=VAL
- D
- .I FILEREF=95.3 D Q
- ..; The LOINC x-ref in LAB does not use the check digit (piece 2).
- ..S VAL=$P(VAL,"-"),END=$P(END,"-")
- ..S FILE="^LAB(60)",INDEX="AF"
- .I FILEREF=50.67 S FILE="^PSDRUG",INDEX="D" Q
- .I FILEREF=9999999.05 S FILE="^AUTTCOM",INDEX="B" Q
- .I FILEREF=9999999.09 S FILE="^AUTTEDT",INDEX="B" Q
- .I FILEREF=9999999.14 S FILE="^AUTTIMM",INDEX="C" Q
- .I FILEREF=9999999.64 S FILE="^AUTTHF",INDEX="B" Q
- .I FILEREF=9999999.31 S FILE="^AUTTADA",INDEX="B" Q
- .; CPT, ICD9, and ICD0 require a SPACE be added to the code.
- .; Some Taxonomy entries already have the space included.
- .S:$E(VAL,$L(VAL))'=" " VAL=VAL_" "
- .S:$E(END,$L(END))'=" " END=END_" "
- .I FILEREF=80 S FILE="^ICD9",INDEX="BA" Q
- .I FILEREF=80.1 S FILE="^ICD0",INDEX="BA" Q
- .I FILEREF=81 S FILE="^ICPT",INDEX="BA" Q
- ; Backup one entry so loop can find all the entries in the range.
- S VAL=$O(@FILE@(INDEX,VAL),-1)
- F S VAL=$O(@FILE@(INDEX,VAL)) Q:VAL="" Q:$$CHECK(VAL,END) D
- .S IEN=""
- .F S IEN=$O(@FILE@(INDEX,VAL,IEN)) Q:IEN="" D
- ..S NAME=$P($G(@FILE@(IEN,0)),U,1)
- ..;Does coding system match
- ..I $G(SYSN),SYSN'=$P($G(@FILE@(IEN,1)),U,1) Q
- ..I $G(SYSN) S SYS=$P(^ICDS(SYSN,0),U,2),SYSNM=$P(^ICDS(SYSN,0),U,1)
- ..I $G(ORDER)'="CODE" S @TARGET@(IEN)=NAME_U_$G(SYSN)_U_$G(SYS)_U_$G(SYSNM) Q
- ..I $G(ORDER)="CODE" S @TARGET@(NAME_" ")=IEN_U_$G(SYSN)_U_$G(SYS)_U_$G(SYSNM)_U_NAME
- Q
- ;
- LST(SYSN,FILEREF,CODLS,ORDER,TARGET) ;PEP - LIST
- ; Input
- ; SYSN - System IEN from 80.4 (1, 2, 30 or 31)
- ; FILEREF - File reference
- ; CODLS - List of codes, can be range 250.00-250.99 or 250*
- ; ORDER - Format to get data back (blank returns in IEN order, "CODE" returns in CODE order)
- ; TARGET - Target reference
- ;
- NEW VAL,END,LG,IEN,SYS,NAME,SYSNM,INDEX
- S SYSN=$G(SYSN)
- I $G(FILEREF)="" S FILEREF=$P(^ICDS(SYSN,0),U,3)
- I CODLS["-" S VAL=$P(CODLS,"-",1),END=$P(CODLS,"-",2) D SRCH(FILEREF) Q
- I CODLS["*" D
- .S VAL=$P(CODLS,"*",1),END=VAL,LG=$L(END)
- .; CPT, ICD9, and ICD0 require a SPACE be added to the code.
- .; Some Taxonomy entries already have the space included.
- .S:$E(VAL,$L(VAL))'=" " VAL=VAL_" "
- .I FILEREF=80 S FILE="^ICD9",INDEX="BA"
- .I FILEREF=80.1 S FILE="^ICD0",INDEX="BA"
- .I FILEREF=81 S FILE="^ICPT",INDEX="BA"
- .;
- .F S VAL=$O(@FILE@(INDEX,VAL)) Q:VAL=""!($E(VAL,1,LG)'=END) D
- ..S IEN=""
- ..F S IEN=$O(@FILE@(INDEX,VAL,IEN)) Q:IEN="" D
- ...S NAME=$P($G(@FILE@(IEN,0)),U,1)
- ...;Does coding system match
- ...I $G(SYSN),SYSN'=$P($G(@FILE@(IEN,1)),U,1) Q
- ...I $G(SYSN) S SYS=$P(^ICDS(SYSN,0),U,2),SYSNM=$P(^ICDS(SYSN,0),U,1)
- ...I $G(ORDER)'="CODE" S @TARGET@(IEN)=NAME_U_$G(SYSN)_U_$G(SYS)_U_$G(SYSNM) Q
- ...I $G(ORDER)="CODE" S @TARGET@(NAME_" ")=IEN_U_$G(SYSN)_U_$G(SYS)_U_$G(SYSNM)_U_NAME
- Q
- ATXAPI ;GDIT/HS/ALA-Taxonomy APIs ; 13 Feb 2012 12:02 PM
- +1 ;;5.1;TAXONOMY;**11,13**;FEB 4, 1997;Build 13
- +2 ;
- BLDSV(FILEREF,VAL,TARGET) ;PEP - Add a single value to a target
- +1 ;Description
- +2 ; Use this if no taxonomy was given but an individual code
- +3 ;Input
- +4 ; FILEREF - File where the code resides
- +5 ; VAL - Value
- +6 ; TARGET - reference where entry is to be placed
- +7 ;
- +8 ; The LOINC x-ref in LAB does not use the check digit (piece 2).
- +9 NEW INDEX,VAL,FILE,IEN,END,NAME
- +10 IF FILEREF=95.3
- SET FILE="^LAB(60)"
- SET INDEX="AF"
- SET VAL=$PIECE(VAL,"-")
- +11 IF FILEREF=80
- SET FILE="^ICD9"
- SET INDEX="BA"
- +12 IF FILEREF=80.1
- SET FILE="^ICD0"
- SET INDEX="BA"
- +13 IF FILEREF=81
- SET FILE="^ICPT"
- SET INDEX="BA"
- +14 SET END=VAL
- +15 ;
- +16 ; Backup one entry so loop can find all the entries in the range.
- +17 SET VAL=$ORDER(@FILE@(INDEX,VAL),-1)
- +18 FOR
- SET VAL=$ORDER(@FILE@(INDEX,VAL))
- IF VAL=""
- QUIT
- IF $$CHECK(VAL,END)
- QUIT
- Begin DoDot:1
- +19 SET IEN=""
- +20 FOR
- SET IEN=$ORDER(@FILE@(INDEX,VAL,IEN))
- IF IEN=""
- QUIT
- Begin DoDot:2
- +21 SET NAME=$PIECE($GET(@FILE@(IEN,0)),U,1)
- +22 SET @TARGET@(IEN)=NAME
- End DoDot:2
- End DoDot:1
- +23 ;
- +24 KILL FILEREF,FILE,INDEX,VAL,END,NAME,IEN,TARGET
- +25 QUIT
- +26 ;
- CHECK(V,E) ;EP
- +1 NEW Z
- +2 IF V=E
- QUIT 0
- +3 SET Z(V)=""
- +4 SET Z(E)=""
- +5 IF $ORDER(Z(""))=E
- QUIT 1
- +6 QUIT 0
- +7 ;
- BLDTAX(TAX,TARGET,TAXIEN,TAXTYP) ; PEP - Expand a taxonomy into a target
- +1 ;
- +2 ; Takes a taxonomy name and builds an array that can then be used
- +3 ; to scan various V-File cross-references to see which records
- +4 ; match an entry in the Taxonomy.
- +5 ;
- +6 ; Currently supported Taxonomies are as follows:
- +7 ; (where FILE is field #.15 in the TAXONOMY file #9002226)
- +8 ; ICD9 Diagnoses via ICD9 codes (^ICD9 - FILE 80)
- +9 ; ICD9 Procedures via ICD9 codes (^ICD0 - FILE 80.1)
- +10 ; CPT Procedures via CPT codes (^ICPT - FILE 81)
- +11 ; Medications via NDC codes (^PSDRUG - FILE 2)
- +12 ; Medications via MED IEN (^PSDRUG - FILE 50)
- +13 ; Laboratory tests via LOINC codes (^LAB(60) - FILE 95.3)
- +14 ; Patient Education Topics by name (^AUTTEDT - FILE 9999999.09)
- +15 ; NOTE: Use BLDTAX1 below if providing a list of partial Patient Education Topic Codes to match.
- +16 ; Immunizations via HL7/CVX codes (^AUTTIMM - FILE 9999999.14)
- +17 ; Health Factors by Name (^AUTTHF - FILE 9999999.64)
- +18 ; (where FILE is field #.09 in the LAB TAXONOMY file #9002228)
- +19 ; Laboratory tests via LAB IEN (^LAB(60) - FILE 60)
- +20 ; VA Drug Class (^PS(50.605 - FILE 50.605)
- +21 ; Community (^AUTTCOM - FILE 9999999.05)
- +22 ; Clinics (^DIC(40.7 - FILE 40.7)
- +23 ; Dental ADA codes (^AUTTDA - FILE 9999999.31)
- +24 ;
- +25 ; Input:
- +26 ; TAX = Name of Taxonomy from ATXAX or ATXLAB file.
- +27 ; (required)
- +28 ; TARGET = Closed array reference where the output will be stored.
- +29 ; (required)
- +30 ; This can be a local variable or global reference.
- +31 ; (Ex. TARGET="ARRAY" or TARGET="^TMP($J)"
- +32 ; TAXIEN = IEN of Taxonomy from ATXAX or ATXLAB file.
- +33 ; TAXTYP = 'L' for lab, assumes ATXAX
- +34 ;
- +35 ; Output:
- +36 ; An array in the local or global TARGET of the form:
- +37 ; @TARGET@(IEN)=NAME (.01 field)
- +38 ;
- +39 ; NOTE: Kill the output array before calling the function unless
- +40 ; you intend to group several Taxonomies of the same type.
- +41 ;
- +42 NEW FILEREF,TAXREF,ENTRY,VALUE,VAL,END,FILE,INDEX,IEN,NAME,SYS,SYSN,SYSNM
- +43 NEW QFL,ATXNCAN
- +44 ;
- +45 IF $GET(TARGET)=""!($GET(TAX)="")
- QUIT
- +46 SET TAXTYP=$GET(TAXTYP,"")
- +47 ;
- +48 IF $GET(TAXIEN)'=""
- Begin DoDot:1
- +49 IF $GET(TAXTYP)="L"
- SET TAXREF="^ATXLAB"
- QUIT
- +50 SET TAXREF="^ATXAX"
- +51 IF $PIECE($GET(@TAXREF@(TAXIEN,0)),U,1)'=TAX
- SET TAXTYP="L"
- SET TAXREF="^ATXLAB"
- End DoDot:1
- +52 ;
- +53 IF $GET(TAXIEN)=""
- Begin DoDot:1
- +54 IF $GET(TAXTYP)="L"
- SET TAXIEN=$ORDER(^ATXLAB("B",TAX,0))
- SET TAXREF="^ATXLAB"
- QUIT
- +55 SET TAXIEN=$ORDER(^ATXAX("B",TAX,0))
- SET TAXREF="^ATXAX"
- End DoDot:1
- +56 ;
- +57 IF TAXIEN=""
- QUIT
- +58 ;
- +59 IF TAXREF="^ATXAX"
- SET FILEREF=$$GET1^DIQ(9002226,TAXIEN,.15,"I")
- SET ATXNCAN=$$GET1^DIQ(9002226,TAXIEN,.13,"I")
- +60 IF TAXREF="^ATXLAB"
- SET FILEREF=$$GET1^DIQ(9002228,TAXIEN,.09,"I")
- +61 ; The following file references from Taxonomy are supported:
- +62 ;I $F(",40.7,80,80.1,81,50.67,50,95.3,9999999.09,9999999.14,9999999.64,60,50.605,9999999.05,",","_FILEREF_",")=0 Q
- +63 IF '$DATA(^ATXTYPE("C",FILEREF))
- QUIT
- +64 SET ENTRY=0
- +65 FOR
- SET ENTRY=$ORDER(@TAXREF@(TAXIEN,21,ENTRY))
- IF 'ENTRY
- QUIT
- Begin DoDot:1
- +66 SET VALUE=@TAXREF@(TAXIEN,21,ENTRY,0)
- +67 SET VAL=$PIECE(VALUE,U,1)
- SET END=$PIECE(VALUE,U,2)
- SET SYS=$PIECE(VALUE,U,3)
- +68 IF FILEREF=80
- Begin DoDot:2
- +69 SET SYSN=$SELECT(SYS'="":SYS,1:1)
- +70 SET SYS=$SELECT(SYS'="":$PIECE(^ICDS(SYS,0),U,2),1:$PIECE(^ICDS(1,0),U,2))
- +71 SET SYSNM=$PIECE(^ICDS(SYSN,0),U,1)
- End DoDot:2
- +72 IF FILEREF=80.1
- Begin DoDot:2
- +73 SET SYSN=$SELECT(SYS'="":SYS,1:2)
- +74 SET SYS=$SELECT(SYS'="":$PIECE(^ICDS(SYS,0),U,2),1:$PIECE(^ICDS(2,0),U,2))
- +75 SET SYSNM=$PIECE(^ICDS(SYSN,0),U,1)
- End DoDot:2
- +76 IF +$GET(ATXNCAN)=0
- SET QFL=1
- Begin DoDot:2
- +77 IF FILEREF'=9999999.06
- IF FILEREF'=9999999.09
- SET QFL=0
- QUIT
- +78 ;I FILEREF=9999999.05 S QFL=0 Q
- +79 ;I FILEREF=9999999.64 S QFL=0 Q
- +80 SET FILE=$$ROOT^DILFD(FILEREF,"",1)
- +81 IF $EXTRACT(VAL,$LENGTH(VAL))=" "
- SET VAL=$EXTRACT(VAL,1,$LENGTH(VAL)-1)
- +82 IF $EXTRACT(END,$LENGTH(END))=" "
- SET END=$EXTRACT(END,1,$LENGTH(END)-1)
- +83 IF FILEREF=9999999.06
- SET NAME=$PIECE($GET(^DIC(4,VAL,0)),U,1)
- SET @TARGET@(VAL)=NAME
- QUIT
- +84 IF FILEREF=9999999.09
- IF VAL'?.N
- SET QFL=0
- QUIT
- +85 SET NAME=$PIECE($GET(@FILE@(VAL,0)),U,1)
- SET @TARGET@(VAL)=NAME
- End DoDot:2
- IF QFL
- QUIT
- +86 DO SRCH(FILEREF)
- End DoDot:1
- +87 QUIT
- +88 ;
- BLDEDU(TAX,TARGET) ;PEP - EDUCATION
- +1 ;
- +2 ; Takes a list of partial Patient Education topic names and
- +3 ; builds an array that can then be used to scan a V-File
- +4 ; cross-reference to see which records match an entry in the
- +5 ; list.
- +6 ;
- +7 ; This tag only supports Patient Education:
- +8 ; (where FILE is field #.15 in the TAXONOMY file #9002226)
- +9 ; Patient Education Topic Codes (^AUTTEDT - FILE 9999999.09)
- +10 ;
- +11 ; Input:
- +12 ; TAX = PATIENT EDUCATION TOPIC CODE LIST to search for
- +13 ; (required)
- +14 ;
- +15 ; Example: "CD-,-CD,AOD-,-AOD"
- +16 ; Example: "*BGP HIV/AIDS DXS"
- +17 ;
- +18 ; Returns items where the MNEMONIC field for the Patient
- +19 ; Education entry contains one of the listed values.
- +20 ;
- +21 ; Second example shows an ICD taxonomy name.
- +22 ; If used, will search for any Patient Education entry
- +23 ; containing one of the values in that Taxonomy.
- +24 ;
- +25 ; TARGET : Closed array reference where the output will be stored.
- +26 ; This can be a local variable or global reference.
- +27 ; (Ex. TARGET="ARRAY" or TARGET="^TMP($J)"
- +28 ;
- +29 ; Output:
- +30 ; An array in the local or global TARGET of the form:
- +31 ; @TARGET@(IEN)=NAME (.01 field)
- +32 ;
- +33 ; NOTE: Kill the output array before calling the function unless
- +34 ; you intend to group several Taxonomies of the same type.
- +35 ;
- +36 NEW VAL,IEN,NAME,MNEMONIC,TAX1,I,ICDIEN,FLG
- +37 FOR I=1:1:$LENGTH(TAX,",")
- SET TAX1=$PIECE(TAX,",",I)
- IF $EXTRACT(TAX1)="*"
- DO BLDTAX($EXTRACT(TAX1,2,$LENGTH(TAX1)),"ICDIEN")
- +38 SET VAL=""
- +39 FOR
- SET VAL=$ORDER(^AUTTEDT("B",VAL))
- IF VAL=""
- QUIT
- Begin DoDot:1
- +40 SET IEN=""
- +41 FOR
- SET IEN=$ORDER(^AUTTEDT("B",VAL,IEN))
- IF IEN=""
- QUIT
- Begin DoDot:2
- +42 SET NAME=$$GET1^DIQ(9999999.09,IEN,.01,"I")
- SET MNEMONIC=$$GET1^DIQ(9999999.09,IEN,1,"I")
- SET FLG=0
- +43 FOR I=1:1:$LENGTH(TAX,",")
- SET TAX1=$PIECE(TAX,",",I)
- IF $EXTRACT(TAX1)'="*"
- IF MNEMONIC[TAX1
- SET @TARGET@(IEN)=NAME_U_MNEMONIC
- SET FLG=1
- QUIT
- +44 IF FLG=1
- QUIT
- +45 SET I=""
- +46 ;If an ICD is used as the MNEMONIC it will be formatted as "ICD-abbreviation".
- +47 ;For example, if the ICD is "042." and the patient education is 'alcohol or drugs' then the MNEMONIC would be "042.-AOD".
- +48 FOR
- SET I=$ORDER(ICDIEN(I))
- IF I=""
- QUIT
- SET TAX1=ICDIEN(I)_"-"
- IF MNEMONIC[TAX1
- SET @TARGET@(IEN)=NAME_U_MNEMONIC
- SET FLG=1
- QUIT
- +49 IF FLG=1
- QUIT
- +50 QUIT
- End DoDot:2
- +51 QUIT
- End DoDot:1
- +52 QUIT
- +53 ;
- ICD(TAXDX,TAX,TAXTY) ;PEP - Checks to see if ICD code is found in certain taxonomy
- +1 ; Input:
- +2 ; TAXDX=dx ifn
- +3 ; TAX=taxonomy
- +4 ; TAXTY=9 for dx or 0 for proc 1 for cpt
- +5 NEW TAXICD,TAXBEG,TAXEND,TAXFLG,TAXIEN,TAXREF,TAXARR
- +6 IF TAX?.N
- SET TAXIEN=TAX
- +7 IF TAX'?.N
- Begin DoDot:1
- +8 SET TAXIEN=$ORDER(^ATXAX("B",TAX,0))
- SET TAXREF="^ATXAX"
- End DoDot:1
- +9 SET TAXFLG=0
- IF '$DATA(TAXDX)!'$DATA(TAXIEN)!'$DATA(TAXTY)
- QUIT TAXFLG
- +10 IF (TAXDX="")!(TAXIEN="")
- QUIT TAXFLG
- +11 ;I TAXTY=9 S SYS=$$CSI^ICDEX(80,TAXDX) S:SYS="" SYS=1
- +12 ;I TAXTY=0 S SYS=$$CSI^ICDEX(80.1,TAXDX) S:SYS="" SYS=2
- +13 ;S TAXICD=$S(TAXTY=1:$P($$CPT^ICPTCOD(TAXDX),U,2),1:$P($$ICDDX^ICDEX(SYS,TAXDX),U,2))
- +14 ;IHS/CMI/LAB GDIT/ARLIS - MODIFIED TO USE AC IF IT EXISTS
- +15 SET TAXARR=$NAME(^ATXAX(TAXIEN,21,"AC"))
- +16 IF '$DATA(^ATXAX(TAXIEN,21,"AC"))
- DO BLDTAX($PIECE(^ATXAX(TAXIEN,0),U),.TAXARR,TAXIEN)
- +17 IF $DATA(^ATXAX(TAXIEN,21,"AC",TAXDX))
- QUIT 1
- +18 QUIT TAXFLG
- +19 ;
- SRCH(FILEREF) ; Search for values
- +1 ; LAB entries use the IEN and only specify one value.
- +2 IF FILEREF=60
- Begin DoDot:1
- +3 SET NAME=$PIECE($GET(^LAB(60,VAL,0)),U,1)
- SET @TARGET@(VAL)=NAME
- End DoDot:1
- QUIT
- +4 ; MED entries use the IEN and only specify one value.
- +5 IF FILEREF=50.605
- Begin DoDot:1
- +6 NEW X,NVAL
- +7 SET NVAL=$ORDER(^PS(50.605,"B",VAL,""))
- IF NVAL=""
- QUIT
- +8 SET X=""
- FOR
- SET X=$ORDER(^PSDRUG("VAC",NVAL,X))
- IF X=""
- QUIT
- Begin DoDot:2
- +9 SET NAME=$PIECE($GET(^PSDRUG(X,0)),U,1)
- SET @TARGET@(X)=NAME
- End DoDot:2
- End DoDot:1
- QUIT
- +10 IF FILEREF=50
- Begin DoDot:1
- +11 SET NAME=$PIECE($GET(^PSDRUG(VAL,0)),U,1)
- SET @TARGET@(VAL)=NAME
- End DoDot:1
- QUIT
- +12 IF FILEREF=40.7
- Begin DoDot:1
- +13 SET NAME=$PIECE($GET(^DIC(40.7,VAL,0)),U,1)
- SET @TARGET@(VAL)=NAME
- End DoDot:1
- QUIT
- +14 ; Otherwise, treat all items as ranges (even if there is only one entry).
- +15 IF END=""
- SET END=VAL
- +16 Begin DoDot:1
- +17 IF FILEREF=95.3
- Begin DoDot:2
- +18 ; The LOINC x-ref in LAB does not use the check digit (piece 2).
- +19 SET VAL=$PIECE(VAL,"-")
- SET END=$PIECE(END,"-")
- +20 SET FILE="^LAB(60)"
- SET INDEX="AF"
- End DoDot:2
- QUIT
- +21 IF FILEREF=50.67
- SET FILE="^PSDRUG"
- SET INDEX="D"
- QUIT
- +22 IF FILEREF=9999999.05
- SET FILE="^AUTTCOM"
- SET INDEX="B"
- QUIT
- +23 IF FILEREF=9999999.09
- SET FILE="^AUTTEDT"
- SET INDEX="B"
- QUIT
- +24 IF FILEREF=9999999.14
- SET FILE="^AUTTIMM"
- SET INDEX="C"
- QUIT
- +25 IF FILEREF=9999999.64
- SET FILE="^AUTTHF"
- SET INDEX="B"
- QUIT
- +26 IF FILEREF=9999999.31
- SET FILE="^AUTTADA"
- SET INDEX="B"
- QUIT
- +27 ; CPT, ICD9, and ICD0 require a SPACE be added to the code.
- +28 ; Some Taxonomy entries already have the space included.
- +29 IF $EXTRACT(VAL,$LENGTH(VAL))'=" "
- SET VAL=VAL_" "
- +30 IF $EXTRACT(END,$LENGTH(END))'=" "
- SET END=END_" "
- +31 IF FILEREF=80
- SET FILE="^ICD9"
- SET INDEX="BA"
- QUIT
- +32 IF FILEREF=80.1
- SET FILE="^ICD0"
- SET INDEX="BA"
- QUIT
- +33 IF FILEREF=81
- SET FILE="^ICPT"
- SET INDEX="BA"
- QUIT
- End DoDot:1
- +34 ; Backup one entry so loop can find all the entries in the range.
- +35 SET VAL=$ORDER(@FILE@(INDEX,VAL),-1)
- +36 FOR
- SET VAL=$ORDER(@FILE@(INDEX,VAL))
- IF VAL=""
- QUIT
- IF $$CHECK(VAL,END)
- QUIT
- Begin DoDot:1
- +37 SET IEN=""
- +38 FOR
- SET IEN=$ORDER(@FILE@(INDEX,VAL,IEN))
- IF IEN=""
- QUIT
- Begin DoDot:2
- +39 SET NAME=$PIECE($GET(@FILE@(IEN,0)),U,1)
- +40 ;Does coding system match
- +41 IF $GET(SYSN)
- IF SYSN'=$PIECE($GET(@FILE@(IEN,1)),U,1)
- QUIT
- +42 IF $GET(SYSN)
- SET SYS=$PIECE(^ICDS(SYSN,0),U,2)
- SET SYSNM=$PIECE(^ICDS(SYSN,0),U,1)
- +43 IF $GET(ORDER)'="CODE"
- SET @TARGET@(IEN)=NAME_U_$GET(SYSN)_U_$GET(SYS)_U_$GET(SYSNM)
- QUIT
- +44 IF $GET(ORDER)="CODE"
- SET @TARGET@(NAME_" ")=IEN_U_$GET(SYSN)_U_$GET(SYS)_U_$GET(SYSNM)_U_NAME
- End DoDot:2
- End DoDot:1
- +45 QUIT
- +46 ;
- LST(SYSN,FILEREF,CODLS,ORDER,TARGET) ;PEP - LIST
- +1 ; Input
- +2 ; SYSN - System IEN from 80.4 (1, 2, 30 or 31)
- +3 ; FILEREF - File reference
- +4 ; CODLS - List of codes, can be range 250.00-250.99 or 250*
- +5 ; ORDER - Format to get data back (blank returns in IEN order, "CODE" returns in CODE order)
- +6 ; TARGET - Target reference
- +7 ;
- +8 NEW VAL,END,LG,IEN,SYS,NAME,SYSNM,INDEX
- +9 SET SYSN=$GET(SYSN)
- +10 IF $GET(FILEREF)=""
- SET FILEREF=$PIECE(^ICDS(SYSN,0),U,3)
- +11 IF CODLS["-"
- SET VAL=$PIECE(CODLS,"-",1)
- SET END=$PIECE(CODLS,"-",2)
- DO SRCH(FILEREF)
- QUIT
- +12 IF CODLS["*"
- Begin DoDot:1
- +13 SET VAL=$PIECE(CODLS,"*",1)
- SET END=VAL
- SET LG=$LENGTH(END)
- +14 ; CPT, ICD9, and ICD0 require a SPACE be added to the code.
- +15 ; Some Taxonomy entries already have the space included.
- +16 IF $EXTRACT(VAL,$LENGTH(VAL))'=" "
- SET VAL=VAL_" "
- +17 IF FILEREF=80
- SET FILE="^ICD9"
- SET INDEX="BA"
- +18 IF FILEREF=80.1
- SET FILE="^ICD0"
- SET INDEX="BA"
- +19 IF FILEREF=81
- SET FILE="^ICPT"
- SET INDEX="BA"
- +20 ;
- +21 FOR
- SET VAL=$ORDER(@FILE@(INDEX,VAL))
- IF VAL=""!($EXTRACT(VAL,1,LG)'=END)
- QUIT
- Begin DoDot:2
- +22 SET IEN=""
- +23 FOR
- SET IEN=$ORDER(@FILE@(INDEX,VAL,IEN))
- IF IEN=""
- QUIT
- Begin DoDot:3
- +24 SET NAME=$PIECE($GET(@FILE@(IEN,0)),U,1)
- +25 ;Does coding system match
- +26 IF $GET(SYSN)
- IF SYSN'=$PIECE($GET(@FILE@(IEN,1)),U,1)
- QUIT
- +27 IF $GET(SYSN)
- SET SYS=$PIECE(^ICDS(SYSN,0),U,2)
- SET SYSNM=$PIECE(^ICDS(SYSN,0),U,1)
- +28 IF $GET(ORDER)'="CODE"
- SET @TARGET@(IEN)=NAME_U_$GET(SYSN)_U_$GET(SYS)_U_$GET(SYSNM)
- QUIT
- +29 IF $GET(ORDER)="CODE"
- SET @TARGET@(NAME_" ")=IEN_U_$GET(SYSN)_U_$GET(SYS)_U_$GET(SYSNM)_U_NAME
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +30 QUIT