Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: LEXU6

LEXU6.m

Go to the documentation of this file.
  1. LEXU6 ;ISL/KER - Miscellaneous Lexicon Utilities ;05/23/2017
  1. ;;2.0;LEXICON UTILITY;**80,86,103**;Sep 23, 1996;Build 2
  1. ;
  1. ; Global Variables
  1. ; ^LEX(757.001) N/A
  1. ; ^TMP("LEXSCH") SACC 2.3.2.5.1
  1. ; ^TMP("LEXTKN") SACC 2.3.2.5.1
  1. ;
  1. ; External References
  1. ; $$DT^XLFDT ICR 10103
  1. ; $$FMADD^XLFDT ICR 10103
  1. ; $$FMDIFF^XLFDT ICR 10103
  1. ; $$FMTE^XLFDT ICR 10103
  1. ; $$GET1^DIQ ICR 2056
  1. ; ^DIC ICR 10006
  1. ;
  1. SC(LEX,LEXS,LEXVDT) ; Filter by Semantic Class
  1. ;
  1. ; Input
  1. ;
  1. ; LEX IEN of file 757.01
  1. ; LEXS Filter
  1. ; LEXVDT Date to use for screening by codes
  1. ;
  1. ; Output
  1. ;
  1. ; $$SC 1/0
  1. ;
  1. N LEXINC,LEXEXC,LEXIC,LEXEC,LEXRREC,X D VDT^LEXU
  1. S LEXRREC=LEX Q:'$D(^LEX(757.01,LEXRREC,0)) 0
  1. I $L(LEXS,";")=3,$P(LEXS,";",3)'="" D Q:+LEXINC>0 LEXINC
  1. . S LEXINC=0 S LEXINC=$$SO(LEXRREC,$P(LEXS,";",3),$G(LEXVDT))
  1. S LEXRREC=$P(^LEX(757.01,LEXRREC,1),U,1)
  1. S LEXINC=0 F LEXIC=1:1:$L($P(LEXS,";",1),"/") D
  1. . N LEXP,LEX1,LEX2 S LEXP=$P($P(LEXS,";",1),"/",LEXIC)
  1. . S LEX1=$D(^LEX(757.1,"AMCC",LEXRREC,LEXP))
  1. . S LEX2=$D(^LEX(757.1,"AMCT",LEXRREC,LEXP))
  1. . I LEX1!(LEX2) D
  1. . . S LEXINC=1,LEXIC=$L($P(LEXS,";",1),"/")+1
  1. I LEXINC=0!($P(LEXS,";",2)="") K LEXIC,LEXS,LEXEC Q LEXINC
  1. S LEXEXC=0 F LEXEC=1:1:$L($P(LEXS,";",2),"/") D
  1. . N LEXP,LEX1,LEX2 S LEXP=$P($P(LEXS,";",2),"/",LEXEC)
  1. . S LEX1=$D(^LEX(757.1,"AMCC",LEXRREC,LEXP))
  1. . S LEX2=$D(^LEX(757.1,"AMCT",LEXRREC,LEXP))
  1. . I LEX1!(LEX2) D
  1. . . S LEXEXC=1,LEXEC=$L($P(LEXS,";",2),"/")+1
  1. I LEXINC,'LEXEXC K LEXIC,LEXS,LEXEC Q 1
  1. K LEXIC,LEXS,LEXEC
  1. Q 0
  1. SO(LEX,LEXS,LEXVDT) ; Filter by Source
  1. ;
  1. ; Input
  1. ;
  1. ; LEX IEN of file 757.01
  1. ; LEXS Filter
  1. ; LEXVDT Date to use for screening by codes
  1. ;
  1. ; Output
  1. ;
  1. ; $$SO 1/0
  1. ;
  1. N LEXABR,LEXCR,LEXF,LEXMC,LEXMCE,LEXN0,LEXSAB,LEXSO,LEXSR,LEXSTA,LEXTR
  1. S LEXTR=+LEX,LEXF=0 Q:'$D(^LEX(757.01,LEXTR,0)) LEXF
  1. Q:'$D(^LEX(757.01,LEXTR)) LEXF
  1. S LEXMC=$P(^LEX(757.01,LEXTR,1),U,1)
  1. S LEXMCE=+(^LEX(757,+($P(^LEX(757.01,LEXTR,1),U,1)),0))
  1. D VDT^LEXU I LEXTR>0,LEXMCE>0,LEXTR=LEXMCE D G SOQ
  1. . S LEXF=0 F LEXSR=1:1:$L(LEXS,"/") D Q:LEXF>0
  1. . . S LEXABR=$P(LEXS,"/",LEXSR),LEXCR=0
  1. . . F S LEXCR=$O(^LEX(757.02,"AMC",LEXMC,LEXCR)) Q:+LEXCR=0 D Q:LEXF>0
  1. . . . N LEXN0,LEXSAB,LEXQ S LEXQ=0
  1. . . . S LEXN0=$G(^LEX(757.02,LEXCR,0))
  1. . . . S LEXSAB=+($P(LEXN0,U,3)),LEXSO=$P(LEXN0,U,2)
  1. . . . I $G(LEXLKT)["BC" D Q:LEXQ
  1. . . . . N LEXNAR S LEXNAR=$G(^TMP("LEXSCH",$J,"NAR",0))
  1. . . . . I $L($G(LEXNAR)) S:$E(LEXSO,1,$L($G(LEXNAR)))'=$G(LEXNAR) LEXQ=1
  1. . . . S LEXSTA=$$STATCHK^LEXSRC2(LEXSO,$G(LEXVDT),,LEXSAB)
  1. . . . Q:+LEXSTA'>0 Q:$P(LEXSTA,U,2)'=LEXCR
  1. . . . Q:'$D(^LEX(757.03,LEXSAB,0))
  1. . . . S LEXSAB=$E(^LEX(757.03,LEXSAB,0),1,3)
  1. . . . I LEXSAB=LEXABR S LEXF=1
  1. SOQ ; Quit Source Filter
  1. K LEXCR,LEXMC,LEXMCE,LEXN0,LEXSAB,LEXABR,LEXSO,LEXSR,LEXSTA,LEXTR
  1. Q LEXF
  1. SOS(X,ARY,SYN) ; Sources for Expression
  1. ;
  1. ; Input
  1. ; X Internal Entry Number Expression file #757.01
  1. ; .ARY Local Array Name passed by Reference
  1. ; SYN Include codes mapped via a Synonym
  1. ;
  1. ; Output
  1. ; ARY(IEN) IEN is from file #757.01 (same as X)
  1. ; ARY(IEN,0) Number of Codes Found
  1. ; ARY(IEN,#) # is a sequence number
  1. ;
  1. ; Equals an 13 Piece "^" delimited string
  1. ;
  1. ; 1 Code
  1. ; 2 Coding System Nomenclature
  1. ; 3 Coding System Source Abbreviation
  1. ; 4 Code Status
  1. ; 5 Code Active Date
  1. ; 6 Code Inactive Date
  1. ; 7 Expression Status
  1. ; 8 Expression Active Date
  1. ; 9 Expression Inactive Date
  1. ; 10 Expression Variable Pointer
  1. ; 11 Code Variable Pointer
  1. ; 12 Coding System Variable Pointer
  1. ; 13 National File Variable Pointer (if it exist)
  1. ;
  1. ; Array has two indexes
  1. ;
  1. ; ARY(IEN,"B",(CODE_" "),#)=Code_"^"_Nomenclature
  1. ; ARY(IEN,"C",SOURCE,#)=Code_"^"_Nomenclature
  1. ;
  1. N LEXCT,LEXCIEN,LEXEIEN,LEXI,LEXSIEN,LEXSF S LEXCT=0,(LEXCIEN,LEXEIEN)=+($G(X)) Q:+LEXEIEN'>0 0
  1. Q:'$D(^LEX(757.01,+($G(LEXEIEN)),0)) 0 K ARY(LEXCIEN)
  1. Q:'$D(^LEX(757.01,+LEXEIEN,0)) 0 Q:'$D(^LEX(757.02,"B",+LEXEIEN)) 0 S LEXSIEN=0,LEXSF=+($G(SYN))
  1. ; Codes for an Expression
  1. I +LEXSF'>0 D
  1. . S LEXSIEN=0 F S LEXSIEN=$O(^LEX(757.02,"B",+LEXEIEN,LEXSIEN)) Q:+LEXSIEN'>0 D SOSE
  1. ; Codes for an Major Concept
  1. I +LEXSF>0 D
  1. . N LEXTMIEN S LEXTMIEN=+($G(^LEX(757.01,+LEXEIEN,1))) S LEXSIEN=0
  1. . F S LEXSIEN=$O(^LEX(757.02,"AMC",+LEXTMIEN,LEXSIEN)) Q:+LEXSIEN'>0 D
  1. . . S LEXEIEN=+($G(^LEX(757.02,+LEXSIEN,0))) D SOSE
  1. S (LEXI,LEXCT)=0 F S LEXI=$O(ARY(LEXCIEN,LEXI)) Q:+LEXI'>0 S LEXCT=LEXCT+1 S ARY(+LEXCIEN,0)=LEXCT
  1. K ARY(LEXCIEN,"D") S X=LEXCT S:+LEXCT>0 ARY(+LEXCIEN,0)=LEXCT
  1. Q X
  1. SOSE ; Build array of Sources for Expression
  1. N LEXACT,LEXCVP,LEXEVP,LEXEXA,LEXEXI,LEXEXS,LEXINA,LEXNAT,LEXNIEN,LEXNOM,LEXNUM,LEXO,LEXSAB,LEXSO,LEXSRC,LEXSTA,LEXSVP
  1. S (LEXNAT,LEXEVP,LEXCVP,LEXSVP)="",LEXSO=$G(^LEX(757.02,+LEXSIEN,0)),LEXSRC=$P(LEXSO,"^",3)
  1. S LEXSAB=$P($G(^LEX(757.03,+LEXSRC,0)),"^",1) Q:'$L(LEXSAB) S LEXNOM=$P($G(^LEX(757.03,+LEXSRC,0)),"^",2) Q:'$L(LEXNOM)
  1. S LEXSO=$P(LEXSO,"^",2) Q:$E(LEXSO,1,4)="U000" S:+($G(LEXEIEN))>0 LEXEVP=+($G(LEXEIEN))_";LEX(757.01,"
  1. S:+($G(LEXSIEN))>0 LEXCVP=+($G(LEXSIEN))_";LEX(757.02," S:+($G(LEXSRC))>0 LEXSVP=+($G(LEXSRC))_";LEX(757.03,"
  1. I LEXSRC=1!(LEXSRC=30) S LEXNIEN=$$CODEN^ICDEX(LEXSO,80) S:+LEXNIEN>0 LEXNAT=+LEXNIEN_";ICD9("
  1. I LEXSRC=2!(LEXSRC=31) S LEXNIEN=$$CODEN^ICDEX(LEXSO,80.1) S:+LEXNIEN>0 LEXNAT=+LEXNIEN_";ICD0("
  1. I LEXSRC=3!(LEXSRC=4) S LEXNIEN=$$CODEN^ICPTCOD(LEXSO) S:+LEXNIEN>0 LEXNAT=+LEXNIEN_";ICPT("
  1. S LEXSTA=$$SOAI(LEXSO,LEXSRC),LEXACT=$P(LEXSTA,"^",2),LEXINA=$P(LEXSTA,"^",3),LEXSTA=+$P(LEXSTA,"^",1)
  1. S LEXEXA=$$EXAI(LEXSIEN),LEXEXS=+($P(LEXEXA,"^",1)),LEXEXI=$P(LEXEXA,"^",3),LEXEXA=$P(LEXEXA,"^",2)
  1. S LEXO=LEXSO_"^"_LEXNOM_"^"_LEXSAB S:$L($G(LEXSTA)) $P(LEXO,"^",4)=$G(LEXSTA)
  1. S:$L($G(LEXACT)) $P(LEXO,"^",5)=$G(LEXACT) S:$L($G(LEXINA)) $P(LEXO,"^",6)=$G(LEXINA)
  1. S:$L($G(LEXEXS)) $P(LEXO,"^",7)=$G(LEXEXS) S:$L($G(LEXEXA)) $P(LEXO,"^",8)=$G(LEXEXA)
  1. S:$L($G(LEXEXI)) $P(LEXO,"^",9)=$G(LEXEXI) S:$L($G(LEXEVP)) $P(LEXO,"^",10)=$G(LEXEVP)
  1. S:$L($G(LEXCVP)) $P(LEXO,"^",11)=$G(LEXCVP) S:$L($G(LEXSVP)) $P(LEXO,"^",12)=$G(LEXSVP)
  1. S:$L($G(LEXNAT)) $P(LEXO,"^",13)=$G(LEXNAT)
  1. S LEXNUM=$O(ARY(LEXCIEN,"D",LEXSIEN," "),-1)
  1. S:LEXNUM'>0 LEXNUM=$O(ARY(LEXCIEN,"B",(LEXSO_" "),0))
  1. S:LEXNUM'>0 LEXNUM=$O(ARY(LEXCIEN," "),-1)+1
  1. S:'$D(ARY(LEXCIEN,+LEXNUM)) LEXCT=LEXCT+1
  1. S ARY(LEXCIEN,+LEXNUM)=LEXO,ARY(LEXCIEN,"D",LEXSIEN,LEXNUM)=""
  1. S ARY(LEXCIEN,"B",(LEXSO_" "),LEXNUM)=LEXSO_"^"_LEXNOM,ARY(LEXCIEN,"C",+LEXSRC,LEXNUM)=LEXSO_"^"_LEXNOM
  1. Q
  1. SOAI(X,Y) ; Source Status, Activation and Inactivation
  1. N LEXACT,LEXEF,LEXINA,LEXSIEN,LEXSO,LEXSRC,LEXSTA S LEXSO=$G(X),LEXSRC=+($G(Y))
  1. Q:'$L(LEXSO) "" Q:+LEXSRC'>0 "" Q:'$D(^LEX(757.03,+LEXSRC,0)) "" S (LEXSTA,LEXACT,LEXINA)=""
  1. S LEXEF="" F S LEXEF=$O(^LEX(757.02,"ACT",(LEXSO_" "),3,LEXEF)) Q:'$L(LEXEF) D
  1. . N LEXSIEN S LEXSIEN=0 F S LEXSIEN=$O(^LEX(757.02,"ACT",(LEXSO_" "),3,LEXEF,LEXSIEN)) Q:+LEXSIEN'>0 D
  1. . . Q:$P($G(^LEX(757.02,+LEXSIEN,0)),"^",3)'=+LEXSRC S:'$L(LEXACT)!(LEXEF<LEXACT) LEXACT=LEXEF
  1. S LEXEF="" F S LEXEF=$O(^LEX(757.02,"ACT",(LEXSO_" "),2,LEXEF)) Q:'$L(LEXEF) D
  1. . N LEXSIEN S LEXSIEN=0 F S LEXSIEN=$O(^LEX(757.02,"ACT",(LEXSO_" "),2,LEXEF,LEXSIEN)) Q:+LEXSIEN'>0 D
  1. . . Q:$P($G(^LEX(757.02,+LEXSIEN,0)),"^",3)'=+LEXSRC S:'$L(LEXINA)!(LEXEF>LEXINA) LEXINA=LEXEF
  1. S:+($G(LEXACT))'>+($G(LEXINA)) LEXSTA=0 S:+($G(LEXACT))>+($G(LEXINA)) LEXINA="",LEXSTA=1
  1. S X=LEXSTA_"^"_LEXACT_"^"_LEXINA
  1. Q X
  1. EXAI(X) ; Expression Activation and Inactivation
  1. N LEXACT,LEXEF,LEXINA,LEXSIEN,LEXSTA S LEXSIEN=$G(X) Q:+LEXSIEN'>0 "" S (LEXSTA,LEXACT,LEXINA)=""
  1. S LEXEF="" F S LEXEF=$O(^LEX(757.02,+($G(LEXSIEN)),4,"B",LEXEF)) Q:'$L(LEXEF) D
  1. . N LEXHIS S LEXHIS=0 F S LEXHIS=$O(^LEX(757.02,+($G(LEXSIEN)),4,"B",LEXEF,LEXHIS)) Q:+LEXHIS'>0 D
  1. . . N LEXDT,LEXND,LEXST S LEXND=$G(^LEX(757.02,+($G(LEXSIEN)),4,+LEXHIS,0)),LEXST=$P(LEXND,"^",2),LEXDT=$P(LEXND,"^",1)
  1. . . S:LEXST=1&(+($G(LEXDT))>+($G(LEXACT))) LEXACT=+($G(LEXDT)) S:LEXST=0&(+($G(LEXDT))>+($G(LEXINA))) LEXINA=+($G(LEXDT))
  1. S:+($G(LEXACT))'>+($G(LEXINA)) LEXSTA=0 S:+($G(LEXACT))>+($G(LEXINA)) LEXINA="",LEXSTA=1 S X=LEXSTA_"^"_LEXACT_"^"_LEXINA
  1. Q X
  1. EXM(X,LEX,LEXD,LEXM) ; Exact Match
  1. ;
  1. ; Input
  1. ;
  1. ; X Text to Search for (required)
  1. ; LEX Local Array Passed by Reference (will be killed)
  1. ; LEXD Boolean Flag - Deactivated Terms (optional)
  1. ; 1 Include deactivated terms
  1. ; 0 Do not include deactivated terms (default)
  1. ; LEXM Boolean Flag - Major Concepts (optional)
  1. ; 1 Include Major Concepts ONLY
  1. ; 0 Include all (default); Major Concepts, Synonyms,
  1. ; Lexical Variants and Fully Specified Names
  1. ;
  1. ; Output
  1. ;
  1. ; $$EXM Number of exact matches found
  1. ; LEX Ouput Local Array Passed by Reference
  1. ;
  1. ; LEX(0) 2 piece "^" dilimited string
  1. ; 1 Total Exact Matches found
  1. ; 2 Text Searched for
  1. ;
  1. ; LEX(#) 5 piece "^" dilimited string
  1. ; 1 IEN of Exact Match Expression
  1. ; 2 IEN of Major Concept for Expression
  1. ; 3 Type of Exact Match Expression (internal)
  1. ; 4 Deactivation Flag (internal)
  1. ; 5 Type of Exact Match Expression (external)
  1. ;
  1. K LEX N LEXCTL,LEXIEN,LEXINC,LEXMCO,LEXORD,LEXORG,LEXTXT,LEXCT
  1. S LEXORG=$G(X),LEXTXT=$$UP^XLFSTR(LEXORG) Q:$L(LEXTXT)<2 "" S LEXCTL=$E(LEXTXT,1,62),LEXCT=0
  1. S LEXINC=+($G(LEXD)),LEXMCO=+($G(LEXM)),LEXORD=$E(LEXCTL,1,($L(LEXCTL)-1))_$C($A($E(LEXCTL,$L(LEXCTL)))-1)_"~"
  1. F S LEXORD=$O(^LEX(757.01,"B",LEXORD)) Q:'$L(LEXORD) Q:$E(LEXORD,1,$L(LEXCTL))'=LEXCTL D
  1. . N LEXIEN S LEXIEN=0 F S LEXIEN=$O(^LEX(757.01,"B",LEXORD,LEXIEN)) Q:+LEXIEN'>0 D
  1. . . N LEXTY,LEXDF,LEXEXP,LEXMC,LEXTN,LEXI S LEXEXP=$G(^LEX(757.01,+LEXIEN,0)) Q:$$UP^XLFSTR(LEXEXP)'=LEXTXT
  1. . . S LEXTY=$P($G(^LEX(757.01,+LEXIEN,1)),"^",2),LEXDF=$P($G(^LEX(757.01,+LEXIEN,1)),"^",5)
  1. . . Q:LEXTY'=1&(+($G(LEXMCO))>0) Q:LEXDF>0&(+($G(LEXINC))'>0)
  1. . . S LEXTN=$S(LEXTY=1:"Major Concept",LEXTY=3:"Lexical Variant",LEXTY=8:"Fully Specified Name",1:"Synonym")
  1. . . S:LEXDF>0 LEXTN="Deactivated "_LEXTN S LEXMC=+($P($G(^LEX(757.01,+LEXIEN,1)),"^",1))
  1. . . S LEXI=$O(LEX(" "),-1)+1,LEX(LEXI)=LEXIEN_"^"_LEXMC_"^"_LEXTY_"^"_LEXDF_"^"_LEXTN,LEX(0)=LEXI_"^"_LEXORG
  1. I LEXINC>0 D
  1. . S LEXINC=+($G(LEXD)),LEXMCO=+($G(LEXM)),LEXORD=$E(LEXCTL,1,($L(LEXCTL)-1))_$C($A($E(LEXCTL,$L(LEXCTL)))-1)_"~"
  1. . F S LEXORD=$O(^LEX(757.01,"ADTERM",LEXORD)) Q:'$L(LEXORD) Q:$E(LEXORD,1,$L(LEXCTL))'=LEXCTL D
  1. . . N LEXIEN S LEXIEN=0 F S LEXIEN=$O(^LEX(757.01,"ADTERM",LEXORD,LEXIEN)) Q:+LEXIEN'>0 D
  1. . . . N LEXTY,LEXDF,LEXEXP,LEXMC,LEXTN,LEXI S LEXEXP=$G(^LEX(757.01,+LEXIEN,0)) Q:$$UP^XLFSTR(LEXEXP)'=LEXTXT
  1. . . . S LEXTY=$P($G(^LEX(757.01,+LEXIEN,1)),"^",2),LEXDF=$P($G(^LEX(757.01,+LEXIEN,1)),"^",5)
  1. . . . Q:LEXTY'=1&(+($G(LEXMCO))>0) Q:LEXDF>0&(+($G(LEXINC))'>0)
  1. . . . S LEXTN=$S(LEXTY=1:"Major Concept",LEXTY=3:"Lexical Variant",LEXTY=8:"Fully Specified Name",1:"Synonym")
  1. . . . S:LEXDF>0 LEXTN="Deactivated "_LEXTN S LEXMC=+($P($G(^LEX(757.01,+LEXIEN,1)),"^",1))
  1. . . . S LEXI=$O(LEX(" "),-1)+1,LEX(LEXI)=LEXIEN_"^"_LEXMC_"^"_LEXTY_"^"_LEXDF_"^"_LEXTN,LEX(0)=LEXI_"^"_LEXORG
  1. S X=+($G(LEX(0)))
  1. Q X