VistA-ePrescribing/p/C0PTRXN2.m

391 lines
16 KiB
Mathematica
Raw Permalink Normal View History

2012-11-11 11:20:01 -05:00
C0PTRXN ; ERX/GPL - Med file eRx analysis routines ; 7/10/10
;;0.1;C0P;nopatch;noreleasedate;Build 77
;Copyright 2009 George Lilly. Licensed under the terms of the GNU
;General Public License See attached copy of the License.
;
;This program 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 2 of the License, or
;(at your option) any later version.
;
;This program 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 this program; if not, write to the Free Software Foundation, Inc.,
;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
;
Q
;
; gpl 7/2010 - these routines are to test the Drug file mappings
; to see how well they will work for eRx. None of this code is needed
; for operation of the eRx Package. It is for analysis, debugging and future
; development
;
FDBFN() Q 1130590010 ; First Databank Drugs file number
RXNFN() Q 1130590011.001 ; RxNorm Concepts file number
T1 ; TEST1
N ZI
S ZI=""
F S ZI=$O(^C0P("FDB","B",ZI)) Q:ZI="" D ;
. N ZGCN,ZRXNCUI,ZNAME,ZVAIEN,ZDRUGIEN
. S (ZGCN,ZRXNCUI,ZNAME,ZVAIEN,ZDRUGIEN)=""
. S ZGCN=$$GCN^C0PLKUP(ZI)
. S ZRXNCUI=$$RXNCUI^C0PLKUP(ZGCN)
. I ZRXNCUI'="" S ZVUID=$$VUID^C0PLKUP(ZRXNCUI)
. E S ZRXNCUI="NONE"
. S ZNAME=$$FULLNAME^C0PLKUP(ZI)
. I ZVUID'="" S ZVAIEN=$$VAPROD^C0PLKUP(ZVUID)
. I ZVAIEN'="" S ZDRUGIEN=$$DRUG^C0PLKUP(ZVAIEN)
. E S ZDRUGIEN="N/A"
. W !,ZI," ",ZGCN," ",ZRXNCUI," ",ZVUID," ",ZVAIEN," ",ZDRUGIEN," ",ZNAME
Q
; OK, T1 IS JUST SOME EXPLORITORY WORK. TIME TO GET ORGANIZED
;
TEST ;
;
S GARY=$NA(^TMP("C0PRXN","TYPE2"))
S GOUT=$NA(^TMP("C0POUT"))
K @GOUT
D RNF2CSV^C0CRNF(GOUT,GARY,"VN") ; TURN TYPE 2 INTO A CSV
D FILEOUT^C0CRNF(GOUT,"TYPE2_TEST.csv")
Q
;
INDEX2 ; ADD AN INDEX TO TYPE2 DRUGS OF THE VUID
; FOR USE IN FINDING THE CURRENT VA->FDB MAPPING STATUS
N ZI S ZI=""
N ZBASE
S ZBASE=$NA(^TMP("C0PRXN","TYPE2","V")) ; TYPE2 DRUGS ARE HERE
S ZINDEX=$NA(^TMP("C0PRXN","TYPE2","INDEX")) ; PUT THE INDEX HERE
F S ZI=$O(@ZBASE@(ZI)) Q:ZI="" D ;
. N ZVUIDS,ZVUID
. S ZVUIDS=@ZBASE@(ZI,"VUID",1) ; LIST OF VUIDS ^ SEPARATED
. N ZN S ZN=@ZBASE@(ZI,"VANAME",1)_"^"_@ZBASE@(ZI,"FDBNAME",1)
. I ZVUIDS["^" D ;
. . N ZJ S ZJ=""
. . F S ZJ=$P(ZVUIDS,"^",1) Q:ZJ="" D ; FOR EACH VUID
. . . S ZVUID(ZJ)=ZN ;SET INDEX TO NAME
. . . S ZVUIDS=$P(ZVUIDS,"^",2) ; DROP THE FIRST IN THE LIST
. E S ZVUID(ZVUIDS)=ZN ;SET INDEX TO VA NAME
. S ZJ=""
. F S ZJ=$O(ZVUID(ZJ)) Q:ZJ="" D ; FOR EACH VUID
. . ;S @ZINDEX@(ZJ,ZI)=ZVUID(ZJ) ;SET THE INDEX
. . W !,$NA(@ZINDEX@(ZJ,ZI))_"="_ZVUID(ZJ) ;SET THE INDEX
Q
EN ; ENTRY POINT TO CREATE THE ERX DRUG ANALYSIS SPREADSHEETS
; SEE BELOW FOR DOCUMENTATION
N GARY
S GARY=$NA(^TMP("C0PRXN","ALL")) ; PLACE TO PUT THE ENTIRE ARRAY
K @GARY
D BLDARY(GARY) ; BUILD THE ENTIRE ARRAY
D IDXARY(GARY) ; INDEX THE ARRAY BY TYPE AND DRUG NAME
D TYPES
Q
;
TYPES ; BUILD AN ARRAY FOR EACH TYPE
I '$D(GARY) S GARY=$NA(^TMP("C0PRXN","ALL"))
N C0PN,ZTYPE
F C0PN=1:1:4 D ; FOR EACH ANALYSIS TYPE
. S ZTYPE=$NA(^TMP("C0PRXN","TYPE"_C0PN))
. K @ZTYPE
. D BLDTYPE(GARY,ZTYPE,C0PN) ; BUILD AN EXTRACTED ARRAY ACCORDING TO TYPE
. S GOUT=$NA(^TMP("C0POUT"))
. K @GOUT
. D RNF2CSV^C0CRNF(GOUT,ZTYPE,"VN") ; TURN TYPE 2 INTO A CSV
. W !
. D FILEOUT^C0CRNF(GOUT,"eRx_mapping__Type"_C0PN_".csv")
Q
;
IDXARY(INARY) ; INDEX THE ARRAY BY TYPE AND NAME
;
N ZI
S ZI=""
F S ZI=$O(@INARY@("V",ZI)) Q:ZI="" D ; FOR EACH ELEMENT OF THE ARRAY
. S @INARY@("INDEX",@INARY@("V",ZI,"TYPE"),@INARY@("V",ZI,"FDBNAME"),ZI)=""
D COUNT
Q
;
COUNT ; COUNT AND REPORT HOW MANY ARE IN EACH TYPE
I '$D(INARY) S INARY=$NA(^TMP("C0PRXN","ALL"))
N ZN,ZI,ZJ,ZCOUNT
S ZN=""
F S ZN=$O(@INARY@("INDEX",ZN)) Q:ZN="" D ; FOR EACH TYPE
. S ZCOUNT=0
. S ZI=""
. F S ZI=$O(@INARY@("INDEX",ZN,ZI)) Q:ZI="" D ; FOR EACH INDEX ENTRY
. . S ZCOUNT=ZCOUNT+1
. W !,"COUNT FOR TYPE "_ZN_" = "_ZCOUNT
Q
;
BLDTYPE(INARY,OARY,ITYPE) ; EXTRACT A TYPE ARRAY
;
N C0PI,C0PJ
S C0PI=""
F S C0PI=$O(@INARY@("INDEX",ITYPE,C0PI)) Q:C0PI="" D ; FOR EACH OF TYPE
. S C0PJ=$O(@INARY@("INDEX",ITYPE,C0PI,"")) ; SET RECORD NUMBER
. N C0PROW
. M C0PROW=@INARY@("V",C0PJ) ; CONTENTS OF ROW
. D RNF1TO2B^C0CRNF(OARY,"C0PROW") ; USING THE "B" VERSION TO BE ABLE TO
. ; TO CONVERT TO A CSV
Q
;
BLDARY(ZARY) ; BUILDS AN RNF2 ARRAY; ZARY IS PASSED BY NAME
; (SEE C0CRNF.m FOR DOCUMENTATION OF RNF2 FORMAT)
;
; FIRST DATA BANK DRUGS ARE MATCHED TO VISTA DRUGS THROUGH A MULTI-STEP
; PROCESS. THE MEDID IS THE FIRST DATA BANK NUMBER USED TO REFER TO THEIR
; DRUGS. EACH MEDID HAS A GCN (GENERIC CODE NUMBER) WHICH CAN BE USED TO
; LOOK UP THE DRUG IN THE RXNORM UMLS DATABASE. THE GCN IS USED TO FIND
; THE RXNORM CONCEPT NUMBER (RXNCUI). THE RXNCUI IS USED TO FIND THE VUID
; USING THE RXNORM UMLS DATABASE. THE VUID IS USED TO FIND THE IEN OF THE
; DRUG IN THE VA PRODUCTS FILE (ALSO KNOWN AS THE NDF - NATIONAL DRUG FILE).
; THE VAPROD IEN IS THEN USED TO LOOK UP THE DRUG IN THE VA DRUG FILE
; (FILE 50) USING A NEW CROSS REFERENCE (AC0P) CREATED FOR THIS PURPOSE.
; THE RESULT OF THIS CHAIN IS A DRUG MAPPED FROM THE FDB MEDID TO A
; VA DRUG FILE IEN. TO SUMMARIZE:
;
; MEDID->GCN->RXNCUI->VUID->VAPROD->DRUGIEN
;
; (NOTE: THIS PROCESS WILL CHANGE - BE IMPROVED - WHEN THE VERIFIED
; MEDID->RXNORM MAPPING BECOMES AVAILABLE. THIS ANALYSIS WILL ESTABLISH
; A BASELINE WITH WHICH TO COMPARE THE RESULT OF USING THAT MAPPING)
;
; (THE PROCESS IS ACTUALLY MORE COMPLEX THAT THIS, BECAUSE WE ALSO TRY
; AND MATCH DRUGS BY LOOKING AT THEIR CHEMICAL COMPONENTS BUT THIS ANALYSIS
; IGNORES THIS MORE COMPLEX PROCESS.)
;
; NOT ALL DRUGS MAKE IT ALL THE WAY THROUGH THIS MAPPING. IN ADDITION, THERE
; MAY BE DRUGS THAT ARE IN THE DRUG FILE THAT ARE NOT IN THE FDB FILE
; THIS ROUTINE WILL CREATE A SPREADSHEET THAT WILL SHOW THE UNMAPPED DRUGS
; IN BOTH DIRECTIONS (MEDID->...>DRUGIEN AND DRUGIEN->...>MEDID)
; IT WILL ALSO SHOW THE DRUG NAME AS IT APPEARS IN FIRST DATA BANK
; AND THE NAME THAT WILL BE USED FOR THAT DRUG IN VISTA (ERX). OFTEN
; THEY WILL BE DIFFERENT. IF THE FDB DRUG IS NOT A GENERIC, THE GENERIC NAME
; WILL BY USED BY ERX TO LIST THE DRUG IN THE PATIENT'S DRUG LIST IN VISTA
;
; WE ARE GOING TO ORGANIZE AN ARRAY WITH DRUGS BY TYPE. HERE ARE THE TYPES:
;
; TYPE 1 - FDB DRUGS THAT MAP EXACTLY TO THE DRUG FILE, WITH NAMES THAT
; MATCH EXACTLY
;
; TYPE 2 - FDB DRUGS THAT MAP TO THE DRUG FILE, BUT WITH DIFFERENT NAMES.
; THIS CATEGORY INCLUDES DRUGS THAT ARE SHOWN IN VISTA AS GENERICS BUT
; ON FDB AS BRAND NAME DRUGS
;
; TYPE 3 - FDB DRUGS THAT DO NOT MAP TO THE DRUG FILE, BUT DO MAP TO THE
; VA PRODUCT FILE (NDF). IF ANY OF THESE DRUGS MIGHT BE ORDERED VIA ERX,
; IT MIGHT BE A GOOD IDEA TO ADD THEM TO THE DRUG FILE.
; NOTE: FOR TYPE 3 AND ABOVE DRUGS, ERX WILL STILL FUNCTION PROPERLY BUT
; INSTEAD OF MAPPING THE DRUG TO THE DRUG FILE, WILL MAP IT AS A FREE TEXT
; DRUG AND WILL SEND A MAIL MESSAGE ABOUT THE MAPPING ERROR SO THAT THE
; DRUG CAN BE CONSIDERED FOR ADDING TO THE DRUG FILE
;
; TYPE 4 - FDB DRUGS THAT DO NOT MAP TO THE DRUG FILE AND ARE ALSO NOT
; FOUND IN THE NDF. THIS MIGHT BE THE CASE FOR NEWER DRUGS. ERX WILL
; STILL FUNCTION, BUT THESE WILL BE FREE TEXT DRUGS. THE REMEDY IS AN
; UPDATE FROM THE VA OF THE NDF OR ADDING THE DRUGS TO THE NDF AND THE
; DRUG FILE. (THERE ARE COMPLEXITIES IN ADDING DRUGS TO THE NDF BECAUSE
; OF HOW TO THEN HANDLE AN UPDATE FROM THE VA)
;
; TYPE 5 - DRUGS IN THE DRUG FILE THAT ARE NOT FOUND IN THE FDB DRUG DATABASE
; MAPPING. THIS MIGHT INCLUDE BRAND NAME DRUGS IN THE DRUG FILE THAT HAVE
; BEEN MAPPED TO GENERICS WHEN COMING FROM FDB. IN ANY CASE, THESE ARE DRUGS
; FOR WHICH THERE IS NO PATH TO MAP FROM THEM TO FDB. (REDUCING THE NUMBER
; OF DRUGS IN THIS TYPE TO ZERO WILL BE A GOAL BEFORE IMPLEMENTING PHASE II
; OF ERX WHERE DRUGS WILL BE ORDERED ON VISTA AND SENT TO THE ERX
; SERVICE.
;
N ZI
S ZI=""
F S ZI=$O(^C0P("FDB","B",ZI)) Q:ZI="" D ;
. N ZGCN,ZRXNCUI,ZNAME,ZVAIEN,ZDRUGIEN,ZROW,ZIEN,ZVANAME
. S (ZGCN,ZRXNCUI,ZNAME,ZVAIEN,ZDRUGIEN,ZVANAME)=""
. S ZROW("MEDID")=ZI ; FDB MEDID
. S ZIEN=$O(^C0P("FDB","B",ZI,"")) ; IEN OF THE FDB MED
. S ZROW("FDBNAME")=$$FULLNAME^C0PLKUP(ZI) ; FDB MED NAME
. S ZGCN=$$GCN^C0PLKUP(ZI)
. I ZGCN=0 D Q ; NO GCN, CAN'T MAP
. . S ZROW("TYPE")=4
. . D RNF1TO2^C0CRNF(ZARY,"ZROW")
. S ZROW("GCN")=ZGCN
. S ZRXNCUI=$$RXNCUI^C0PLKUP(ZGCN) ; RETRIEVE THE RXNORM CONCEPT ID
. I ZRXNCUI="" W !,"ERROR, NO RXNCUI "_ZGCN B ; SHOULDN'T HAPPEN
. S ZROW("RXNCUI")=ZRXNCUI
. S ZVUID=$$VUID^C0PLKUP(ZRXNCUI) ; FETCH THE VUID
. I ZVUID="" D Q ; NO VUID FOUND
. . S ZROW("TYPE")=4
. . D RNF1TO2^C0CRNF(ZARY,"ZROW")
. S ZROW("VUID")=ZVUID
. I ZVUID["^" S ZVUID=$P(ZVUID,"^",1) ; USE THE FIRST ONE
. S ZVAIEN=$$VAPROD^C0PLKUP(ZVUID) ; IEN IN VA PRODUCTS (NDF)
. I ZVAIEN=0 D Q ; NOT FOUND IN NDF
. . S ZROW("TYPE")=4
. . D RNF1TO2^C0CRNF(ZARY,"ZROW")
. S ZDRUGIEN=$$DRUG^C0PLKUP(ZVAIEN) ; IEN IN DRUG FILE
. I ZDRUGIEN=0 D Q ;
. . S ZROW("TYPE")=3
. . S ZROW("VANDFNAME")=$$GET1^DIQ(50.68,ZVAIEN_",",.01) ;NDF NAME
. . D RNF1TO2^C0CRNF(ZARY,"ZROW")
. S ZVANAME=$$GET1^DIQ(50,ZDRUGIEN_",",.01) ; VA DRUG NAME
. S ZROW("VANAME")=ZVANAME ;
. I ZVANAME=$$UP^XLFSTR(ZNAME) S ZROW("TYPE")=1
. E S ZROW("TYPE")=2
. D RNF1TO2^C0CRNF(ZARY,"ZROW")
. ;B
Q
;
BLDFILE() ; BUILDS THE C0P RXNORM FDB VUID MAPPING FILE #113059010.002
;
; FIRST DATA BANK DRUGS ARE MATCHED TO VISTA DRUGS THROUGH A MULTI-STEP
; PROCESS. THE MEDID IS THE FIRST DATA BANK NUMBER USED TO REFER TO THEIR
; DRUGS. EACH MEDID HAS A GCN (GENERIC CODE NUMBER) WHICH CAN BE USED TO
; LOOK UP THE DRUG IN THE RXNORM UMLS DATABASE. THE GCN IS USED TO FIND
; THE RXNORM CONCEPT NUMBER (RXNCUI). THE RXNCUI IS USED TO FIND THE VUID
; USING THE RXNORM UMLS DATABASE. THE VUID IS USED TO FIND THE IEN OF THE
; DRUG IN THE VA PRODUCTS FILE (ALSO KNOWN AS THE NDF - NATIONAL DRUG FILE).
; THE VAPROD IEN IS THEN USED TO LOOK UP THE DRUG IN THE VA DRUG FILE
; (FILE 50) USING A NEW CROSS REFERENCE (AC0P) CREATED FOR THIS PURPOSE.
; THE RESULT OF THIS CHAIN IS A DRUG MAPPED FROM THE FDB MEDID TO A
; VA DRUG FILE IEN. TO SUMMARIZE:
;
; MEDID->GCN->RXNCUI->VUID->VAPROD->DRUGIEN
;
; (NOTE: THIS PROCESS WILL CHANGE - BE IMPROVED - WHEN THE VERIFIED
; MEDID->RXNORM MAPPING BECOMES AVAILABLE. THIS ANALYSIS WILL ESTABLISH
; A BASELINE WITH WHICH TO COMPARE THE RESULT OF USING THAT MAPPING)
;
; (THE PROCESS IS ACTUALLY MORE COMPLEX THAT THIS, BECAUSE WE ALSO TRY
; AND MATCH DRUGS BY LOOKING AT THEIR CHEMICAL COMPONENTS BUT THIS ANALYSIS
; IGNORES THIS MORE COMPLEX PROCESS.)
;
; NOT ALL DRUGS MAKE IT ALL THE WAY THROUGH THIS MAPPING. IN ADDITION, THERE
; MAY BE DRUGS THAT ARE IN THE DRUG FILE THAT ARE NOT IN THE FDB FILE
; THIS ROUTINE WILL CREATE A SPREADSHEET THAT WILL SHOW THE UNMAPPED DRUGS
; IN BOTH DIRECTIONS (MEDID->...>DRUGIEN AND DRUGIEN->...>MEDID)
; IT WILL ALSO SHOW THE DRUG NAME AS IT APPEARS IN FIRST DATA BANK
; AND THE NAME THAT WILL BE USED FOR THAT DRUG IN VISTA (ERX). OFTEN
; THEY WILL BE DIFFERENT. IF THE FDB DRUG IS NOT A GENERIC, THE GENERIC NAME
; WILL BY USED BY ERX TO LIST THE DRUG IN THE PATIENT'S DRUG LIST IN VISTA
;
; WE ARE GOING TO ORGANIZE AN ARRAY WITH DRUGS BY TYPE. HERE ARE THE TYPES:
;
; TYPE 1 - FDB DRUGS THAT MAP EXACTLY TO THE DRUG FILE, WITH NAMES THAT
; MATCH EXACTLY
;
; TYPE 2 - FDB DRUGS THAT MAP TO THE DRUG FILE, BUT WITH DIFFERENT NAMES.
; THIS CATEGORY INCLUDES DRUGS THAT ARE SHOWN IN VISTA AS GENERICS BUT
; ON FDB AS BRAND NAME DRUGS
;
; TYPE 3 - FDB DRUGS THAT DO NOT MAP TO THE DRUG FILE, BUT DO MAP TO THE
; VA PRODUCT FILE (NDF). IF ANY OF THESE DRUGS MIGHT BE ORDERED VIA ERX,
; IT MIGHT BE A GOOD IDEA TO ADD THEM TO THE DRUG FILE.
; NOTE: FOR TYPE 3 AND ABOVE DRUGS, ERX WILL STILL FUNCTION PROPERLY BUT
; INSTEAD OF MAPPING THE DRUG TO THE DRUG FILE, WILL MAP IT AS A FREE TEXT
; DRUG AND WILL SEND A MAIL MESSAGE ABOUT THE MAPPING ERROR SO THAT THE
; DRUG CAN BE CONSIDERED FOR ADDING TO THE DRUG FILE
;
; TYPE 4 - FDB DRUGS THAT DO NOT MAP TO THE DRUG FILE AND ARE ALSO NOT
; FOUND IN THE NDF. THIS MIGHT BE THE CASE FOR NEWER DRUGS. ERX WILL
; STILL FUNCTION, BUT THESE WILL BE FREE TEXT DRUGS. THE REMEDY IS AN
; UPDATE FROM THE VA OF THE NDF OR ADDING THE DRUGS TO THE NDF AND THE
; DRUG FILE. (THERE ARE COMPLEXITIES IN ADDING DRUGS TO THE NDF BECAUSE
; OF HOW TO THEN HANDLE AN UPDATE FROM THE VA)
;
; TYPE 5 - DRUGS IN THE DRUG FILE THAT ARE NOT FOUND IN THE FDB DRUG DATABASE
; MAPPING. THIS MIGHT INCLUDE BRAND NAME DRUGS IN THE DRUG FILE THAT HAVE
; BEEN MAPPED TO GENERICS WHEN COMING FROM FDB. IN ANY CASE, THESE ARE DRUGS
; FOR WHICH THERE IS NO PATH TO MAP FROM THEM TO FDB. (REDUCING THE NUMBER
; OF DRUGS IN THIS TYPE TO ZERO WILL BE A GOAL BEFORE IMPLEMENTING PHASE II
; OF ERX WHERE DRUGS WILL BE ORDERED ON VISTA AND SENT TO THE ERX
; SERVICE.
;
N FN S FN=1130590010.002 ;FILE NUMBER FOR C0P RXNORM FDB VUID MAPPING FILE
N C0PFDA
N ZI
S ZI=""
F S ZI=$O(^C0P("FDB","B",ZI)) Q:ZI="" D ;
. W !,ZI
. D DOONE(.C0PFDA,ZI) ;BUILD AN FDA
. D UPDIE ;WRITE TO FILE
. K C0PDFA
Q
;
DOONE(C0PFDA,ZI) ; RETURN FDA FOR MEDID ZI
N FN S FN=1130590010.002 ;FILE NUMBER FOR C0P RXNORM FDB VUID MAPPING FILE
N ZGCN,ZRXNCUI,ZNAME,ZVAIEN,ZDRUGIEN,ZROW,ZIEN,ZVANAME,ZRXNIEN,ZRXNTXT
S (ZGCN,ZRXNCUI,ZNAME,ZVAIEN,ZDRUGIEN,ZVANAME)=""
;S ZROW("MEDID")=ZI ; FDB MEDID
S C0PFDA(FN,"?+1,",.02)=ZI ; FDB MEDID
S ZIEN=$O(^C0P("FDB","B",ZI,"")) ; IEN OF THE FDB MED
S C0PFDA(FN,"?+1,",1.02)=ZIEN ;POINTER TO FDB MED
;S ZROW("FDBNAME")=$$FULLNAME^C0PLKUP(ZI) ; FDB MED NAME
S ZNAME=$$FULLNAME^C0PLKUP(ZI) ; FDB MED NAME
S C0PFDA(FN,"?+1,",2.02)=ZNAME ; FDB MED NAME
S ZGCN=$$GCN^C0PLKUP(ZI)
I ZGCN=0 D Q ; NO GCN, CAN'T GO FURTHER
. ;S ZROW("TYPE")=4
. S C0PFDA(FN,"?+1,",3)=4 ;TYPE 4, CAN'T MAP FDB TO RXN
. S C0PFDA(FN,"?+1,",.01)="MISSING RXN" ;NEED TO HAVE A .01
. ;D RNF1TO2^C0CRNF(ZARY,"ZROW")
;S ZROW("GCN")=ZGCN
S C0PFDA(FN,"?+1,",.04)=$$GCN^C0PLKUP(ZI) ;GENERIC CATEGORY NUMBER
S ZRXNCUI=$$RXNCUI^C0PLKUP(ZGCN) ; RETRIEVE THE RXNORM CONCEPT ID
I ZRXNCUI="" W !,"ERROR, NO RXNCUI "_ZGCN B ; SHOULDN'T HAPPEN
S C0PFDA(FN,"?+1,",.01)=ZRXNCUI ; RXN CONCEPT
S ZRXNIEN=$O(^C0P("RXN","B",ZRXNCUI,"")) ; RXN CONCEPT IEN
S C0PFDA(FN,"?+1,",1.01)=ZRXNIEN ; POINTER TO RXN CONCEPT
S ZRXNTXT=$G(^C0P("RXN",ZRXNIEN,1,1,0)) ; FIRST LINE OF RXN TEXT
S C0PFDA(FN,"?+1,",2.01)=ZRXNTXT ; RXN CONCEPT LABEL
;S ZROW("RXNCUI")=ZRXNCUI
S ZVUID=$$VUID^C0PLKUP(ZRXNCUI) ; FETCH THE VUID
I ZVUID="" D Q ; NO VUID FOUND
. ;S ZROW("TYPE")=4
. S C0PFDA(FN,"?+1,",3)=4 ;TYPE 4, CAN'T MAP RXNCUI TO VUID
. ;D RNF1TO2^C0CRNF(ZARY,"ZROW")
;S ZROW("VUID")=ZVUID
S ZVUID=$TR(ZVUID,"^","|") ; CAN'T HAVE ^ IN FIELDS
S C0PFDA(FN,"?+1,",.03)=ZVUID ;SET OF VUIDS
I ZVUID["|" S ZVUID=$P(ZVUID,"|",1) ; USE THE FIRST ONE
S ZVAIEN=$$VAPROD^C0PLKUP(ZVUID) ; IEN IN VA PRODUCTS (NDF)
I +ZVAIEN=0 D Q ; NOT FOUND IN NDF
. ;S ZROW("TYPE")=4
. S C0PFDA(FN,"?+1,",3)=4 ;TYPE 4, CAN'T MAP VUID TO NDF
. ;D RNF1TO2^C0CRNF(ZARY,"ZROW")
S ZDRUGIEN=$$DRUG^C0PLKUP(ZVAIEN) ; IEN IN DRUG FILE
I ZDRUGIEN["^" S ZDRUGIEN=$P(ZDRUGIEN,"^",1) ; USE THE FIRST ONE
I +ZDRUGIEN=0 D Q ;
. S ZROW("TYPE")=3
. S C0PFDA(FN,"?+1,",3)=3 ;TYPE 3, CAN'T MAP VUID TO DRUG FILE
. ;S ZROW("VANDFNAME")=$$GET1^DIQ(50.68,ZVAIEN_",",.01) ;NDF NAME
. S C0PFDA(FN,"?+1,",1.04)=ZVAIEN ;POINTER TO NDF
. S C0PFDA(FN,"?+1,",2.04)=$$GET1^DIQ(50.68,ZVAIEN_",",.01) ;NDF NAME
. ;D RNF1TO2^C0CRNF(ZARY,"ZROW")
S ZVANAME=$$GET1^DIQ(50,ZDRUGIEN_",",.01) ; VA DRUG NAME
S C0PFDA(FN,"?+1,",2.03)=ZVANAME ; VA DRUG FILE NAME
S C0PFDA(FN,"?+1,",1.03)=$G(ZDRUGIEN) ; VA DRUG FILE IEN
;S ZROW("VANAME")=ZVANAME ;
I ZVANAME=$$UP^XLFSTR(ZNAME) S ZROW("TYPE")=1
E S ZROW("TYPE")=2
S C0PFDA(FN,"?+1,",3)=ZROW("TYPE") ; MATCHING TYPE 1 OR 2
;D RNF1TO2^C0CRNF(ZARY,"ZROW")
;B
Q
;
UPDIE ; INTERNAL ROUTINE TO CALL UPDATE^DIE AND CHECK FOR ERRORS
;Q ;//SMH don't want an update
;I C0PFDA(FN,"+1,",3)'=3 Q ;
;I C0PFDA(FN,"+1,",1.02)=1 Q ;
;ZWR C0PFDA ;
K ZERR
D CLEAN^DILF
D UPDATE^DIE("","C0PFDA","","ZERR")
;I $D(ZERR) D ;
;. W "ERROR",!
;. ZWR ZERR
;. B
K C0PFDA
Q
;