home products news downloads documentation support gallery online maps resellers search
TNTmips Downloads Menu

HOME

CONTACT US

CURRENT RELEASE
  TNT 2013

DEVELOPMENT VERSION
  TNT 2014

TNTmips Pro
PRIOR RELEASES
  TNT 2012

FREE SOFTWARE
  TNTmips Free
  TNTatlas
  TNTsdk

MORE DOWNLOADS
  HASP Key Driver
  Screen Recorder
  TNT Language Kits
  Sample Geodata
  TNT Scripts

DOCUMENTATION
  TNTmips Tutorials
  Tutorial Datasets
  Technical Guides
  Scripts
  Quick Guides

MORE INFO
  Download FAQs
  FTP
  Download Managers
  Find Reseller

SITE MAP


SRFI.sml

See other Scripts by Jack? ...


# ------------------------------------------------------------
# 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: jparis37@msn.com ");
     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.");


Back Home ©MicroImages, Inc. 2013 Published in the United States of America
11th Floor - Sharp Tower, 206 South 13th Street, Lincoln NE 68508-2010   USA
Business & Sales: (402)477-9554  Support: (402)477-9562  Fax: (402)477-9559
Business info@microimages.com  Support support@microimages.com  Web webmaster@microimages.com

25 March 2009

page update: 26 May 11