SRFI.sml

  Download

More scripts: Scripts By Jack

Syntax Highlighing:

comments, key words, predefined symbols, class members & methods, functions & classes
            
# ------------------------------------------------------------
# SRFI.sml
# ------------------------------------------------------------
# SET WARNING LEVEL: Refer to B5 & B6.
  $warnings 3
# ------------------------------------------------------------
# DEFINE PROCEDURE writeTitle: Refer to B12 & B13.
# PURPOSE: WRITES TITLE & AUTHOR INFO TO CONSOLE WINDOW.
  proc writeTitle() begin
     printf("SRFI.sml:\n");
     printf("     SML VERSION: November 15, 2005\n");
     printf(" TNTmips VERSION: Released 7.1\n"); 
     printf("         PURPOSE: CONVERTS MS DNs ");
     printf("TO SRFI VALUES.\n");
     printf("     MAY PRODUCE: PVI & PBI RASTERS\n");
     printf("         DETAILS: FAQs_by_Jack A & B\n");
     printf("          AUTHOR: Dr. Jack F. Paris\n");
     printf("    CONTACT INFO: [email protected] ");
     printf(" 303-775-1195\n");
     printf("     ALLOWED USE: ONLY NON-COMMERCIAL\n\n");
  end
# ------------------------------------------------------------
# DEFINE VARIABLES FOR GENERAL CHARACTER STRINGS: Refer to B7.
  string t$,p$,p1$,p2$,p3$,p4$,p5$,p6$,p7$,p8$,p9$;
  string p10$,p11$,p12$,p13$,p14$,p15$,p16$,p17$,p18$,p19$;
  string p20$,p21$;
# ------------------------------------------------------------
# CLEAR CONSOLE WINDOW & ASK USER TO RE-POSITION IT:
# Refer to B8 & B9.
  clear();
  p1$ = "CONSOLE-WINDOW ADJUSTMENT:\n";
  p2$ = "* REPOSITION the CONSOLE WINDOW.\n";
  p3$ = "* Then, CLICK OK.";
  p$  = p1$ + p2$ + p3$;
  PopupMessage(p$);
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO DATETIME & CONTRAST CLASSES:
# Refer to B10 - B11.
  class DATETIME cdate$;
  class CONTRAST smlContrast;
  string clut1$,clut2$,clut3$;
# ------------------------------------------------------------
# ASSIGN VALUES TO VARIABLES RELATED TO smlContrast:
  clut1$  = "exp"; clut2$  = "Exponential";
  clut3$  = "Exponential contrast table";
  smlContrast.Power            =   0.8;
  smlContrast.InputLowerLimit  =   1;
  smlContrast.OutputLowerLimit =   1;
  smlContrast.OutputUpperLimit = 255;
# ------------------------------------------------------------
# WRITE TITLE & AUTHOR INFORMATION: Refer to B13.
  writeTitle();
# ------------------------------------------------------------
# DECLARE USER-INPUT VARIABLES: Refer to B14 & B15.
  string  site$,gc$;
  numeric cdate,pdate,dd,d1,d2;
  numeric sunelevang,imager,vnir;
  numeric atcor,delcf,msfac,icRL;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO DATA TYPES OF RASTERS:
# Refer to B14 & B15.
  string dntype$,srfitype$,ptype$;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO USER-INPUT VARIABLES:
# Refer to B14 & B15.
  numeric he,doy,sc,dnlow,dnhigh;
  string imager$,atcor$,gi$;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO SRFapc-to-SRFsfc CONVERSION:
# Refer to B14 & B15.
  numeric cCB,cBL,cGL,cYL,cRL,cRE,cNA,cNB;
  numeric cMA,cMB,cMC,cMD,cME,cMF,cMG,cRLm1,pc;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO BOOLEAN ENABLERS: 
# Refer to B14 & B15.
  numeric pF,pCB,pBL,pYL,pRE,pNA,pNB;
  numeric pMA,pMB,pMC,pMD,pME,pMF,pMG,nc;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO WAVELENGTH-BASED MODELS:
# Refer to B14 & B15.
  numeric p,p2,wLenCB,wLenBL,wLenGL,wLenYL,wLenRL,wLenRE;
  numeric wLenNA,wLenNB,wLenMA,wLenMB,wLenMC,wLenMD,wLenME;
  numeric wLenMF,wLenMG;
  numeric wLenV,logwLenRLdwLenV,wtBL;
  numeric srfpathV,logsrfpathV;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO DN-to-SR CONVERSION:
# Refer to B14 & B15.
  numeric skCB,skBL,skGL,skYL,skRL,skRE,skNA,skNB;
  numeric skMA,skMB,skMC,skMD,skME,skMF,skMG;
  numeric dnbCB,dnbBL,dnbGL,dnbYL,dnbRL,dnbRE,dnbNA,dnbNB;
  numeric dnbMA,dnbMB,dnbMC,dnbMD,dnbME,dnbMF,dnbMG;
# ------------------------------------------------------------
# DECLARE DIRECT-SOLAR-SPECTRAL-IRRADIANCE VARIABLES:
# Refer to B14 & B15.
  numeric dssiCB,dssiBL,dssiGL,dssiYL,dssiRL,dssiRE;
  numeric dssiNA,dssiNB,dssiMA,dssiMB,dssiMC,dssiMD,dssiME;
  numeric dssiMF,dssiMG;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO PVI & PBI: Refer to B14 & B15.
  numeric pfac,angrad,sinang,cosang;
  numeric pbioff,pvioff,srfiNRint,bslineslope,maxpvipbi;
  numeric srfiNR,tsrfiNR,pbif,pbi,pvif,pvi;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO ARRAY PARAMETERS: 
# Refer to B14 & B15.
  numeric maxi,maxip1;
# ------------------------------------------------------------
# DECLARE LIST OF POSSIBLE INPUT RASTERS: Refer to B14 & B15.
  raster CB,BL,GL,YL,RL,RE,NA,NB,MA,MB,MC,MD,ME,MF,MG;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO LOOPS: Refer to B14 & B15.
  numeric i,nlins,ncols;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO INPUT RASTERS: 
# Refer to B14 & B15.
  numeric dnCB,dnBL,dnGL,dnYL,dnRL,dnRE,dnNA,dnNB;
  numeric dnMA,dnMB,dnMC,dnMD,dnME,dnMF,dnMG;
  numeric dnminCB,dnminBL,dnminGL,dnminYL,dnminRL,dnminRE;
  numeric dnminNA,dnminNB,dnminMA,dnminMB,dnminMC,dnminMD;
  numeric dnminME,dnminMF,dnminMG;
  numeric dnmaxCB,dnmaxBL,dnmaxGL,dnmaxYL,dnmaxRL,dnmaxRE;
  numeric dnmaxNA,dnmaxNB,dnmaxMA,dnmaxMB,dnmaxMC,dnmaxMD;
  numeric dnmaxME,dnmaxMF,dnmaxMG;
# ------------------------------------------------------------
# DECLARE VARIABLES FOR HISTOGRAM-EDGE FINDING ALGORITHM:
# Refer to B14 & B15.
  numeric dnheCB,dnheBL,dnheGL,dnheYL,dnheRL,dnheRE;
  numeric dnheNA,dnheNB,dnheMA,dnheMB,dnheMC,dnheMD;
  numeric dnheME,dnheMF,dnheMG;
  numeric logsrfpathRL,difoflogs;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO SItoa & SRFtoa: 
# Refer to B14 & B15.
  numeric pi100,esd,sitoafac;
  numeric sitoaCB,sitoaBL,sitoaGL,sitoaYL,sitoaRL,sitoaRE;
  numeric sitoaNA,sitoaNB,sitoaMA,sitoaMB,sitoaMC,sitoaMD;
  numeric sitoaME,sitoaMF,sitoaMG;
  numeric aCB,aBL,aGL,aYL,aRL,aRE,aNA,aNB;
  numeric aMA,aMB,aMC,aMD,aME,aMF,aMG;
  numeric mCB,mBL,mGL,mYL,mRL,mRE,mNA,mNB;
  numeric mMA,mMB,mMC,mMD,mME,mMF,mMG;
  numeric srftoaCB,srftoaBL,srftoaGL,srftoaYL,srftoaRL;
  numeric srftoaRE,srftoaNA,srftoaNB,srftoaMA,srftoaMB;
  numeric srftoaMC,srftoaMD,srftoaME,srftoaMF,srftoaMG;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO DNpath: Refer to B14 & B15.
  numeric dnpathCB1,dnpathBL1,dnpathGL1,dnpathYL1,dnpathRE1;
  numeric dnpathNA1,dnpathNB1,dnpathMA1,dnpathMB1,dnpathMC1;
  numeric dnpathMD1,dnpathME1,dnpathMF1,dnpathMG1;
  numeric dnpathCB,dnpathBL,dnpathGL,dnpathYL,dnpathRL;
  numeric dnpathRE,dnpathNA,dnpathNB,dnpathMA,dnpathMB;
  numeric dnpathMC,dnpathMD,dnpathME,dnpathMF,dnpathMG;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO SRFpath: Refer to B14 & B15.
  numeric srfpathCB1,srfpathBL1,srfpathGL1,srfpathYL1;
  numeric srfpathRE1,srfpathNA1,srfpathNB1,srfpathMA1;
  numeric srfpathMB1,srfpathMC1,srfpathMD1,srfpathME1;
  numeric srfpathMF1,srfpathMG1;
  numeric srfpathCB2,srfpathBL2,srfpathGL2,srfpathYL2;
  numeric srfpathRE2,srfpathNA2,srfpathNB2,srfpathMA2;
  numeric srfpathMB2,srfpathMC2,srfpathMD2,srfpathME2;
  numeric srfpathMF2,srfpathMG2;
  numeric srfpathCB,srfpathBL,srfpathGL,srfpathYL,srfpathRL;
  numeric srfpathRE,srfpathNA,srfpathNB,srfpathMA,srfpathMB;
  numeric srfpathMC,srfpathMD,srfpathME,srfpathMF,srfpathMG;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO SRFapc: Refer to B14 & B15.
  numeric srfapcCB,srfapcBL,srfapcGL,srfapcYL,srfapcRL;
  numeric srfapcRE,srfapcNA,srfapcNB,srfapcMA,srfapcMB;
  numeric srfapcMC,srfapcMD,srfapcME,srfapcMF,srfapcMG;
# ------------------------------------------------------------
# DECLARE VARIABLES RELATED TO SRFsfc & SRFI:
# Refer to B14 & B15.
  numeric srfsfcCB,srfsfcBL,srfsfcGL,srfsfcYL,srfsfcRL;
  numeric srfsfcRE,srfsfcNA,srfsfcNB,srfsfcMA,srfsfcMB;
  numeric srfsfcMC,srfsfcMD,srfsfcME,srfsfcMF,srfsfcMG;
  numeric srfiCB,srfiBL,srfiGL,srfiYL,srfiRL,srfiRE,srfiNA;
  numeric srfiNB,srfiMA,srfiMB,srfiMC,srfiMD,srfiME,srfiMF;
  numeric srfiMG;
# ------------------------------------------------------------
# DECLARE LIST OF POSSIBLE OUTPUT RASTERS: Refer to B14 & B15.
  raster SRFICB,SRFIBL,SRFIGL,SRFIYL,SRFIRL,SRFIRE,SRFINA;
  raster SRFINB,SRFIMA,SRFIMB,SRFIMC,SRFIMD,SRFIME,SRFIMF;
  raster SRFIMG,PBI,PVI;
# ------------------------------------------------------------
# GET NAME OF SITE FROM THE USER: Refer to B16.
  t$  = "SITE NAME";
  p1$ = "SITE-NAME:\n";
  p2$ = "* ENTER SITE NAME.\n";
  p3$ = "* Then, CLICK OK.\n";
  p4$ = "NAME ENTERED:";
  p$  = p1$ + p2$ + p3$ + p4$;
  site$ = PopupString(p$,"NAME",t$);
  printf("       SITE NAME: %s\n",site$);
# ------------------------------------------------------------
# GET COLLECTION DATE FROM THE USER: Refer to B17.
  p1$ = "COLLECTION-DATE:\n";
  p2$ = "  FORMAT: YYYYMMDD\n";
  p3$ = "* ACCEPT the Default DATE,\n";
  p4$ = "* Or, ENTER the Correct DATE.\n";
  p5$ = "* Then, Click OK.\n\n";
  p6$ = "DATE ENTERED:";
  p$  = p1$ + p2$ + p3$ + p4$ + p5$ + p6$;
  dd = 20010509; d1 = 19710723; d2 = 29991231;
  cdate = PopupNum(p$,dd,d1,d2,0);
  dd = cdate; d1 = cdate;
  cdate$.SetDateYYYYMMDD(cdate);
  doy = cdate$.GetDayOfYear();
  printf(" COLLECTION DATE: %8d\n",cdate);
  printf(" DAY OF THE YEAR: %d\n",doy);
# ------------------------------------------------------------
# GET SUN ELEVATION ANGLE FROM THE USER: Refer to B18.
  p1$ = "SUN-ELEVATION-ANGLE:\n";
  p2$ = "   UNITS: deg above the Horizon\n";
  p3$ = "  FORMAT: NN.NN\n";
  p4$ = "   RANGE: 1.00  to 90.00 deg\n";
  p5$ = "* ACCEPT the Default ANGLE,\n";
  p6$ = "* Or, ENTER the Correct ANGLE.\n";
  p7$ = "* Then, CLICK OK.\n\n";
  p8$ = "ANGLE ENTERED:";
  p$  = p1$ + p2$ + p3$ + p4$ + p5$ + p6$ + p7$ + p8$;
  sunelevang = PopupNum(p$,66.99,1,90,2);
  printf(" SUN ELEV. ANGLE: %5.2f deg\n",sunelevang);
# ------------------------------------------------------------
# GET IMAGER NUMBER FROM THE USER: Refer to B19.
  p1$  = "IMAGER-NUMBER:\n";
  p2$  = "  IMAGER\n";
  p3$  = "  NUMBER:  NAME OF IMAGER      STATUS\n";
  p4$  = "       1:  QuickBird MS     Available\n";
  p5$  = "       2:  Ikonos MS        Available\n";
  p6$  = "       3:  OrbView-3 MS           Not\n";
  p7$  = "       4:  Landsat-7 ETM+   Available\n";
  p8$  = "       5:  Landsat-5 TM     Available\n";
  p9$  = "       6:  Landsat-5 MSS          Not\n";
  p10$ = "       7:  Landsat-4 TM     Available\n";
  p11$ = "       8:  Landsat-4 MSS          Not\n";
  p12$ = "       9:  Landsat-3 MSS          Not\n";
  p13$ = "      10:  Landsat-2 MSS          Not\n";
  p14$ = "      11:  Landsat-1 MSS          Not\n";
  p15$ = "      12:  Terra ASTER      Available\n";
  p16$ = "      13:  Terra MODIS            Not\n";
  p17$ = "      14:  Aqua MODIS             Not\n";
  p18$ = "* ACCEPT the Default IMAGER NUMBER,\n";
  p19$ = "* Or, SELECT the Correct IMAGER NUMBER.\n";
  p20$ = "* Then, CLICK OK.\n\n";
  p21$ = "NUMBER ENTERED:";
  p$   = p1$ + p2$ + p3$ + p4$ + p5$ + p6$ + p7$ + p8$ + p9$;
  p$   = p$ + p10$ + p11$ + p12$ + p13$ + p14$ + p15$ + p16$;
  p$   = p$ + p17$ + p18$ + p19$ + p20$ + p21$;
  imager = PopupNum(p$,12,14,1,0);  
# ------------------------------------------------------------
# GET ATMOSPHERIC CORRECTION (atcor) LEVEL FROM THE USER:
# Refer to B20.
  p1$ = "ATMOSPHERIC-CORRECTION LEVEL:\n";
  p2$ = "     LEVEL: TYPE OF ATMOSPHERIC CORRECTION\n";
  p3$ = "         1: No Atmospheric Correction\n";
  p4$ = "         2: Atmospheric Reflectance Only\n";
  p5$ = "         3: All Atmospheric Effects\n";
  p6$ = "* ACCEPT the Default LEVEL,\n";
  p7$ = "* Or, SELECT a Differernt LEVEL.\n";
  p8$ = "* Then, CLICK OK.\n\n";
  p9$ = "LEVEL ENTERED:";
  p$  = p1$ + p2$ + p3$ + p4$ + p5$ + p6$ + p7$ + p8$ + p9$;
  atcor = PopupNum(p$,3,1,3,0);
# ------------------------------------------------------------
# WRITE CORRECTION LEVEL TO THE CONSOLE WINDOW:
# Refer to B20.
  printf("CORRECTION LEVEL: ");
  p4$ = "No Atmospheric Corrections";
  p5$ = "Corrected for Atmospheric Reflectance";
  p6$ = "Corrected for All Atmospheric Effects";
  if (atcor==1) then printf("%s\n",p4$);
  if (atcor==2) then printf("%s\n",p5$);
  if (atcor==3) then printf("%s\n",p6$);
# ------------------------------------------------------------
# IF atcor > 1, GET delcf PARAMETER FROM USER:
# Refer to B22.
  if (atcor > 1) then begin
     p1$ = "HISTOGRAM-EDGE FINDING PARAMETER:\n";
     p2$ = "  FORMAT: N.NN (Units: Percentage Points)\n";
     p3$ = "   RANGE: 0.01 to 1.00 Percentage Points\n";
     p4$ = "* Either, ACCEPT the Default VALUE,\n";
     p5$ = "* Or, ENTER a Better VALUE.\n";
     p6$ = "* Then, CLICK OK.\n\n";
     p7$ = "VALUE ENTERED:";
     p$  = p1$ + p2$ +p3$ + p4$ + p5$ + p6$ + p7$;
     delcf = PopupNum(p$,0.05,0.01,1.00,2);
     printf("           delcf: %4.2f Percentage",delcf);
     printf(" Points\n");
  end
  he = 0.01 * delcf;
# ------------------------------------------------------------
# IF atcor = 3, GET the msfac VALUE: Refer B23.
  if (atcor == 3) then begin
     p1$ = "msfac-VALUE ENTRY:\n";
     p2$ = "   msfac: Scaling Factor for All MS Bands.\n";
     p3$ = "  FORMAT: N.NNNN\n";
     p4$ = "   RANGE: 0.1000 to 2.0000\n";
     p5$ = "* ACCEPT the Default VALUE,\n";
     p6$ = "* Or, ENTER a Better VALUE.\n";
     p7$ = "  NOTE: Don't Change msfac Unless Justified.\n";
     p8$ = "* Then, CLICK OK.\n\n";
     p9$ = "VALUE ENTERED:";
     p$  = p1$ + p2$ + p3$ + p4$ + p5$ + p6$ + p7$ + p8$;
     p$ = p$ + p9$;
     msfac = PopupNum(p$,1,0.1,2,4);
     printf("           msfac: %6.4f\n",msfac);
# ------------------------------------------------------------
# IF atcor = 3, GET icRL VALUE FROM THE USER:
# Refer to B24.
     p1$ = "icRL-VALUE ENTRY:\n";
     p2$ = "    icRL: Input c-Factor for the RL Band.\n";
     p3$ = "  FORMAT: N.NNNN\n";
     p4$ = "   RANGE: 1.0000 to 3.0000\n";
     p5$ = "* ACCEPT the Default Value,\n";
     p6$ = "* Or, ENTER a Better Value.\n";
     p7$ = "* Then, CLICK OK.\n\n";
     p8$ = "VALUE ENTERED:";
     p$  = p1$ + p2$ + p3$ + p4$ + p5$ + p6$ + p7$ + p8$;
     icRL = PopupNum(p$,1.34,1,2,4);
     printf("            icRL: %6.4f\n",icRL);
     cRL = icRL;
  end
# ------------------------------------------------------------
# CALCULATE cRLm1 & ASSIGN THE pc VALUE:
# Refer to B26.
  cRLm1 = cRL - 1; pc = 2.27;
# ------------------------------------------------------------
# GENERATE IMAGER-SPECIFIC PARAMETERS: Refer to B25.
  if (imager == 1) then begin
     imager$ = "QuickBird MS";
     pBL=1; pNA=1; maxi=2100; dnlow=1; dnhigh=2047;
     wLenBL=0.482; wLenGL=0.548; wLenRL=0.654; wLenNA=0.809;
     skBL=0.2359; skGL=0.1453; skRL=0.1785; skNA=0.1353;
     dnbBL=0; dnbGL=0; dnbRL=0; dnbNA=0;
     dssiBL=1925; dssiGL=1843; dssiRL=1575; dssiNA=1250;
  end
  if (imager == 2) then begin
     imager$ = "Ikonos MS";
     pBL=1; pNA=1; maxi=2100; dnlow=1; dnhigh=2047;
     wLenBL=0.480; wLenGL=0.551; wLenRL=0.665; wLenNA=0.805;
     skBL=0.2216; skGL=0.1739; skRL=0.1809; skNA=0.1405;
     if (cdate > 20010222) then begin
        skBL=0.1935; skGL=0.1847; skRL=0.1536; skNA=0.1148;
     end
     dnbBL=0; dnbGL=0; dnbRL=0; dnbNA=0;
     dssiBL=1939; dssiGL=1843; dssiRL=1575; dssiNA=1250;
  end
  if (imager == 3) then begin
     p1$ = "WARNING!\n";
     p2$ = "SRFI.sml Cannot Process MS Data from\n";
     p3$ = "OrbView 3.\n";
     p4$ = "Please Stop this SML by\n";
     p5$ = "CLICKing CANCEL."; 
     p$  = p1$ + p2$ + p3$ + p4$ + p5$; 
     PopupMessage(p$);
     imager$ = "OrbView-3 MS";
     pBL=1; pNA=1; maxi=2100; dnlow=1; dnhigh=2047;
     wLenBL=0.482; wLenGL=0.548; wLenRL=0.654; wLenNA=0.809;
#     skBL=0.2359; skGL=0.1453; skRL=0.1785; skNA=0.1353;
     dnbBL=0; dnbGL=0; dnbRL=0; dnbNA=0;
     dssiBL=1925; dssiGL=1843; dssiRL=1575; dssiNA=1250;
  end
  if (imager == 4) then begin
     imager$ = "Landsat-7 ETM+";
     pBL=1; pNA=1; pMB=1; pMC=1; maxi=255;
     dnlow=0; dnhigh=255;
     wLenBL=0.482; wLenGL=0.565; wLenRL=0.660; wLenNA=0.825;
     wLenMB=1.650; wLenMC=2.220;
#    GET PROCESSING DATE FROM THE USER:
     p1$ = "PROCESSING-DATE ENTRY\n";
     p2$ = "  FORMAT: YYYYMMDD\n";
     p3$ = "* Either ACCEPT the Default DATE,\n";
     p4$ = "* Or, ENTER the Correct DATE.\n";
     p5$ = "* Then, Click OK.\n\n";
     p6$ = "PROCESSING-DATE ENTERED:";
     p$  = p1$ + p2$ + p3$ + p4$ + p5$ + p6$;
     pdate = PopupNum(p$,dd,d1,d2,0);
#    GET PRODUCT-SOURCE CODE FROM USER:
     p1$ = "LANDSAT 7 ETM+ PRODUCT SOURCE CODE:\n";
     p2$ = "  SOURCE CODE: SOURCE NAME\n";
     p3$ = "            1: LPGS (EOS Data Gateway)\n";
     p4$ = "            2: NLAPS (EarthExplorer)\n";
     p5$ = "  Either, ACCEPT the Default CODE,\n";
     p6$ = "  Or, ENTER the Correct CODE.\n";
     p7$ = "  Then, CLICK OK.\n";
     p8$ = "CODE ENTERED:";
     p$  = p1$ + p2$ + p3$ + p4$ + p5$ + p6$ + p7$ + p8$;
     sc  = PopupNum(p$,2,1,2,0);
#    GET GAIN-CODE STRING FROM USER:
     p1$  = "LANDSAT 7 ETM+ GAIN-CODE:\n";
     p2$  = "  GAIN-CODE BAND SEQUENCE:\n";
     p3$  = "    BL GAIN: H or L : Default=H\n";
     p4$  = "    GL GAIN: H or L : Default=H\n";
     p5$  = "    RL GAIN: H or L : Default=H\n";
     p6$  = "    NA GAIN: H or L : Default=L\n";
     p7$  = "    MB GAIN: H or L : Default=H\n";
     p8$  = "    MC GAIN: H or L : Default=H\n";
     p9$  = "  Default GAIN-CODE = HHHLHH\n";
     p10$ = "  ACCEPT the Default GAIN-CODE,\n";
     p11$ = "  Or, ENTER the Correct GAIN-CODE.\n";
     p12$ = "  Then, CLICK OK.\n";
     p13$ = "GAIN-CODE ENTERED:";
     p$   = p1$ + p2$ + p3$ + p4$ + p5$ + p6$ + p7$ + p8$;
     p$   = p$ + p9$ + p10$ + p11$ + p12$ + p13$;
     gc$  = "HHHLHH";
     t$   = "GAIN-CODE QUERY";
     gc$  = PopupString(p$,gc$,t$);
#    Low-Gain Values for Data Processed BEFORE 20000701 by
#    NLAPS (EarthExplorer), i.e., qcalmin = 0:
     skBL=1.19098; skGL=1.21333; skRL=0.94118; skNA=0.93922;
     skMB=0.19098; skMC=0.06647;
     dnbBL=5.21; dnbGL=4.95; dnbRL=4.78; dnbNA=4.79;
     dnbMB=5.24; dnbMC=5.27;
#    High-Gain Values for Data Processed BEFORE 20000701 by
#    NLAPS (EarthExplorer), i.e., qcalmin = 0:
     gi$ = mid$(gc$,1,1);
     if (gi$ == "H") then begin
        skBL=0.78627; dnbBL=7.89;
     end
     gi$ = mid$(gc$,2,1);
     if (gi$ == "H") then begin
        skGL=0.81725; dnbGL=7.34;
     end
     gi$ = mid$(gc$,3,1);
     if (gi$ == "H") then begin
        skRL=0.63961; dnbRL=7.04;
     end
     gi$ = mid$(gc$,4,1);
     if (gi$ == "H") then begin
        skNA=0.63529; dnbNA=7.08;
     end
     gi$ = mid$(gc$,5,1);
     if (gi$ == "H") then begin
        skMB=0.12847; dnbMB=7.78;
     end
     gi$ = mid$(gc$,6,1);
     if (gi$ == "H") then begin
        skMC=0.04424; dnbMC=7.91;
     end
     if (pdate > 20000701) then begin
#       Low-Gain Values for Data Processed AFTER 20000701 by
#       NLAPS (EarthExplorer), i.e., qcalmin = 0:
        skBL=1.17608; skGL=1.20510; skRL=0.93882; skNA=0.96549;
        skMB=0.19047; skMC=0.06624;
        dnbBL=5.27; dnbGL=5.31; dnbRL=5.33; dnbNA=5.28;
        dnbMB=5.25; dnbMC=5.28;
#       High-Gain Values for Data Processed AFTER 20000701 by
#       NLAPS (EarthExplorer), i.e., qcalmin = 0:
        gi$ = mid$(gc$,1,1);
        if (gi$ == "H") then begin
           skBL=0.77569; dnbBL=7.99;
        end
        gi$ = mid$(gc$,2,1);
        if (gi$ == "H") then begin
           skGL=0.79569; dnbGL=8.04;
        end
        gi$ = mid$(gc$,3,1);
        if (gi$ == "H") then begin
           skRL=0.61922; dnbRL=8.07;
        end
        gi$ = mid$(gc$,4,1);
        if (gi$ == "H") then begin
           skNA=0.63725; dnbNA=8.00;
        end
        gi$ = mid$(gc$,5,1);
        if (gi$ == "H") then begin
           skMB=0.12573; dnbMB=7.95;
        end
        gi$ = mid$(gc$,6,1);
        if (gi$ == "H") then begin
           skMC=0.04373; dnbMC=8.00;
        end
     end
#    ---------------------------------------------------------
#    Corrections Related to Changing qcalmin from 0 to 1:
#    This Change is Associated with Either of Two Cases:
#         * sc == 1 (LPGS: All Dates)
#         * pdate > 20040701 (LPGS and NLAPS)
     if (sc == 1 or pdate > 20040404) then begin
        dnlow = 1;
        skBL = skBL*255/254; dnbBL = 1 + dnbBL*254/255;
        skGL = skGL*255/254; dnbGL = 1 + dnbGL*254/255;
        skRL = skRL*255/254; dnbRL = 1 + dnbRL*254/255;
        skNA = skNA*255/254; dnbNA = 1 + dnbNA*254/255;
        skMB = skMB*255/254; dnbMB = 1 + dnbMB*254/255;
        skMC = skMC*255/254; dnbMC = 1 + dnbMC*254/255;
     end     
     dssiBL=1970; dssiGL=1843; dssiRL=1555; dssiNA=1047;
     dssiMB=215.0; dssiMC=80.67;
  end
  if (imager == 5) then begin
     imager$ = "Landsat-5 TM";
     pBL=1; pNA=1; pMB=1; pMC=1; maxi=255;
     dnlow=0; dnhigh=255;
     wLenBL=0.482; wLenGL=0.565; wLenRL=0.660; wLenNA=0.825;
     wLenMB=1.650; wLenMC=2.220;
     skBL=0.60243; skGL=1.17510; skRL=0.80576; skNA=0.81455;
     skMB=0.10808; skMC=0.05698;
     dnbBL=2.52; dnbGL=2.42; dnbRL=1.45; dnbNA=1.85;
     dnbMB=3.42;dnbMC=2.63;
     dssiBL=1957; dssiGL=1829; dssiRL=1554; dssiNA=1036;
     dssiMB=215.0; dssiMC=80.67;
#    GET PROCESSING DATE FROM THE USER:
     p1$ = "PROCESSING-DATE:\n";
     p2$ = "  FORMAT: YYYYMMDD\n";
     p3$ = "* ACCEPT the Default DATE,\n";
     p4$ = "* Or, ENTER the Correct DATE.\n";
     p5$ = "* Then, Click OK.\n\n";
     p6$ = "DATE ENTERED:";
     p$  = p1$ + p2$ + p3$ + p4$ + p5$ + p6$;
     pdate = PopupNum(p$,dd,d1,d2,0);
     if (pdate > 20030504) then begin
        skBL=0.76282; skGL=1.44251; skRL=1.03988;
        skNA=0.87259; skMB=0.11988; skMC=0.06529;
        dnbBL=1.99; dnbGL=1.97; dnbRL=1.13; dnbNA=1.73;
        dnbMB=3.09; dnbMC=2.30;
     end
  end
  if (imager == 6) then begin
     p1$ = "WARNING!\n";
     p2$ = "SRFI.sml Cannot Process MS Data from\n";
     p3$ = "Landsat-5 MSS.\n";
     p4$ = "Please Stop this SML by\n";
     p5$ = "CLICKing CANCEL."; 
     p$  = p1$ + p2$ + p3$ + p4$ + p5$; 
     PopupMessage(p$);
     imager$ = "Landsat-5 MSS";
     pRE=1; pNB=1; maxi=200; dnlow=0; dnhigh=127;
     wLenGL=0.550; wLenRL=0.650; wLenRE=0.750;
     wLenNB=0.950;
#     skGL=1.6000; skRL=1.6000; skRE=1.6000; skNB=1.6000;
#     dnbGL=0; dnbRL=0; dnbRE=0; dnbNA=0; 
#     dssiGL=1829; dssiRL=1557; dssiRE=1300; dssiNB=950.0;
  end
  if (imager == 7) then begin
     p1$ = "WARNING!\n";
     p2$ = "SRFI.sml Cannot Process MS Data from\n";
     p3$ = "Landsat 4 TM.\n";
     p4$ = "Please Stop this SML by\n";
     p5$ = "CLICKing CANCEL."; 
     p$  = p1$ + p2$ + p3$ + p4$ + p5$; 
     PopupMessage(p$);
     imager$ = "Landsat-4 TM"; 
     pBL=1; pNA=1; pMB=1; pMC=1; maxi=255;
     dnlow=0; dnhigh=255;
     wLenBL=0.482; wLenGL=0.565; wLenRL=0.660; wLenNA=0.825;
     wLenMB=1.650; wLenMC=2.220;
#     skBL=1.6000; skGL=1.6000; skRL=1.6000; skNA=1.6000;
#     skMB=1.6000; skMC=1.6000;
#     dnbBL=0; dnbGL=0; dnbRL=0; dnbNA=0;
#     dnbMB=0; dnbMC=0; 
     dssiBL=1957; dssiGL=1825; dssiRL=1557; dssiNA=1033;
     dssiMB=215.0; dssiMC=80.67;
  end
  if (imager == 8) then begin
     p1$ = "WARNING!\n";
     p2$ = "SRFI.sml Cannot Process MS Data from\n";
     p3$ = "Landsat 4 MSS.\n";
     p4$ = "Please Stop this SML by\n";
     p5$ = "CLICKing CANCEL."; 
     p$  = p1$ + p2$ + p3$ + p4$ + p5$; 
     PopupMessage(p$);
     imager$ = "Landast-4 MSS"; pRE=1; pNB=1; maxi=200;
     dnlow=0; dnhigh=127;
     wLenGL=0.550; wLenRL=0.650; wLenRE=0.750;
     wLenNB=0.950;
#     skGL=1.6000; skRL=1.6000; skRE=1.6000;
#     skNB=1.6000;
#     dnbGL=0; dnbRL=0; dnbRE=0; dnbNA=0; 
#     dssiGL=1829; dssiRL=1557; dssiRE=1300;
#     dssiNB=950.0;
  end
  if (imager == 9) then begin
     p1$ = "WARNING!\n";
     p2$ = "SRFI.sml Cannot Process MS Data from\n";
     p3$ = "Landsat 3 MSS.\n";
     p4$ = "Please Stop this SML by\n";
     p5$ = "CLICKing CANCEL."; 
     p$  = p1$ + p2$ + p3$ + p4$ + p5$;
     PopupMessage(p$);
     imager$ = "Landsat-3 MSS"; pRE=1; pNB=1; maxi=255;
     dnlow=0; dnhigh=127;
     wLenGL=0.550; wLenRL=0.650; wLenRE=0.750;
     wLenNB=0.950;
#     skGL=1.6000; skRL=1.6000; skRE=1.6000;
#     skNB=1.6000;
#     dnbGL=0; dnbRL=0; dnbRE=0; dnbNA=0; 
#     dssiGL=1829; dssiRL=1557; dssiRE=1300;
#     dssiNB=950.0;
  end
  if (imager == 10) then begin
     p1$ = "WARNING!\n";
     p2$ = "SRFI.sml Cannot Process MS Data from\n";
     p3$ = "Landsat 2 MSS.\n";
     p4$ = "Please Stop this SML by\n";
     p5$ = "CLICKing CANCEL."; 
     p$  = p1$ + p2$ + p3$ + p4$ + p5$;
     PopupMessage(p$);
     imager$ = "Landsat-2 MSS"; pRE=1; pNB=1; maxi=100;
     dnlow=0; dnhigh=63;
     wLenGL=0.550; wLenRL=0.650; wLenRE=0.750;
     wLenNB=0.950;
#     skGL=1.6000; skRL=1.6000; skRE=1.6000;
#     skNB=1.6000;
#     dnbGL=0; dnbRL=0; dnbRE=0; dnbNA=0; 
#     dssiGL=1829; dssiRL=1557; dssiRE=1300;
#     dssiNB=950.0;
  end
  if (imager == 11) then begin
     p1$ = "WARNING!\n";
     p2$ = "SRFI.sml Cannot Process MS Data from\n";
     p3$ = "Landsat 1 MSS.\n";
     p4$ = "Please Stop this SML by\n";
     p5$ = "CLICKing CANCEL.";
     p$  = p1$ + p2$ + p3$ + p4$ + p5$;
     PopupMessage(p$);
     imager$ = "Landsat-1 MSS"; pRE=1; pNB=1; maxi=100;
     dnlow=0; dnhigh=63;
     wLenGL=0.550; wLenRL=0.650; wLenRE=0.750;
     wLenNB=0.950;
#     skGL=1.6000; skRL=1.6000; skRE=1.6000;
#     skNB=1.6000;
#     dnbGL=0; dnbRL=0; dnbRE=0; dnbNA=0; 
#     dssiGL=1829; dssiRL=1557; dssiRE=1300;
#     dssiNB=950.0;
  end
#    ---------------------------------------------------------
  if (imager == 12) then begin
     imager$ = "Terra ASTER"; pNA=1; pMB=1; pMC=1; pMD=1;
     pME=1; pMF=1; pMG=1; maxi=255;
     dnlow=1; dnhigh=255;
     wLenGL=0.556; wLenRL=0.659; wLenNA=0.807;
     wLenMB=1.657; wLenMC=2.169; wLenMD=2.209; wLenME=2.263;
     wLenMF=2.334; wLenMG=2.400;
     p1$ = "VNIR BANDS ONLY versus ALL BANDS OPTION:\n";
     p2$ = "     OPTION 1: PROCESS VNIR BANDS ONLY\n";
     p3$ = "     OPTION 2: PROCESS ALL BANDS\n";
     p4$ = "         NOTE: INPUT BANDS MUST MATCH.\n";
     p5$ = "OPTION ENTERED:";
     p$ = p1$ + p2$ + p3$ + p4$ + p5$;
     vnir = PopupNum(p$,2,1,2,0);
#    DEFAULT (NORMAL-GAIN) sk VALUES:
     skGL=1.6880; skRL=1.4150; skNA=0.8620; skMB=0.2174;
     skMC=0.0696; skMD=0.0625; skME=0.0597; skMF=0.0417;
     skMG=0.0318;
     dnbGL=1; dnbRL=1; dnbNA=1; dnbMB=1; dnbMC=1; dnbMD=1;
     dnbME=1; dnbMF=1; dnbMG=1;
     if (vnir == 1) then begin
        pMB=0; pMC=0; pMD=0; pME=0; pMF=0; pMG=0;
#       GET SHORT GAIN-CODE STRING FROM USER:
        p1$  = "Terra ASTER GAIN-CODE:\n";
        p2$  = "  GAIN-CODE BAND SEQUENCE:\n";
        p3$  = "    GL GAIN: 1,    N, or H: Default=N\n";
        p4$  = "    RL GAIN: 1,    N, or H: Default=N\n";
        p5$  = "    NA GAIN: 1,    N, or H: Default=N\n";
        p6$  = "  Default GAIN-CODE = NNN\n";
        p7$  = "  ACCEPT the Default GAIN-CODE,\n";
        p8$  = "  Or, ENTER Correct GAIN-CODE.\n";
        p9$  = "  Then, CLICK OK.\n";
        p10$ = "GAIN-CODE ENTERED:";
        p$   = p1$ + p2$ + p3$ + p4$ + p5$ + p6$ + p7$ + p8$;
        p$   = p$ + p9$ + p10$;
        gc$  = "HHN";
        t$   = "GAIN-CODE QUERY";
        gc$  = PopupString(p$,gc$,t$);
        gi$ = mid$(gc$,1,1);
        if (gi$ == "1") then skGL=2.2500;
        if (gi$ == "H") then skGL=0.6760;
        gi$ = mid$(gc$,2,1);
        if (gi$ == "1") then skRL=1.8900;
        if (gi$ == "H") then skRL=0.7080;
        gi$ = mid$(gc$,3,1);
        if (gi$ == "1") then skNA=1.1500;
        if (gi$ == "H") then skNA=0.4230;
     end
     if (vnir <> 1) then begin
#       GET LONG GAIN-CODE STRING FROM USER:
        p1$  = "Terra ASTER GAIN-CODE:\n";
        p2$  = "  GAIN-CODE BAND SEQUENCE:\n";
        p3$  = "    GL GAIN: 1,    N, or H: Default=N\n";
        p4$  = "    RL GAIN: 1,    N, or H: Default=N\n";
        p5$  = "    NA GAIN: 1,    N, or H: Default=N\n";
        p6$  = "    MB GAIN: 1, 2, N, or H: Default=N\n";
        p7$  = "    MC GAIN: 1, 2, N, or H: Default=N\n";
        p8$  = "    MD GAIN: 1, 2, N, or H: Default=N\n";
        p9$  = "    ME GAIN: 1, 2, N, or H: Default=N\n";
        p10$ = "    MF GAIN: 1, 2, N, or H: Default=N\n";
        p11$ = "    MG GAIN: 1, 2, N, or H: Default=N\n";
        p12$ = "  Default GAIN-CODE = NNNNNNNNN\n";
        p13$ = "  ACCEPT the Default GAIN-CODE,\n";
        p14$ = "  Or, ENTER the Correct GAIN-CODE.\n";
        p15$ = "  Then, CLICK OK.\n";
        p16$ = "GAIN-CODE ENTERED:";
        p$   = p1$ + p2$ + p3$ + p4$ + p5$ + p6$ + p7$ + p8$;
        p$   = p$ + p9$ + p10$ + p11$ + p12$ +p13$ + p14$;
        p$   = p$ + p15$ + p16$;
        gc$  = "HHNNNNNNN";
        t$   = "GAIN-CODE QUERY";
        gc$  = PopupString(p$,gc$,t$);
        gi$ = mid$(gc$,1,1);
        if (gi$ == "1") then skGL=2.2500;
        if (gi$ == "H") then skGL=0.6760;
        gi$ = mid$(gc$,2,1);
        if (gi$ == "1") then skRL=1.8900;
        if (gi$ == "H") then skRL=0.7080;
        gi$ = mid$(gc$,3,1);
        if (gi$ == "1") then skNA=1.1500;
        if (gi$ == "H") then skNA=0.4230;
        gi$ = mid$(gc$,4,1);
        if (gi$ == "1") then skMB=0.2900;
        if (gi$ == "2") then skMB=0.2900;
        if (gi$ == "H") then skMB=0.1087;
        gi$ = mid$(gc$,5,1);
        if (gi$ == "1") then skMC=0.0925;
        if (gi$ == "2") then skMC=0.4090;
        if (gi$ == "H") then skMC=0.0348;
        gi$ = mid$(gc$,6,1);
        if (gi$ == "1") then skMD=0.0830;
        if (gi$ == "2") then skMD=0.3900;
        if (gi$ == "H") then skMD=0.0313;
        gi$ = mid$(gc$,7,1);
        if (gi$ == "1") then skME=0.0795;
        if (gi$ == "2") then skME=0.3320;
        if (gi$ == "H") then skME=0.0299;
        gi$ = mid$(gc$,8,1);
        if (gi$ == "1") then skMF=0.0556;
        if (gi$ == "2") then skMF=0.2450;
        if (gi$ == "H") then skMF=0.0209;
        gi$ = mid$(gc$,9,1);
        if (gi$ == "1") then skMG=0.0424;
        if (gi$ == "2") then skMG=0.2650;
        if (gi$ == "H") then skMG=0.0159;
     end
     dssiGL=1829 ; dssiRL=1557 ; dssiNA=1047 ; dssiMB=215.0;
     dssiMC=84.67; dssiMD=82.67; dssiME=80.67; dssiMF=78.67;
     dssiMG=76.67;
  end
  if (imager == 13) then begin
     p1$ = "WARNING!\n";
     p2$ = "SRFI.sml Cannot Process MS Data from\n";
     p3$ = "Terra MODIS.\n";
     p4$ = "Please Stop this SML by\n";
     p5$ = "CLICKing CANCEL."; 
     p$  = p1$ + p2$ + p3$ + p4$ + p5$;
     PopupMessage(p$);
     imager$ = "Terra MODIS"; 
     pBL=1; pNA=1; pMA=1; pMB=1; pMC=1; maxi=4200;
     dnlow=1; dnhigh=4095;
#     wLenBL=0.469; wLenGL=0.555; wLenRL=0.645; wLenNA=0.8585;
#     wLenMA=1.240; wLenMB=1.640; wLenMC=2.013;
#     skBL=0.1000; skGL=0.1000; skRL=0.1000; skNA=0.1000;
#     skMA=0.1000; skMB=0.1000; skMC=0.1000;
#     dnbBL=0; dnbGL=0; dnbRL=0; dnbNA=0;
#     dnbMA=0; dnbMB=0; dnbMC=0;
#     dssiBL=1957; dssiGL=1829; dssiRL=1557; dssiNA=1047;
#     dssiMA= 400; dssiMB=215.0; dssiMC=80.67;
  end
  if (imager == 14) then begin
     p1$ = "WARNING!\n";
     p2$ = "SRFI.sml Cannot Process MS Data from\n";
     p3$ = "Aqua MODIS.\n";
     p4$ = "Please Stop this SML by\n";
     p5$ = "CLICKing CANCEL."; 
     p$  = p1$ + p2$ + p3$ + p4$ + p5$;
     PopupMessage(p$);
     imager$ = "Aqua MODIS";
     pBL=1; pNA=1; pMA=1; pMB=1; pMC=1; maxi=4200;
     dnlow=1; dnhigh=4095;
#     wLenBL=0.469; wLenGL=0.555; wLenRL=0.645; wLenNA=0.8585;
#     wLenMA=1.240; wLenMB=1.640; wLenMC=2.013;
#     skBL=0.1000; skGL=0.1000; skRL=0.1000; skNA=0.1000;
#     skMA=0.1000; skMB=0.1000; skMC=0.1000;
#     dnbBL=0; dnbGL=0; dnbRL=0; dnbNA=0;
#     dnbMA=0; dnbMB=0; dnbMC=0;
#     dssiBL=1957; dssiGL=1829; dssiRL=1557; dssiNA=1047;
#     dssiMA= 400; dssiMB=215.0; dssiMC=80.67;
  end
  printf("          IMAGER: %s\n",imager$);
  printf("  IMAGE DN SCALE: %d to %d\n",dnlow,dnhigh);
  if (imager == 4) then begin
     printf("       GAIN-CODE: %s\n",gc$);
     p$ = "LPGS (EOS Data Gateway)";
     if (sc == 2) then p$ = "NLAPS (EarthExplorer)";
     printf("     DATA VENDOR: %s\n",p$);
  end
# ------------------------------------------------------------
# CALCULATE C-FACTORS & FOR ENABLED MS BANDS: Refer to B26.
  if (pCB) then cCB = 1 + cRLm1 * (wLenRL/wLenCB)^pc;
  if (pBL) then cBL = 1 + cRLm1 * (wLenRL/wLenBL)^pc;
  cGL = 1 + cRLm1 * (wLenRL/wLenGL)^pc;
  if (pYL) then cYL = 1 + cRLm1 * (wLenRL/wLenYL)^pc;
  pc = 1.1;
  if (pRE) then cRE = 1 + cRLm1 * (wLenRL/wLenRE)^pc;
  if (pNA) then cNA = 1 + cRLm1 * (wLenRL/wLenNA)^pc;
  if (pNB) then cNB = 1 + cRLm1 * (wLenRL/wLenNB)^pc;
  if (pMA) then cMA = 1 + cRLm1 * (wLenRL/wLenMA)^pc;
  if (pMB) then cMB = 1 + cRLm1 * (wLenRL/wLenMB)^pc;
  if (pMC) then cMC = 1 + cRLm1 * (wLenRL/wLenMC)^pc;
  if (pMD) then cMD = 1 + cRLm1 * (wLenRL/wLenMD)^pc;
  if (pME) then begin
     cME = 1 + cRLm1 * (wLenRL/wLenME)^pc;
     cME = cME * 1.1;
  end
  if (pMF) then begin
     cMF = 1 + cRLm1 * (wLenRL/wLenMF)^pc;
     cMF = cMF * 1.5;
  end
  if (pMG) then begin
     cMG = 1 + cRLm1 * (wLenRL/wLenMG)^pc;
     cMG = cMG * 2.4;
  end
# ------------------------------------------------------------
# PARAMETERS RELATED TO WVI & WBI CALCULATIONS: Refer to B36.
  srfiNRint = 254; bslineslope = 1.086;
  pbioff = 100; pvioff = 1000; 
  pfac = 0.2723659; maxpvipbi = 3000;
# ------------------------------------------------------------
# IF atcor < 3, SET C-FACTORS EQUAL TO 1: Refer to B26.
  if (atcor < 3) then begin
     cCB = 1; cBL = 1; cGL = 1; cYL = 1; cRL = 1; cRE = 1;
     cNA = 1; cNB = 1; cMA = 1; cMB = 1; cMC = 1; cMD = 1;
     cME = 1; cMF = 1; cMG = 1;
  end
# ------------------------------------------------------------
# SET UP ARRAYS: Refer to B22, B28 & B29.
  maxip1 = maxi + 1;
  array numeric vCB[maxip1]; array numeric vBL[maxip1];
  array numeric vGL[maxip1]; array numeric vYL[maxip1];
  array numeric vRL[maxip1]; array numeric vRE[maxip1];
  array numeric vNA[maxip1]; array numeric vNB[maxip1];
  array numeric vMA[maxip1]; array numeric vMB[maxip1];
  array numeric vMC[maxip1]; array numeric vMD[maxip1];
  array numeric vME[maxip1]; array numeric vMF[maxip1];
  array numeric vMG[maxip1]; array numeric   v[maxip1];
# ------------------------------------------------------------
# DEFINE proc checkHisto(Band)
# PURPOSE: Check that Input Raster has a Full (Unsampled)
#          Histogram.  If Not, Then Recompute Histogram.
  proc checkHisto (raster Band) begin
     local numeric sampleInt;
     sampleInt = HistogramGetSampleInterval(Band);
     if (sampleInt > 1) begin
        DeleteHistogram(Band); CreateHistogram(Band,0);
     end
     else if (sampleInt == -1) then	begin
        CreateHistogram(Band,0);
     end
  end
# ------------------------------------------------------------
# DEFFINE func dnHE(heloc): Refer to B22 * B28.
# PURPOSE: Find Dark Edge of Raster Histogram Based on the
#          DN Value at Which the Cumulative Frequency
#          Distributoin Rises Rapidly (Faster than HEP).
  func dnHE(heloc) begin
     local numeric j, jm1, jp1, sumfq, sumcfq, del, dnhe;
     sumfq = 0;
     for j=1 to maxi begin
        sumfq = sumfq + v[j];
     end
     v[1] = v[1] * 100 / sumfq;
#    v[1] equals percent frequency for DN = 1
     for j=2 to maxi begin
        jm1 = j - 1; v[j] = v[jm1] + v[j] * 100 / sumfq;
#       v[j] equals percent frequency for DN = j
     end
     dnhe = 0;
     for j=1 to maxi begin
        jp1 = j + 1; del = v[jp1] - v[j];
        if (dnhe == 0) then begin
           if (del >  heloc) then dnhe = jp1;
        end
     end
     return(dnhe);
  end
# ------------------------------------------------------------
# IF atcor = 3, RESCALE C-FACTORS BASED ON msfac:
# Refer to B23.
  if (atcor == 3) then begin
    if (pCB) then cCB = cCB * msfac;
    if (pBL) then cBL = cBL * msfac;
    cGL = cGL * msfac; cRL = cRL * msfac;
    if (pYL) then cYL = cYL * msfac;
    if (pRE) then cRE = cRE * msfac;
    if (pNA) then cNA = cNA * msfac;
    if (pNB) then cNB = cNB * msfac;
    if (pMA) then cMA = cMA * msfac;
    if (pMB) then cMB = cMB * msfac;
    if (pMC) then cMC = cMC * msfac;
    if (pMD) then cMD = cMD * msfac;
    if (pME) then cME = cME * msfac;
    if (pMF) then cMF = cMF * msfac;
    if (pMG) then cMG = cMG * msfac;
  end
# ------------------------------------------------------------
# OPEN APPROPRIATE INPUT RASTERS & GET MIN & MAX VALUES: 
# Refer to B27.
  printf("\nOPEN INPUT RASTERS:\n");
  if (pCB) then begin
     printf(" CB");
     GetInputRaster(CB); nlins = NumLins(CB);
     ncols = NumCols(CB); dntype$ = RastType(CB);
     checkHisto(CB);
     dnminCB = GlobalMin(CB); dnmaxCB = GlobalMax(CB);
  end
  if (pBL) then begin
     if (pCB) then begin
        if (pBL) then begin
           printf(" BL");
           GetInputRaster(BL,nlins,ncols,dntype$);
        end
     end
     else begin
        printf(" BL");
        GetInputRaster(BL); nlins = NumLins(BL);
        ncols = NumCols(BL); dntype$ = RastType(BL);
     end
     checkHisto(BL);
     dnminBL = GlobalMin(BL); dnmaxBL = GlobalMax(BL);
  end
  printf(" GL");
  if (pCB or pBL) then begin
     GetInputRaster(GL,nlins,ncols,dntype$);
  end
  else begin
     GetInputRaster(GL);
     nlins = NumLins(GL); ncols = NumCols(GL);
     dntype$ = RastType(GL);
  end
  checkHisto(GL);
  dnminGL = GlobalMin(GL); dnmaxGL = GlobalMax(GL);
  if (pYL) then begin
     printf(" YL");
     GetInputRaster(YL,nlins,ncols,dntype$);
     checkHisto(YL);
     dnminYL = GlobalMin(YL); dnmaxYL = GlobalMax(YL);
  end
  printf(" RL");
  GetInputRaster(RL,nlins,ncols,dntype$);
  checkHisto(RL);
  dnminRL = GlobalMin(RL); dnmaxRL = GlobalMax(RL);
  if (pRE) then begin
     printf(" RE");
     GetInputRaster(RE,nlins,ncols,dntype$);
     checkHisto(RE);
     dnminRE = GlobalMin(RE); dnmaxRE = GlobalMax(RE);
  end
  if (pNA) then begin
     printf(" NA");
     GetInputRaster(NA,nlins,ncols,dntype$);
     checkHisto(NA);
     dnminNA = GlobalMin(NA); dnmaxNA = GlobalMax(NA);
  end
  if (pNB) then begin
     printf(" NB");
     GetInputRaster(NB,nlins,ncols,dntype$);
     checkHisto(NB);
     dnminNB = GlobalMin(NB); dnmaxNB = GlobalMax(NB);
  end
  if (pMA) then begin
     printf(" MA");
     GetInputRaster(MA,nlins,ncols,dntype$);
     checkHisto(MA);
     dnminMA = GlobalMin(MA); dnmaxMA = GlobalMax(MA);
  end
  if (pMB) then begin
     printf(" MB");
     GetInputRaster(MB,nlins,ncols,dntype$);
     checkHisto(MB);
     dnminMB = GlobalMin(MB); dnmaxMB = GlobalMax(MB);
  end
  if (pMC) then begin
     printf(" MC");
     GetInputRaster(MC,nlins,ncols,dntype$);
     checkHisto(MC);
     dnminMC = GlobalMin(MC); dnmaxMC = GlobalMax(MC);
  end
  if (pMD) then begin
     printf(" MD");
     GetInputRaster(MD,nlins,ncols,dntype$);
     checkHisto(MD);
     dnminMD = GlobalMin(MD); dnmaxMD = GlobalMax(MD);
  end
  if (pME) then begin
     printf(" ME");
     GetInputRaster(ME,nlins,ncols,dntype$);
     checkHisto(ME);
     dnminME = GlobalMin(ME); dnmaxME = GlobalMax(ME);
  end
  if (pMF) then begin
     printf(" MF");
     GetInputRaster(MF,nlins,ncols,dntype$);
     checkHisto(MF);
     dnminMF = GlobalMin(MF); dnmaxMF = GlobalMax(MF);
  end
  if (pMG) then begin
     printf(" MG");
     GetInputRaster(MG,nlins,ncols,dntype$);
     checkHisto(MG);
     dnminMG = GlobalMin(MG); dnmaxMG = GlobalMax(MG);
  end
  printf("\n");
# ------------------------------------------------------------
# IF atcor > 1, FIND DARK-EDGES OF DN HISTOGRAMS:
# Refer to B28.
  if (atcor > 1) then begin
     if (pCB) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(CB,v);
        dnheCB = dnHE(he);
     end
     if (pBL) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(BL,v);
        dnheBL = dnHE(he);
        if (dnheBL < dnbBL) then dnheBL = ceil(dnbBL);
     end
     ResizeArrayClear(v,maxip1); ReadHistogram(GL,v);
     dnheGL = dnHE(he);
     if (dnheGL < dnbGL) then dnheGL = ceil(dnbGL);
     if (pYL) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(YL,v);
        dnheYL = dnHE(he);
        if (dnheYL < dnbYL) then dnheYL = ceil(dnbYL);
     end
     ResizeArrayClear(v,maxip1); ReadHistogram(RL,v);
     dnheRL = dnHE(he);
     if (dnheRL < dnbRL) then dnheRL = ceil(dnbRL);
     if (pRE) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(RE,v);
        dnheRE = dnHE(he);
        if (dnheRE < dnbRE) then dnheRE = ceil(dnbRE);
     end
     if (pNA) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(NA,v);
        dnheNA = dnHE(he);
        if (dnheNA < dnbNA) then dnheNA = ceil(dnbNA);
     end
     if (pNB) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(NB,v);
        dnheNB = dnHE(he);
        if (dnheNB < dnbNB) then dnheNB = ceil(dnbNB);
     end
     if (pMA) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(MA,v);
        dnheMA = dnHE(he);
        if (dnheMA < dnbMA) then dnheMA = ceil(dnbMA);
     end
     if (pMB) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(MB,v);
        dnheMB = dnHE(he);
        if (dnheMB < dnbMB) then dnheMB = ceil(dnbMB);
     end
     if (pMC) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(MC,v);
        dnheMC = dnHE(he);
        if (dnheMC < dnbMC) then dnheMC = ceil(dnbMC);
     end
     if (pMD) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(MD,v);
        dnheMD = dnHE(he);
        if (dnheMD < dnbMD) then dnheMD = ceil(dnbMD);
     end
     if (pME) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(ME,v);
        dnheME = dnHE(he);
        if (dnheME < dnbME) then dnheME = ceil(dnbME);
     end
     if (pMF) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(MF,v);
        dnheMF = dnHE(he);
        if (dnheMF < dnbMF) then dnheMF = ceil(dnbMF);
     end
     if (pMG) then begin
        ResizeArrayClear(v,maxip1); ReadHistogram(MG,v);
        dnheMG = dnHE(he);
        if (dnheMG < dnbMG) then dnheMG = ceil(dnbMG);
     end
  end
# ------------------------------------------------------------
# CALCULATE SItoa & DN-to-SRF CONVERSION-COEFFICIENTS: aBAND
# Refer to B29.
  esd = 1 - 0.01672 * cosd(0.9856 * (doy - 4));
  sitoafac = sind(sunelevang) / esd^2;
  if (pCB) then sitoaCB = dssiCB * sitoafac;
  if (pBL) then sitoaBL = dssiBL * sitoafac;
  sitoaGL = dssiGL * sitoafac; sitoaRL = dssiRL * sitoafac;
  if (pYL) then sitoaYL = dssiYL * sitoafac;
  if (pRE) then sitoaRE = dssiRE * sitoafac;
  if (pNA) then sitoaNA = dssiNA * sitoafac;
  if (pNB) then sitoaNB = dssiNB * sitoafac;
  if (pMA) then sitoaMA = dssiMA * sitoafac;
  if (pMB) then sitoaMB = dssiMB * sitoafac;
  if (pMC) then sitoaMC = dssiMC * sitoafac;
  if (pMD) then sitoaMD = dssiMD * sitoafac;
  if (pME) then sitoaME = dssiME * sitoafac;
  if (pMF) then sitoaMF = dssiMF * sitoafac;
  if (pMG) then sitoaMG = dssiMG * sitoafac;
  pi100 = pi * 100;
  if (pCB) then aCB = pi100 * skCB / sitoaCB;
  if (pBL) then aBL = pi100 * skBL / sitoaBL;
  aGL = pi100 * skGL / sitoaGL; aRL = pi100 * skRL / sitoaRL;
  if (pYL) then aYL = pi100 * skYL / sitoaYL;
  if (pRE) then aRE = pi100 * skRE / sitoaRE;
  if (pNA) then aNA = pi100 * skNA / sitoaNA;
  if (pNB) then aNB = pi100 * skNB / sitoaNB;
  if (pMA) then aMA = pi100 * skMA / sitoaMA;
  if (pMB) then aMB = pi100 * skMB / sitoaMB;
  if (pMC) then aMC = pi100 * skMC / sitoaMC;
  if (pMD) then aMD = pi100 * skMD / sitoaMD;
  if (pME) then aME = pi100 * skME / sitoaME;
  if (pMF) then aMF = pi100 * skMF / sitoaMF;
  if (pMG) then aMG = pi100 * skMG / sitoaMG;
# ------------------------------------------------------------
# IF atcor > 1, ESTIMATE SRFpath & DNpath: Refer to B29.
  if (atcor > 1) then begin
     dnpathGL1 = dnheGL; 
     srfpathGL1 = (dnpathGL1 - dnbGL) * aGL;
     dnpathRL = dnheRL;
     srfpathRL  = (dnpathRL - dnbRL)  * aRL;
     logsrfpathRL = log(srfpathRL);
     wLenV = wLenGL; srfpathV = srfpathGL1;
     if (pBL) then begin
        wtBL = 0.55114;
        dnpathBL1 = dnheBL;
        srfpathBL1 = (dnpathBL1 - dnbBL) * aBL;
        wLenV = wtBL * wLenBL + (1 - wtBL) * wLenGL;
        srfpathV = (srfpathBL1 + srfpathGL1) / 2;
     end
     logwLenRLdwLenV = log(wLenRL / wLenV);
     logsrfpathV = log(srfpathV);
     difoflogs = logsrfpathV - logsrfpathRL;
     p = difoflogs / logwLenRLdwLenV;
     if (pCB) then begin
        srfpathCB2 =  srfpathRL * (wLenRL / wLenCB)^p;
        srfpathCB = SetMin(srfpathCB1, srfpathCB2);
        dnpathCB = round(srfpathCB / aCB) + dnbCB;
     end
     if (pBL) then begin
        srfpathBL2 =  srfpathRL * (wLenRL / wLenBL)^p;
        srfpathBL = SetMin(srfpathBL1, srfpathBL2);
        dnpathBL = round(srfpathBL / aBL) + dnbBL;
     end
     srfpathGL2 =  srfpathRL * (wLenRL / wLenGL)^p;
     srfpathGL = SetMin(srfpathGL1, srfpathGL2);
     dnpathGL = round(srfpathGL / aGL) + dnbGL;
     if (pYL) then begin
        srfpathYL2 =  srfpathRL * (wLenRL / wLenYL)^p;
        dnpathYL1 = dnheYL;
        srfpathYL1 = (dnpathYL1 - dnbYL) * aYL;
        srfpathYL = SetMin(srfpathYL1, srfpathYL2);
        dnpathYL = round(srfpathYL / aYL) + dnbYL;
     end
     p2 = 0.2 * p;
     if (pRE) then begin
        srfpathRE2 =  srfpathRL * (wLenRL / wLenRE)^p2;
        dnpathRE1 = dnheRE;
        srfpathRE1 = (dnpathRE1 - dnbRE) * aRE;
        srfpathRE = SetMin(srfpathRE1, srfpathRE2);
        dnpathRE = round(srfpathRE / aRE) + dnbRE;
     end
     if (pNA) then begin
        srfpathNA2 =  srfpathRL * (wLenRL / wLenNA)^p2;
        dnpathNA1 = dnheNA;
        srfpathNA1 = (dnpathNA1 - dnbNA) * aNA;
        srfpathNA = SetMin(srfpathNA1, srfpathNA2);
        dnpathNA = round(srfpathNA / aNA) + dnbNA;
     end
     if (pNB) then begin
        srfpathNB2 =  srfpathRL * (wLenRL / wLenNB)^p2;
        dnpathNB1 = dnheNB;
        srfpathNB1 = (dnpathNB1 - dnbNB) * aNB;
        srfpathNB = SetMin(srfpathNB1, srfpathNB2);
        dnpathNB = round(srfpathNB / aNB) + dnbNB;
     end
     if (pMA) then begin
        srfpathMA2 =  srfpathRL * (wLenRL / wLenMA)^p2;
        dnpathMA1 = dnheMA;
        srfpathMA1 = (dnpathMA1 - dnbMA) * aMA;
        srfpathMA = SetMin(srfpathMA1, srfpathMA2);
        dnpathMA = round(srfpathMA / aMA) + dnbMA;
     end
     if (pMB) then begin
        srfpathMB2 =  srfpathRL * (wLenRL / wLenMB)^p2;
        dnpathMB1 = dnheMB;
        srfpathMB1 = (dnpathMB1 - dnbMB) * aMB;
        srfpathMB = SetMin(srfpathMB1, srfpathMB2);
        dnpathMB = round(srfpathMB / aMB) + dnbMB;
     end
     if (pMC) then begin
        srfpathMC2 =  srfpathRL * (wLenRL / wLenMC)^p2;
        dnpathMC1 = dnheMC;
        srfpathMC1 = (dnpathMC1 - dnbMC) * aMC;
        srfpathMC = SetMin(srfpathMC1, srfpathMC2);
        dnpathMC = round(srfpathMC / aMC) + dnbMC;
     end
     if (pMD) then begin
        srfpathMD2 =  srfpathRL * (wLenRL / wLenMD)^p2;
        dnpathMD1 = dnheMD;
        srfpathMD1 = (dnpathMD1 - dnbMD) * aMD;
        srfpathMD = SetMin(srfpathMD1, srfpathMD2);
        dnpathMD = round(srfpathMD / aMD) + dnbMD;
     end
     if (pME) then begin
        srfpathME2 =  srfpathRL * (wLenRL / wLenME)^p2;
        dnpathME1 = dnheME;
        srfpathME1 = (dnpathME1 - dnbME) * aME;
        srfpathME = SetMin(srfpathME1, srfpathME2);
        dnpathME = round(srfpathME / aME) + dnbME;
     end
     if (pMF) then begin
        srfpathMF2 =  srfpathRL * (wLenRL / wLenMF)^p2;
        dnpathMF1 = dnheMF;
        srfpathMF1 = (dnpathMF1 - dnbMF) * aMF;
        srfpathMF = SetMin(srfpathMF1, srfpathMF2);
        dnpathMF = round(srfpathMF / aMF) + dnbMF;
     end
     if (pMG) then begin
        srfpathMG2 =  srfpathRL * (wLenRL / wLenMG)^p2;
        dnpathMG1 = dnheMG;
        srfpathMG1 = (dnpathMG1 - dnbMG) * aMG;
        srfpathMG = SetMin(srfpathMG1, srfpathMG2);
        dnpathMG = round(srfpathMG / aMG) + dnbMG;
     end
  end
# ------------------------------------------------------------
# SET UP LOOK-UP TABLES FOR SRFI VALUES (FUNCTION OF DNs):
# Refer to B30.
  if (atcor == 1) then begin
     srfpathCB = 0; srfpathBL = 0; srfpathGL = 0;
     srfpathYL = 0; srfpathRL = 0; srfpathRE = 0;
     srfpathNA = 0; srfpathNB = 0; srfpathMA = 0;
     srfpathMB = 0; srfpathMC = 0; srfpathMD = 0;
     srfpathME = 0; srfpathMF = 0; srfpathMG = 0;
  end
  if (cCB) then ResizeArrayClear(vCB,maxip1);
  if (pBL) then ResizeArrayClear(vBL,maxip1);
  ResizeArrayClear(vGL,maxip1); ResizeArrayClear(vRL,maxip1);
  if (pYL) then ResizeArrayClear(vYL,maxip1);
  if (pRE) then ResizeArrayClear(vRE,maxip1);
  if (pNA) then ResizeArrayClear(vNA,maxip1);
  if (pNB) then ResizeArrayClear(vNB,maxip1);
  if (pMA) then ResizeArrayClear(vMA,maxip1);
  if (pMB) then ResizeArrayClear(vMB,maxip1);
  if (pMC) then ResizeArrayClear(vMC,maxip1);
  if (pMD) then ResizeArrayClear(vMD,maxip1);
  if (pME) then ResizeArrayClear(vME,maxip1);
  if (pMF) then ResizeArrayClear(vMF,maxip1);
  if (pMG) then ResizeArrayClear(vMG,maxip1);
  for i=1 to maxi begin
     if (pCB) then begin
        srftoaCB = (i - dnbCB) * aCB;
        srfapcCB = srftoaCB - srfpathCB;
        srfsfcCB = srfapcCB * cCB;
        srfiCB = round(srfsfcCB * 100);
        if (srfiCB < 1) then srfiCB = 1;
        vCB[i] = srfiCB;
     end
     if (pBL) then begin
        srftoaBL = (i - dnbBL) * aBL;
        srfapcBL = srftoaBL - srfpathBL;
        srfsfcBL = srfapcBL * cBL;
        srfiBL = round(srfsfcBL * 100);
        if (srfiBL < 1) then srfiBL = 1;
        vBL[i] = srfiBL;
     end
     srftoaGL = (i - dnbGL) * aGL; 
     srfapcGL = srftoaGL - srfpathGL;
     srfsfcGL = srfapcGL * cGL;
     srfiGL = round(srfsfcGL * 100);
     if (srfiGL < 1) then srfiGL = 1;
     vGL[i] = srfiGL;
     if (pYL) then begin
        srftoaYL = (i - dnbYL) * aYL;
        srfapcYL = srftoaYL - srfpathYL;
        srfsfcYL = srfapcYL * cYL;
        srfiYL = round(srfsfcYL * 100);
        if (srfiYL < 1) then srfiYL = 1;
        vYL[i] = srfiYL;
     end
     srftoaRL = (i - dnbRL) * aRL;
     srfapcRL = srftoaRL - srfpathRL;
     srfsfcRL = srfapcRL * cRL;
     srfiRL = round(srfsfcRL * 100);
     if (srfiRL < 1) then srfiRL = 1;
     vRL[i] = srfiRL;
     if (pRE) then begin
        srftoaRE = (i - dnbRE) * aRE;
        srfapcRE = srftoaRE - srfpathRE;
        srfsfcRE = srfapcRE * cRE;
        srfiRE = round(srfsfcRE * 100);
        if (srfiRE < 1) then srfiRE = 1;
        vRE[i] = srfiRE;
     end
     if (pNA) then begin
        srftoaNA = (i - dnbNA) * aNA;
        srfapcNA = srftoaNA - srfpathNA;
        srfsfcNA = srfapcNA * cNA;
        srfiNA = round(srfsfcNA * 100);
        if (srfiNA < 1) then srfiNA = 1;
        vNA[i] = srfiNA;
     end
     if (pNB) then begin
        srftoaNB = (i - dnbNB) * aNB;
        srfapcNB = srftoaNB - srfpathNB;
        srfsfcNB = srfapcNB * cNB;
        srfiNB = round(srfsfcNB * 100);
        if (srfiNB < 1) then srfiNB = 1;
        vNB[i] = srfiNB;
     end
     if (pMA) then begin
        srftoaMA = (i - dnbMA) * aMA;
        srfapcMA = srftoaMA - srfpathMA;
        srfsfcMA = srfapcMA * cMA;
        srfiMA = round(srfsfcMA * 100);
        if (srfiMA < 1) then srfiMA = 1;
        vMA[i] = srfiMA;
     end
     if (pMB) then begin
        srftoaMB = (i - dnbMB) * aMB;
        srfapcMB = srftoaMB - srfpathMB;
        srfsfcMB = srfapcMB * cMB;
        srfiMB = round(srfsfcMB * 100);
        if (srfiMB < 1) then srfiMB = 1;
        vMB[i] = srfiMB;
     end
     if (pMC) then begin
        srftoaMC = (i - dnbMC) * aMC;
        srfapcMC = srftoaMC - srfpathMC;
        srfsfcMC = srfapcMC * cMC;
        srfiMC = round(srfsfcMC * 100);
        if (srfiMC < 1) then srfiMC = 1;
        vMC[i] = srfiMC;
     end
     if (pMD) then begin
        srftoaMD = (i - dnbMD) * aMD;
        srfapcMD = srftoaMD - srfpathMD;
        srfsfcMD = srfapcMD * cMD;
        srfiMD = round(srfsfcMD * 100);
        if (srfiMD < 1) then srfiMD = 1;
        vMD[i] = srfiMD;
     end
     if (pME) then begin
        srftoaME = (i - dnbME) * aME;
        srfapcME = srftoaME - srfpathME;
        srfsfcME = srfapcME * cME;
        srfiME = round(srfsfcME * 100);
        if (srfiME < 1) then srfiME = 1;
        vME[i] = srfiME;
     end
     if (pMF) then begin
        srftoaMF = (i - dnbMF) * aMF;
        srfapcMF = srftoaMF - srfpathMF;
        srfsfcMF = srfapcMF * cMF;
        srfiMF = round(srfsfcMF * 100);
        if (srfiMF < 1) then srfiMF = 1;
        vMF[i] = srfiMF;
     end
     if (pMG) then begin
        srftoaMG = (i - dnbMG) * aMG;
        srfapcMG = srftoaMG - srfpathMG;
        srfsfcMG = srfapcMG * cMG;
        srfiMG = round(srfsfcMG * 100);
        if (srfiMG < 1) then srfiMG = 1;
        vMG[i] = srfiMG;
     end
  end
# ------------------------------------------------------------
# IF atcor > 1, THEN GENERATE A HISTOGRAM ANALYSES REPORT:
# Refer to B31.
  if (atcor > 1) then begin
     printf("\nHISTOGRAM ANALYSES REPORT:\n");
     printf("BAND DNmin DNhe DNmax");
     printf(" DNpath SRFpath1 SRFpath\n");
     if (pCB) then begin
        printf("  CB   %3d  %3d",dnminCB,dnheCB);
        printf("  %4d    %3d",dnmaxCB, dnpathCB);
        printf(" %8.3f %7.3f\n",srfpathCB1,srfpathCB);
     end
     if (pBL) then begin
        printf("  BL   %3d  %3d",dnminBL,dnheBL);
        printf("  %4d    %3d",dnmaxBL, dnpathBL);
        printf(" %8.3f %7.3f\n",srfpathBL1,srfpathBL);
     end
     printf("  GL   %3d  %3d",dnminGL,dnheGL);
     printf("  %4d    %3d",dnmaxGL, dnpathGL);
     printf(" %8.3f %7.3f\n",srfpathGL1,srfpathGL);
     if (pYL) then begin
        printf("  YL   %3d  %3d",dnminYL,dnheYL);
        printf("  %4d    %3d",dnmaxYL, dnpathYL);
        printf(" %8.3f %7.3f\n",srfpathYL1,srfpathYL);
     end
     printf("  RL   %3d  %3d",dnminRL,dnheRL);
     printf("  %4d    %3d",dnmaxRL, dnpathRL);
     printf(" %8.3f %7.3f\n",srfpathRL,srfpathRL);
     if (pRE) then begin
        printf("  RE   %3d  %3d",dnminRE,dnheRE);
        printf("  %4d    %3d",dnmaxRE, dnpathRE);
        printf(" %8.3f %7.3f\n",srfpathRE1,srfpathRE);
     end
     if (pNA) then begin
        printf("  NA   %3d  %3d",dnminNA,dnheNA);
        printf("  %4d    %3d",dnmaxNA, dnpathNA);
        printf(" %8.3f %7.3f\n",srfpathNA1,srfpathNA);
     end
     if (pNB) then begin
        printf("  NB   %3d  %3d",dnminNB,dnheNB);
        printf("  %4d    %3d",dnmaxNB, dnpathNB);
        printf(" %8.3f %7.3f\n",srfpathNB1,srfpathNB);
     end
     if (pMA) then begin
        printf("  MA   %3d  %3d",dnminMA,dnheMA);
        printf("  %4d    %3d",dnmaxMA, dnpathMA);
        printf(" %8.3f %7.3f\n",srfpathMA1,srfpathMA);
     end
     if (pMB) then begin
        printf("  MB   %3d  %3d",dnminMB,dnheMB);
        printf("  %4d    %3d",dnmaxMB, dnpathMB);
        printf(" %8.3f %7.3f\n",srfpathMB1,srfpathMB);
     end
     if (pMC) then begin
        printf("  MC   %3d  %3d",dnminMC,dnheMC);
        printf("  %4d    %3d",dnmaxMC, dnpathMC);
        printf(" %8.3f %7.3f\n",srfpathMC1,srfpathMC);
     end
     if (pMD) then begin
        printf("  MD   %3d  %3d",dnminMD,dnheMD);
        printf("  %4d    %3d",dnmaxMD, dnpathMD);
        printf(" %8.3f %7.3f\n",srfpathMD1,srfpathMD);
     end
     if (pME) then begin
        printf("  ME   %3d  %3d",dnminME,dnheME);
        printf("  %4d    %3d",dnmaxME, dnpathME);
        printf(" %8.3f %7.3f\n",srfpathME1,srfpathME);
     end
     if (pMF) then begin
        printf("  MF   %3d  %3d",dnminMF,dnheMF);
        printf("  %4d    %3d",dnmaxMF, dnpathMF);
        printf(" %8.3f %7.3f\n",srfpathMF1,srfpathMF);
     end
     if (pMG) then begin
        printf("  MG   %3d  %3d",dnminMG,dnheMG);
        printf("  %4d    %3d",dnmaxMG, dnpathMG);
        printf(" %8.3f %7.3f\n",srfpathMG1,srfpathMG);
     end
     printf("SRFIpath Model Parameter: %6.4f\n",p);
#    ---------------------------------------------------------
#    PRINT HISTOGRAM ANALYSIS REPORT TO CONSOLE WINDOW:
     printf("\n");
     p1$   = "HISTOGRAM ANALYSES REPORT ASSESSMENT\n";
     p2$   = "* EXAMINE the HISTOGRAM ANALYSES REPORT.\n";
     p3$   = "  - DNheXX Should be Somewhat Higher";
     p4$   = " than the DNminXX.\n";
     p5$   = "  - SRFpath1XX Should be Like SRFpathXX\n";
     p6$   = "       EXCEPT for NA and/or NB Band.\n";
     p7$   = "  - SRFpath Should Decrease Band by Band.\n";
     p8$   = "  - SRFIpath Model Parameter Value Should\n";
     p9$   = "       be in the RANGE: 1.5000 to 5.0000.\n\n";
     p10$  = "* If the REPORT Looks Reasonable, Continue.\n";
     p11$  = "* If the REPORT Looks Unreasonable, STOP.\n\n";
     p12$  = "  - TO STOP (in the NEXT Popup WINDOW),\n";
     p13$  = "       * CLICK CANCEL.\n";
     p14$  = "       * Then, Re-Run SRFI.sml with a\n";
     p15$  = "                   Better delcf Value.\n\n";
     p16$  = "   - To CLOSE This Window, CLICK OK.";
     p$    = p1$ + p2$ + p3$ + p4$ + p5$ + p6$ + p7$ + p8$;
     p$    = p$ + p9$ + p10$ + p11$ + p12$ + p13$ + p14$;
     p$    = p$ + p15$ + p16$;
     PopupMessage(p$);
  end
# ------------------------------------------------------------
# ASSIGN NAMES & LOCATIONS FOR OUTPUT RASTERS:
# Refer to B33.
  printf("ASSIGN NAMES & LOCATIONS FOR OUTPUT RASTERS:\n");
  srfitype$ = "16-bit unsigned"; ptype$ = "16-bit unsigned";
  if (pCB) then begin
     printf(" SRFICB");
     GetOutputRaster(SRFICB,nlins,ncols,srfitype$);
     SetNull(SRFICB,0);
  end
  if (pBL) then begin
     printf(" SRFIBL");
     GetOutputRaster(SRFIBL,nlins,ncols,srfitype$);
     SetNull(SRFIBL,0);
  end
  printf(" SRFIGL");
  GetOutputRaster(SRFIGL,nlins,ncols,srfitype$);
  SetNull(SRFIGL,0);
  if (pYL) then begin
     printf(" SRFIYL");
     GetOutputRaster(SRFIYL,nlins,ncols,srfitype$);
     SetNull(SRFIYL,0);
  end
  printf(" SRFIRL");
  GetOutputRaster(SRFIRL,nlins,ncols,srfitype$);
  SetNull(SRFIRL,0);
  if (pRE) then begin
     printf(" SRFIRE");
     GetOutputRaster(SRFIRE,nlins,ncols,srfitype$);
     SetNull(SRFIRE,0);
  end
  if (pNA) then begin
     printf(" SRFINA");
     GetOutputRaster(SRFINA,nlins,ncols,srfitype$);
     SetNull(SRFINA,0);
  end
  if (pNB) then begin
     printf(" SRFINB");
     GetOutputRaster(SRFINB,nlins,ncols,srfitype$);
     SetNull(SRFINB,0);
  end
  if (pMA) then begin
     printf(" SRFIMA");
     GetOutputRaster(SRFIMA,nlins,ncols,srfitype$);
     SetNull(SRFIMA,0);
  end
  if (pMB) then begin
     printf(" SRFIMB");
     GetOutputRaster(SRFIMB,nlins,ncols,srfitype$);
     SetNull(SRFIMB,0);
  end
  if (pMC) then begin
     printf(" SRFIMC");
     GetOutputRaster(SRFIMC,nlins,ncols,srfitype$);
     SetNull(SRFIMC,0);
  end
  if (pMD) then begin
     printf(" SRFIMD");
     GetOutputRaster(SRFIMD,nlins,ncols,srfitype$);
     SetNull(SRFIMD,0);
  end
  if (pME) then begin
     printf(" SRFIME");
     GetOutputRaster(SRFIME,nlins,ncols,srfitype$);
     SetNull(SRFIME,0);
  end
  if (pMF) then begin
     printf(" SRFIMF");
     GetOutputRaster(SRFIMF,nlins,ncols,srfitype$);
     SetNull(SRFIMF,0);
  end
  if (pMG) then begin
     printf(" SRFIMG");
     GetOutputRaster(SRFIMG,nlins,ncols,srfitype$);
     SetNull(SRFIMG,0);
  end
  if (atcor == 3) then begin
     printf(" PVI");
     GetOutputRaster(PVI,nlins,ncols,ptype$);
     printf(" PBI");
     GetOutputRaster(PBI,nlins,ncols,ptype$);
     SetNull(PVI,0); SetNull(PBI,0);
  end
  printf("\n\n");
# ------------------------------------------------------------
# FILL SRFI RASTERS WITH VALUES: Refer to B35.
  if (atcor == 1) then begin
     printf("PRODUCING SRFItoa RASTERS:\n");
  end
  if (atcor == 2) then begin
     printf("PRODUCING SRFIapc RASTERS:\n");
  end
  if (atcor == 3) then begin
     printf("PRODUCING SRFIsfc RASTERS:\n");
  end
  if (pCB) then begin
     printf(" CB");
     for each CB begin
        dnCB = CB; nc = IsNull(dnCB);
        if (nc==0) then SRFICB = vCB[dnCB];
     end
     CreateHistogram(SRFICB,0); CreatePyramid(SRFICB,0);
     CopySubobjects(RL,SRFICB,"GEOREF");
     smlContrast.InputUpperLimit = 2820;
     smlContrast.Compute(SRFICB,clut1$,clut2$,clut3$);
     CloseRaster(CB); CloseRaster(SRFICB);
  end
  if (pBL) then begin
     printf(" BL");
     for each BL begin
        dnBL = BL; nc = IsNull(dnBL);
        if (nc==0) then SRFIBL = vBL[dnBL];
     end
     CreateHistogram(SRFIBL,0); CreatePyramid(SRFIBL,0);
     CopySubobjects(RL,SRFIBL,"GEOREF");
     smlContrast.InputUpperLimit = 2820;
     smlContrast.Compute(SRFIBL,clut1$,clut2$,clut3$);
     CloseRaster(BL); CloseRaster(SRFIBL);
  end
  printf(" GL");
  for each GL begin
     dnGL = GL; nc = IsNull(dnGL);
     if (nc==0) then SRFIGL = vGL[dnGL];
  end
  CreateHistogram(SRFIGL,0); CreatePyramid(SRFIGL,0);
  CopySubobjects(RL,SRFIGL,"GEOREF");
  smlContrast.InputUpperLimit = 3230;
  smlContrast.Compute(SRFIGL,clut1$,clut2$,clut3$);
  CloseRaster(GL); CloseRaster(SRFIGL);
  if (pYL) then begin
     printf(" YL");
     for each YL begin
        dnYL = YL; nc = IsNull(dnYL);
        if (nc==0) then SRFIYL = vYL[dnYL];
     end
     CreateHistogram(SRFIYL,0); CreatePyramid(SRFIYL,0);
     CopySubobjects(RL,SRFIYL,"GEOREF");
     smlContrast.InputUpperLimit = 3230;
     smlContrast.Compute(SRFIYL,clut1$,clut2$,clut3$);
     CloseRaster(YL); CloseRaster(SRFIYL);
  end
  printf(" RL");
  for each RL begin
     dnRL = RL; nc = IsNull(dnRL);
     if (nc==0) then SRFIRL = vRL[dnRL];
  end
  CreateHistogram(SRFIRL,0); CreatePyramid(SRFIRL,0);
  CopySubobjects(RL,SRFIRL,"GEOREF");
  smlContrast.InputUpperLimit = 3500;
  smlContrast.Compute(SRFIRL,clut1$,clut2$,clut3$);
  CloseRaster(RL);
  if (pRE) then begin
     printf(" RE");
     for each RE begin
        dnRE = RE; nc = IsNull(dnRE);
        if (nc==0) then SRFIRE = vRE[dnRE];
     end
     CreateHistogram(SRFIRE,0); CreatePyramid(SRFIRE,0);
     CopySubobjects(RL,SRFIRE,"GEOREF");
     smlContrast.InputUpperLimit = 4000;
     smlContrast.Compute(SRFIRE,clut1$,clut2$,clut3$);
     CloseRaster(RE); CloseRaster(SRFIRE);
  end
  if (pNA) then begin
     printf(" NA");
     for each NA begin
        dnNA = NA; nc = IsNull(dnNA);
        if (nc==0) then SRFINA = vNA[dnNA];
     end
     CreateHistogram(SRFINA,0); CreatePyramid(SRFINA,0);
     CopySubobjects(RL,SRFINA,"GEOREF");
     smlContrast.InputUpperLimit = 5000;
     smlContrast.Compute(SRFINA,clut1$,clut2$,clut3$);
     CloseRaster(NA);
  end
  if (pNB) then begin
     printf(" NB");
     for each NB begin
        dnNA = NB; nc = IsNull(dnNB);
        if (nc==0) then SRFINB = vNB[dnNB];
     end
     CreateHistogram(SRFINB,0); CreatePyramid(SRFINB,0);
     CopySubobjects(RL,SRFINB,"GEOREF");
     smlContrast.InputUpperLimit = 5000;
     smlContrast.Compute(SRFINB,clut1$,clut2$,clut3$);
     CloseRaster(NB);
  end
  if (pMA) then begin
     printf(" MA");
     for each MA begin
        dnMA = MA; nc = IsNull(dnMA);
        if (nc==0) then SRFIMA = vMA[dnMA];
     end
     CreateHistogram(SRFIMA,0); CreatePyramid(SRFIMA,0);
     CopySubobjects(RL,SRFIMA,"GEOREF");
     smlContrast.InputUpperLimit = 4200;
     smlContrast.Compute(SRFIMA,clut1$,clut2$,clut3$);
     CloseRaster(MA); CloseRaster(SRFIMA);
  end
  if (pMB) then begin
     printf(" MB");
     for each MB begin
        dnMB = MB; nc = IsNull(dnMB);
        if (nc==0) then SRFIMB = vMB[dnMB];
     end
     CreateHistogram(SRFIMB,0); CreatePyramid(SRFIMB,0);
     CopySubobjects(RL,SRFIMB,"GEOREF");
     smlContrast.InputUpperLimit = 4200;
     smlContrast.Compute(SRFIMB,clut1$,clut2$,clut3$);
     CloseRaster(MB); CloseRaster(SRFIMB);
  end
  if (pMC) then begin
     printf(" MC");
     for each MC begin
        dnMC = MC; nc = IsNull(dnMC);
        if (nc==0) then SRFIMC = vMC[dnMC];
     end
     CreateHistogram(SRFIMC,0); CreatePyramid(SRFIMC,0);
     CopySubobjects(RL,SRFIMC,"GEOREF");
     smlContrast.InputUpperLimit = 3500;
     smlContrast.Compute(SRFIMC,clut1$,clut2$,clut3$);
     CloseRaster(MC); CloseRaster(SRFIMC);
  end
  if (pMD) then begin
     printf(" MD");
     for each MD begin
        dnMD = MD; nc = IsNull(dnMD);
        if (nc==0) then SRFIMD = vMD[dnMD];
     end
     CreateHistogram(SRFIMD,0); CreatePyramid(SRFIMD,0);
     CopySubobjects(RL,SRFIMD,"GEOREF");
     smlContrast.InputUpperLimit = 3500;
     smlContrast.Compute(SRFIMD,clut1$,clut2$,clut3$);
     CloseRaster(MD); CloseRaster(SRFIMD);
  end
  if (pME) then begin
     printf(" ME");
     for each ME begin
        dnME = ME; nc = IsNull(dnME);
        if (nc==0) then SRFIME = vME[dnME];
     end
     CreateHistogram(SRFIME,0); CreatePyramid(SRFIME,0);
     CopySubobjects(RL,SRFIME,"GEOREF");
     smlContrast.InputUpperLimit = 3500;
     smlContrast.Compute(SRFIME,clut1$,clut2$,clut3$);
     CloseRaster(ME); CloseRaster(SRFIME);
  end
  if (pMF) then begin
     printf(" MF");
     for each MF begin
        dnMF = MF; nc = IsNull(dnMF);
        if (nc==0) then SRFIMF = vMF[dnMF];
     end
     CreateHistogram(SRFIMF,0); CreatePyramid(SRFIMF,0);
     CopySubobjects(RL,SRFIMF,"GEOREF");
     smlContrast.InputUpperLimit = 3500;
     smlContrast.Compute(SRFIMF,clut1$,clut2$,clut3$); 
     CloseRaster(MF); CloseRaster(SRFIMF);
  end
  if (pMG) then begin
     printf(" MG");
     for each MG begin
        dnMG = MG; nc = IsNull(dnMG);
        if (nc==0) then SRFIMG = vMG[dnMG];
     end
     CreateHistogram(SRFIMG,0); CreatePyramid(SRFIMG,0);
     CopySubobjects(RL,SRFIMG,"GEOREF");
     smlContrast.InputUpperLimit = 3500;
     smlContrast.Compute(SRFIMG,clut1$,clut2$,clut3$);
     CloseRaster(MG); CloseRaster(SRFIMG);
  end
# ------------------------------------------------------------
# IF atcor = 3, PRODUCE VALUES FOR PVI & PBI RASTERS:
# Refer to B36
  if (atcor == 3) then begin
     printf("\n\nPRODUCING PVI & PBI RASTERS:");
     angrad = -atan(bslineslope);
     sinang = sin(angrad); cosang = cos(angrad);
     for each SRFIRL begin
        srfiRL =  SRFIRL;
        if (srfiRL > 0) then begin
           if (pNA) then srfiNR = SRFINA;
           if (pNB and pNA==0) then srfiNR = SRFINB;
           tsrfiNR = srfiNR - srfiNRint;
           pbif = srfiRL * cosang - tsrfiNR * sinang;
           pbi  = round(pfac * pbif)+ pbioff;
           pvif = srfiRL * sinang + tsrfiNR * cosang;
           pvi  = round(pfac * pvif) + pvioff;
           if (pbi < 1) then pbi = 1;
           if (pvi < 1) then pvi = 1;
           if (pbi > maxpvipbi) then pbi = maxpvipbi;
           if (pvi > maxpvipbi) then pvi = maxpvipbi;
           PBI = pbi; PVI = pvi;
        end
     end
     CreateHistogram(PBI,0); CreateHistogram(PVI,0);
     CreatePyramid(PBI,0); CreatePyramid(PVI,0);
     CopySubobjects(RL,PVI,"GEOREF");
     CopySubobjects(RL,PBI,"GEOREF");
     smlContrast.Power           =    1;
     smlContrast.InputLowerLimit =  800;
     smlContrast.InputUpperLimit = 2000;
     smlContrast.Compute(PVI,clut1$,clut2$,clut3$);
     smlContrast.InputLowerLimit =    1;
     smlContrast.InputUpperLimit = 1500;
     smlContrast.Compute(PBI,clut1$,clut2$,clut3$);
     CloseRaster(PBI); CloseRaster(PVI);
  end
  if (pNA) then CloseRaster(SRFINA);
  if (pNB) then CloseRaster(SRFINB);
  CloseRaster(SRFIRL);
# ------------------------------------------------------------
# CLEAR CONSOLE WINDOW, WRITE TITLE & WRITE PROCESSING-REPORT
# TO CONSOLE WINDOW: Refer to B37.
  clear(); writeTitle();
  printf("SRFI.sml PROCESSING-REPORT:\n\n");
  printf("          SITE NAME: %s\n",site$);
  printf("    COLLECTION DATE: %8d\n",cdate);
  printf("        DAY OF YEAR: %d\n",doy);
  if (pdate>0) then begin
     printf("    PROCESSING DATE: %8d\n",pdate);
  end
  printf("SUN ELEVATION ANGLE: %5.2f deg\n",sunelevang);
  printf("             IMAGER: %s\n",imager$);
  printf("     IMAGE DN SCALE: %d to %d\n",dnlow,dnhigh);
  if (imager == 4) then begin
     printf("          GAIN-CODE: %s\n",gc$);
     p$ = "LPGS (EOS Data Gateway)";
     if (sc == 2) then p$ = "NLAPS (EarthExplorer)";
     printf("        DATA VENDOR: %s\n",p$);
  end
  printf("   CORRECTION LEVEL: ");
  p4$ = "Make No Atmospheric Corrections";
  p5$ = "Correct for Atmospheric Reflectance Only";
  p6$ = "Correct for All Atmospheric Effects";
  if (atcor == 1) then printf("%s\n",p4$);
  if (atcor == 2) then printf("%s\n",p5$);
  if (atcor == 3) then printf("%s\n",p6$);
  printf("              delcf: %4.2f Percentage",delcf);
  printf(" Points\n");
  printf("              msfac: %6.4f\n",msfac);
  printf("               icRL: %6.4f\n\n",icRL);
  if (imager == 4) then begin
     printf("          GAIN-CODE: %s\n",gc$);
     p$ = "LPGS (EOS Data Gateway)";
     if (sc == 2) then p$ = "NLAPS (EarthExplorer)";
     printf("        DATA VENDOR: %s\n",p$);
  end
  printf("   BAND  dnb dnpath srfpath        a");
  printf("     c         m\n");
  if (pCB) then begin
     mCB = aCB * cCB;
     printf("     CB %4d %6d %7.3f",dnbCB,dnpathCB,srfpathCB);
     printf(" %8.6f %5.3f %9.7f\n",aCB,cCB,mCB);
  end
  if (pBL) then begin
     mBL = aBL * cBL;
     printf("     BL %4d %6d %7.3f",dnbBL,dnpathBL,srfpathBL);
     printf(" %8.6f %5.3f %9.7f\n",aBL,cBL,mBL);
  end
  mGL = aGL * cGL;
  if (pYL) then begin
     mYL = aYL * cYL;
     printf("     YL %4d %6d %7.3f",dnbYL,dnpathYL,srfpathYL);
     printf(" %8.6f %5.3f %9.7f\n",aYL,cYL,mYL);
  end
  mRL = aRL * cRL;
  printf("     GL %4d %6d %7.3f",dnbGL,dnpathGL,srfpathGL);
  printf(" %8.6f %5.3f %9.7f\n",aGL,cGL,mGL);
  printf("     RL %4d %6d %7.3f",dnbRL,dnpathRL,srfpathRL);
  printf(" %8.6f %5.3f %9.7f\n",aRL,cRL,mRL);
  if (pRE) then begin
     mRE = aRE * cRE;
     printf("     RE %4d %6d %7.3f",dnbRE,dnpathRE,srfpathRE);
     printf(" %8.6f %5.3f %9.7f\n",aRE,cRE,mRE);
  end
  if (pNA) then begin
     mNA = aNA * cNA;
     printf("     NA %4d %6d %7.3f",dnbNA,dnpathNA,srfpathNA);
     printf(" %8.6f %5.3f %9.7f\n",aNA,cNA,mNA);
  end
  if (pNB) then begin
     mNB = aNB * cNB;
     printf("     NB %4d %6d %7.3f",dnbNB,dnpathNB,srfpathNB);
     printf(" %8.6f %5.3f %9.7f\n",aNB,cNB,mNB);
  end
  if (pMA) then begin
     mMA = aMA * cMA;
     printf("     MA %4d %6d %7.3f",dnbMA,dnpathMA,srfpathMA);
     printf(" %8.6f %5.3f %9.7f\n",aMA,cMA,mMA);
  end
  if (pMB) then begin
     mMB = aMB * cMB;
     printf("     MB %4d %6d %7.3f",dnbMB,dnpathMB,srfpathMB);
     printf(" %8.6f %5.3f %9.7f\n",aMB,cMB,mMB);
  end
  if (pMC) then begin
     mMC = aMC * cMC;
     printf("     MC %4d %6d %7.3f",dnbMC,dnpathMC,srfpathMC);
     printf(" %8.6f %5.3f %9.7f\n",aMC,cMC,mMC);
  end
  if (pMD) then begin
     mMD = aMD * cMD;
     printf("     MD %4d %6d %7.3f",dnbMD,dnpathMD,srfpathMD);
     printf(" %8.6f %5.3f %9.7f\n",aMD,cMD,mMD);
  end
  if (pME) then begin
     mME = aME * cME;
     printf("     ME %4d %6d %7.3f",dnbME,dnpathME,srfpathME);
     printf(" %8.6f %5.3f %9.7f\n",aME,cME,mME);
  end
  if (pMF) then begin
     mMF = aMF * cMF;
     printf("     MF %4d %6d %7.3f",dnbMF,dnpathMF,srfpathMF);
     printf(" %8.6f %5.3f %9.7f\n",aMF,cMF,mMF);
  end
  if (pMG) then begin
     mMG = aMG * cMG;
     printf("     MG %4d %6d %7.3f",dnbMG,dnpathMG,srfpathMG);
     printf(" %8.6f %5.3f %9.7f\n",aMG,cMG,mMG);
  end
  printf("     SRFpath Model Parameter: %6.4f\n\n",p);
  printf("   CONVERSION EQUATIONS for Band XX:\n");
  printf("     mXX       = aXX * cXX\n");
  printf("     srftoaXX  = (dnXX - dnbXX) * aXX\n");
  printf("     srfpathXX = (dnpathXX - dnbXX) * aXX\n");
  printf("     srfapcXX  = srftoaXX - srfpathXX\n");
  printf("     srfsfcXX  = srfapcXX * cXX\n");
  printf("     srfsfcXX  = (dnXX - dnbXX - dnpathXX)");
  printf(" * mXX\n");
  printf("     srfitoaXX = round(100 * srftoaXX)\n");
  printf("     srfiapcXX = round(100 * srfapcXX)\n");
  printf("     srfisfcXX = round(100 * srfsfcXX)\n");
  printf("     dnXX      = dnpathXX + round");
  printf("(0.01 * srfiXX / mXX)\n");
# ------------------------------------------------------------
# GIVE REFERENCE FOR ANALYSIS HINTS: Refer to B37.
  printf("\nFOR ANALYSIS HINTS: Refer to B37.\n\n");
  printf("TO SAVE THE CONSOLE WINDOW TEXT AS A REPORT:\n");
  printf("   1. RIGHT-CLICK IN THE CONSOLE WINDOW.\n");
  printf("   2. SELECT THE Save As... OPTION.\n");
  printf("   3. NAVIGATE TO THE DESIRED LOCATION.\n");
  printf("   4. PROVIDE A REPORT NAME (or OVERWRITE).\n");
  printf("   5. CLICK OK.");