Ignore:
Timestamp:
Apr 27, 2016, 7:02:22 PM (8 years ago)
Author:
Sam Habiel
Message:

2.5 version of RxNorm package

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ccr/trunk/rxnorm/trunk/routines/C0CRXNLK.m

    r1665 r1730  
    11C0CRXNLK ; VEN/SMH - RxNorm Lookup Utilities ;2014-07-22  2:27 PM
    2  ;;2.3;RXNORM FOR VISTA;;Jul 22, 2014;Build 16
    3  ;(c) Sam Habiel 2013
     2 ;;2.5;RXNORM FOR VISTA;;Apr 27, 2016;Build 16
     3 ;(c) Sam Habiel 2016
    44 ; See accompanying license. Don't use otherwise.
    55 ;
     
    77 N DIQUIET S DIQUIET=1
    88 D DT^DICRW
    9  D EN^XTMUNIT($T(+0),1)
     9 D EN^%ut($T(+0),2)
    1010 QUIT
    1111 ;
     
    2222 Q ^(IEN)
    2323 ;
    24 GCN2RXNT ; @TEST - Test Get RxNorm CUI using GCN
     24GCN2RXNT ; @TEST Test Get RxNorm CUI using GCN
    2525 Q:'$D(^C0CRXN(176.001,"STC","NDDF"))
    2626 N L F L=1:1 N LN S LN=$T(GCN2RXND+L) Q:LN["<<END>>"  Q:LN=""  D
    2727 . N GCN S GCN=$P(LN,";",3)
    2828 . N RXN S RXN=$P(LN,";",4)
    29  . D CHKEQ^XTMUNIT($$GCN2RXN(GCN),RXN,"Translation from GCN to RXCUI failed")
     29 . D CHKEQ^%ut($$GCN2RXN(GCN),RXN,"Translation from GCN to RXCUI failed")
    3030 QUIT
    3131 ;
    3232GCN2RXND ; @DATA - Data for Tests ;;GCN;EXPECTED RXNCUI
    33  ;;16033;991632
    3433 ;;8208;310429
    3534 ;;1275;628953
     
    4948 Q GCNS
    5049 ;
    51 RXN2GCNT ; @TEST - Test Get GCN from RXNCUI
     50RXN2GCNT ; @TEST Test Get GCN from RXNCUI
    5251 Q:'$D(^C0CRXN(176.001,"STX","NDDF"))
    5352 N L F L=1:1 N LN S LN=$T(RXN2GCND+L) Q:LN["<<END>>"  Q:LN=""  D
    5453 . N RXN S RXN=$P(LN,";",3)
    5554 . N GCN S GCN=$P(LN,";",4)
    56  . D CHKEQ^XTMUNIT($$RXN2GCN(RXN),GCN,"Translation from RXCUI to GCN failed")
     55 . D CHKEQ^%ut($$RXN2GCN(RXN),GCN,"Translation from RXCUI to GCN failed")
    5756 QUIT
    5857 ;
     
    6059RXN2GCND ; @DATA - Data for Tests ;;RXNORM CUI;Expected GCN; Human Readable Drug name for dear reader
    6160 ;;998689;5145;Acetabulol 200mg tab
    62  ;;745679;5037;Albuterol Inhaler
     61 ;;745679;28090;Albuterol Inhaler
    6362 ;;197320;2536;Allopurinol 300mg tab
    64  ;;993691;3948^46236;Bupropion 75mg tab
     63 ;;993691;46236;Bupropion 75mg tab
    6564 ;;197591;3768;Diazepam 5mg tab
    6665 ;;<<END>>
     
    7978 Q C0PVUID
    8079 ;
    81 RXN2VUIT ; @TEST - Get VUIDs given RxNorm values
     80RXN2VUIT ; @TEST Get VUIDs given RxNorm values
    8281 N L F L=1:1 N LN S LN=$T(RXN2VUID+L) Q:LN["<<END>>"  Q:LN=""  D
    8382 . N RXN S RXN=$P(LN,";",3)
    8483 . N VUIDS S VUIDS=$P(LN,";",4)
    85  . D CHKEQ^XTMUNIT($P($$RXN2VUI(RXN),U),$P(VUIDS,U),"Translation from RXNCUI to VUID failed")
     84 . D CHKEQ^%ut($P($$RXN2VUI(RXN),U),$P(VUIDS,U),"Translation from RXNCUI to VUID failed")
    8685 QUIT
    8786 ;
    8887RXN2VUID ; @DATA - Data items for previous test
    89  ;;991632;4006455
    9088 ;;310429;4002369^4013941
    91  ;;628953;4000874^4000856^4013966^4015798^4015799
     89 ;;628953;4000856^4013966^4015798^4015799
    9290 ;;197604;4003335^4015937
    93  ;;884173;4002469^4013919
     91 ;;884173;4002469^4013919^4032795
    9492 ;;<<END>>
    9593 ;
     
    105103 Q O
    106104 ;
    107 VUI2VAPT ; @TEST - Get VA Product IEN from VUID
     105VUI2VAPT ; @TEST Get VA Product IEN from VUID
    108106 N L F L=1:1 N LN S LN=$T(VUI2VAPD+L) Q:LN["<<END>>"  Q:LN=""  D
    109107 . N VUID S VUID=$P(LN,";",3)
    110108 . N VAP S VAP=$P(LN,";",4)
    111  . D CHKEQ^XTMUNIT($$VUI2VAP(VUID),VAP,"Translation from VUID to VA PRODUCT failed")
     109 . D CHKEQ^%ut($$VUI2VAP(VUID),VAP,"Translation from VUID to VA PRODUCT failed")
    112110 QUIT
    113111 ;
     
    166164 N IEN S IEN=$O(^C0CRXN(176.001,"STC","NDDF","IN",BASE,"")) Q ^(IEN)
    167165 ;
    168 FDI2RXNT ; @TEST - Test Get RxNorm CUI for FDB Ingredient/Base
     166FDI2RXNT ; @TEST Test Get RxNorm CUI for FDB Ingredient/Base
    169167 Q:'$D(^C0CRXN(176.001,"STC","NDDF"))
    170  D CHKEQ^XTMUNIT($$FDI2RXN(14739),1362160,"$$FDI2RXN failed")
     168 D CHKEQ^%ut($$FDI2RXN(14739),1362160,"$$FDI2RXN failed")
    171169 QUIT
    172170 ;
     
    177175 ; Input: RXNCUI By Value
    178176 ; Output: VUID
    179  N IEN S IEN=$O(^C0CRXN(176.001,"STX","VANDF","IN",RXNCUI,"")) Q ^(IEN)
    180  ;
    181 RXN2VINT ; @TEST - Test Get VUID Ingredient for RxNorm CUI
    182  D CHKEQ^XTMUNIT($$RXN2VIN(1366467),4031768,"$$RXN2VIN failed")
     177 N IEN S IEN=$O(^C0CRXN(176.001,"STX","VANDF","IN",RXNCUI,""))
     178 I IEN Q ^(IEN)
     179 E  Q ""
     180 ;
     181RXN2VINT ; @TEST Test Get VUID Ingredient for RxNorm CUI
     182 D CHKEQ^%ut($$RXN2VIN(1366467),4031768,"$$RXN2VIN failed")
    183183 QUIT
    184184 ;
     
    192192 Q C0PIEN_"^"_C0P01
    193193 ;
    194 VIN2VAGT ; @TEST - Test Get VA Generic for VUID Ingredient
    195  D CHKEQ^XTMUNIT(+$$VIN2VAG(4023636),2832,"$$VIN2VAG failed")
     194VIN2VAGT ; @TEST Test Get VA Generic for VUID Ingredient
     195 D CHKEQ^%ut(+$$VIN2VAG(4023636),2832,"$$VIN2VAG failed")
    196196 QUIT
    197197 ;
     
    218218 Q $$VIN2DIN($$RXN2VIN($$FDI2RXN(BASE)))
    219219 ;
    220 VUI2RXN(VUID) ; $$ Public - Get RXNCUI for VUID (any VUID type)
    221  ; Input: VUID By Value
    222  ; Output: RXNCUIs delimited by ^
    223  ; Get all entries whose code is the VUID and are in the VA NDF which are clinical drugs
    224  D FIND^DIC(176.001,,"@;.01","PQX",VUID,,"CODE","I $P(^(0),U,12,13)=""VANDF^CD""")
    225  ; Deserialise it into a single string
    226  ; ^TMP("DILIST",4844,0)="1^*^0^"
    227  ; ^TMP("DILIST",4844,0,"MAP")="IEN^.01"
    228  ; ^TMP("DILIST",4844,1,0)="1006351^1364462"
    229  N RXNS S RXNS=""
    230  N I F I=0:0 S I=$O(^TMP("DILIST",$J,I)) Q:'I  S RXNS=RXNS_$P(^(I,0),U,2)_U
    231  S RXNS=$E(RXNS,1,$L(RXNS)-1)
    232  QUIT RXNS
     220VUI2RXN(VUID,TTY) ; $$ Public Stephanie's Unified VUID searcher. Get RXNCUI given VUID
     221 ;GIVEN A VUID IN ONE OF SEVERAL FILES RETURN THE ASSOCIATED RXNORM CODE IN 176.001
     222 ; TTY="IN", "CD", or "PT"
     223 ;        IN = DRUG INGRIDENT FILE & VA GENERIC file
     224 ;        CD = VA PRODUCT FILE
     225 ;        PT = VA DRUG CLASS
     226 ;
     227 ; SAB="VANDF"
     228 ; CODE=VUID
     229 ;
     230 I $O(^C0CRXN(176.001,"STC","VANDF",TTY,VUID,"")) Q ^($O(^("")))
     231 Q ""
     232 ;
     233VUI2RXNT ; @TEST VUID to RxNorm CUI tests
     234 D CHKEQ^%ut($$VUI2RXN(4010151,"CD"),314231)
     235 D CHKEQ^%ut($$VUI2RXN(4020940,"IN"),16681)
     236 D CHKEQ^%ut($$VUI2RXN(4021568,"PT"),883)
     237 D CHKEQ^%ut($$VUI2RXN(1234234,"CD"),"")
     238 QUIT
    233239 ;
    234240VUI2GCN(VUID) ; $$ Public - Get GCNs for a given VUID (any VUID type)
     
    236242 ; Output: GCNs delimited by ^
    237243 ; TODO: Unit Test
    238  N RXNS S RXNS=$$VUI2RXN(VUID)
     244 N RXNS S RXNS=$$VUI2RXN(VUID,"AB")
    239245 Q:RXNS="" ""  ; VUID not a drug or ingredient (can be food)
    240246 N GCNS S GCNS=""
     
    251257 N VUID S VUID=+^PSNDF(50.68,VAP,"VUID")  ; Get VUID
    252258 I 'VUID S $EC=",U1," ; Must exist
    253  Q $$VUI2RXN(VUID)
     259 Q $$VUI2RXN(VUID,"AB")
    254260 ;
    255261MED2SCDN(DA) ; $$ Public - Medication to Semantic Clinical Drug Name
     
    258264 N RXNCUI S RXNCUI=$$MED2RXN(DA)
    259265 Q:'RXNCUI ""
     266 Q $$SCDNAME(RXNCUI)
     267 ;
     268SCDNAME(RXNCUI) ; $$ Public - Semantic Clinical Drug Name for RxNorm CUI
    260269 N IEN S IEN=$O(^C0CRXN(176.001,"STC","RXNORM","SCD",RXNCUI,""))  ; Let's try generic drug
    261270 I 'IEN S IEN=$O(^C0CRXN(176.001,"STC","RXNORM","SBD",RXNCUI,""))  ; Let's try non-bioequivalent Brands then
     
    265274 Q $P(^C0CRXN(176.001,IEN,0),U,15)
    266275 ;
     276ANYNAME(RXNCUI) ; $$ Public - Get the RxNorm name, no matter what it is
     277 N RESULT S RESULT=""
     278 N TTY S TTY=""
     279 F  S TTY=$O(^C0CRXN(176.001,"STC","RXNORM",TTY)) Q:TTY=""  D  Q:RESULT]""
     280 . N IEN S IEN=$O(^C0CRXN(176.001,"STC","RXNORM",TTY,RXNCUI,""))
     281 . Q:'IEN
     282 . S RESULT=$P(^C0CRXN(176.001,IEN,0),U,15)
     283 QUIT RESULT
     284 ;
    267285RXN2NDI(RXNCUI) ; $$ Public - Get NDDF Ingredient for RXNCUI
    268286 ; Input: RXNCUI By Value
     
    276294 ; Output: NDDF Base code
    277295 ; TODO:Not tested...
    278  Q $$RXN2NDI($$VUI2RXN(VUID))
     296 Q $$RXN2NDI($$VUI2RXN(VUID,"IN"))
    279297 ;
    280298 ; ---
     
    287305 N IEN S IEN=$O(^C0CRXN(176.002,"ASAA","RXNORM","NDC",NDC,"")) Q ^(IEN)
    288306 ;
    289 NDC2RXNT ; @TEST - Test Get RxCUI given the NDC & Get RxCUI given the 50.67 NDC
    290  D CHKEQ^XTMUNIT($$NDC2RXN("30142-0917-71"),198439,"$$NDC2RXN failed")
    291  D CHKEQ^XTMUNIT($$NDC2RXN2("000031868518","VANDF"),996520,"$$NDC2RXN2 failed")
     307NDC2RXNT ; @TEST Test Get RxCUI given the NDC & Get RxCUI given the 50.67 NDC
     308 D CHKEQ^%ut($$NDC2RXN("30142-0917-71"),198439,"$$NDC2RXN failed")
     309 D CHKEQ^%ut($$NDC2RXN2("000031868518","VANDF"),996520,"$$NDC2RXN2 failed")
    292310 QUIT
    293311 ;
     
    304322 ; Output: 0 or 1
    305323 Q ''$D(^C0CRXN(176.001,"STC","RXNORM","SBD",RXN))
    306 ISBRANDT ; @TEST - Test Is this RxCUI for a brand drug?
    307  D CHKEQ^XTMUNIT($$ISBRAND(205535),1,"$$ISBRAND failed") ; Brand Prozac
    308  D CHKEQ^XTMUNIT($$ISBRAND(310384),0,"$$ISBRAND failed") ; Generic Fluoxetine
     324ISBRANDT ; @TEST Test Is this RxCUI for a brand drug?
     325 D CHKEQ^%ut($$ISBRAND(205535),1,"$$ISBRAND failed") ; Brand Prozac
     326 D CHKEQ^%ut($$ISBRAND(310384),0,"$$ISBRAND failed") ; Generic Fluoxetine
    309327 QUIT
    310328 ;
     
    315333 ; Output: RxCUI of Generic
    316334 Q $O(^C0CRXN(176.005,"B",RXN,"has_tradename",""))
    317 BR2GENT ; @TEST - Test Convert Brand RxCUI to Generic RxCUI (many to 1)
    318  D CHKEQ^XTMUNIT($$BR2GEN(205535),310384,"$$BR2GEN failed")
     335BR2GENT ; @TEST Test Convert Brand RxCUI to Generic RxCUI (many to 1)
     336 D CHKEQ^%ut($$BR2GEN(205535),310384,"$$BR2GEN failed")
    319337 QUIT
    320338 ;
     
    327345 Q RTN
    328346 ;
    329 GEN2BRT ; @TEST - Test Convert Generic RxCUI to Brand RxCUIs (1 to many).
    330  D CHKTF^XTMUNIT($$GEN2BR(310384)[205535,"$$GEN2BR failed")
     347GEN2BRT ; @TEST Test Convert Generic RxCUI to Brand RxCUIs (1 to many).
     348 D CHKTF^%ut($$GEN2BR(310384)[205535,"$$GEN2BR failed")
    331349 QUIT
    332350 ;
     
    345363 . S BNS=BNS_$P(^C0CRXN(176.001,BNIEN,0),U,15)_U
    346364 QUIT $E(BNS,1,$L(BNS)-1)
    347 RXN2BNST ; @TEST - Test Get all Brand Names associated with an RXN
    348  D CHKTF^XTMUNIT($$RXN2BNS(205535)["Prozac","$$RXN2BNS failed")
    349  QUIT
    350  ;
    351  ; ---
    352  ;
    353 RXN2NDC(RXN) ; Get NDC codes for RxNorm code
     365RXN2BNST ; @TEST Test Get all Brand Names associated with an RXN
     366 D CHKTF^%ut($$RXN2BNS(205535)["Prozac","$$RXN2BNS failed")
     367 QUIT
     368 ;
     369 ; ---
     370 ;
     371RXN2NDC(RXN) ; $$ Public - Get NDC codes for RxNorm code
    354372 N NDCS S NDCS=""
    355373 N I F I=0:0 S I=$O(^C0CRXN(176.002,"ASAR","RXNORM","NDC",RXN,I)) Q:'I  S NDCS=NDCS_^(I)_"^"
    356374 S $E(NDCS,$L(NDCS))=""
    357375 QUIT NDCS
    358 RXN2NDCT ; @TEST - Test Get NDC codes for RxNorm code
    359  D CHKTF^XTMUNIT($$RXN2NDC(197379)["^"_16714003309,"$$RXN2NDC failed")
    360  QUIT
     376RXN2NDCT ; @TEST Test Get NDC codes for RxNorm code
     377 D CHKTF^%ut($$RXN2NDC(197379)["^"_16714003309,"$$RXN2NDC failed")
     378 QUIT
     379 ;
     380LVUID(RXN) ; $$ Public - Locate VUID, given RxNorm. Iterative Search
     381 ; ^C0CRXN(176.001,"STC","RXNORM","IN",46239,IEN
     382 N TTY S TTY=""
     383 N intermediateRxCUI
     384 N finalVUID
     385 i '$$EXIST(RXN) q "0^not found in RxNorm"
     386 ;
     387 F  S TTY=$O(^C0CRXN(176.001,"STC","RXNORM",TTY)) Q:TTY=""  D  q:$g(intermediateRxCUI)  q:$g(finalVUID)
     388 . N IEN S IEN=$O(^C0CRXN(176.001,"STC","RXNORM",TTY,RXN,""))
     389 . I 'IEN quit  ; s err="0^not found in RxNorm" quit
     390 . ; W ^C0CRXN(176.001,IEN,0),!
     391 . I TTY="BN" s intermediateRxCUI=$$BR2GEN(RXN) quit  ; try searching with generic
     392 . I TTY="IN"!(TTY="MIN") s finalVUID=$$RXN2VIN(RXN) quit         ; match VUID
     393 . I TTY="PIN" s intermediateRxCUI=$$formOf(RXN) quit  ; try searching with ingredient
     394 . I TTY="SCD" d
     395 .. s finalVUID=$$RXN2VUI(RXN)
     396 .. i finalVUID="" s finalVUID=$$containerOf(RXN)
     397 .. I finalVUID="" s finalVUID=$$tradeName(RXN)
     398 . I TTY="GPCK" d
     399 .. s finalVUID=$$tradeName(RXN)
     400 i $get(intermediateRxCUI) q $$LVUID(intermediateRxCUI) ; recurse
     401 i $get(finalVUID) quit finalVUID
     402 quit "0^no mapping found in RxNorm"
     403 ;
     404formOf(RXN) ; RXN is form of result
     405 q $o(^C0CRXN(176.005,"B",RXN,"has_form",""))
     406containerOf(RXN) ; loop through all contains and see if one hits it.
     407 n container
     408 n vuid s vuid=""
     409 f container=0:0 s container=$o(^C0CRXN(176.005,"B",RXN,"contains",container)) q:'container  d  q:$g(vuid)
     410 . s vuid=$$RXN2VUI(container)
     411 quit vuid
     412tradeName(RXN) ; loop through all tradenames and see if there's a match
     413 n vuid s vuid=""
     414 n tncui f tncui=0:0 s tncui=$o(^C0CRXN(176.005,"B",RXN,"tradename_of",tncui)) q:'tncui  d  q:$g(vuid)
     415 . s vuid=$$RXN2VUI(tncui)
     416 quit vuid
     417 ;
     418loopVUIDs ; [Public] Paste VUIDs to get the RxNorm Numbers
     419 ; ZEXCEPT: DTIME
     420 n rxn
     421 f  r rxn:$g(DTIME,300) q:rxn=""  q:rxn=$c(4)  d
     422 . w "|"
     423 . w $$LVUID(rxn),"|",$$ANYNAME(rxn),!
     424 quit
Note: See TracChangeset for help on using the changeset viewer.