 %MACRO E2122P1M(INP=, IND=, OUTDATA=, IDVAR=, KEEPVAR=, SEDITS=,
                 DATE_ASOF=, 
                 FMNAME0=012221Y21Y22RC,   
                 AGEFMT0=IAGEHYBCY21MCE, SEXFMT0=ISEXHYBCY21MCE, 
                 DF_DG=, DF_POSTG=, 
                 AGESEXMAC=AGESEXV2, 
                 EDITMAC0=V21I0ED3, LABELMAC=V20H87L1, 
                 HIERMAC=V20H87H1, SCOREMAC=SCOREVAR);

 %**********************************************************************
 * E2122P1M creates HCC and score variables for each person who is
 * present in a person file.
 * If a person has at least one diagnosis in DIAG file then HCCs are
 * created, otherwise HCCs are set to 0 .
 * Score variables are created using coefficients from 5 final
 * models: Dialysis Continuing Enrollee, Dialysis New Enrollees, 
 * Functioning Graft Community, Functioning Graft Institutional, 
 * Functioning Graft New Enrollee.
 *
 * Assumptions about input files:
 *   - both files are sorted by person ID
 *   - person level file has the following variables:
 *     :&IDVAR  - person ID variable (it is a macro parameter)
 *     :DOB     - date of birth
 *     :SEX     - gender
 *     :OREC    - original reason for entitlement
 *     :MCAID   - Medicaid dummy variable
 *     :NEMCAID - Medicaid dummy variable for new enrollees
 *
 *   - diagnosis level file has the following vars:
 *     :&IDVAR - person ID variable (it is a macro parameter)
 *     :DIAG   - diagnosis
 *
 * Parameters:
 *      INP       - input person dataset
 *      IND       - input diagnosis dataset
 *      OUTDATA   - output dataset
 *      IDVAR     - name of person ID variable (MBI for Medicare data)
 *      KEEPVAR   - variables to keep in output file
 *      SEDITS    - a switch that controls whether to perform MCE edits  
 *                  on ICD10: 1-YES, 0-NO
 *      DATE_ASOF - reference date to calculate age. Set to February 1
 *                  of the payment year for consistency with CMS.
 *      FMNAME0   - format name (crosswalk ICD10 to V21 CCs)
 *      AGEFMT0   - format name (crosswalk ICD10 to acceptable age range
 *                  in case MCE edits on diags are to be performed)
 *      SEXFMT0   - format name (crosswalk ICD10 to acceptable sex in 
 *                  case MCE edits on diags are to be performed)
 *      DF_DG     - normalization factor set by CMS, used to multiply 
 *                  dialysis and transplant scores (currently set to 1 
 *                  by default)
 *      DF_POSTG  - normalization factor set by CMS, used to multiply 
 *                  functioning graft scores (currently set to 1 by 
 *                  default)
 *      AGESEXMAC - external macro name: create age/sex,
 *                  originally disabled, disabled vars
 *      EDITMAC0  - external macro name: perform edits to ICD10
 *      LABELMAC  - external macro name: assign labels to HCCs
 *      HIERMAC   - external macro name: set HCC=0 according to
 *                  hierarchies
 *      SCOREMAC  - external macro name: calculate a score variable
 *
 **********************************************************************;

 %**********************************************************************
 * step1: include external macros;
 **********************************************************************;
 %IF "&AGESEXMAC" ne "" %THEN %DO;
     %INCLUDE IN0(&AGESEXMAC) /SOURCE2; %* create demographic variables;
 %END;
 %IF "&EDITMAC0" ne "" %THEN %DO;
     %INCLUDE IN0(&EDITMAC0)   /SOURCE2; %* perform edits on ICD10;
 %END;
 %IF "&LABELMAC" ne "" %THEN %DO;
     %INCLUDE IN0(&LABELMAC)  /SOURCE2; %* hcc labels;
 %END;
 %IF "&HIERMAC" ne "" %THEN %DO;
     %INCLUDE IN0(&HIERMAC)   /SOURCE2; %* hierarchies;
 %END;
 %IF "&SCOREMAC" ne "" %THEN %DO;
     %INCLUDE IN0(&SCOREMAC)  /SOURCE2; %* calculate score variable;
 %END;

 %**********************************************************************
 * step2: define internal macro variables;
 **********************************************************************;
              %****************************************
               * Macro variables common to all models
               *****************************************;

 %LET N_CC=201;    %*max # of HCCs;

               %****************************************
               * Continuing enrollee dialysis model
               *****************************************;
 %* Age/sex cells used in dialysis CE model, functioning graft community 
  model and functioning graft institutional model;
 %LET AGESEX=%STR(F0_34  F35_44 F45_54 F55_59 F60_64 F65_69
                  F70_74 F75_79 F80_84 F85_89 F90_94 F95_GT
                  M0_34  M35_44 M45_54 M55_59 M60_64 M65_69
                  M70_74 M75_79 M80_84 M85_89 M90_94 M95_GT);

 %* Medicaid and Originally Disabled Interactions with Age and Sex used
  in dialysis CE model and functioning graft community model;
 %LET MOAS = %STR(MCAID_Female_Aged
                  MCAID_Female_NonAged
                  MCAID_Male_Aged
                  MCAID_Male_NonAged
                  OriginallyDisabled_Female
                  OriginallyDisabled_Male);

 %* Originally Disabled Interactions with ESRD and Sex;
 %LET OE = %STR(Originally_ESRD_Female
                Originally_ESRD_Male);

 %* Disease Interactions for dialysis CE model;
 %LET DID = %STR(SEPSIS_CARD_RESP_FAIL
                 CANCER_IMMUNE
                 DIABETES_CHF
                 CHF_COPD
                 COPD_CARD_RESP_FAIL);

 %* Disabled/Disease Interactions for dialysis CE model and functioning 
  graft community model;
 %LET DDC = %STR(NONAGED_HCC6      NONAGED_HCC34
                 NONAGED_HCC46     NONAGED_HCC54
                 NONAGED_HCC55     NONAGED_HCC110
                 NONAGED_HCC176);

 %* Diagnostic categories necessary to create interaction variables;
 %LET DIAG_CAT= CANCER  DIABETES  IMMUNE  CHF     CARD_RESP_FAIL
                COPD    RENAL     COMPL   SEPSIS  PRESSURE_ULCER;

 %* Variables for Dialysis regression;
 %LET MOD_DIAL= %STR(&AGESEX &MOAS &OE &HCCV21_list87 &DID &DDC);

               %****************************************
               * New Enrollee dialysis model
               *****************************************;
 %* Variables for Dialysis New Enrollees regression;
 %LET MOD_DIAL_NE = %STR(
 NMCAID_NORIGDIS_NEF0_34        NMCAID_NORIGDIS_NEF35_44
 NMCAID_NORIGDIS_NEF45_54       NMCAID_NORIGDIS_NEF55_59
 NMCAID_NORIGDIS_NEF60_64       NMCAID_NORIGDIS_NEF65_69
 NMCAID_NORIGDIS_NEF70_74       NMCAID_NORIGDIS_NEF75_79
 NMCAID_NORIGDIS_NEF80_84       NMCAID_NORIGDIS_NEF85_GT

 NMCAID_NORIGDIS_NEM0_34        NMCAID_NORIGDIS_NEM35_44
 NMCAID_NORIGDIS_NEM45_54       NMCAID_NORIGDIS_NEM55_59
 NMCAID_NORIGDIS_NEM60_64       NMCAID_NORIGDIS_NEM65_69
 NMCAID_NORIGDIS_NEM70_74       NMCAID_NORIGDIS_NEM75_79
 NMCAID_NORIGDIS_NEM80_84       NMCAID_NORIGDIS_NEM85_GT

 MCAID_NORIGDIS_NEF0_34         MCAID_NORIGDIS_NEF35_44
 MCAID_NORIGDIS_NEF45_54        MCAID_NORIGDIS_NEF55_59
 MCAID_NORIGDIS_NEF60_64        MCAID_NORIGDIS_NEF65_69
 MCAID_NORIGDIS_NEF70_74        MCAID_NORIGDIS_NEF75_79
 MCAID_NORIGDIS_NEF80_84        MCAID_NORIGDIS_NEF85_GT

 MCAID_NORIGDIS_NEM0_34         MCAID_NORIGDIS_NEM35_44
 MCAID_NORIGDIS_NEM45_54        MCAID_NORIGDIS_NEM55_59
 MCAID_NORIGDIS_NEM60_64        MCAID_NORIGDIS_NEM65_69
 MCAID_NORIGDIS_NEM70_74        MCAID_NORIGDIS_NEM75_79
 MCAID_NORIGDIS_NEM80_84        MCAID_NORIGDIS_NEM85_GT

 NMCAID_ORIGDIS_NEF0_34         NMCAID_ORIGDIS_NEF35_44
 NMCAID_ORIGDIS_NEF45_54        NMCAID_ORIGDIS_NEF55_59
 NMCAID_ORIGDIS_NEF60_64        NMCAID_ORIGDIS_NEF65_69
 NMCAID_ORIGDIS_NEF70_74        NMCAID_ORIGDIS_NEF75_79
 NMCAID_ORIGDIS_NEF80_84        NMCAID_ORIGDIS_NEF85_GT

 NMCAID_ORIGDIS_NEM0_34         NMCAID_ORIGDIS_NEM35_44
 NMCAID_ORIGDIS_NEM45_54        NMCAID_ORIGDIS_NEM55_59
 NMCAID_ORIGDIS_NEM60_64        NMCAID_ORIGDIS_NEM65_69
 NMCAID_ORIGDIS_NEM70_74        NMCAID_ORIGDIS_NEM75_79
 NMCAID_ORIGDIS_NEM80_84        NMCAID_ORIGDIS_NEM85_GT
                              
 MCAID_ORIGDIS_NEF0_34          MCAID_ORIGDIS_NEF35_44
 MCAID_ORIGDIS_NEF45_54         MCAID_ORIGDIS_NEF55_59
 MCAID_ORIGDIS_NEF60_64         MCAID_ORIGDIS_NEF65_69
 MCAID_ORIGDIS_NEF70_74         MCAID_ORIGDIS_NEF75_79
 MCAID_ORIGDIS_NEF80_84         MCAID_ORIGDIS_NEF85_GT

 MCAID_ORIGDIS_NEM0_34          MCAID_ORIGDIS_NEM35_44
 MCAID_ORIGDIS_NEM45_54         MCAID_ORIGDIS_NEM55_59
 MCAID_ORIGDIS_NEM60_64         MCAID_ORIGDIS_NEM65_69
 MCAID_ORIGDIS_NEM70_74         MCAID_ORIGDIS_NEM75_79
 MCAID_ORIGDIS_NEM80_84         MCAID_ORIGDIS_NEM85_GT);


               %****************************************
               * Community Functioning Graft model
               *****************************************;
 %* Disease Interactions for Functioning graft community model;
 %LET DIC = %STR(SEPSIS_CARD_RESP_FAIL
                 CANCER_IMMUNE
                 DIABETES_CHF
                 CHF_COPD
                 CHF_RENAL
                 COPD_CARD_RESP_FAIL);

 %* Variables for Functioning Graft Community regression;
 %LET MOD_GRAFT_COMM= %STR(&AGESEX &MOAS &HCCV21_list87 &DIC &DDC);

               %****************************************
               * Institutional Functioning Graft model
               *****************************************;
 %* Disabled/Disease Interactions for institutional Functioning graft 
  model;
 %LET DDI = %STR(NONAGED_HCC85       NONAGED_PRESSURE_ULCER
                 NONAGED_HCC161      NONAGED_HCC39
                 NONAGED_HCC77       NONAGED_HCC6);

 %* Disease Interactions for institutional functioning graft model;
 %LET DII = %STR(CHF_COPD COPD_CARD_RESP_FAIL
                 SEPSIS_PRESSURE_ULCER
                 SEPSIS_ARTIF_OPENINGS
                 ART_OPENINGS_PRESSURE_ULCER
                 DIABETES_CHF
                 COPD_ASP_SPEC_BACT_PNEUM
                 ASP_SPEC_BACT_PNEUM_PRES_ULC
                 SEPSIS_ASP_SPEC_BACT_PNEUM
                 SCHIZOPHRENIA_COPD
                 SCHIZOPHRENIA_CHF
                 SCHIZOPHRENIA_SEIZURES);

 %* Variables for Functioning Graft Institutional regression;
 %LET MOD_GRAFT_INST= %STR(&AGESEX MCAID ORIGDS &HCCV21_list87
                           &DII &DDI);

               %***************************************;
               * New Enrollee Functioning Graft model 
               ****************************************;
 %* Variables for Functioning Graft New Enrollee regression;
 %LET MOD_GRAFT_NE= %STR(
 NMCAID_NORIGDIS_G_NEF0_34    NMCAID_NORIGDIS_G_NEF35_44 
 NMCAID_NORIGDIS_G_NEF45_54   NMCAID_NORIGDIS_G_NEF55_59 
 NMCAID_NORIGDIS_G_NEF60_64   NMCAID_NORIGDIS_G_NEF65    
 NMCAID_NORIGDIS_G_NEF66      NMCAID_NORIGDIS_G_NEF67    
 NMCAID_NORIGDIS_G_NEF68      NMCAID_NORIGDIS_G_NEF69    
 NMCAID_NORIGDIS_G_NEF70_74   NMCAID_NORIGDIS_G_NEF75_79 
 NMCAID_NORIGDIS_G_NEF80_84   NMCAID_NORIGDIS_G_NEF85_89 
 NMCAID_NORIGDIS_G_NEF90_94   NMCAID_NORIGDIS_G_NEF95_GT
 
 NMCAID_NORIGDIS_G_NEM0_34    NMCAID_NORIGDIS_G_NEM35_44 
 NMCAID_NORIGDIS_G_NEM45_54   NMCAID_NORIGDIS_G_NEM55_59 
 NMCAID_NORIGDIS_G_NEM60_64   NMCAID_NORIGDIS_G_NEM65    
 NMCAID_NORIGDIS_G_NEM66      NMCAID_NORIGDIS_G_NEM67    
 NMCAID_NORIGDIS_G_NEM68      NMCAID_NORIGDIS_G_NEM69    
 NMCAID_NORIGDIS_G_NEM70_74   NMCAID_NORIGDIS_G_NEM75_79 
 NMCAID_NORIGDIS_G_NEM80_84   NMCAID_NORIGDIS_G_NEM85_89 
 NMCAID_NORIGDIS_G_NEM90_94   NMCAID_NORIGDIS_G_NEM95_GT 

 MCAID_NORIGDIS_G_NEF0_34     MCAID_NORIGDIS_G_NEF35_44  
 MCAID_NORIGDIS_G_NEF45_54    MCAID_NORIGDIS_G_NEF55_59  
 MCAID_NORIGDIS_G_NEF60_64    MCAID_NORIGDIS_G_NEF65     
 MCAID_NORIGDIS_G_NEF66       MCAID_NORIGDIS_G_NEF67     
 MCAID_NORIGDIS_G_NEF68       MCAID_NORIGDIS_G_NEF69     
 MCAID_NORIGDIS_G_NEF70_74    MCAID_NORIGDIS_G_NEF75_79  
 MCAID_NORIGDIS_G_NEF80_84    MCAID_NORIGDIS_G_NEF85_89  
 MCAID_NORIGDIS_G_NEF90_94    MCAID_NORIGDIS_G_NEF95_GT 
 
 MCAID_NORIGDIS_G_NEM0_34     MCAID_NORIGDIS_G_NEM35_44  
 MCAID_NORIGDIS_G_NEM45_54    MCAID_NORIGDIS_G_NEM55_59  
 MCAID_NORIGDIS_G_NEM60_64    MCAID_NORIGDIS_G_NEM65     
 MCAID_NORIGDIS_G_NEM66       MCAID_NORIGDIS_G_NEM67     
 MCAID_NORIGDIS_G_NEM68       MCAID_NORIGDIS_G_NEM69     
 MCAID_NORIGDIS_G_NEM70_74    MCAID_NORIGDIS_G_NEM75_79  
 MCAID_NORIGDIS_G_NEM80_84    MCAID_NORIGDIS_G_NEM85_89  
 MCAID_NORIGDIS_G_NEM90_94    MCAID_NORIGDIS_G_NEM95_GT 
 
 NMCAID_ORIGDIS_G_NEF65       NMCAID_ORIGDIS_G_NEF66     
 NMCAID_ORIGDIS_G_NEF67       NMCAID_ORIGDIS_G_NEF68     
 NMCAID_ORIGDIS_G_NEF69       NMCAID_ORIGDIS_G_NEF70_74  
 NMCAID_ORIGDIS_G_NEF75_79    NMCAID_ORIGDIS_G_NEF80_84  
 NMCAID_ORIGDIS_G_NEF85_89    NMCAID_ORIGDIS_G_NEF90_94  
 NMCAID_ORIGDIS_G_NEF95_GT 
 
 NMCAID_ORIGDIS_G_NEM65     
 NMCAID_ORIGDIS_G_NEM66       NMCAID_ORIGDIS_G_NEM67     
 NMCAID_ORIGDIS_G_NEM68       NMCAID_ORIGDIS_G_NEM69     
 NMCAID_ORIGDIS_G_NEM70_74    NMCAID_ORIGDIS_G_NEM75_79  
 NMCAID_ORIGDIS_G_NEM80_84    NMCAID_ORIGDIS_G_NEM85_89  
 NMCAID_ORIGDIS_G_NEM90_94    NMCAID_ORIGDIS_G_NEM95_GT 
 
 MCAID_ORIGDIS_G_NEF65        MCAID_ORIGDIS_G_NEF66      
 MCAID_ORIGDIS_G_NEF67        MCAID_ORIGDIS_G_NEF68      
 MCAID_ORIGDIS_G_NEF69        MCAID_ORIGDIS_G_NEF70_74   
 MCAID_ORIGDIS_G_NEF75_79     MCAID_ORIGDIS_G_NEF80_84   
 MCAID_ORIGDIS_G_NEF85_89     MCAID_ORIGDIS_G_NEF90_94   
 MCAID_ORIGDIS_G_NEF95_GT    
 
 MCAID_ORIGDIS_G_NEM65      
 MCAID_ORIGDIS_G_NEM66        MCAID_ORIGDIS_G_NEM67      
 MCAID_ORIGDIS_G_NEM68        MCAID_ORIGDIS_G_NEM69      
 MCAID_ORIGDIS_G_NEM70_74     MCAID_ORIGDIS_G_NEM75_79   
 MCAID_ORIGDIS_G_NEM80_84     MCAID_ORIGDIS_G_NEM85_89   
 MCAID_ORIGDIS_G_NEM90_94     MCAID_ORIGDIS_G_NEM95_GT);   

 %*age/sex variables for New Enrollee interactions;
 %LET NE_AGESEXV=%STR(
      NEF0_34    NEF35_44   NEF45_54   NEF55_59   NEF60_64
      NEF65      NEF66      NEF67      NEF68      NEF69
      NEF70_74   NEF75_79   NEF80_84   NEF85_GT   NEF65_69
      NEF85_89   NEF90_94   NEF95_GT   
      NEM0_34    NEM35_44   NEM45_54   NEM55_59   NEM60_64
      NEM65      NEM66      NEM67      NEM68      NEM69
      NEM70_74   NEM75_79   NEM80_84   NEM85_GT   NEM65_69
      NEM85_89   NEM90_94   NEM95_GT);
 
 %*macro to create New Enrollee regression variables;
 %MACRO INTER(PVAR=, RLIST=);
    %LOCAL I;
    %LET I=1;
    %DO %UNTIL(%SCAN(&RLIST,&I)=);
       &PVAR._%SCAN(&RLIST,&I) = &PVAR * %SCAN(&RLIST,&I);
       %LET I=%EVAL(&I+1);
    %END;
 %MEND INTER;


 %**********************************************************************
 * step3: merge person and diagnosis files outputting one record
 *        per person with score and HCC variables for each input person
 *        level record
 **********************************************************************;

 DATA &OUTDATA(KEEP=&KEEPVAR);
    %****************************************************;
    * step3.1: declaration section;
    %****************************************************;

    %IF "&LABELMAC" ne "" %THEN %&LABELMAC;  *HCC labels;

    %*length of some new variables,
     other demographic vars defined in macro &AGESEXMAC;
    LENGTH CC $4. AGEF   
           &AGESEX &DIAG_CAT &MOAS &OE &DDC &DIC
           &DDI &DII
           &NE_AGESEXV 
           CC1-CC&N_CC
           HCC1-HCC&N_CC        3.;

    %*retain cc vars;
    RETAIN CC1-CC&N_CC 0  AGEF
           ;
    %*arrays;
    ARRAY C(&N_CC)  CC1-CC&N_CC;
    ARRAY HCC(&N_CC) HCC1-HCC&N_CC;
    %*interactions with HCCs;
    ARRAY RV &DIAG_CAT &DIC &DDC &DDI &DII;

    %****************************************************
    * step3.2: bring regression parameters
    ****************************************************;
    IF _N_ = 1 THEN SET INCOEF.HCCCOEFN;

    %****************************************************
    * step3.3: merge
    ****************************************************;
    MERGE &INP(IN=IN1)
          &IND(IN=IN2);
    BY &IDVAR;

    IF IN1 THEN DO;

    %*******************************************************
    * step3.4: for the first record for a person set CC to 0
    ********************************************************;

       IF FIRST.&IDVAR THEN DO;
          %*set ccs to 0;
           DO I=1 TO &N_CC;
            C(I)=0;
           END;
           %* age;
           AGEF =FLOOR((INTCK(
                'MONTH',DOB,&DATE_ASOF)-(DAY(&DATE_ASOF)<DAY(DOB)))/12);
           IF AGEF=64 & OREC='0' THEN AGEF=65;
           IF AGEF<0 THEN AGEF=0;
       END;

    %******************************************************
    * step3.5 if there are any diagnoses for a person
    *         then do the following:
    *         - perform diag edits using macro &EDITMAC0 
    *         - create CC using corresponding formats for ICD10
    *         - assign additional CC using provided additional formats
    *******************************************************;
       IF IN1 & IN2 THEN DO;
          %*initialize;
          CC="9999";

          %IF "&EDITMAC0" NE "" %THEN 
               %&EDITMAC0(AGE=AGEF,SEX=SEX,ICD10=DIAG); 
          IF CC NE "-1.0" AND CC NE "9999" THEN DO;
             IND=INPUT(CC,4.);
             IF 1 <= IND <= &N_CC THEN C(IND)=1;
          END;
          ELSE IF CC="9999" THEN DO;
             ** primary assignment **;
             IND = INPUT(LEFT(PUT(DIAG,$IAS1&FMNAME0..)),4.);
             IF 1 <= IND <= &N_CC THEN C(IND)=1;
             ** duplicate assignment **;
             IND = INPUT(LEFT(PUT(DIAG,$IAS2&FMNAME0..)),4.);
             IF 1 <= IND <= &N_CC THEN C(IND)=1;
          END;
       END; %*CC creation;  

    %**************************************************************
    * step3.6 for the last record for a person do the
    *         following:
    *         - create demographic variables needed (macro &AGESEXMAC)
    *         - create HCC using hierarchies (macro &HIERMAC)
    *         - create HCC interaction variables
    *         - create HCC and DISABL interaction variables
    *         - set HCCs and interaction vars to zero if there
    *           are no diagnoses for a person
    *         - create 17 score variables
    **************************************************************;
       IF LAST.&IDVAR THEN DO;

           %*****************************
           * demographic vars
           *****************************;
           %*create age/sex cells, originally disabled, disabled vars;
           %IF "&AGESEXMAC" ne "" %THEN
           %&AGESEXMAC(AGEF=AGEF, SEX=SEX, OREC=OREC);

           NEF85_GT = (SEX='2' & AGEF >84);
           NEM85_GT = (SEX='1' & AGEF >84);
           NEF65_69 = SUM(NEF65, NEF66, NEF67, NEF68, NEF69);
           NEM65_69 = SUM(NEM65, NEM66, NEM67, NEM68, NEM69);

           %*medicaid interactions;
           MCAID_Female_Aged     = MCAID*(SEX='2')*(1 - DISABL);
           MCAID_Female_NonAged  = MCAID*(SEX='2')*DISABL;
           MCAID_Male_Aged       = MCAID*(SEX='1')*(1 - DISABL);
           MCAID_Male_NonAged    = MCAID*(SEX='1')*DISABL;

           %* originally disabled interactions with age/sex;
           OriginallyDisabled_Female= ORIGDS*(SEX='2');
           OriginallyDisabled_Male  = ORIGDS*(SEX='1');

           %* originally  ESRD or both originally disabled & ESRD;
           Originally_ESRD_Female   = (OREC IN ('2','3'))*(SEX='2')*
                                      (AGEF >=65);
           Originally_ESRD_Male     = (OREC IN ('2','3'))*(SEX='1')*
                                      (AGEF >=65);

           %*****************************
           * variables for New Enrollees
           *****************************;
           %* NE interactions;
           %* Dialysis NE;
           NE_ORIGDS       = (OREC='1');
           NMCAID_NORIGDIS = (NEMCAID <=0 and NE_ORIGDS <=0);
           MCAID_NORIGDIS  = (NEMCAID > 0 and NE_ORIGDS <=0);
           NMCAID_ORIGDIS  = (NEMCAID <=0 and NE_ORIGDS > 0);
           MCAID_ORIGDIS   = (NEMCAID > 0 and NE_ORIGDS > 0);

           %INTER(PVAR =  NMCAID_NORIGDIS,  RLIST = &NE_AGESEXV);
           %INTER(PVAR =  MCAID_NORIGDIS,   RLIST = &NE_AGESEXV);
           %INTER(PVAR =  NMCAID_ORIGDIS,   RLIST = &NE_AGESEXV);
           %INTER(PVAR =  MCAID_ORIGDIS,    RLIST = &NE_AGESEXV);

           %* Funcioning Graft NE;
           NE_ORIGDS_G       = (AGEF>=65)*(OREC='1');
           NMCAID_NORIGDIS_G = (NEMCAID <=0 and NE_ORIGDS_G <=0);
           MCAID_NORIGDIS_G  = (NEMCAID > 0 and NE_ORIGDS_G <=0);
           NMCAID_ORIGDIS_G  = (NEMCAID <=0 and NE_ORIGDS_G > 0);
           MCAID_ORIGDIS_G   = (NEMCAID > 0 and NE_ORIGDS_G > 0);

           %INTER(PVAR =  NMCAID_NORIGDIS_G,  RLIST = &NE_AGESEXV);
           %INTER(PVAR =  MCAID_NORIGDIS_G,   RLIST = &NE_AGESEXV);
           %INTER(PVAR =  NMCAID_ORIGDIS_G,   RLIST = &NE_AGESEXV);
           %INTER(PVAR =  MCAID_ORIGDIS_G,    RLIST = &NE_AGESEXV); 

           IF IN1 & IN2 THEN DO;
             %***************************
             * setting HCCs, hierarchies   
             ***************************;
             CC134=0;
             %IF "&HIERMAC" ne "" %THEN %&HIERMAC;
             %***************************
             * HCC interaction variables
             ***************************;
             %* Functioning graft community model diagnostic categories;
             CANCER         = MAX(HCC8, HCC9, HCC10, HCC11, HCC12);
             DIABETES       = MAX(HCC17, HCC18, HCC19);
             IMMUNE         = HCC47;
             CARD_RESP_FAIL = MAX(HCC82, HCC83, HCC84);
             CHF            = HCC85;
             COPD           = MAX(HCC110, HCC111);
             RENAL          = MAX(HCC134, HCC135, HCC136, HCC137,
                                  HCC138, HCC139, HCC140, HCC141);
             COMPL          = HCC176;
             SEPSIS         = HCC2;
             %*interactions ;
             SEPSIS_CARD_RESP_FAIL =  SEPSIS*CARD_RESP_FAIL;
             CANCER_IMMUNE         =  CANCER*IMMUNE;
             DIABETES_CHF          =  DIABETES*CHF ;
             CHF_COPD              =  CHF*COPD     ;
             CHF_RENAL             =  CHF*RENAL    ;
             COPD_CARD_RESP_FAIL   =  COPD*CARD_RESP_FAIL  ;
             %*interactions with disabled ;
             NONAGED_HCC6   = DISABL*HCC6;   %*Opportunistic Infections;
             NONAGED_HCC34  = DISABL*HCC34;  %*Chronic Pancreatitis;
             NONAGED_HCC46  = DISABL*HCC46;  %*Severe Hematol Disorders;
             NONAGED_HCC54  = DISABL*HCC54;  %*Drug/Alcohol Psychosis;
             NONAGED_HCC55  = DISABL*HCC55;  %*Drug/Alcohol Dependence;
             NONAGED_HCC110 = DISABL*HCC110; %*Cystic Fibrosis;
             NONAGED_HCC176 = DISABL*HCC176; %* added 7/2009;

             %*Functioning graft institutional model;
             PRESSURE_ULCER = MAX(HCC157, HCC158, HCC159, HCC160);
             SEPSIS_PRESSURE_ULCER = SEPSIS*PRESSURE_ULCER;
             SEPSIS_ARTIF_OPENINGS = SEPSIS*(HCC188);
             ART_OPENINGS_PRESSURE_ULCER = (HCC188)*PRESSURE_ULCER;
             DIABETES_CHF = DIABETES*CHF;
             COPD_ASP_SPEC_BACT_PNEUM = COPD*(HCC114);
             ASP_SPEC_BACT_PNEUM_PRES_ULC = (HCC114)*PRESSURE_ULCER;
             SEPSIS_ASP_SPEC_BACT_PNEUM = SEPSIS*(HCC114);
             SCHIZOPHRENIA_COPD = (HCC57)*COPD;
             SCHIZOPHRENIA_CHF= (HCC57)*CHF;
             SCHIZOPHRENIA_SEIZURES = (HCC57)*(HCC79);

             NONAGED_HCC85          = DISABL*(HCC85);
             NONAGED_PRESSURE_ULCER = DISABL*PRESSURE_ULCER;
             NONAGED_HCC161         = DISABL*(HCC161);
             NONAGED_HCC39          = DISABL*(HCC39);
             NONAGED_HCC77          = DISABL*(HCC77);

           END; %*there are some diagnoses for a person;
           ELSE DO;
              DO I=1 TO &N_CC;
                 HCC(I)=0;
              END;
              DO OVER RV;
                 RV=0;
              END;
           END;

           %*to be able to keep normalization factors DF_DG and DF_POSTG in the output file;
           DF_DG = &DF_DG; 
           DF_POSTG = &DF_POSTG;
           LABEL
           DF_DG = "Normalization factor set by CMS, used to multiply dialysis and transplant scores"
           DF_POSTG = "Normalization factor set by CMS, used to multiply functioning graft scores";
          
           %*score calculation;
                                 
           /*********************************/
           /*    dialysis model             */
           /*********************************/;
          %IF "&SCOREMAC" ne "" %THEN %DO;
          %&SCOREMAC(PVAR=SCORE_DIAL, RLIST=&MOD_DIAL, CPREF=DI_);
           %*normalization;
           SCORE_DIAL=&DF_DG*SCORE_DIAL;

           /**********************************/
           /*  dialysis new enrollees model  */
           /**********************************/;
          %&SCOREMAC(PVAR=SCORE_DIAL_NE, RLIST=&MOD_DIAL_NE, CPREF=DNE_);
           %*normalization;
           SCORE_DIAL_NE=&DF_DG*SCORE_DIAL_NE;

           /**********************************/
           /*   transplant scores            */
           /**********************************/;

          SCORE_TRANS_KIDNEY_ONLY_1M = &DF_DG*TRANSPLANT_KIDNEY_ONLY_1M;
          SCORE_TRANS_KIDNEY_ONLY_2M = &DF_DG*TRANSPLANT_KIDNEY_ONLY_2M;
          SCORE_TRANS_KIDNEY_ONLY_3M = &DF_DG*TRANSPLANT_KIDNEY_ONLY_3M;

           /*************************************/
           /* community Functioning graft model */
           /*************************************/;

          %&SCOREMAC(PVAR=_SCORE_GRAFT_COMM, RLIST=&MOD_GRAFT_COMM,
                         CPREF=GC_);

          %*transplant bumps;
          SCORE_GRAFT_COMM_DUR4_9_GE65 =&DF_POSTG*(_SCORE_GRAFT_COMM +
                                        GE65_DUR4_9 * (AGEF >= 65));

          SCORE_GRAFT_COMM_DUR4_9_LT65 =&DF_POSTG*(_SCORE_GRAFT_COMM +
                                        LT65_DUR4_9 * (AGEF < 65)); 

          SCORE_GRAFT_COMM_DUR10PL_GE65 =&DF_POSTG*(_SCORE_GRAFT_COMM +
                                         GE65_DUR10PL * (AGEF >= 65));

          SCORE_GRAFT_COMM_DUR10PL_LT65 =&DF_POSTG*(_SCORE_GRAFT_COMM +
                                         LT65_DUR10PL * (AGEF < 65));

           /*****************************************/
           /* institutional functioning graft model */
           /*****************************************/;

          %&SCOREMAC(PVAR=_SCORE_GRAFT_INST, RLIST=&MOD_GRAFT_INST,
                         CPREF=GI_);

          %*transplant bumps;
          SCORE_GRAFT_INST_DUR4_9_GE65 =&DF_POSTG*(_SCORE_GRAFT_INST +
                                        GE65_DUR4_9_LTI * (AGEF >= 65));

          SCORE_GRAFT_INST_DUR4_9_LT65 =&DF_POSTG*(_SCORE_GRAFT_INST +
                                        LT65_DUR4_9_LTI * (AGEF < 65));

          SCORE_GRAFT_INST_DUR10PL_GE65 =&DF_POSTG*(_SCORE_GRAFT_INST +
                                       GE65_DUR10PL_LTI * (AGEF >= 65));

          SCORE_GRAFT_INST_DUR10PL_LT65 =&DF_POSTG*(_SCORE_GRAFT_INST +
                                       LT65_DUR10PL_LTI * (AGEF < 65));

           /*****************************************/
           /* new enrollees functioning graft model */
           /*****************************************/;

          %&SCOREMAC(PVAR=_SCORE_GRAFT_NE, RLIST=&MOD_GRAFT_NE,
                         CPREF=GNE_);

          %*transplant bumps;
          SCORE_GRAFT_NE_DUR4_9_GE65 =&DF_POSTG*(_SCORE_GRAFT_NE +
                                      GE65_DUR4_9_NE * (AGEF >= 65));

          SCORE_GRAFT_NE_DUR4_9_LT65 =&DF_POSTG*(_SCORE_GRAFT_NE +
                                      LT65_DUR4_9_NE * (AGEF < 65));

          SCORE_GRAFT_NE_DUR10PL_GE65 =&DF_POSTG*(_SCORE_GRAFT_NE +
                                       GE65_DUR10PL_NE * (AGEF >= 65));

          SCORE_GRAFT_NE_DUR10PL_LT65 =&DF_POSTG*(_SCORE_GRAFT_NE +
                                       LT65_DUR10PL_NE * (AGEF < 65));
          %END;
          OUTPUT &OUTDATA;
       END; %*last record for a person;
     END; %*there is a person record;
 RUN;

 %**********************************************************************
 * step4: data checks and proc contents
 ***********************************************************************;
 PROC PRINT U DATA=&OUTDATA(OBS=46);
     TITLE "*** file output by ESRD software ***";
 RUN ;
 PROC CONTENTS DATA=&OUTDATA;
 RUN;

 %MEND E2122P1M;
