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

PSSPGX.m

Go to the documentation of this file.
PSSPGX ;BIR/MV - PHARMACOGENOMICS API ;09/20/07
 ;;1.0;PHARMACY DATA MANAGEMENT;**262**;9/30/97;Build 66
 ;
 ; Reference to ^MXMLDOM is supported by DBIA #3561
 ;
PGXOPT(PSSBASE,PSSDRUGS,PSSGENES,PSSOUT) ;PHARMACOGENOMIC (PGx) TEST OPTION
 ;PSSBASE  = Name of subscript(ex: PSSPGX) [require]
 ;  PSSDRUGS(PSSIEN,"DRUGNAME")=Drug name [require] ;PSSIEN of file 50
 ;  PSSDRUGS(PSSIEN,"GCN")=GCNSEQNO [require]
 ;  PSSDRUGS(PSSIEN,"VUID")=VUID [require]
 ;PSSGENES  = Genetic test array for PGX order checks.
 ;  PSSGENES(GENE,"GENE")="" [require]
 ;  PSSGENES(GENE,"GENOTYPE")=VINCI_Genotype - ex: PSSGENES(CYP2D6,"GENOTYPE")="*>*9/*10"
 ;  PSSGENES(GENE,"PHENOTYPE")=VINCI_Phenotype - ex: PSSGENES(CYP2D6,"PHENOTYPE")="INTERMEDIATE/NORMAL/ULTRARAPID METABOLIZER"  
 ;  PSSGENES(GENE,"ACTIVITY_SCORE")=VINCI_ActivityScore - ex: PSSGENES(CYP2D6,"ACTIVITY_SCORE")="1-3"
 ;PSSOUT = 1 for successful; results are stored in ^TMP($J,"PSSPGX")
 ;         -1^error message (ex: -1^ERROR #6059: Unable to open TCP/IP socket...
 NEW PSSPGXDG,PSSNOGCN
 K ^TMP($J,"OUT XML"),^TMP(PSSBASE,$J),^TMP($J,"PSSXWARN"),^TMP("PSSPGXBS",$J)
 S PSSOPTFG=1 ;not building the ^TMP($J,"PSSXWARN")
 D PGXMAIN^PSSPGX1(PSSBASE,.PSSGENES,.PSSDRUGS,.PSSOUT)
 Q
 ;
PGXOC(PSSBASE,PSSDFN,PSSDRUGS,PSSOUT,PSSPGXPK) ;Pharmacogenomics findings for Inpatient, Outpatient, CPRS(?)
 ;PSSBASE = Name of subscript(ex: PSJPGX, PSOPGX, or ORPGX) [require]
 ;PSSDFN  = Patient DFN
 ;PSSDRUGS(IEN)= Dispense drug array from file 50 [require]
 ;PSSOUT  = 1 for successful; results are stored in ^TMP($J,"PSSPGX")
 ;          -1^error message (ex: -1^ERROR #6059: Unable to open TCP/IP socket...
 NEW PSSPGXDG,PSSNOGCN,PSSHDRFG,PSSFDBFG,PSSOUT,PSSGENES,PSSPTLAB,PSSGDT,PSSGTBL,PSSURL,PSSPERR
 I (+$$CHKSTAT^PSSDSFDB()=-1),'+$G(PSSOPTFG) Q
 S PSSDFN=+$G(PSSDFN)
 I $G(PSSBASE)="" S PSSBASE="PSSPGX"
 K ^TMP($J,"OUT XML"),^TMP(PSSBASE,$J),^TMP($J,"PSSXWARN"),^TMP("PSSPGXBS",$J)
 ;Defined the drugs list to send FDB (this list only include PGx eligible drugs).
 D SETDRUG(.PSSDRUGS,.PSSPGXDG,.PSSNOGCN) ;PSSNOGCN(IEN)= Drug IEN without GCNSEQNO
 I '$D(PSSPGXDG) Q
 S PSSHDRFG=0
 ;Get patient PGx lab data from HDR (this call checks for Gene and phenotype that map to FDB, use HDR value if can't find match)
 S PSSOUT=$$GETPGXRESULTS^PSSHDPG1(PSSDFN,.PSSPTLAB)
 D PTLAB(.PSSPTLAB) ;Build genes list
 S:+PSSOUT=-1 PSSHDRFG=1  ;PSSPGXPR checks PSSHDRFG to add HDR error message in the PGx display.
 S PSSOUT=""
 ;Get FDB PGx result
 D PGXMAIN^PSSPGX1(PSSBASE,.PSSGENES,.PSSPGXDG,.PSSOUT)
 Q
 ;
SETDRUG(PSSDRUGS,PSSPGXDG,PSSNOGCN) ;Setup PSSPGXDG array of drug list to send to FDB
 ;Input PSSDRUGS - List of drug(s) from calling applications for PGx check
 ;  PSSDRUGS(IEN)="" [require]
 ;  PSSDRUGS(IEN,"DRUGNAME")=Drug name
 ;  PSSDRUGS(IEN,"GCN")=GCNSEQNO
 ;Set PSSPGXDG - Only includes PGx eligibilty & have GCNseqno drugs (XML is build using these value0
 ;  PSSPGXDG(IEN,"DRUGNAME")=Drug name
 ;  PSSPGXDG(IEN,"GCN")=GCNSEQNO
 ;  PSSPGXDG(IEN,"VUID")=VUID 
 ;PSSNOGCN - array of drug without GCNSEQNO (ex. PSSNOGCN(IEN)="")
 NEW PSSGCN,PSSIEN,PSSVAPRD,PSSVUID,PSSPGXOC
 I '+$D(PSSDRUGS) Q
 F PSSIEN=0:0 S PSSIEN=$O(PSSDRUGS(PSSIEN)) Q:'+PSSIEN  D
 . S (PSSVAPRD,PSSGCN,PSSVUID,PSSPGXOC)=""
 . S PSSVAPRD=$P($G(^PSDRUG(+PSSIEN,"ND")),U,3)
 . I +PSSVAPRD D
 .. S PSSPGXOC=+$$PGX^PSNAPIS("",PSSVAPRD) ;1 is PGx eligible - 50.68)
 .. S PSSGCN=+$P($G(^PSNDF(50.68,+PSSVAPRD,1)),U,5)
 .. S PSSVUID=$P($G(^PSNDF(50.68,+PSSVAPRD,"VUID")),U)
 . I '+$G(PSSGCN) S PSSNOGCN(PSSIEN)="" Q
 . ;I +'PSSPGXOC!+PSSPGXOC D  ;1 is PGx eligible. for now check for 0 or 1 since all return zero *********
 . I +PSSPGXOC D
 .. S PSSPGXDG(PSSIEN,"GCN")=PSSGCN
 .. S PSSPGXDG(PSSIEN,"VUID")=$G(PSSVUID)
 .. S PSSPGXDG(PSSIEN,"DRUGNAME")=$S($G(PSSDRUGS(PSSIEN,"DRUGNAME"))]"":PSSDRUGS(PSSIEN,"DRUGNAME"),1:$P($G(^PSDRUG(PSSIEN,0)),U,1))
 Q
 ;
PTLAB(PSSPTLAB) ;Setup PSSGDT and PSSGENES arrays
 ;PSSPTLAB(GENE,CNT,"ACTIVITY_SCORE")
 ;PSSPTLAB(GENE,CNT,"GENOTYPE")
 ;PSSPTLAB(GENE,CNT,"NPP_SharePointURL")
 ;PSSPTLAB(GENE,CNT,"PHENOTYPE")
 ;PSSPTLAB(GENE,CNT,"RESULT_DATE")
 Q:'$D(PSSPTLAB)
 ;PSSGDT(-RESULT_DATE,GENE,...where dates are in reverse)
 D GENEDT(.PSSPTLAB)
 ;PSSGENES(GENE,...if dupl gene exists only include the gene with the latest date)
 D GENELST(.PSSGDT)
 Q
 ;
GENEDT(PSSPTLAB) ;Sort genes list by decending result_date
 NEW PSSCNT,PSSGENE,PSSLABDT,PSSFMDT
 Q:'$D(PSSPTLAB)
 S PSSGENE="" F  S PSSGENE=$O(PSSPTLAB(PSSGENE)) Q:PSSGENE=""  D
 . F PSSCNT=0:0 S PSSCNT=$O(PSSPTLAB(PSSGENE,PSSCNT)) Q:'PSSCNT  D
 .. S PSSLABDT=$G(PSSPTLAB(PSSGENE,PSSCNT,"RESULT_DATE"))
 .. Q:PSSLABDT=""
 .. S PSSFMDT=$$DTCNV(PSSLABDT)
 .. S PSSGDT(-PSSFMDT,PSSGENE,"RESULT_DATE")=$$FMTE^XLFDT(PSSFMDT,"2S")
 .. S PSSGDT(-PSSFMDT,PSSGENE,"GENOTYPE")=$G(PSSPTLAB(PSSGENE,PSSCNT,"GENOTYPE"))
 .. S PSSGDT(-PSSFMDT,PSSGENE,"PHENOTYPE")=$G(PSSPTLAB(PSSGENE,PSSCNT,"PHENOTYPE"))
 .. S PSSGDT(-PSSFMDT,PSSGENE,"ACTIVITY_SCORE")=$G(PSSPTLAB(PSSGENE,PSSCNT,"ACTIVITY_SCORE"))
 .. S PSSGDT(-PSSFMDT,PSSGENE,"NPP_SharePointURL")=$G(PSSPTLAB(PSSGENE,PSSCNT,"NPP_SharePointURL"))
 .. S PSSURL=PSSGDT(-PSSFMDT,PSSGENE,"NPP_SharePointURL")
 Q
 ;
GENELST(PSSGDT) ;Sort by genes
 ;PSSGDT array - sorting with RESULT_DATE in reverse order. Ex: PSSGDT(-3170312,"CYP2C19","ACTIVITY_SCORE")=""
 ;PSSGENES array - Ex: PSSGENE(GENE,"GENE")
 NEW PSSLABDT,PSSGENE
 Q:'$D(PSSGDT)
 S PSSLABDT="" F  S PSSLABDT=$O(PSSGDT(PSSLABDT)) Q:PSSLABDT=""  D
 . S PSSGENE="" F  S PSSGENE=$O(PSSGDT(PSSLABDT,PSSGENE)) Q:PSSGENE=""  D
 .. I $D(PSSGENES(PSSGENE,"GENE")) Q  ;Only keep a gene from the latest result_date
 .. S PSSGENES(PSSGENE,"GENE")=""
 .. S PSSGENES(PSSGENE,"GENOTYPE")=$G(PSSGDT(PSSLABDT,PSSGENE,"GENOTYPE"))
 .. S PSSGENES(PSSGENE,"PHENOTYPE")=$G(PSSGDT(PSSLABDT,PSSGENE,"PHENOTYPE"))
 .. S PSSGENES(PSSGENE,"ACTIVITY_SCORE")=$G(PSSGDT(PSSLABDT,PSSGENE,"ACTIVITY_SCORE"))
 .. S PSSGENES(PSSGENE,"RESULT_DATE")=$G(PSSGDT(PSSLABDT,PSSGENE,"RESULT_DATE"))
 .. S PSSGENES(PSSGENE,"NPP_SharePointURL")=$G(PSSGDT(PSSLABDT,PSSGENE,"NPP_SharePointURL"))
 Q
 ;
DTCNV(PSSEDT) ;Converse external date to Fileman internal date
 ;PSSEDT - External format (ex: 06/13/2024)
 NEW PSSFMDT
 Q:$G(PSSEDT)="" "ERROR"
 S PSSFMDT=($P(PSSEDT,"/",3)-1700)_$P(PSSEDT,"/")_$P(PSSEDT,"/",2)
 Q PSSFMDT
 ;
GENETBL(PSSGDT) ;
 NEW PSSGENE,PSSCNT,PSSAS,PSSLABDT,PSSGENTP
 Q:'$D(PSSGDT)
 S PSSGTBL(1)="The patient has the following PGx labs:"
 S PSSGTBL(2)=""
 S PSSGTBL(3)="                    Activity"
 S PSSGTBL(4)="Lab Date   Gene      Score   Phenotype"
 S PSSCNT=4
 S PSSLABDT="" F  S PSSLABDT=$O(PSSGDT(PSSLABDT)) Q:PSSLABDT=""  D
 . S PSSGENE="" F  S PSSGENE=$O(PSSGDT(PSSLABDT,PSSGENE)) Q:PSSGENE=""  D
 .. S PSSCNT=PSSCNT+1
 .. ;Result date 
 .. S PSSTXT=$$FMTE^XLFDT($E(PSSLABDT,2,8),"5D")
 .. S PSSTXT=PSSTXT_$$SPACES(PSSTXT,11)
 .. S PSSGTBL(PSSCNT)=PSSTXT
 .. ;Gene - truncate to 12 char.
 .. S PSSTXT=$E(PSSGENE,1,12)_$$SPACES($E(PSSGENE,1,12),13)
 .. S PSSGTBL(PSSCNT)=PSSGTBL(PSSCNT)_PSSTXT
 .. ;Activity Score
 .. S PSSAS=$G(PSSGDT(PSSLABDT,PSSGENE,"ACTIVITY_SCORE"))
 .. S PSSTXT=PSSAS_$$SPACES(PSSAS,5)
 .. S PSSGTBL(PSSCNT)=PSSGTBL(PSSCNT)_PSSTXT
 .. ;Phenotype
 .. S PSSTXT=$G(PSSGDT(PSSLABDT,PSSGENE,"PHENOTYPE"))
 .. S PSSGENTP=$G(PSSGDT(PSSLABDT,PSSGENE,"GENOTYPE")) I PSSGENTP'="" S PSSTXT=PSSTXT_"  (Genotype: "_PSSGENTP_")"
 .. D PHENO(PSSTXT,1,49)
 Q
 ;
PHENO(PSSTXT,DIWL,DIWR) ;format phenotype (can be longer than 50 chars)
 NEW PSSX,PSSX1,PSSLINE,X
 S X=$G(PSSTXT)
 S:'+$G(PSSCNT) PSSCNT=1,PSSGTBL(PSSCNT)=""
 I '$G(DIWL) S DIWL=1
 I '$G(DIWR) S DIWR=75
 K ^UTILITY($J,"W") D ^DIWP
 ;
 S PSSX1=0
 F PSSX=0:0 S PSSX=$O(^UTILITY($J,"W",1,PSSX)) Q:'PSSX  D
 . S PSSTXT=$G(^UTILITY($J,"W",1,PSSX,0)),PSSX1=PSSX1+1
 . I PSSTXT]"" D
 .. I $L(PSSTXT)>49 S PSSLINE(PSSX1)=$E(PSSTXT,1,49),PSSX1=PSSX1+1,PSSLINE(PSSX1)=$E(PSSTXT,49,$L(PSSTXT))
 .. I $L(PSSTXT)<50 S PSSLINE(PSSX1)=PSSTXT
 ;
 F PSSX1=0:0 S PSSX1=$O(PSSLINE(PSSX1)) Q:'PSSX1  D
 . I PSSX1>1 S PSSCNT=PSSCNT+1,PSSGTBL(PSSCNT)=""
 . S PSSGTBL(PSSCNT)=PSSGTBL(PSSCNT)_$$SPACES($G(PSSGTBL(PSSCNT)),29)_PSSLINE(PSSX1)
 ;
 K ^UTILITY($J,"W"),DIWL,DIWR
 Q
 ;
SPACES(PSSTXT,PSSCHR) ;Add trailing spaces
 NEW PSSSPACE,PSSDIFF
 Q:'+$G(PSSCHR) ""
 S PSSDIFF=PSSCHR-$L($G(PSSTXT))
 Q:+PSSDIFF<1 ""
 S $P(PSSSPACE," ",PSSDIFF)=" "
 Q PSSSPACE