# ------------------------------------------------------------ # 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.");