| [1487] | 1 | C0QRMBMI        ; SLC/PKR - National BMI and BSA computed finding; 7/16/12 3:36pm | 
|---|
|  | 2 | ;;1.0;QUALITY MEASURES;**1**; | 
|---|
|  | 3 | ; | 
|---|
|  | 4 | ; VEN/SMH - on July 16 2012 | 
|---|
|  | 5 | ; Added PBMI as a new Computed Finding -- essentially the same as BMI | 
|---|
|  | 6 | ; PBMI = Percentile BMI; | 
|---|
|  | 7 | ; | 
|---|
|  | 8 | ; Copy of Routine PXRMBMI stolen from Patrick Reddington | 
|---|
|  | 9 | ; | 
|---|
|  | 10 | ;================================ | 
|---|
|  | 11 | BMI(DFN,NGET,BDT,EDT,NFOUND,TEST,DATE,DATA,TEXT)        ;Multi-occurrence computed | 
|---|
|  | 12 | ;finding for BMI. | 
|---|
|  | 13 | N BMI,HDATE,HT,IND,TDATE,WHL,WT | 
|---|
|  | 14 | ;Get the list of weight and height measurements. | 
|---|
|  | 15 | D WANDHL(DFN,NGET,BDT,EDT,.NFOUND,.WHL) | 
|---|
|  | 16 | F IND=1:1:NFOUND D | 
|---|
|  | 17 | . S TDATE=$P(WHL(IND),U,1),WT=$P(WHL(IND),U,2) | 
|---|
|  | 18 | . S HT=$P(WHL(IND),U,3),HDATE=$P(WHL(IND),U,4) | 
|---|
|  | 19 | . S TEST(IND)=1,DATE(IND)=TDATE | 
|---|
|  | 20 | . S TEXT(IND)="height measured "_$$EDATE^PXRMDATE(HDATE) | 
|---|
|  | 21 | . S BMI=WT/(HT*HT) | 
|---|
|  | 22 | . S BMI=$FN(BMI,"",1) | 
|---|
|  | 23 | . S (DATA(IND,"VALUE"),DATA(IND,"BMI"))=BMI | 
|---|
|  | 24 | Q | 
|---|
|  | 25 | ; | 
|---|
|  | 26 | ; VEN/SMH -> Begin addition to routine | 
|---|
|  | 27 | PBMI(DFN,NGET,BDT,EDT,NFOUND,TEST,DATE,DATA,TEXT)       ; Multi-occurrence computed | 
|---|
|  | 28 | ; finding for BMI percentile | 
|---|
|  | 29 | N BMI,HDATE,HT,IND,TDATE,WHL,WT,BMI | 
|---|
|  | 30 | ;Get the list of weight and height measurements. | 
|---|
|  | 31 | D WANDHL(DFN,NGET,BDT,EDT,.NFOUND,.WHL) | 
|---|
|  | 32 | F IND=1:1:NFOUND D | 
|---|
|  | 33 | . S TDATE=$P(WHL(IND),U,1),WT=$P(WHL(IND),U,2) | 
|---|
|  | 34 | . S HT=$P(WHL(IND),U,3),HDATE=$P(WHL(IND),U,4) | 
|---|
|  | 35 | . S TEST(IND)=1,DATE(IND)=TDATE | 
|---|
|  | 36 | . S TEXT(IND)="height measured "_$$EDATE^PXRMDATE(HDATE) | 
|---|
|  | 37 | . S BMI=WT/(HT*HT) | 
|---|
|  | 38 | . N PBMI S PBMI=0 ; BMI Percentile | 
|---|
|  | 39 | . N GENDER S GENDER=$P(^DPT(DFN,0),U,2) | 
|---|
|  | 40 | . N DOB S DOB=$P(^DPT(DFN,0),U,3) | 
|---|
|  | 41 | . N AGE S AGE=$$FMDIFF^XLFDT($$DT^XLFDT(),DOB,1)/365.24 ; Age in yrs | 
|---|
|  | 42 | . I $T(BMIPCTL^TMGGRC1)]"" S PBMI=$$BMIPCTL^TMGGRC1(AGE,GENDER,BMI,"") | 
|---|
|  | 43 | . S PBMI=+PBMI ; We get a textish result (e.g. 78th percentile) | 
|---|
|  | 44 | . S (DATA(IND,"VALUE"),DATA(IND,"BMI%ILE"))=PBMI | 
|---|
|  | 45 | Q | 
|---|
|  | 46 | ; VEN/SMH <- End | 
|---|
|  | 47 | ; | 
|---|
|  | 48 | ;================================ | 
|---|
|  | 49 | BSA(DFN,NGET,BDT,EDT,NFOUND,TEST,DATE,DATA,TEXT)        ;Multi-occurrence computed | 
|---|
|  | 50 | ;finding for BSA. The coefficients have been adjusted for heights | 
|---|
|  | 51 | ;in cm and weights in kg expect for Boyd where the weight is grams. | 
|---|
|  | 52 | ;The default is to use the Mosteller formula. | 
|---|
|  | 53 | N BSA,FORMULA,HT,IND,TDATE,TYPE,WHL,WT | 
|---|
|  | 54 | S TYPE=$S(TEST="":"M",TEST="M":"M",TEST="D":"D",TEST="H":"H",TEST="G":"G",TEST="B":"B",1:"M") | 
|---|
|  | 55 | S FORMULA=$S(TYPE="M":"Mosteller",TYPE="B":"Boyd",TYPE="D":"DuBois and Dubois",TYPE="H":"Haycock",TYPE="G":"Gehan and George",1:"Mosteller")_" formula" | 
|---|
|  | 56 | ;Get the list of weight and height measurements. | 
|---|
|  | 57 | D WANDHL(DFN,NGET,BDT,EDT,.NFOUND,.WHL) | 
|---|
|  | 58 | F IND=1:1:NFOUND D | 
|---|
|  | 59 | . S TDATE=$P(WHL(IND),U,1),WT=$P(WHL(IND),U,2) | 
|---|
|  | 60 | . S HT=$P(WHL(IND),U,3),HDATE=$P(WHL(IND),U,4) | 
|---|
|  | 61 | . S TEST(IND)=1,DATE(IND)=TDATE | 
|---|
|  | 62 | . I TYPE="M" S BSA=$$SQRT^XLFMTH((WT*HT)/36) | 
|---|
|  | 63 | . I TYPE="D" S BSA=.20247*$$PWR^XLFMTH(HT,.725)*$$PWR^XLFMTH(WT,.425) | 
|---|
|  | 64 | . I TYPE="H" S BSA=.15058*$$PWR^XLFMTH(HT,.3964)*$$PWR^XLFMTH(WT,.5378) | 
|---|
|  | 65 | . I TYPE="G" S BSA=.164*$$PWR^XLFMTH(HT,.42246)*$$PWR^XLFMTH(WT,.51456) | 
|---|
|  | 66 | . I TYPE="B" D | 
|---|
|  | 67 | .. N WEXP | 
|---|
|  | 68 | .. S WT=1000*WT | 
|---|
|  | 69 | .. S WEXP=.7285-(.0188*$$LOG^XLFMTH(WT)) | 
|---|
|  | 70 | .. S BSA=.001277*$$PWR^XLFMTH(HT,.3)*$$PWR^XLFMTH(WT,WEXP) | 
|---|
|  | 71 | . S BSA=$FN(BSA,"",2) | 
|---|
|  | 72 | . S (DATA(IND,"VALUE"),DATA(IND,"BSA"))=BSA | 
|---|
|  | 73 | . S TEXT(IND)=FORMULA_", height measured "_$$EDATE^PXRMDATE(HDATE) | 
|---|
|  | 74 | Q | 
|---|
|  | 75 | ; | 
|---|
|  | 76 | ;================================ | 
|---|
|  | 77 | GHEIGHT(DFN,WDATE,HT,HDATE)     ;Return the height measurement taken on the | 
|---|
|  | 78 | ;date closest to WDATE (WDATE is the date of the weight measurement). If no height is | 
|---|
|  | 79 | ;found return -1. | 
|---|
|  | 80 | N BCKDATE,DAS,DIFFL,DIFFS,DONE,FWDDATE,TEMP | 
|---|
|  | 81 | S (DONE,HDATE)=0,HT=-1 | 
|---|
|  | 82 | ;Check for height measured on same date and time. | 
|---|
|  | 83 | S DAS=$O(^PXRMINDX(120.5,"PI",DFN,8,WDATE,"")) | 
|---|
|  | 84 | I DAS'="" D | 
|---|
|  | 85 | . D GETDATA^PXRMVITL(DAS,.TEMP) | 
|---|
|  | 86 | . I TEMP("RATE")'=+TEMP("RATE") Q | 
|---|
|  | 87 | . S HT=+(TEMP("RATE")*0.0254),HDATE=WDATE,DONE=1 | 
|---|
|  | 88 | I 'DONE S (BCKDATE,FWDDATE)=WDATE | 
|---|
|  | 89 | F  Q:DONE  D | 
|---|
|  | 90 | . S BCKDATE=+$O(^PXRMINDX(120.5,"PI",DFN,8,BCKDATE),-1) | 
|---|
|  | 91 | . S FWDDATE=+$O(^PXRMINDX(120.5,"PI",DFN,8,FWDDATE)) | 
|---|
|  | 92 | . I (BCKDATE=0),(FWDDATE=0) S DONE=1 Q | 
|---|
|  | 93 | . S DIFFS=$$FMDIFF^XLFDT(WDATE,BCKDATE,2),DIFFL(DIFFS,BCKDATE)="" | 
|---|
|  | 94 | . S DIFFS=$$FMDIFF^XLFDT(FWDDATE,WDATE,2) | 
|---|
|  | 95 | . S DIFFS=$S(DIFFS<0:-DIFFS,1:DIFFS),DIFFL(DIFFS,FWDDATE)="" | 
|---|
|  | 96 | . S DIFFS=$O(DIFFL("")),HDATE=$O(DIFFL(DIFFS,"")) | 
|---|
|  | 97 | . I HDATE=0 Q | 
|---|
|  | 98 | . S DAS=$O(^PXRMINDX(120.5,"PI",DFN,8,HDATE,"")) | 
|---|
|  | 99 | . D GETDATA^PXRMVITL(DAS,.TEMP) | 
|---|
|  | 100 | . I TEMP("RATE")'=+TEMP("RATE") K DIFFL(DIFFS,HDATE) Q | 
|---|
|  | 101 | . S HT=+(TEMP("RATE")*0.0254) | 
|---|
|  | 102 | . S DONE=1 | 
|---|
|  | 103 | Q | 
|---|
|  | 104 | ; | 
|---|
|  | 105 | ;================================ | 
|---|
|  | 106 | WANDHL(DFN,NGET,BDT,EDT,NFOUND,WHL)     ;Return an ordered and | 
|---|
|  | 107 | ;paired list of weight and height measurements. Weight is in kilograms | 
|---|
|  | 108 | ;and height is in meters. | 
|---|
|  | 109 | N DAS,DIFFL,DIFFS,DONE,HT,HDATE,NOCC | 
|---|
|  | 110 | N SDIR,TDATE,TEMP,WLIST,WT | 
|---|
|  | 111 | S SDIR=$S(NGET>0:-1,1:1) | 
|---|
|  | 112 | S NOCC=$S(NGET>0:NGET,1:-NGET) | 
|---|
|  | 113 | ;Get a list of weight measurements in the date range. | 
|---|
|  | 114 | S TDATE=BDT-.000001 | 
|---|
|  | 115 | F  S TDATE=+$O(^PXRMINDX(120.5,"PI",DFN,9,TDATE)) Q:(TDATE=0)!(TDATE>EDT)  D | 
|---|
|  | 116 | . S DAS=$O(^PXRMINDX(120.5,"PI",DFN,9,TDATE,"")) | 
|---|
|  | 117 | . S WLIST(TDATE)=DAS | 
|---|
|  | 118 | ;Get up to NOCC BMI values. | 
|---|
|  | 119 | S TDATE="",(DONE,NFOUND)=0 | 
|---|
|  | 120 | F  S TDATE=$O(WLIST(TDATE),SDIR) Q:(DONE)!(TDATE="")  D | 
|---|
|  | 121 | . S DAS=WLIST(TDATE) | 
|---|
|  | 122 | . K TEMP | 
|---|
|  | 123 | . D GETDATA^PXRMVITL(DAS,.TEMP) | 
|---|
|  | 124 | . I TEMP("RATE")'=+TEMP("RATE") Q | 
|---|
|  | 125 | . S WT=+TEMP("RATE")*0.4535924 | 
|---|
|  | 126 | .;Find the closest height measurement. | 
|---|
|  | 127 | . D GHEIGHT(DFN,TDATE,.HT,.HDATE) | 
|---|
|  | 128 | . I HT=-1 Q | 
|---|
|  | 129 | . S NFOUND=NFOUND+1 | 
|---|
|  | 130 | . S WHL(NFOUND)=TDATE_U_WT_U_HT_U_HDATE | 
|---|
|  | 131 | . I NFOUND=NOCC S DONE=1 | 
|---|
|  | 132 | Q | 
|---|
|  | 133 | ; | 
|---|