YTSMCMI4 ;BAL/KTL - MHAX ANSWERS SPECIAL HANDLING #2 ; 9/14/18 3:19pm
 ;;5.01;MENTAL HEALTH;**151,187,202,217,221,234**;Dec 30, 1994;Build 38
 ;
 ; MCMI4
 ;
DLLSTR(YSDATA,YS,YSTRNG) ;
 ;  YSTRNG = 1 Score Instr
 ;  YSTRNG = 2 get Rpt Ans and Text
 N YSCNT,YSIND,CNT,YSCOD,YSINVRPT,YSCALRSL,YSRAWRSL,YSQANS,YSQANS2,YSQSCAL,YSNOGRPH,HIARR,SCALOD
 N YBRS,YPRS   ;Calc Base Rate, Calc PR
 N YSNOTE      ;Noteworthy
 N HIHIT,GRSHIT ;High 3 Persnlty Scale Hit & Grossman >75 Hit
 S N=N+1
 D INICOD^YTSMCMIB  ;YSCOD(scalename)=scalecode
 D INIBRS^YTSMCMIC  ;YBRS(scalecode,"STR") -get Base Rate for each scale Raw
 D INIPRS^YTSMCMID  ;YPRS(scalecode,"STR") -get Percentile for scale Raw (Facet)/Adj Base Rate (Non-Facet)
 D YSQ^YTSMCMIB     ;YSQSCAL(scalcode)=questions.  chck if any scales are invld.
 D DATA1
 I YSTRNG=1 Q
 ; Genrate Rpt Sections
 D MODIND   ;Mod Indices
 D CPP      ;Clin Patterns
 D SPP      ;Sevr Path
 D CS       ;Clinical Syndr
 D SCS      ;Sevr Clinical Syndr
 D TOP3     ;3 Highest Grossman Scales
 D FACET    ;All Facet Scales
 D RSLWRN   ;Rsl Warning
 D NTWRTHY
 D RESP     ;Set up Responses
 Q
DATA1 ;Extract results&calc
 ;I YSTRNG=1, add up RAW values for scaleN calc adj BR and PR
 ;I YSTRNG=2, extract from saved values, Do rpt calcs
 I YSTRNG=1 D  Q
 .D EXTANS  ;Extrct T/F responses
 .D ^YTSMCMIA
 D LDSCORES^YTSCORE(.YSDATA,.YS)
 ;Extract Raw Scale Rsl;Get the High Point;Get BR Adj Hdr;Get V rsl for Invalidity;Get W rsl for Inconsistency
 D EXTRSL,EXTANS,HIGHPT,BRADJH,INVDH,INCNH
 S YSINVRPT=$$INVRPT()  ; See if INVALID Rpt cond
 I YSINVRPT'="" D INVALID(YSINVRPT)
 D INVSCL  ;Any Scale invalid
 D ELEV    ;Top 3 Grossman
 D NOTEW   ;Noteworthy Responses
 Q
INVRPT() ;
 ; Check for Invalid Report
 ; Raw V > 1  ;Invalidity Index elev
 ; Raw X > 114 ! Raw X < 7  ;Scale X outside range
 ; All Scales 1-8B Base Rate < 60  ; All scls too low
 ; Raw W > 19  ;Inconsistency Index elevated
 ; More than 13 responses skipped for X
 ; INVRPT of 1 = YES, INVALID
 ;           0 = NO, OK TO PROCEED
 N INVSTR,SCALSTR,SCAL,CHK,XQUES,QUES,I,SKIPS
 I YSRAWRSL("V Invalidity")>1 S INVSTR="The Invalidity Index is elevated." Q INVSTR
 I YSRAWRSL("X Disclosure")<7!(YSRAWRSL("X Disclosure")>114) S INVSTR="Scale X is outside of an acceptable range." Q INVSTR
 S CHK=""
 F I=1145:1:1156 D
 .S SCAL=$$GET1^DIQ(601.87,I_",",3,"I")
 .S SCAL=$G(YBRS(SCAL,"RSL"))
 .Q:SCAL<60
 .S CHK=1
 I CHK="" S INVSTR="Scales 1-8B are all less than 60 BR" Q INVSTR
 I $G(YSRAWRSL("W Inconsistency"))>19 S INVSTR="The Inconsistency Index is elevated." Q INVSTR
 ; Check if X scale>13 omits
 S XQUES=YSQSCAL("X Disclosure")
 S CHK=0
 F I=1:1:$L(XQUES,U) D
 . S QUES=$P(XQUES,U,I) I YSQANS(QUES)="X" S CHK=CHK+1
 I CHK>13 S INVSTR="Scale X omits greater than 13" Q INVSTR
 ; Check all scale>13 omits
 S CHK=0,SCAL=""
 ;F  S SCAL=$O(YSQSCAL(SCAL)) Q:SCAL=""  D
 ;. S XQUES=YSQSCAL(SCAL)
 ;. F I=1:1:$L(XQUES,U) D
 ;.. S QUES=$P(XQUES,U,I) Q:QUES=""  Q:YSQANS(QUES)'="X"
 ;.. Q:$D(SKIPS(QUES))  ;already counted from another scale
 ;.. S CHK=CHK+1,SKIPS(QUES)=""
 S QUES="" F  S QUES=$O(YSQANS(QUES)) Q:QUES=""  D
 . Q:YSQANS(QUES)'="X"
 . Q:$D(SKIPS(QUES))
 . S CHK=CHK+1,SKIPS(QUES)=""
 I CHK>13 S INVSTR="Invalid responses greater than 13" Q INVSTR
 Q ""
INVALID(INVSTR) ;
 ; Text for invalid rpt
 N I,DONE
 S DONE=""
 S I="" F  S I=$O(YSDATA(I)) Q:I=""!(DONE=1)  D
 .I YSDATA(I)["7771" S $P(YSDATA(I),U,3)="",DONE=1  ;If INVALID, do not display HP Code
 S N=N+1,YSDATA(N)="7783^9999;1^INVALID PROFILE: "_INVSTR_"|"
 S YSNOGRPH=1  ;Don't Graph BR Scores
 Q
INVSCL ;
 ;Any scale>2 or 4 omits
 N OMITS,SCALSTR,SCAL,QUES,RSL,CNT,I,II
 F I=1140:1:1143,1145:1:1169,1240:1:1284 D
 .S SCAL=$$GET1^DIQ(601.87,I_",",3,"I")
 .S CNT=0
 .I SCAL="X Disclosure"!(SCAL="W Inconsistency") Q
 .S OMITS=4 I SCAL="V Invalidity" S OMITS=2
 .F II=1:1:$L(YSQSCAL(SCAL),U) D
 ..S QUES=$P(YSQSCAL(SCAL),U,II),RSL=YSQANS(QUES)
 ..I RSL'=1,(RSL'=2) S CNT=CNT+1
 .I CNT>OMITS D
 ..S YSRAWRSL(SCAL)="-"
 ..S YBRS(SCAL,"RSL")="-"
 ..S YPRS(SCAL,"RSL")="-"
 Q
EXTANS ;
 ;Extract the T/F from YSDATA
 ;TRUE=1 FALSE=2
 N X,QUEST,ANS,STR,PTR,DATA
 S X=2
 F  S X=$O(YSDATA(X)) Q:+X=0  D
 .S DATA=YSDATA(X)
 .S ANS=$$GET1^DIQ(601.75,$P($G(DATA),U,3)_",",4,"I")
 .S QUES=$P(DATA,U,2),PTR=$P(DATA,U)
 .S YSQANS(QUES)=ANS
 .S YSQANS(QUES,"PTR")=PTR
 .S YSQANS2(PTR)=ANS
 Q
EXTRSL ;
 ; Extract the Raw score-store by Scale Name
 N I,SCAL,VAL,BR,PR,RAW,YSAD,YSCALE,G,SCLNAM
 S I=1 F  S I=$O(^TMP($J,"YSCOR",I)) Q:I=""  D
 .S VAL=^TMP($J,"YSCOR",I),SCAL=$P(VAL,"="),VAL=$P(VAL,"=",2)
 .S RAW=$P(VAL,U),YSRAWRSL(SCAL)=RAW
 .S BR=$P(VAL,U,2),BR=$$BRFIX^YTSMCMIA(BR),YBRS(SCAL,"RSL")=BR  ;PATCH X
 .S PR=$P(VAL,U,3),YPRS(SCAL,"RSL")=PR
 .S SCLNAM(SCAL)=I  ;^TMP($J,"YSCOR") by scalename-extract calculated results below
 D EX2
 Q
EX2 ;T-SCORE NOT IN ^TMP($J,"YSCOR") 
 S YSAD=$G(YS("AD"))
 S YSCALE=""
 F  S YSCALE=$O(^YTT(601.92,"AC",YSAD,YSCALE))  Q:'YSCALE  D
 .S G=$G(^YTT(601.92,YSCALE,0))
 .S SCAL=$P(G,U,3)
 .S RAW=$P(G,U,4),BR=$P(G,U,5),BR=$$BRFIX^YTSMCMIA(BR),PR=$P(G,U,6)  ;PATCH X
 .S YBRS(SCAL,"RSL")=BR
 .S YPRS(SCAL,"RSL")=PR
 Q
HIGHPT ; Highpoint Hdr
 S N=N+1
 N TEXT1,SCAL,SCALC,SCALSTR,SCALCOD,I,HI,DONE,SCALR
 S TEXT1=""
 S SCALCOD="1 ^2A^2B^3 ^4A^4B^5 ^6A^6B^7 ^8A^8B"
 F I=1145:1:1156 D
 .S SCAL=$$GET1^DIQ(601.87,I_",",3,"I")
 .S SCALR=$G(YBRS(SCAL,"RSL"))
 .Q:SCALR'>59
 .S SCALC=YSCOD("NAME",SCAL) S:$L(SCALC)=1 SCALC=SCALC_" "  ;Sort numbers vs strings correctly
 .S HI(-SCALR,SCALC)=""
 S DONE=0,I=0
 S SCAL="" F  S SCAL=$O(HI(SCAL)) Q:SCAL=""!DONE  D
 .S SCALC="" F  S SCALC=$O(HI(SCAL,SCALC)) Q:SCALC=""!DONE  D
 ..S SCALCOD=SCALC
 ..S:SCALCOD[" " SCALCOD=+SCALCOD
 ..S TEXT1=TEXT1_SCALCOD_" ",I=I+1
 ..I I=3 S DONE=1
 I $L(TEXT1)>0 S TEXT1=$E(TEXT1,1,$L(TEXT1)-1)
 S YSDATA(N)="7771^9999;1^"_TEXT1
 Q
BRADJH ; BR Adjustment Hdr
 N X,ACC,A,CC,TEXT1
 S TEXT1=""
 S X=YSRAWRSL("X Disclosure")
 S A=YBRS("A Generalized Anxiety","RSL")
 S CC=YBRS("CC Major Depression","RSL")
 I ((X>0)&(X<21))!((X>61)&(X<122)) S TEXT1="X"
 I (A>74)!(CC>74) S TEXT1=$S(TEXT1="":"A/CC",1:TEXT1_", A/CC")
 S:TEXT1="" TEXT1="None"
 S N=N+1,YSDATA(N)="7772^9999;1^"_TEXT1
 Q
INVDH ; Invalidity Hdr
 N TEXT1
 S TEXT1=$G(YSRAWRSL("V Invalidity"))
 S N=N+1,YSDATA(N)="7773^9999;1^"_TEXT1
 Q
INCNH ; Inconsistency Hdr
 N TEXT1
 S TEXT1=$G(YSRAWRSL("W Inconsistency"))
 S N=N+1,YSDATA(N)="7774^9999;1^"_TEXT1
 S YSRAWRSL("W Inconsistency")=0
 Q
CALCW ; Calc the W Scale
 N PAIR
 S YSRAWRSL("W Inconsistency")=0
 F PAIR="22-170","125-143","47-157","40-181","81-116","85-126","76-150","25-94","44-121","39-59","17-184","33-89","78-164","38-171","74-115","46-154","26-99","20-174","32-122","13-112","55-110","173-194","95-127","60-162","15-149" D
 .D WADD(PAIR)
 S N=N+1,YSDATA(N)="7774^9999;1^"_YSRAWRSL("W Inconsistency")
 Q
WADD(PAIR) ;
 N Q1,Q2,ADD
 S Q1=$G(YSQANS($P(PAIR,"-"))) S:Q1=2 Q1=0    ;False=0 instead of 2
 S Q2=$G(YSQANS($P(PAIR,"-",2))) S:Q2=2 Q2=0  ;
 S ADD=$TR((Q1-Q2),"-")  ;W ?30,ADD
 S YSRAWRSL("W Inconsistency")=YSRAWRSL("W Inconsistency")+ADD
 Q
ELEV ; Calc 3 highest Personality Scores from BR
 ; Order of Importance after BR: S,C,P,1,2A,2B,3,4A,4B,5,6A,6B,7,8A,8B
 ; Result is HIARR("FINAL")
 N SCALSTR,SCAL,SCD,BR,TOPN,CNT,SCCOD,SCDF,SCALF,I,J
 F I=1157:1:1159,1145:1:1156 D
 .S SCAL=$$GET1^DIQ(601.87,I_",",3,"I")
 .S BR=YBRS(SCAL,"RSL")
 .Q:BR<60
 .S HIARR("RSL",-BR,SCAL)=""
 S TOPN=3
 S CNT=0,BR="" F  S BR=$O(HIARR("RSL",BR)) Q:BR=""!(CNT>TOPN)  D
 .F I=1157:1:1159,1145:1:1156 D
 ..S SCAL=$$GET1^DIQ(601.87,I_",",3,"I")
 ..Q:CNT>TOPN
 ..S SCD=YSCOD("NAME",SCAL)
 ..Q:'$D(HIARR("RSL",BR,SCAL))
 ..S CNT=CNT+1,HIARR("FINAL",CNT)=SCAL_U_SCD
 S SCAL="" F  S SCAL=$O(YSCOD("NAME",SCAL)) Q:SCAL=""  S SCCOD(YSCOD("NAME",SCAL))=SCAL  ;SCCOD of Scale Codes=Scale Name
 F I=1:1:TOPN D
 .Q:'$D(HIARR("FINAL",I))
 .S SCAL=HIARR("FINAL",I),SCD=$P(SCAL,U,2),SCAL=$P(SCAL,U)
 .F J=1:1:3 D
 ..S SCDF=SCD_"."_J,SCALF=SCCOD(SCDF)
 ..S HIARR("FINAL",I,J)=SCALF_U_SCDF_U_YSRAWRSL(SCALF)_U_YBRS(SCALF,"RSL")_U_YPRS(SCALF,"RSL")
 Q
NOTEW ; Noteworthy
 ; Use YSQANS(question number)=1/2 (True/False)
 ;     YSQANS(question number,"PTR")=pointer to MH QUESTION
 N CNT,CAT,QUESTR,QUES,CATTOT
 S CNT=1
 S CAT="Adult ADHD",CATTOT=0
 F QUES=56,77,82,92,108,-63 D SETNOT
 I CATTOT<4 K YSNOTE(CNT)  ;Must be>=4 endorsed responses
 S CNT=CNT+1
 S CAT="Autism Spectrum",CATTOT=0
 F QUES=92,119,138,163,165,179,190 D SETNOT
 I CATTOT<4 K YSNOTE(CNT)
 S CNT=CNT+1
 S CAT="Childhood Abuse"
 F QUES=47,157 D SETNOT
 S CNT=CNT+1
 S CAT="Eating Disorder"
 F QUES=69,86,102,186 D SETNOT
 S CNT=CNT+1
 S CAT="Emotional Dyscontrol"
 F QUES=27,36,45,56,72,80,127,177 D SETNOT
 S CNT=CNT+1
 S CAT="Explosively Angry"
 F QUES=11,74,115,145,168,191 D SETNOT
 S CNT=CNT+1
 S CAT="Health Preoccupied"
 F QUES=7,41,57,113,120,146 D SETNOT
 S CNT=CNT+1
 S CAT="Interpersonally Alienated"
 F QUES=4,104,182,190 D SETNOT
 S CNT=CNT+1
 S CAT="Prescription Drug Abuse"
 F QUES=124,176 D SETNOT
 S CNT=CNT+1
 S CAT="Self-Destructive Potential"
 F QUES=14,32,34,39,59,101,107,114,126,151,164 D SETNOT
 S CNT=CNT+1
 S CAT="Self-Injurious Behavior/Tendency"
 F QUES=40,181 D SETNOT
 S CNT=CNT+1
 S CAT="Traumatic Brain Injury"
 F QUES=55,110 D SETNOT
 S CNT=CNT+1
 S CAT="Vengefully Prone"
 F QUES=22,37,78,100,103,111,136,167,178,192 D SETNOT
 Q
SETNOT ;
 N CHK
 S CHK=1 ;True
 I QUES<0 S QUES=-QUES,CHK=2  ;Minus Ques#-check for a False
 S ANS=YSQANS(QUES) Q:ANS'=CHK
 S:'$D(YSNOTE(CNT,"CAT")) YSNOTE(CNT,"CAT")=CAT
 S YSNOTE(CNT,"CAT",QUES)=YSQANS(QUES,"PTR")_U_ANS,CATTOT=CATTOT+1
 Q
MODIND ;
 N SCALSTR,SCAL,XSCAL,SCALCOD,ZTXT,STR,GRPH,I,ANS,RAW,BR
 S ANS=7775,STR="  "
 S SCALSTR="X Disclosure^Y Desirability^Z Debasement"
 D RPTBLK(ANS,SCALSTR)
 Q
CPP ;
 N SCALSTR,SCAL,XSCAL,SCALCOD,ZTXT,STR,GRPH,I,ANS,RAW,BR
 S ANS=7776,STR="  "
 S SCALSTR="1 Schizoid^2A Avoidant^2B Melancholic^3 Dependent^4A Histrionic^4B Turbulent^5 Narcissistic^6A Antisocial^6B Sadistic^7 Compulsive^8A Negativistic^8B Masochistic"
 D RPTBLK1(ANS,SCALSTR)
 Q
SPP ;
 N SCALSTR,SCAL,XSCAL,SCALCOD,ZTXT,STR,GRPH,I,ANS,RAW,BR
 S ANS=7777,STR="  "
 S SCALSTR="S Schizotypal^C Borderline^P Paranoid"
 D RPTBLK1(ANS,SCALSTR)
 Q
CS ;
 N SCALSTR,SCAL,XSCAL,SCALCOD,ZTXT,STR,GRPH,I,ANS,RAW,BR
 S ANS=7778,STR="  "
 S SCALSTR="A Generalized Anxiety^H Somatic Symptom^N Bipolar Spectrum^D Persistent Depression^B Alcohol Use^T Drug Use^R Post-Traumatic Stress"
 D RPTBLK1(ANS,SCALSTR)
 Q
SCS ;
 N SCALSTR,SCAL,XSCAL,SCALCOD,ZTXT,STR,GRPH,I,ANS,RAW,BR
 S ANS=7779,STR="  "
 S SCALSTR="SS Schizophrenic Spectrum^CC Major Depression^PP Delusional"
 D RPTBLK1(ANS,SCALSTR)
 Q
TOP3 ;
 N SCALSTR,SCAL,XSCAL,SCALCOD,ZTXT,STR,GRPH,I,ANS,RAW,BR,TCNT,TCNT2,HD
 S ANS=7780,STR="  ",HIHIT=0
 Q:'$D(HIARR)
 F TCNT=1:1:3 D
 .Q:'$D(HIARR("FINAL",TCNT))
 .S HD=HIARR("FINAL",TCNT),SCAL=$P(HD,U),SCALCOD=$P(HD,U,2),HIHIT=1
 .S ZTXT=$$MAKSTR(SCAL,39,"L"),STR=STR_ZTXT_"|"
 .S TCNT2="" F  S TCNT2=$O(HIARR("FINAL",TCNT,TCNT2)) Q:TCNT2=""  D
 ..S HD=HIARR("FINAL",TCNT,TCNT2),SCAL=$P(HD,U),SCALCOD=$P(HD,U,2)
 ..S RAW=$P(HD,U,3),BR=$P(HD,U,4),PR=$P(HD,U,5)
 ..S ZTXT=$$MAKSTR(SCAL,39,"L"),STR=STR_ZTXT
 ..S ZTXT=$$MAKSTR(RAW,4,"R"),STR=STR_ZTXT
 ..S ZTXT=$$MAKSTR(PR,4,"R"),STR=STR_ZTXT
 ..S ZTXT=$$MAKSTR(BR,4,"R"),STR=STR_ZTXT
 ..S GRPH=$$MAKGRP(BR,100),STR=STR_"  "_GRPH_"|"
 .S STR=STR_"|"
 S N=N+1,YSDATA(N)=ANS_"^9999;1^"_STR
 Q
FACET ;
 N SCAL,SCALCOD,GSCAL,GCOD,ZTXT,STR,SCALXRF,I,II
 ;Make SCALXRF by Scale Code to get to the each Grossman Facet Scale Names
 S SCAL="" F  S SCAL=$O(YSCOD("NAME",SCAL)) Q:SCAL=""  S SCALXRF(YSCOD("NAME",SCAL))=SCAL
 S ANS=7781,STR="  ",GRSHIT=0
 F I=1145:1:1159 D
 .S SCAL=$$GET1^DIQ(601.87,I_",",3,"I")
 .S SCALCOD=YSCOD("NAME",SCAL)
 .S ZTXT=$$MAKSTR(SCAL,39,"L"),STR=STR_ZTXT_"|"
 .F II=1:1:3 D
 ..S GCOD=SCALCOD_"."_II
 ..S GSCAL=SCALXRF(GCOD)
 ..S ZTXT=$$MAKSTR(GSCAL,39,"L"),STR=STR_ZTXT
 ..S RAW=YSRAWRSL(GSCAL),PR=YPRS(GSCAL,"RSL"),BR=YBRS(GSCAL,"RSL")
 ..I BR>74 S GRSHIT=1  ;At least one Grossman Facet >=75
 ..S ZTXT=$$MAKSTR(RAW,4,"R"),STR=STR_ZTXT
 ..S ZTXT=$$MAKSTR(PR,4,"R"),STR=STR_ZTXT
 ..S ZTXT=$$MAKSTR(BR,4,"R"),STR=STR_ZTXT_"|"
 .S STR=STR_"|"
 S N=N+1,YSDATA(N)=ANS_"^9999;1^"_STR
 Q
RSLWRN ; Result warning
 N STR
 ;S HIHIT=1,GRSHIT=0 ;TESTING
 Q:HIHIT=0   ;No Personality Scale >= 60
 Q:GRSHIT=1  ;At least one Grossman Facet >=75
 S STR="Generally, two conditions must be met in order for a Grossman Facet scale score |"
 S STR=STR_"to be considered interpretable. The first is that a primary personality scale |"
 S STR=STR_"must be at or above BR 60. The second is that one or more of its facet scales |"
 S STR=STR_"must be at or above BR 75. Since none of this patient's facet scale scores are|"
 S STR=STR_"at or above BR 75, no facet scale interpretations are included in this report.|"
 S N=N+1,YSDATA(N)=ANS_"^9999;1^"_STR
 Q
NTWRTHY ;
 N I,II,CAT,QUES,QPTR,QTXT,ZTXT,STR,QANS
 Q:'$D(YSNOTE)
 S ANS=7782
 S STR="  "
 S I=0 F  S I=$O(YSNOTE(I)) Q:I=""  D
 .S CAT=YSNOTE(I,"CAT")
 .S STR=STR_CAT_"|"
 .S QUES="" F  S QUES=$O(YSNOTE(I,"CAT",QUES)) Q:QUES=""  D
 ..S ZTXT=$$MAKSTR(QUES_". ",5,"R"),STR=STR_ZTXT
 ..S QPTR=$P(YSNOTE(I,"CAT",QUES),U),QANS=$P(YSNOTE(I,"CAT",QUES),U,2)
 ..S QANS=$S(QANS=1:"(True)",QANS=2:"(False)",1:"")
 ..S QTXT="",II=0 F  S II=$O(^YTT(601.72,QPTR,1,II)) Q:+II=0  D
 ... S QTXT=QTXT_^YTT(601.72,QPTR,1,II,0)  ;Space between lines?
 ..S STR=STR_QTXT_" "_QANS_"|"
 .S STR=STR_"|"
 S N=N+1,YSDATA(N)=ANS_"^9999;1^"_STR
 Q
RESP ;
 N I,STR,NUM,QUES,ANS
 S ANS=7784
 S STR="||ITEM RESPONSES |"
 I '$D(YSQANS) S STR=STR_"Could not create list of responses for the report|" S N=N+1,YSDATA(N)=ANS_"^9999;1^"_STR Q
 F I=1:1:195 D
 .S NUM=YSQANS(I) I NUM="" S NUM="X"
 .S STR=STR_$$MAKSTR(I_": ",5,"R")_NUM_"  "  I I#10=0 S STR=STR_"|"
 S N=N+1,YSDATA(N)=ANS_"^9999;1^"_STR
 Q
RPTBLK(ANS,SCALSTR) ;
 ;Report Block no PR
 F I=1:1:$L(SCALSTR,U) D
 .S SCAL=$P(SCALSTR,U,I),SCALCOD=YSCOD("NAME",SCAL)
 .S ZTXT=$$MAKSTR(SCAL,43,"L"),STR=STR_ZTXT
 .S RAW=YSRAWRSL(SCAL),BR=YBRS(SCAL,"RSL")
 .S ZTXT=$$MAKSTR(RAW,4,"R"),STR=STR_ZTXT
 .S ZTXT=$$MAKSTR(BR,4,"R"),STR=STR_ZTXT
 .S GRPH=$$MAKGRP(BR,100),STR=STR_"  "_GRPH_"|"
 S N=N+1,YSDATA(N)=ANS_"^9999;1^"_STR
 Q
RPTBLK1(ANS,SCALSTR) ;
 ;Report Block+PR
 F I=1:1:$L(SCALSTR,U) D
 .S SCAL=$P(SCALSTR,U,I),SCALCOD=YSCOD("NAME",SCAL)
 .S ZTXT=$$MAKSTR(SCAL,39,"L"),STR=STR_ZTXT
 .S RAW=YSRAWRSL(SCAL),PR=YPRS(SCAL,"RSL"),BR=YBRS(SCAL,"RSL")
 .S ZTXT=$$MAKSTR(RAW,4,"R"),STR=STR_ZTXT
 .S ZTXT=$$MAKSTR(PR,4,"R"),STR=STR_ZTXT
 .S ZTXT=$$MAKSTR(BR,4,"R"),STR=STR_ZTXT
 .S GRPH=$$MAKGRP(BR,115),STR=STR_"  "_GRPH_"|"
 S N=N+1,YSDATA(N)=ANS_"^9999;1^"_STR
 Q
MAKSTR(TXT,LEN,JUST,CHAR) ;
 ;   TXT =Text
 ;   LEN =Total Len
 ;   JUST=R/L Justified, def=R
 ;   CHAR=Char PAD, def=" "
 N STR,TXTL
 S TXTL=$L(TXT),STR=""
 I TXT[" " S TXT=$TR(TXT," ",$C(0))
 I $G(CHAR)="" S CHAR=" "
 I $G(JUST)="" S JUST="R"
 I JUST="L" D
 .S STR=TXT
 .Q:(LEN-TXTL+1)'>1  ;String is full len, don't justify
 .S $P(STR,CHAR,LEN-TXTL+1)=""
 I JUST="R" D
 .I (LEN-TXTL+1)>1 S $P(STR,CHAR,LEN-TXTL+1)=""
 .S STR=STR_TXT
 S:STR[$C(0) STR=$TR(STR,$C(0)," ")  ;XLAT out $C(0)
 Q STR
MAKGRP(NUM,MAX) ;
 ; String of "*" for graph
 N GRP,LEN,RND,J,NCHAR
 S LEN=50  ;Graph #of Chars.
 I NUM="-"!($G(YSNOGRPH)=1) D  Q GRP
 .S GRP=$$MAKSTR("",LEN,"L")
 S NCHAR=LEN/MAX*NUM,RND="."_$P(NCHAR,".",2),NCHAR=$P(NCHAR,".")
 I RND>.5 S NCHAR=NCHAR+1
 S $P(GRP,"*",NCHAR+1)="",GRP=$$MAKSTR(GRP,LEN,"L")
 Q GRP
YSARRAY(YSARRAY) ;
 N II,YSVAL,YSCALEI,YSCALEN,YSKEYI,G,YSQN,YSAI,YSAN,YSTARG
 K YSARRAY
 S II=1
 F I=2:1 Q:'$D(^TMP($J,"YSG",I))  I ^TMP($J,"YSG",I)?1"Scale".E D
 . S YSCALEI=$P(^TMP($J,"YSG",I),U),YSCALEI=$P(YSCALEI,"=",2)
 . S YSCALEN=$P(^TMP($J,"YSG",I),U,4)
 . S YSKEYI=0 F  S YSKEYI=$O(^YTT(601.91,"AC",YSCALEI,YSKEYI)) Q:YSKEYI'>0  D
 ..S G=^YTT(601.91,YSKEYI,0)
 ..S YSQN=$P(G,U,3),YSTARG=$P(G,U,4),YSVAL=$P(G,U,5)
 ..S YSAI=$O(^YTT(601.85,"AC",YSAD,YSQN,0))
 ..Q:YSAI'>0
 ..Q:'$D(^YTT(601.85,YSAI,0))
 ..S YSAN=""
 ..I $D(^YTT(601.85,YSAI,1,1,0)) S YSAN=^YTT(601.85,YSAI,1,1,0)
 ..I $P(^YTT(601.85,YSAI,0),U,4)?1N.N S YSAN=$P(^YTT(601.85,YSAI,0),U,4),YSAN=$G(^YTT(601.75,YSAN,1))
 ..I YSAN=YSTARG S YSARRAY(II)=YSVAL,II=II+1
 ..S YSARRAY("SCALE",YSCALEN)=$G(YSARRAY("SCALE",YSCALEN))+YSVAL
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HYTSMCMI4   16633     printed  Sep 23, 2025@19:56:05                                                                                                                                                                                                   Page 2
YTSMCMI4  ;BAL/KTL - MHAX ANSWERS SPECIAL HANDLING #2 ; 9/14/18 3:19pm
 +1       ;;5.01;MENTAL HEALTH;**151,187,202,217,221,234**;Dec 30, 1994;Build 38
 +2       ;
 +3       ; MCMI4
 +4       ;
DLLSTR(YSDATA,YS,YSTRNG) ;
 +1       ;  YSTRNG = 1 Score Instr
 +2       ;  YSTRNG = 2 get Rpt Ans and Text
 +3        NEW YSCNT,YSIND,CNT,YSCOD,YSINVRPT,YSCALRSL,YSRAWRSL,YSQANS,YSQANS2,YSQSCAL,YSNOGRPH,HIARR,SCALOD
 +4       ;Calc Base Rate, Calc PR
           NEW YBRS,YPRS
 +5       ;Noteworthy
           NEW YSNOTE
 +6       ;High 3 Persnlty Scale Hit & Grossman >75 Hit
           NEW HIHIT,GRSHIT
 +7        SET N=N+1
 +8       ;YSCOD(scalename)=scalecode
           DO INICOD^YTSMCMIB
 +9       ;YBRS(scalecode,"STR") -get Base Rate for each scale Raw
           DO INIBRS^YTSMCMIC
 +10      ;YPRS(scalecode,"STR") -get Percentile for scale Raw (Facet)/Adj Base Rate (Non-Facet)
           DO INIPRS^YTSMCMID
 +11      ;YSQSCAL(scalcode)=questions.  chck if any scales are invld.
           DO YSQ^YTSMCMIB
 +12       DO DATA1
 +13       IF YSTRNG=1
               QUIT 
 +14      ; Genrate Rpt Sections
 +15      ;Mod Indices
           DO MODIND
 +16      ;Clin Patterns
           DO CPP
 +17      ;Sevr Path
           DO SPP
 +18      ;Clinical Syndr
           DO CS
 +19      ;Sevr Clinical Syndr
           DO SCS
 +20      ;3 Highest Grossman Scales
           DO TOP3
 +21      ;All Facet Scales
           DO FACET
 +22      ;Rsl Warning
           DO RSLWRN
 +23       DO NTWRTHY
 +24      ;Set up Responses
           DO RESP
 +25       QUIT 
DATA1     ;Extract results&calc
 +1       ;I YSTRNG=1, add up RAW values for scaleN calc adj BR and PR
 +2       ;I YSTRNG=2, extract from saved values, Do rpt calcs
 +3        IF YSTRNG=1
               Begin DoDot:1
 +4       ;Extrct T/F responses
                   DO EXTANS
 +5                DO ^YTSMCMIA
               End DoDot:1
               QUIT 
 +6        DO LDSCORES^YTSCORE(.YSDATA,.YS)
 +7       ;Extract Raw Scale Rsl;Get the High Point;Get BR Adj Hdr;Get V rsl for Invalidity;Get W rsl for Inconsistency
 +8        DO EXTRSL
           DO EXTANS
           DO HIGHPT
           DO BRADJH
           DO INVDH
           DO INCNH
 +9       ; See if INVALID Rpt cond
           SET YSINVRPT=$$INVRPT()
 +10       IF YSINVRPT'=""
               DO INVALID(YSINVRPT)
 +11      ;Any Scale invalid
           DO INVSCL
 +12      ;Top 3 Grossman
           DO ELEV
 +13      ;Noteworthy Responses
           DO NOTEW
 +14       QUIT 
INVRPT()  ;
 +1       ; Check for Invalid Report
 +2       ; Raw V > 1  ;Invalidity Index elev
 +3       ; Raw X > 114 ! Raw X < 7  ;Scale X outside range
 +4       ; All Scales 1-8B Base Rate < 60  ; All scls too low
 +5       ; Raw W > 19  ;Inconsistency Index elevated
 +6       ; More than 13 responses skipped for X
 +7       ; INVRPT of 1 = YES, INVALID
 +8       ;           0 = NO, OK TO PROCEED
 +9        NEW INVSTR,SCALSTR,SCAL,CHK,XQUES,QUES,I,SKIPS
 +10       IF YSRAWRSL("V Invalidity")>1
               SET INVSTR="The Invalidity Index is elevated."
               QUIT INVSTR
 +11       IF YSRAWRSL("X Disclosure")<7!(YSRAWRSL("X Disclosure")>114)
               SET INVSTR="Scale X is outside of an acceptable range."
               QUIT INVSTR
 +12       SET CHK=""
 +13       FOR I=1145:1:1156
               Begin DoDot:1
 +14               SET SCAL=$$GET1^DIQ(601.87,I_",",3,"I")
 +15               SET SCAL=$GET(YBRS(SCAL,"RSL"))
 +16               if SCAL<60
                       QUIT 
 +17               SET CHK=1
               End DoDot:1
 +18       IF CHK=""
               SET INVSTR="Scales 1-8B are all less than 60 BR"
               QUIT INVSTR
 +19       IF $GET(YSRAWRSL("W Inconsistency"))>19
               SET INVSTR="The Inconsistency Index is elevated."
               QUIT INVSTR
 +20      ; Check if X scale>13 omits
 +21       SET XQUES=YSQSCAL("X Disclosure")
 +22       SET CHK=0
 +23       FOR I=1:1:$LENGTH(XQUES,U)
               Begin DoDot:1
 +24               SET QUES=$PIECE(XQUES,U,I)
                   IF YSQANS(QUES)="X"
                       SET CHK=CHK+1
               End DoDot:1
 +25       IF CHK>13
               SET INVSTR="Scale X omits greater than 13"
               QUIT INVSTR
 +26      ; Check all scale>13 omits
 +27       SET CHK=0
           SET SCAL=""
 +28      ;F  S SCAL=$O(YSQSCAL(SCAL)) Q:SCAL=""  D
 +29      ;. S XQUES=YSQSCAL(SCAL)
 +30      ;. F I=1:1:$L(XQUES,U) D
 +31      ;.. S QUES=$P(XQUES,U,I) Q:QUES=""  Q:YSQANS(QUES)'="X"
 +32      ;.. Q:$D(SKIPS(QUES))  ;already counted from another scale
 +33      ;.. S CHK=CHK+1,SKIPS(QUES)=""
 +34       SET QUES=""
           FOR 
               SET QUES=$ORDER(YSQANS(QUES))
               if QUES=""
                   QUIT 
               Begin DoDot:1
 +35               if YSQANS(QUES)'="X"
                       QUIT 
 +36               if $DATA(SKIPS(QUES))
                       QUIT 
 +37               SET CHK=CHK+1
                   SET SKIPS(QUES)=""
               End DoDot:1
 +38       IF CHK>13
               SET INVSTR="Invalid responses greater than 13"
               QUIT INVSTR
 +39       QUIT ""
INVALID(INVSTR) ;
 +1       ; Text for invalid rpt
 +2        NEW I,DONE
 +3        SET DONE=""
 +4        SET I=""
           FOR 
               SET I=$ORDER(YSDATA(I))
               if I=""!(DONE=1)
                   QUIT 
               Begin DoDot:1
 +5       ;If INVALID, do not display HP Code
                   IF YSDATA(I)["7771"
                       SET $PIECE(YSDATA(I),U,3)=""
                       SET DONE=1
               End DoDot:1
 +6        SET N=N+1
           SET YSDATA(N)="7783^9999;1^INVALID PROFILE: "_INVSTR_"|"
 +7       ;Don't Graph BR Scores
           SET YSNOGRPH=1
 +8        QUIT 
INVSCL    ;
 +1       ;Any scale>2 or 4 omits
 +2        NEW OMITS,SCALSTR,SCAL,QUES,RSL,CNT,I,II
 +3        FOR I=1140:1:1143,1145:1:1169,1240:1:1284
               Begin DoDot:1
 +4                SET SCAL=$$GET1^DIQ(601.87,I_",",3,"I")
 +5                SET CNT=0
 +6                IF SCAL="X Disclosure"!(SCAL="W Inconsistency")
                       QUIT 
 +7                SET OMITS=4
                   IF SCAL="V Invalidity"
                       SET OMITS=2
 +8                FOR II=1:1:$LENGTH(YSQSCAL(SCAL),U)
                       Begin DoDot:2
 +9                        SET QUES=$PIECE(YSQSCAL(SCAL),U,II)
                           SET RSL=YSQANS(QUES)
 +10                       IF RSL'=1
                               IF (RSL'=2)
                                   SET CNT=CNT+1
                       End DoDot:2
 +11               IF CNT>OMITS
                       Begin DoDot:2
 +12                       SET YSRAWRSL(SCAL)="-"
 +13                       SET YBRS(SCAL,"RSL")="-"
 +14                       SET YPRS(SCAL,"RSL")="-"
                       End DoDot:2
               End DoDot:1
 +15       QUIT 
EXTANS    ;
 +1       ;Extract the T/F from YSDATA
 +2       ;TRUE=1 FALSE=2
 +3        NEW X,QUEST,ANS,STR,PTR,DATA
 +4        SET X=2
 +5        FOR 
               SET X=$ORDER(YSDATA(X))
               if +X=0
                   QUIT 
               Begin DoDot:1
 +6                SET DATA=YSDATA(X)
 +7                SET ANS=$$GET1^DIQ(601.75,$PIECE($GET(DATA),U,3)_",",4,"I")
 +8                SET QUES=$PIECE(DATA,U,2)
                   SET PTR=$PIECE(DATA,U)
 +9                SET YSQANS(QUES)=ANS
 +10               SET YSQANS(QUES,"PTR")=PTR
 +11               SET YSQANS2(PTR)=ANS
               End DoDot:1
 +12       QUIT 
EXTRSL    ;
 +1       ; Extract the Raw score-store by Scale Name
 +2        NEW I,SCAL,VAL,BR,PR,RAW,YSAD,YSCALE,G,SCLNAM
 +3        SET I=1
           FOR 
               SET I=$ORDER(^TMP($JOB,"YSCOR",I))
               if I=""
                   QUIT 
               Begin DoDot:1
 +4                SET VAL=^TMP($JOB,"YSCOR",I)
                   SET SCAL=$PIECE(VAL,"=")
                   SET VAL=$PIECE(VAL,"=",2)
 +5                SET RAW=$PIECE(VAL,U)
                   SET YSRAWRSL(SCAL)=RAW
 +6       ;PATCH X
                   SET BR=$PIECE(VAL,U,2)
                   SET BR=$$BRFIX^YTSMCMIA(BR)
                   SET YBRS(SCAL,"RSL")=BR
 +7                SET PR=$PIECE(VAL,U,3)
                   SET YPRS(SCAL,"RSL")=PR
 +8       ;^TMP($J,"YSCOR") by scalename-extract calculated results below
                   SET SCLNAM(SCAL)=I
               End DoDot:1
 +9        DO EX2
 +10       QUIT 
EX2       ;T-SCORE NOT IN ^TMP($J,"YSCOR") 
 +1        SET YSAD=$GET(YS("AD"))
 +2        SET YSCALE=""
 +3        FOR 
               SET YSCALE=$ORDER(^YTT(601.92,"AC",YSAD,YSCALE))
               if 'YSCALE
                   QUIT 
               Begin DoDot:1
 +4                SET G=$GET(^YTT(601.92,YSCALE,0))
 +5                SET SCAL=$PIECE(G,U,3)
 +6       ;PATCH X
                   SET RAW=$PIECE(G,U,4)
                   SET BR=$PIECE(G,U,5)
                   SET BR=$$BRFIX^YTSMCMIA(BR)
                   SET PR=$PIECE(G,U,6)
 +7                SET YBRS(SCAL,"RSL")=BR
 +8                SET YPRS(SCAL,"RSL")=PR
               End DoDot:1
 +9        QUIT 
HIGHPT    ; Highpoint Hdr
 +1        SET N=N+1
 +2        NEW TEXT1,SCAL,SCALC,SCALSTR,SCALCOD,I,HI,DONE,SCALR
 +3        SET TEXT1=""
 +4        SET SCALCOD="1 ^2A^2B^3 ^4A^4B^5 ^6A^6B^7 ^8A^8B"
 +5        FOR I=1145:1:1156
               Begin DoDot:1
 +6                SET SCAL=$$GET1^DIQ(601.87,I_",",3,"I")
 +7                SET SCALR=$GET(YBRS(SCAL,"RSL"))
 +8                if SCALR'>59
                       QUIT 
 +9       ;Sort numbers vs strings correctly
                   SET SCALC=YSCOD("NAME",SCAL)
                   if $LENGTH(SCALC)=1
                       SET SCALC=SCALC_" "
 +10               SET HI(-SCALR,SCALC)=""
               End DoDot:1
 +11       SET DONE=0
           SET I=0
 +12       SET SCAL=""
           FOR 
               SET SCAL=$ORDER(HI(SCAL))
               if SCAL=""!DONE
                   QUIT 
               Begin DoDot:1
 +13               SET SCALC=""
                   FOR 
                       SET SCALC=$ORDER(HI(SCAL,SCALC))
                       if SCALC=""!DONE
                           QUIT 
                       Begin DoDot:2
 +14                       SET SCALCOD=SCALC
 +15                       if SCALCOD[" "
                               SET SCALCOD=+SCALCOD
 +16                       SET TEXT1=TEXT1_SCALCOD_" "
                           SET I=I+1
 +17                       IF I=3
                               SET DONE=1
                       End DoDot:2
               End DoDot:1
 +18       IF $LENGTH(TEXT1)>0
               SET TEXT1=$EXTRACT(TEXT1,1,$LENGTH(TEXT1)-1)
 +19       SET YSDATA(N)="7771^9999;1^"_TEXT1
 +20       QUIT 
BRADJH    ; BR Adjustment Hdr
 +1        NEW X,ACC,A,CC,TEXT1
 +2        SET TEXT1=""
 +3        SET X=YSRAWRSL("X Disclosure")
 +4        SET A=YBRS("A Generalized Anxiety","RSL")
 +5        SET CC=YBRS("CC Major Depression","RSL")
 +6        IF ((X>0)&(X<21))!((X>61)&(X<122))
               SET TEXT1="X"
 +7        IF (A>74)!(CC>74)
               SET TEXT1=$SELECT(TEXT1="":"A/CC",1:TEXT1_", A/CC")
 +8        if TEXT1=""
               SET TEXT1="None"
 +9        SET N=N+1
           SET YSDATA(N)="7772^9999;1^"_TEXT1
 +10       QUIT 
INVDH     ; Invalidity Hdr
 +1        NEW TEXT1
 +2        SET TEXT1=$GET(YSRAWRSL("V Invalidity"))
 +3        SET N=N+1
           SET YSDATA(N)="7773^9999;1^"_TEXT1
 +4        QUIT 
INCNH     ; Inconsistency Hdr
 +1        NEW TEXT1
 +2        SET TEXT1=$GET(YSRAWRSL("W Inconsistency"))
 +3        SET N=N+1
           SET YSDATA(N)="7774^9999;1^"_TEXT1
 +4        SET YSRAWRSL("W Inconsistency")=0
 +5        QUIT 
CALCW     ; Calc the W Scale
 +1        NEW PAIR
 +2        SET YSRAWRSL("W Inconsistency")=0
 +3        FOR PAIR="22-170","125-143","47-157","40-181","81-116","85-126","76-150","25-94","44-121","39-59","17-184","33-89","78-164","38-171","74-115","46-154","26-99","20-174","32-122","13-112","55-110","173-194","95-127","60-162","15-149"
               Begin DoDot:1
 +4                DO WADD(PAIR)
               End DoDot:1
 +5        SET N=N+1
           SET YSDATA(N)="7774^9999;1^"_YSRAWRSL("W Inconsistency")
 +6        QUIT 
WADD(PAIR) ;
 +1        NEW Q1,Q2,ADD
 +2       ;False=0 instead of 2
           SET Q1=$GET(YSQANS($PIECE(PAIR,"-")))
           if Q1=2
               SET Q1=0
 +3       ;
           SET Q2=$GET(YSQANS($PIECE(PAIR,"-",2)))
           if Q2=2
               SET Q2=0
 +4       ;W ?30,ADD
           SET ADD=$TRANSLATE((Q1-Q2),"-")
 +5        SET YSRAWRSL("W Inconsistency")=YSRAWRSL("W Inconsistency")+ADD
 +6        QUIT 
ELEV      ; Calc 3 highest Personality Scores from BR
 +1       ; Order of Importance after BR: S,C,P,1,2A,2B,3,4A,4B,5,6A,6B,7,8A,8B
 +2       ; Result is HIARR("FINAL")
 +3        NEW SCALSTR,SCAL,SCD,BR,TOPN,CNT,SCCOD,SCDF,SCALF,I,J
 +4        FOR I=1157:1:1159,1145:1:1156
               Begin DoDot:1
 +5                SET SCAL=$$GET1^DIQ(601.87,I_",",3,"I")
 +6                SET BR=YBRS(SCAL,"RSL")
 +7                if BR<60
                       QUIT 
 +8                SET HIARR("RSL",-BR,SCAL)=""
               End DoDot:1
 +9        SET TOPN=3
 +10       SET CNT=0
           SET BR=""
           FOR 
               SET BR=$ORDER(HIARR("RSL",BR))
               if BR=""!(CNT>TOPN)
                   QUIT 
               Begin DoDot:1
 +11               FOR I=1157:1:1159,1145:1:1156
                       Begin DoDot:2
 +12                       SET SCAL=$$GET1^DIQ(601.87,I_",",3,"I")
 +13                       if CNT>TOPN
                               QUIT 
 +14                       SET SCD=YSCOD("NAME",SCAL)
 +15                       if '$DATA(HIARR("RSL",BR,SCAL))
                               QUIT 
 +16                       SET CNT=CNT+1
                           SET HIARR("FINAL",CNT)=SCAL_U_SCD
                       End DoDot:2
               End DoDot:1
 +17      ;SCCOD of Scale Codes=Scale Name
           SET SCAL=""
           FOR 
               SET SCAL=$ORDER(YSCOD("NAME",SCAL))
               if SCAL=""
                   QUIT 
               SET SCCOD(YSCOD("NAME",SCAL))=SCAL
 +18       FOR I=1:1:TOPN
               Begin DoDot:1
 +19               if '$DATA(HIARR("FINAL",I))
                       QUIT 
 +20               SET SCAL=HIARR("FINAL",I)
                   SET SCD=$PIECE(SCAL,U,2)
                   SET SCAL=$PIECE(SCAL,U)
 +21               FOR J=1:1:3
                       Begin DoDot:2
 +22                       SET SCDF=SCD_"."_J
                           SET SCALF=SCCOD(SCDF)
 +23                       SET HIARR("FINAL",I,J)=SCALF_U_SCDF_U_YSRAWRSL(SCALF)_U_YBRS(SCALF,"RSL")_U_YPRS(SCALF,"RSL")
                       End DoDot:2
               End DoDot:1
 +24       QUIT 
NOTEW     ; Noteworthy
 +1       ; Use YSQANS(question number)=1/2 (True/False)
 +2       ;     YSQANS(question number,"PTR")=pointer to MH QUESTION
 +3        NEW CNT,CAT,QUESTR,QUES,CATTOT
 +4        SET CNT=1
 +5        SET CAT="Adult ADHD"
           SET CATTOT=0
 +6        FOR QUES=56,77,82,92,108,-63
               DO SETNOT
 +7       ;Must be>=4 endorsed responses
           IF CATTOT<4
               KILL YSNOTE(CNT)
 +8        SET CNT=CNT+1
 +9        SET CAT="Autism Spectrum"
           SET CATTOT=0
 +10       FOR QUES=92,119,138,163,165,179,190
               DO SETNOT
 +11       IF CATTOT<4
               KILL YSNOTE(CNT)
 +12       SET CNT=CNT+1
 +13       SET CAT="Childhood Abuse"
 +14       FOR QUES=47,157
               DO SETNOT
 +15       SET CNT=CNT+1
 +16       SET CAT="Eating Disorder"
 +17       FOR QUES=69,86,102,186
               DO SETNOT
 +18       SET CNT=CNT+1
 +19       SET CAT="Emotional Dyscontrol"
 +20       FOR QUES=27,36,45,56,72,80,127,177
               DO SETNOT
 +21       SET CNT=CNT+1
 +22       SET CAT="Explosively Angry"
 +23       FOR QUES=11,74,115,145,168,191
               DO SETNOT
 +24       SET CNT=CNT+1
 +25       SET CAT="Health Preoccupied"
 +26       FOR QUES=7,41,57,113,120,146
               DO SETNOT
 +27       SET CNT=CNT+1
 +28       SET CAT="Interpersonally Alienated"
 +29       FOR QUES=4,104,182,190
               DO SETNOT
 +30       SET CNT=CNT+1
 +31       SET CAT="Prescription Drug Abuse"
 +32       FOR QUES=124,176
               DO SETNOT
 +33       SET CNT=CNT+1
 +34       SET CAT="Self-Destructive Potential"
 +35       FOR QUES=14,32,34,39,59,101,107,114,126,151,164
               DO SETNOT
 +36       SET CNT=CNT+1
 +37       SET CAT="Self-Injurious Behavior/Tendency"
 +38       FOR QUES=40,181
               DO SETNOT
 +39       SET CNT=CNT+1
 +40       SET CAT="Traumatic Brain Injury"
 +41       FOR QUES=55,110
               DO SETNOT
 +42       SET CNT=CNT+1
 +43       SET CAT="Vengefully Prone"
 +44       FOR QUES=22,37,78,100,103,111,136,167,178,192
               DO SETNOT
 +45       QUIT 
SETNOT    ;
 +1        NEW CHK
 +2       ;True
           SET CHK=1
 +3       ;Minus Ques#-check for a False
           IF QUES<0
               SET QUES=-QUES
               SET CHK=2
 +4        SET ANS=YSQANS(QUES)
           if ANS'=CHK
               QUIT 
 +5        if '$DATA(YSNOTE(CNT,"CAT"))
               SET YSNOTE(CNT,"CAT")=CAT
 +6        SET YSNOTE(CNT,"CAT",QUES)=YSQANS(QUES,"PTR")_U_ANS
           SET CATTOT=CATTOT+1
 +7        QUIT 
MODIND    ;
 +1        NEW SCALSTR,SCAL,XSCAL,SCALCOD,ZTXT,STR,GRPH,I,ANS,RAW,BR
 +2        SET ANS=7775
           SET STR="  "
 +3        SET SCALSTR="X Disclosure^Y Desirability^Z Debasement"
 +4        DO RPTBLK(ANS,SCALSTR)
 +5        QUIT 
CPP       ;
 +1        NEW SCALSTR,SCAL,XSCAL,SCALCOD,ZTXT,STR,GRPH,I,ANS,RAW,BR
 +2        SET ANS=7776
           SET STR="  "
 +3        SET SCALSTR="1 Schizoid^2A Avoidant^2B Melancholic^3 Dependent^4A Histrionic^4B Turbulent^5 Narcissistic^6A Antisocial^6B Sadistic^7 Compulsive^8A Negativistic^8B Masochistic"
 +4        DO RPTBLK1(ANS,SCALSTR)
 +5        QUIT 
SPP       ;
 +1        NEW SCALSTR,SCAL,XSCAL,SCALCOD,ZTXT,STR,GRPH,I,ANS,RAW,BR
 +2        SET ANS=7777
           SET STR="  "
 +3        SET SCALSTR="S Schizotypal^C Borderline^P Paranoid"
 +4        DO RPTBLK1(ANS,SCALSTR)
 +5        QUIT 
CS        ;
 +1        NEW SCALSTR,SCAL,XSCAL,SCALCOD,ZTXT,STR,GRPH,I,ANS,RAW,BR
 +2        SET ANS=7778
           SET STR="  "
 +3        SET SCALSTR="A Generalized Anxiety^H Somatic Symptom^N Bipolar Spectrum^D Persistent Depression^B Alcohol Use^T Drug Use^R Post-Traumatic Stress"
 +4        DO RPTBLK1(ANS,SCALSTR)
 +5        QUIT 
SCS       ;
 +1        NEW SCALSTR,SCAL,XSCAL,SCALCOD,ZTXT,STR,GRPH,I,ANS,RAW,BR
 +2        SET ANS=7779
           SET STR="  "
 +3        SET SCALSTR="SS Schizophrenic Spectrum^CC Major Depression^PP Delusional"
 +4        DO RPTBLK1(ANS,SCALSTR)
 +5        QUIT 
TOP3      ;
 +1        NEW SCALSTR,SCAL,XSCAL,SCALCOD,ZTXT,STR,GRPH,I,ANS,RAW,BR,TCNT,TCNT2,HD
 +2        SET ANS=7780
           SET STR="  "
           SET HIHIT=0
 +3        if '$DATA(HIARR)
               QUIT 
 +4        FOR TCNT=1:1:3
               Begin DoDot:1
 +5                if '$DATA(HIARR("FINAL",TCNT))
                       QUIT 
 +6                SET HD=HIARR("FINAL",TCNT)
                   SET SCAL=$PIECE(HD,U)
                   SET SCALCOD=$PIECE(HD,U,2)
                   SET HIHIT=1
 +7                SET ZTXT=$$MAKSTR(SCAL,39,"L")
                   SET STR=STR_ZTXT_"|"
 +8                SET TCNT2=""
                   FOR 
                       SET TCNT2=$ORDER(HIARR("FINAL",TCNT,TCNT2))
                       if TCNT2=""
                           QUIT 
                       Begin DoDot:2
 +9                        SET HD=HIARR("FINAL",TCNT,TCNT2)
                           SET SCAL=$PIECE(HD,U)
                           SET SCALCOD=$PIECE(HD,U,2)
 +10                       SET RAW=$PIECE(HD,U,3)
                           SET BR=$PIECE(HD,U,4)
                           SET PR=$PIECE(HD,U,5)
 +11                       SET ZTXT=$$MAKSTR(SCAL,39,"L")
                           SET STR=STR_ZTXT
 +12                       SET ZTXT=$$MAKSTR(RAW,4,"R")
                           SET STR=STR_ZTXT
 +13                       SET ZTXT=$$MAKSTR(PR,4,"R")
                           SET STR=STR_ZTXT
 +14                       SET ZTXT=$$MAKSTR(BR,4,"R")
                           SET STR=STR_ZTXT
 +15                       SET GRPH=$$MAKGRP(BR,100)
                           SET STR=STR_"  "_GRPH_"|"
                       End DoDot:2
 +16               SET STR=STR_"|"
               End DoDot:1
 +17       SET N=N+1
           SET YSDATA(N)=ANS_"^9999;1^"_STR
 +18       QUIT 
FACET     ;
 +1        NEW SCAL,SCALCOD,GSCAL,GCOD,ZTXT,STR,SCALXRF,I,II
 +2       ;Make SCALXRF by Scale Code to get to the each Grossman Facet Scale Names
 +3        SET SCAL=""
           FOR 
               SET SCAL=$ORDER(YSCOD("NAME",SCAL))
               if SCAL=""
                   QUIT 
               SET SCALXRF(YSCOD("NAME",SCAL))=SCAL
 +4        SET ANS=7781
           SET STR="  "
           SET GRSHIT=0
 +5        FOR I=1145:1:1159
               Begin DoDot:1
 +6                SET SCAL=$$GET1^DIQ(601.87,I_",",3,"I")
 +7                SET SCALCOD=YSCOD("NAME",SCAL)
 +8                SET ZTXT=$$MAKSTR(SCAL,39,"L")
                   SET STR=STR_ZTXT_"|"
 +9                FOR II=1:1:3
                       Begin DoDot:2
 +10                       SET GCOD=SCALCOD_"."_II
 +11                       SET GSCAL=SCALXRF(GCOD)
 +12                       SET ZTXT=$$MAKSTR(GSCAL,39,"L")
                           SET STR=STR_ZTXT
 +13                       SET RAW=YSRAWRSL(GSCAL)
                           SET PR=YPRS(GSCAL,"RSL")
                           SET BR=YBRS(GSCAL,"RSL")
 +14      ;At least one Grossman Facet >=75
                           IF BR>74
                               SET GRSHIT=1
 +15                       SET ZTXT=$$MAKSTR(RAW,4,"R")
                           SET STR=STR_ZTXT
 +16                       SET ZTXT=$$MAKSTR(PR,4,"R")
                           SET STR=STR_ZTXT
 +17                       SET ZTXT=$$MAKSTR(BR,4,"R")
                           SET STR=STR_ZTXT_"|"
                       End DoDot:2
 +18               SET STR=STR_"|"
               End DoDot:1
 +19       SET N=N+1
           SET YSDATA(N)=ANS_"^9999;1^"_STR
 +20       QUIT 
RSLWRN    ; Result warning
 +1        NEW STR
 +2       ;S HIHIT=1,GRSHIT=0 ;TESTING
 +3       ;No Personality Scale >= 60
           if HIHIT=0
               QUIT 
 +4       ;At least one Grossman Facet >=75
           if GRSHIT=1
               QUIT 
 +5        SET STR="Generally, two conditions must be met in order for a Grossman Facet scale score |"
 +6        SET STR=STR_"to be considered interpretable. The first is that a primary personality scale |"
 +7        SET STR=STR_"must be at or above BR 60. The second is that one or more of its facet scales |"
 +8        SET STR=STR_"must be at or above BR 75. Since none of this patient's facet scale scores are|"
 +9        SET STR=STR_"at or above BR 75, no facet scale interpretations are included in this report.|"
 +10       SET N=N+1
           SET YSDATA(N)=ANS_"^9999;1^"_STR
 +11       QUIT 
NTWRTHY   ;
 +1        NEW I,II,CAT,QUES,QPTR,QTXT,ZTXT,STR,QANS
 +2        if '$DATA(YSNOTE)
               QUIT 
 +3        SET ANS=7782
 +4        SET STR="  "
 +5        SET I=0
           FOR 
               SET I=$ORDER(YSNOTE(I))
               if I=""
                   QUIT 
               Begin DoDot:1
 +6                SET CAT=YSNOTE(I,"CAT")
 +7                SET STR=STR_CAT_"|"
 +8                SET QUES=""
                   FOR 
                       SET QUES=$ORDER(YSNOTE(I,"CAT",QUES))
                       if QUES=""
                           QUIT 
                       Begin DoDot:2
 +9                        SET ZTXT=$$MAKSTR(QUES_". ",5,"R")
                           SET STR=STR_ZTXT
 +10                       SET QPTR=$PIECE(YSNOTE(I,"CAT",QUES),U)
                           SET QANS=$PIECE(YSNOTE(I,"CAT",QUES),U,2)
 +11                       SET QANS=$SELECT(QANS=1:"(True)",QANS=2:"(False)",1:"")
 +12                       SET QTXT=""
                           SET II=0
                           FOR 
                               SET II=$ORDER(^YTT(601.72,QPTR,1,II))
                               if +II=0
                                   QUIT 
                               Begin DoDot:3
 +13      ;Space between lines?
                                   SET QTXT=QTXT_^YTT(601.72,QPTR,1,II,0)
                               End DoDot:3
 +14                       SET STR=STR_QTXT_" "_QANS_"|"
                       End DoDot:2
 +15               SET STR=STR_"|"
               End DoDot:1
 +16       SET N=N+1
           SET YSDATA(N)=ANS_"^9999;1^"_STR
 +17       QUIT 
RESP      ;
 +1        NEW I,STR,NUM,QUES,ANS
 +2        SET ANS=7784
 +3        SET STR="||ITEM RESPONSES |"
 +4        IF '$DATA(YSQANS)
               SET STR=STR_"Could not create list of responses for the report|"
               SET N=N+1
               SET YSDATA(N)=ANS_"^9999;1^"_STR
               QUIT 
 +5        FOR I=1:1:195
               Begin DoDot:1
 +6                SET NUM=YSQANS(I)
                   IF NUM=""
                       SET NUM="X"
 +7                SET STR=STR_$$MAKSTR(I_": ",5,"R")_NUM_"  "
                   IF I#10=0
                       SET STR=STR_"|"
               End DoDot:1
 +8        SET N=N+1
           SET YSDATA(N)=ANS_"^9999;1^"_STR
 +9        QUIT 
RPTBLK(ANS,SCALSTR) ;
 +1       ;Report Block no PR
 +2        FOR I=1:1:$LENGTH(SCALSTR,U)
               Begin DoDot:1
 +3                SET SCAL=$PIECE(SCALSTR,U,I)
                   SET SCALCOD=YSCOD("NAME",SCAL)
 +4                SET ZTXT=$$MAKSTR(SCAL,43,"L")
                   SET STR=STR_ZTXT
 +5                SET RAW=YSRAWRSL(SCAL)
                   SET BR=YBRS(SCAL,"RSL")
 +6                SET ZTXT=$$MAKSTR(RAW,4,"R")
                   SET STR=STR_ZTXT
 +7                SET ZTXT=$$MAKSTR(BR,4,"R")
                   SET STR=STR_ZTXT
 +8                SET GRPH=$$MAKGRP(BR,100)
                   SET STR=STR_"  "_GRPH_"|"
               End DoDot:1
 +9        SET N=N+1
           SET YSDATA(N)=ANS_"^9999;1^"_STR
 +10       QUIT 
RPTBLK1(ANS,SCALSTR) ;
 +1       ;Report Block+PR
 +2        FOR I=1:1:$LENGTH(SCALSTR,U)
               Begin DoDot:1
 +3                SET SCAL=$PIECE(SCALSTR,U,I)
                   SET SCALCOD=YSCOD("NAME",SCAL)
 +4                SET ZTXT=$$MAKSTR(SCAL,39,"L")
                   SET STR=STR_ZTXT
 +5                SET RAW=YSRAWRSL(SCAL)
                   SET PR=YPRS(SCAL,"RSL")
                   SET BR=YBRS(SCAL,"RSL")
 +6                SET ZTXT=$$MAKSTR(RAW,4,"R")
                   SET STR=STR_ZTXT
 +7                SET ZTXT=$$MAKSTR(PR,4,"R")
                   SET STR=STR_ZTXT
 +8                SET ZTXT=$$MAKSTR(BR,4,"R")
                   SET STR=STR_ZTXT
 +9                SET GRPH=$$MAKGRP(BR,115)
                   SET STR=STR_"  "_GRPH_"|"
               End DoDot:1
 +10       SET N=N+1
           SET YSDATA(N)=ANS_"^9999;1^"_STR
 +11       QUIT 
MAKSTR(TXT,LEN,JUST,CHAR) ;
 +1       ;   TXT =Text
 +2       ;   LEN =Total Len
 +3       ;   JUST=R/L Justified, def=R
 +4       ;   CHAR=Char PAD, def=" "
 +5        NEW STR,TXTL
 +6        SET TXTL=$LENGTH(TXT)
           SET STR=""
 +7        IF TXT[" "
               SET TXT=$TRANSLATE(TXT," ",$CHAR(0))
 +8        IF $GET(CHAR)=""
               SET CHAR=" "
 +9        IF $GET(JUST)=""
               SET JUST="R"
 +10       IF JUST="L"
               Begin DoDot:1
 +11               SET STR=TXT
 +12      ;String is full len, don't justify
                   if (LEN-TXTL+1)'>1
                       QUIT 
 +13               SET $PIECE(STR,CHAR,LEN-TXTL+1)=""
               End DoDot:1
 +14       IF JUST="R"
               Begin DoDot:1
 +15               IF (LEN-TXTL+1)>1
                       SET $PIECE(STR,CHAR,LEN-TXTL+1)=""
 +16               SET STR=STR_TXT
               End DoDot:1
 +17      ;XLAT out $C(0)
           if STR[$CHAR(0)
               SET STR=$TRANSLATE(STR,$CHAR(0)," ")
 +18       QUIT STR
MAKGRP(NUM,MAX) ;
 +1       ; String of "*" for graph
 +2        NEW GRP,LEN,RND,J,NCHAR
 +3       ;Graph #of Chars.
           SET LEN=50
 +4        IF NUM="-"!($GET(YSNOGRPH)=1)
               Begin DoDot:1
 +5                SET GRP=$$MAKSTR("",LEN,"L")
               End DoDot:1
               QUIT GRP
 +6        SET NCHAR=LEN/MAX*NUM
           SET RND="."_$PIECE(NCHAR,".",2)
           SET NCHAR=$PIECE(NCHAR,".")
 +7        IF RND>.5
               SET NCHAR=NCHAR+1
 +8        SET $PIECE(GRP,"*",NCHAR+1)=""
           SET GRP=$$MAKSTR(GRP,LEN,"L")
 +9        QUIT GRP
YSARRAY(YSARRAY) ;
 +1        NEW II,YSVAL,YSCALEI,YSCALEN,YSKEYI,G,YSQN,YSAI,YSAN,YSTARG
 +2        KILL YSARRAY
 +3        SET II=1
 +4        FOR I=2:1
               if '$DATA(^TMP($JOB,"YSG",I))
                   QUIT 
               IF ^TMP($JOB,"YSG",I)?1"Scale".E
                   Begin DoDot:1
 +5                    SET YSCALEI=$PIECE(^TMP($JOB,"YSG",I),U)
                       SET YSCALEI=$PIECE(YSCALEI,"=",2)
 +6                    SET YSCALEN=$PIECE(^TMP($JOB,"YSG",I),U,4)
 +7                    SET YSKEYI=0
                       FOR 
                           SET YSKEYI=$ORDER(^YTT(601.91,"AC",YSCALEI,YSKEYI))
                           if YSKEYI'>0
                               QUIT 
                           Begin DoDot:2
 +8                            SET G=^YTT(601.91,YSKEYI,0)
 +9                            SET YSQN=$PIECE(G,U,3)
                               SET YSTARG=$PIECE(G,U,4)
                               SET YSVAL=$PIECE(G,U,5)
 +10                           SET YSAI=$ORDER(^YTT(601.85,"AC",YSAD,YSQN,0))
 +11                           if YSAI'>0
                                   QUIT 
 +12                           if '$DATA(^YTT(601.85,YSAI,0))
                                   QUIT 
 +13                           SET YSAN=""
 +14                           IF $DATA(^YTT(601.85,YSAI,1,1,0))
                                   SET YSAN=^YTT(601.85,YSAI,1,1,0)
 +15                           IF $PIECE(^YTT(601.85,YSAI,0),U,4)?1N.N
                                   SET YSAN=$PIECE(^YTT(601.85,YSAI,0),U,4)
                                   SET YSAN=$GET(^YTT(601.75,YSAN,1))
 +16                           IF YSAN=YSTARG
                                   SET YSARRAY(II)=YSVAL
                                   SET II=II+1
 +17                           SET YSARRAY("SCALE",YSCALEN)=$GET(YSARRAY("SCALE",YSCALEN))+YSVAL
                           End DoDot:2
                   End DoDot:1
 +18       QUIT