PRO READ_L1C, L1CFIL, L1C ; ; VERSION ; 31MAY05 AD Allow for no microwindows and L1C v2.0 ; 14MAR05 AD Original. ; ; DESCRIPTION ; Procedure to read L1C file as a structure ; Creates two additional arrays which are not in the L1C file ; L1C.NLST which is the number of different MWs in the L1C file ; L1C.LABLST the labels of the different microwindows sorted by wavenumber ; Note that this module also orders the output arrays L1C.MIC* and L1C.RAD ; so that the IMIC index (0:NLST-1) corresponds to the same microwindow for ; each sweep irrespective of original position in the L1C file. ; ; ARGUMENTS ; STRING L1CFIL I Name of L1C file ; STRUCTURE L1C O L1C structure ; OPENR, LUN, L1CFIL, /GET_LUN ; Header variables HEADER1 = '' & READF, LUN, HEADER1 HEADER2 = '' & READF, LUN, HEADER2 HEADER3 = '' & READF, LUN, HEADER3 READF, LUN, FMT IF FMT GE 2.0 THEN BEGIN ISPEC = 0 RESLN = 0.0D0 READF, LUN, ISPEC, RESLN ENDIF READF, LUN, NSWP ; Sweep variables - first record JDAY = LONARR(NSWP) SECS = LONARR(NSWP) YYYYMMDD = LONARR(NSWP) HHMMSS = LONARR(NSWP) ORBIT = LONARR(NSWP) LST = FLTARR(NSWP) SZA = FLTARR(NSWP) ; Sweep variables - second record SWPIDX = INTARR(NSWP) ALT = FLTARR(NSWP) ALTNOM = FLTARR(NSWP) LAT = FLTARR(NSWP) LON = FLTARR(NSWP) RADCRV = FLTARR(NSWP) NMIC = INTARR(NSWP) RADCLD = FLTARR(NSWP) CLDIDX = FLTARR(NSWP) MAXMIC = 1 MICLAB = STRARR(MAXMIC,NSWP) MICNPT = LONARR(MAXMIC,NSWP) MICWN1 = DBLARR(MAXMIC,NSWP) MICWN2 = DBLARR(MAXMIC,NSWP) MICNOI = FLTARR(MAXMIC,NSWP) MAXNPT = 1 RAD = FLTARR(MAXNPT,MAXMIC,NSWP) FOR ISWP = 0, NSWP-1 DO BEGIN READF, LUN, JDAY_SWP, SECS_SWP, YYYYMMDD_SWP, HHMMSS_SWP, ORBIT_SWP, $ LST_SWP, SZA_SWP JDAY(ISWP) = JDAY_SWP SECS(ISWP) = SECS_SWP YYYYMMDD(ISWP) = YYYYMMDD_SWP HHMMSS(ISWP) = HHMMSS_SWP ORBIT(ISWP) = ORBIT_SWP LST(ISWP) = LST_SWP SZA(ISWP) = SZA_SWP READF, LUN, SWPIDX_SWP, ALT_SWP, ALTNOM_SWP, LAT_SWP, LON_SWP, RADCRV_SWP, $ NMIC_SWP, RADCLD_SWP, CLDIDX_SWP SWPIDX(ISWP) = SWPIDX_SWP ALT(ISWP) = ALT_SWP ALTNOM(ISWP) = ALTNOM_SWP LAT(ISWP) = LAT_SWP LON(ISWP) = LON_SWP RADCRV(ISWP) = RADCRV_SWP NMIC(ISWP) = NMIC_SWP RADCLD(ISWP) = RADCLD_SWP CLDIDX(ISWP) = CLDIDX_SWP IF NMIC_SWP GT MAXMIC THEN BEGIN NEW = STRARR(NMIC_SWP,NSWP) & NEW[0:MAXMIC-1,*] = MICLAB & MICLAB = NEW NEW = LONARR(NMIC_SWP,NSWP) & NEW[0:MAXMIC-1,*] = MICNPT & MICNPT = NEW NEW = DBLARR(NMIC_SWP,NSWP) & NEW[0:MAXMIC-1,*] = MICWN1 & MICWN1 = NEW NEW = DBLARR(NMIC_SWP,NSWP) & NEW[0:MAXMIC-1,*] = MICWN2 & MICWN2 = NEW NEW = FLTARR(NMIC_SWP,NSWP) & NEW[0:MAXMIC-1,*] = MICNOI & MICNOI = NEW NEW = FLTARR(MAXNPT,NMIC_SWP,NSWP) & NEW[*,0:MAXMIC-1,*] = RAD & RAD = NEW MAXMIC = NMIC_SWP ENDIF FOR IMIC = 0, NMIC(ISWP)-1 DO BEGIN REC = '' READF, LUN, REC MICLAB(IMIC,ISWP) = STRMID ( REC, 0, 8 ) WN1 = 0.0D0 WN2 = 0.0D0 NPT = 0L READS, STRMID ( REC, 8 ), NPT, WN1, WN2, NOI MICNPT(IMIC,ISWP) = NPT MICWN1(IMIC,ISWP) = WN1 MICWN2(IMIC,ISWP) = WN2 MICNOI(IMIC,ISWP) = NOI IF NPT GT MAXNPT THEN BEGIN NEW = FLTARR(NPT,MAXMIC,NSWP) & NEW(0:MAXNPT-1,*,*) = RAD & RAD = NEW MAXNPT = NPT ENDIF R = FLTARR(NPT) READF, LUN, R RAD(0:NPT-1,IMIC,ISWP) = R ENDFOR ENDFOR FREE_LUN, LUN ; So far the microwindows are just listed for each sweep in the order in which ; they are found in the L1C data ; This last part sorts the microwindow information so that the same IMIC index ; is used for the same microwindow throughout the MIC* and RAD arrays LABLST = ['?????????'] ; Since MIC label is C*8 this should never match WN1LST = [1.0D10] ; Should always be higher than MW wavenumber NLST = 1 FOR ISWP = 0, NSWP-1 DO BEGIN FOR IMIC = 0, NMIC(ISWP)-1 DO BEGIN LAB = MICLAB(IMIC,ISWP) IDX = WHERE ( LABLST EQ LAB, GOTMIC ) ; Sets GOTMIC=0 if existing mw IF NOT GOTMIC THEN BEGIN ILST = 0 WN1 = MICWN1[IMIC,ISWP] WHILE WN1 GT WN1LST[ILST] DO ILST = ILST + 1 ; ILST in range 0:NLST-1 IF ILST EQ 0 THEN BEGIN LABLST = [ LAB, LABLST ] WN1LST = [ WN1, WN1LST ] ENDIF ELSE BEGIN LABLST = [ LABLST[0:ILST-1], LAB, LABLST[ILST:NLST-1] ] WN1LST = [ WN1LST[0:ILST-1], WN1, WN1LST[ILST:NLST-1] ] ENDELSE NLST = NLST + 1 ENDIF ENDFOR ENDFOR NLST = NLST-1 ; Remove dummy '?????????' microwindow IF NLST EQ 0 THEN BEGIN ; No microwindow data, just return sweep info IF FMT GE 2.0 THEN $ L1C = {HEADER1:HEADER1, HEADER2:HEADER2, HEADER3:HEADER3, FMT:FMT, $ ISPEC:ISPEC, RESLN:RESLN, $ NSWP:NSWP, JDAY:JDAY, SECS:SECS, YYYYMMDD:YYYYMMDD, HHMMSS:HHMMSS, $ ORBIT:ORBIT, NLST:NLST, $ LST:LST, SZA:SZA, SWPIDX:SWPIDX, ALT:ALT, ALTNOM:ALTNOM, LAT:LAT, $ LON:LON, RADCRV:RADCRV, NMIC:NMIC, RADCLD:RADCLD, CLDIDX:CLDIDX } $ ELSE $ L1C = {HEADER1:HEADER1, HEADER2:HEADER2, HEADER3:HEADER3, FMT:FMT, $ NSWP:NSWP, JDAY:JDAY, SECS:SECS, YYYYMMDD:YYYYMMDD, HHMMSS:HHMMSS, $ ORBIT:ORBIT, NLST:NLST, $ LST:LST, SZA:SZA, SWPIDX:SWPIDX, ALT:ALT, ALTNOM:ALTNOM, LAT:LAT, $ LON:LON, RADCRV:RADCRV, NMIC:NMIC, RADCLD:RADCLD, CLDIDX:CLDIDX } ENDIF LABLST = LABLST[0:NLST-1] ; Expand MIC* array dimensions if necessary to accommodate all MWs IF NLST GT MAXMIC THEN BEGIN NEW = STRARR(NLST,NSWP) & NEW[0:MAXMIC-1,*] = MICLAB & MICLAB = NEW NEW = LONARR(NLST,NSWP) & NEW[0:MAXMIC-1,*] = MICNPT & MICNPT = NEW NEW = DBLARR(NLST,NSWP) & NEW[0:MAXMIC-1,*] = MICWN1 & MICWN1 = NEW NEW = DBLARR(NLST,NSWP) & NEW[0:MAXMIC-1,*] = MICWN2 & MICWN2 = NEW NEW = FLTARR(NLST,NSWP) & NEW[0:MAXMIC-1,*] = MICNOI & MICNOI = NEW NEW = FLTARR(MAXNPT,NLST,NSWP) & NEW[*,0:MAXMIC-1,*] = RAD & RAD = NEW ENDIF ; Shuffle microwindows to ensure same index used for same microwindow FOR ISWP = 0, NSWP-1 DO BEGIN OLDLAB = MICLAB[*,ISWP] FOR JMIC = 0, NMIC[ISWP]-1 DO BEGIN IDX = WHERE ( LABLST EQ OLDLAB[JMIC] ) ILST = IDX[0] IDX = WHERE ( MICLAB[*,ISWP] EQ OLDLAB[JMIC] ) IMIC = IDX[0] LAB = MICLAB[ILST,ISWP] NPT = MICNPT[ILST,ISWP] WN1 = MICWN1[ILST,ISWP] WN2 = MICWN2[ILST,ISWP] NOI = MICNOI[ILST,ISWP] RADSAV = RAD[*,ILST,ISWP] MICLAB[ILST,ISWP] = MICLAB[IMIC,ISWP] MICNPT[ILST,ISWP] = MICNPT[IMIC,ISWP] MICWN1[ILST,ISWP] = MICWN1[IMIC,ISWP] MICWN2[ILST,ISWP] = MICWN2[IMIC,ISWP] MICNOI[ILST,ISWP] = MICNOI[IMIC,ISWP] RAD[*,ILST,ISWP] = RAD[*,IMIC,ISWP] MICLAB[IMIC,ISWP] = LAB MICNPT[IMIC,ISWP] = NPT MICWN1[IMIC,ISWP] = WN1 MICWN2[IMIC,ISWP] = WN2 MICNOI[IMIC,ISWP] = NOI RAD[*,IMIC,ISWP] = RADSAV ENDFOR ENDFOR IF FMT GE 2.0 THEN $ L1C = {HEADER1:HEADER1, HEADER2:HEADER2, HEADER3:HEADER3, FMT:FMT, $ ISPEC:ISPEC, RESLN:RESLN, $ NSWP:NSWP, JDAY:JDAY, SECS:SECS, YYYYMMDD:YYYYMMDD, HHMMSS:HHMMSS, $ ORBIT:ORBIT, NLST:NLST, LABLST:LABLST, $ LST:LST, SZA:SZA, SWPIDX:SWPIDX, ALT:ALT, ALTNOM:ALTNOM, LAT:LAT, $ LON:LON, RADCRV:RADCRV, NMIC:NMIC, RADCLD:RADCLD, CLDIDX:CLDIDX, $ MICLAB:MICLAB, MICNPT:MICNPT, MICWN1:MICWN1, MICWN2:MICWN2, RAD:RAD }$ ELSE $ L1C = {HEADER1:HEADER1, HEADER2:HEADER2, HEADER3:HEADER3, FMT:FMT, $ NSWP:NSWP, JDAY:JDAY, SECS:SECS, YYYYMMDD:YYYYMMDD, HHMMSS:HHMMSS, $ ORBIT:ORBIT, NLST:NLST, LABLST:LABLST, $ LST:LST, SZA:SZA, SWPIDX:SWPIDX, ALT:ALT, ALTNOM:ALTNOM, LAT:LAT, $ LON:LON, RADCRV:RADCRV, NMIC:NMIC, RADCLD:RADCLD, CLDIDX:CLDIDX, $ MICLAB:MICLAB, MICNPT:MICNPT, MICWN1:MICWN1, MICWN2:MICWN2, RAD:RAD } END