common comconst common unpackcommon
Directions to execute this example IDL program.
Extract the following IDL code (to the end of this file) and save it to a file named: idl_example.pro
;----------------------------------------------------------------------------------- pro init_p common comconst, numraw, altitude, nxs, unit_ndx, unit_w common unpackcommon,andarr,outarr ; Initialize unpacking arrays, used to unpack nxs.outofrange355, ; nxs.outofrange532, and nxs.outofrange064. initunpack numraw = 3000 altitude = fltarr(numraw) end ;----------------------------------------------------------------------------------- ;----------------------------------------------------------------------------------- function unpackbytes,thebytearr @com_globals.pro ; Unpacking arrays nxs.outofrange355, nxs.outofrange532, and nxs.outofrange064. ; This function takes an array of 375 bytes and unpacks it to an array of 3000 ; bytes. ; thebytearr is the packed byte array that will be unpacked. ; outarr is the unpacked array. thesize = size(thebytearr) if thesize(2) ne 1 then begin print,'unpackBytes called with bad parameter' stop endif ; andarr is defined and documented in pro initunpack unpacksize = thesize(1) * 8 ; rebin will take the 375 element array, thebytearr, and ; and create a new 3000 element array by repeating each ; thebytearr element 8 times. ; example, want to create a 24 element array from a 3 ; element array. ; Let thebytearr be a 3 element array: [228, 0, 126] ; rebin will create [228,228,228,228,228,228,228,228, ; 0, 0, 0, 0, 0, 0, 0, 0, ; 126,126,126,126,126,126,126,126] ; The statement: ; (rebin(thebytearr,unpacksize,/sample) and andarr(0:unpacksize-1)) ; will "and" the rebinned array with andarr to determine which ; bits in each packed word have been set to 1. ; continue example: ; Let andarr be a 24 element array: ; [128 64 32 16 8 4 2 1 128 64 32 16 8 4 2 1 128 64 32 16 8 4 2 1] ; 228 in binary is 11100100 ; 128 in binary is 10000000 ; 228 and 128 = 10000000 = 128 ; 228 in binary is 11100100 ; 64 in binary is 01000000 ; 228 and 64 = 01000000 = 64 ; 228 in binary is 11100100 ; 32 in binary is 00100000 ; 228 and 32 = 00100000 = 32 ; 228 in binary is 11100100 ; 16 in binary is 00010000 ; 228 and 16 = 00000000 = 0 ; 228 in binary is 11100100 ; 8 in binary is 00001000 ; 228 and 8 = 00000000 = 0 ; 228 in binary is 11100100 ; 4 in binary is 00000100 ; 228 and 4 = 00000100 = 4 ; 228 in binary is 11100100 ; 2 in binary is 00000010 ; 228 and 2 = 00000000 = 0 ; 228 in binary is 11100100 ; 1 in binary is 00000001 ; 228 and 1 = 00000000 = 0 ; the "and" operation for the next 8 words will result in 0, ; 126 in binary is 01111110 ; 128 in binary is 10000000 ; 126 and 128 = 00000000 = 0 ; 228 in binary is 01111110 ; 64 in binary is 01000000 ; 126 and 64 = 01000000 = 64 ; 228 in binary is 01111110 ; 32 in binary is 00100000 ; 126 and 32 = 00100000 = 32 ; 228 in binary is 01111110 ; 16 in binary is 00010000 ; 126 and 16 = 00010000 = 16 ; 228 in binary is 01111110 ; 8 in binary is 00001000 ; 126 and 8 = 00001000 = 8 ; 228 in binary is 01111110 ; 4 in binary is 00000100 ; 126 and 4 = 00000100 = 4 ; 228 in binary is 01111110 ; 2 in binary is 00000010 ; 126 and 2 = 00000010 = 2 ; 228 in binary is 01111110 ; 1 in binary is 00000001 ; 126 and 1 = 00000000 = 0 ; The result of the "and" operation is the array: ; [128,64,32, 0,0,4,0,0, ; 0, 0, 0, 0,0,0,0,0, ; 0,64,32,16,8,4,2,0] ; The minimum operator (<) returns the smaller value, either 1b or ; result value. ; The final unpacked array is defined as follows: ; unpackedarr = [1,1,1,0,0,1,0,0, ; 0,0,0,0,0,0,0,0, ; 0,1,1,1,1,1,1,0] ; Therefore, out of range occurred at locations that equal 1. unpackedarr = 1b < $ (rebin(thebytearr,unpacksize,/sample) and andarr(0:unpacksize-1)) ;355, 532, 1064 outarr(*) = unpackedarr(0:2999) return,outarr end ;----------------------------------------------------------------------------------- ;----------------------------------------------------------------------------------- pro lite ; @com_globals.pro ; Start the procedure here ; Procedure init_p is called to perform initialization. init_p ; LITE level 1, phase c structure nxs = {pbstructuretype, $ syncvalue:0, $ majorversionnumber:0b, $ minorversionnumber:0b, $ datatakeid:bytarr(7), $ orbitnumber:0b, $ idnumber:0l, $ gmtday:0, $ gmthour:0b, $ gmtmin:0b, $ gmtsec:0b, $ gmthund:0b, $ metday:0, $ methour:0b, $ metmin:0b, $ metsec:0b, $ methund:0b, $ latitude:0.0, $ ;degrees longitude:0.0, $ ;degrees shuttlealtitude:0.0, $ ;kilometers offnadirangle:0.0, $ ;degrees digitizerondelay:0.0, $ ;useconds datatakemode:0b, $ ;0=daymode 1=nightmode specialopsmode:0b, $ ;0=normal 1=multiscatter 2=gainchange profilevalidstatus:0b, $ ;0=valid 1=355quest 2=532quest 4=064quest $ ; 8=355invalid 16=532invalid 32=064invalid landwaterflag:0b, $ ;0=land 1=water surfelevfootprint:0.0, $ ;kilometers metdataalts:fltarr(18), $ ;kilometers mettemps:fltarr(18), $ ;Kelvin alttropopause:0.0, $ ;kilometers temptropopause:0.0, $ ;Kelvin laserselected:0b, $ ;0=a 1=b baalignmentstatus:0b, $ ;0=unaligned 1=aligned isdbstatus:0b, $ ;0=invalid 1=valid badatastatus:0b, $ ;0=invalid 1=valid aodatastatus:0b, $ ;0=invalid 1=valid motorinmotion:0b, $ ;0=stopped 1=inmotion aperwheelstatus:0b, $ ;0=closed 1=large 2=annular 3=small 4=inmotion backgroundmongain:0b, $ ;0=day 1=night surfacemode355:0b, $ ;0=no 1=transition 2=yes dbattenuation355:0b, $ ;db numbersatabovesurf355:0, $ ;num samples highestsatsample355:0.0, $ ;kilometers numberunderflows355:0, $ ;num samples filterstatus355:0b, $ ;0=out 1=in 2=inmotion callibrationstatus355:0b, $ ;0=estimated 1=calculated calibrationfactor355:0.0, $ ;unit - see calibration document baselinerippleremvd355:0b, $ ;0=no 1=yes oscillationremoved355:0b, $ ;0=no 1=yes backgroundvalue355:0b, $ ;raw value from instrument highvoltage355enabled:0b, $ ;0=disabled 1=enabled highvoltage355:0.0, $ ;volts (355 nm measured high voltage) energymonitor355:0.0, $ ;mjoules pmtgain355:0.0, $ ;unit - see gain calculation document baselinesubmethod355:0b, $ ;0=slope 1 = averaged subregionunderflow355:0b, $ ;0=none 1=underflow in baseline subtraction reg. anomalousprof355:0b, $ ;0=normal 1=anomalous fillbyte1:0b, $ surfacemode532:0b, $ ;0=no 1=transition 2=yes dbattenuation532:0b, $ ;db numbersatabovesurf532:0, $ ;num samples highestsatsample532:0.0, $ ;kilometers numberunderflows532:0, $ ;num samples filterstatus532:0b, $ ;0=out 1=in 2=inmotion callibrationstatus532:0b, $ ;0=estimated 1=calculated calibrationfactor532:0.0, $ ;unit - see calibration document baselinerippleremvd532:0b, $ ;0=no 1=yes oscillationremoved532:0b, $ ;0=no 1=yes backgroundvalue532:0b, $ ;raw value from instrument highvoltage532enabled:0b, $ ;0=disabled 1=enabled highvoltage532:0.0, $ ;volts (532 nm measured high voltage) energymonitor532:0.0, $ ;mjoules pmtgain532:0.0, $ ;unit - see gain calculation document baselinesubmethod532:0b, $ ;0=slope 1 = averaged subregionunderflow532:0b, $ ;0=none 1=underflow in baseline subtraction reg. anomalousprof532:0b, $ ;0=normal 1=anomalous fillbyte2:0b, $ surfacemode064:0b, $ ;0=no 1=transition 2=yes dbattenuation064:0b, $ ;db numbersatabovesurf064:0, $ ;num samples highestsatsample064:0.0, $ ;kilometers numberunderflows064:0, $ ;num samples filterstatus064:0b, $ ;0=out 1=in 2=inmotion callibrationstatus064:0b, $ ;2=not available calibrationfactor064:0.0, $ ;not defined baselinerippleremvd064:0b, $ ;0=no 1=yes oscillationremoved064:0b, $ ;0=no 1=yes backgroundvalue064:0b, $ ;raw value from instrument highvoltage064enabled:0b, $ ;0=disabled 1=enabled highvoltage064:0.0, $ ;volts (1064 nm measured high voltage) energymonitor064:0.0, $ ;mjoules apdgain064:0.0, $ ;unit - see gain calculation document baselinesubmethod064:0b, $ ;0=slope 1 = averaged subregionunderflow064:0b, $ ;0=none 1=underflow in baseline subtraction reg. anomalousprof064:0b, $ ;0=normal 1=anomalous fillbyte3:0b, $ timeedsinthour:0b, $ ;unadjusted eds time timeedsintmin:0b, $ timeedsintsec:0b, $ timeedsinthund:0b, $ level0fileidnumber:0b, $ ;level 0 directory number level0fileidletter:0b, $ ;level 0 file letter reserved1:bytarr(6), $ highvoltage355cmd:0.0, $ ;volts (355 nm commanded high voltage) highvoltage532cmd:0.0, $ ;volts (532 nm commanded high voltage) reserved2:bytarr(4), $ b0_355:0.0, $ ;baseline subtraction value for 355 channel b0_532:0.0, $ ;baseline subtraction value for 532 channel b0_064:0.0, $ ;baseline subtraction value for 1064 channel outofrng355abv40:0b, $ ;0=none,1=underflow,2=overflow,3=underflow and overflow outofrng532abv40:0b, $ ;0=none,1=underflow,2=overflow,3=underflow and overflow outofrng064abv40:0b, $ ;0=none,1=underflow,2=overflow,3=underflow and overflow outofrange355:bytarr(375), $ ;bit array, if bit is set then there was underflow or outofrange532:bytarr(375), $ ; overflow for the corresponding count outofrange064:bytarr(375), $ top355:0, $ ;index of highest valid count bottom355:0, $ ;index of lowest valid count top532:0, $ ;index of highest valid count bottom532:0, $ ;index of lowest valid count top064:0, $ ;index of highest valid count bottom064:0, $ ;index of lowest valid count profile355:fltarr(3000), $ ;counts profile532:fltarr(3000), $ ;counts profile064:fltarr(3000) $ ;counts } ; Print size of structure, size is 37500 bytes. result = n_tags(nxs,/length) print,' nxs result ',result load_nxs end ;----------------------------------------------------------------------------------- ;----------------------------------------------------------------------------------- pro load_nxs @com_globals.pro ; Define gridded altitude array. The altitude array has size 3000, the range is ; -4.985 to 40.0 km, and the grid increment is 0.015 km (15 m). new_alts ; Open optional output file. out_file = 'idl_example.dat' openw,unit_w,out_file,/get_lun lite_file = ' ' print,'Enter the LITE data file name:' read,lite_file openr,unit_c,lite_file,/get_lun on_ioerror,at_eof icntprof = 0 while (not eof(unit_c)) do begin readu, unit_c, nxs ; Print profile header information, file unit_w must be open. print_readu check_ufof = 0 if (check_ufof gt 0) then begin ; Check for underflow and overflow conditions. ; Unpacking will occur if check_ufof = a value > 0. ; unpacked355, unpacked532, and unpacked064 define underflow and overflow ; occurrences in nxs.profile355, nxs.profile532, and nxs.profile064, respectively. unpacked355 = unpackbytes(nxs.outofrange355) unpacked532 = unpackbytes(nxs.outofrange532) unpacked064 = unpackbytes(nxs.outofrange064) indx = where(unpacked355 eq 1,count) if (count gt 0) then begin ; there is underflow or overflow for 355 channel ; locate where underflow occurred indd = where(nxs.profile355(indx) lt 15.0,cc) if (cc gt 0) then begin ; ind_355uf is an array of cc values and contains the index locations ; for nxs.profile355 and altitude where underflow has occurred ind_355uf = indx(indd) ; print,' 355 underflow ',cc end ; locate where underflow occurred indd = where(nxs.profile355(indx) gt 15.0,cc) if (cc gt 0) then begin ; ind_355of is an array of cc values and contains the index locations ; for nxs.profile355 and altitude where saturation has occurred ind_355of = indx(indd) ; print,' 355 overflow ',cc end end indx = where(unpacked532 eq 1,count) if (count gt 0) then begin ; there is underflow or overflow for 532 channel ; locate where underflow occurred indd = where(nxs.profile532(indx) lt 15.0,cc) if (cc gt 0) then begin ; ind_532uf is an array of cc values and contains the index locations ; for nxs.profile532 and altitude where underflow has occurred ind_532uf = indx(indd) ; print,' 532 underflow ',cc end ; locate where underflow occurred indd = where(nxs.profile532(indx) gt 15.0,cc) if (cc gt 0) then begin ; ind_532of is an array of cc values and contains the index locations ; for nxs.profile532 and altitude where saturation has occurred ind_532of = indx(indd) ; print,' 532 overflow ',cc end end indx = where(unpacked064 eq 1,count) if (count gt 0) then begin ; there is underflow or overflow for 1064 channel ; locate where underflow occurred indd = where(nxs.profile064(indx) lt 15.0,cc) if (cc gt 0) then begin ; ind_064uf is an array of cc values and contains the index locations ; for nxs.profile064 and altitude where underflow has occurred ind_064uf = indx(indd) ; print,' 064 underflow ',cc end ; locate where underflow occurred indd = where(nxs.profile064(indx) gt 15.0,cc) if (cc gt 0) then begin ; ind_064of is an array of cc values and contains the index locations ; for nxs.profile064 and altitude where saturation has occurred ind_064of = indx(indd) ; print,' 064 overflow ',cc end end end ;the_gmt = double(nxs.gmtday)*86400.d0 + double(nxs.gmthour)*3600.d0 + double(nxs.gmtmin)*60.d0 + $ ; double(nxs.gmtsec) + double(nxs.gmthund)/100.d0 icntprof = icntprof + 1 end at_eof: print,' at complete, icntprof = ',icntprof free_lun, unit_c free_lun, unit_w return end ;----------------------------------------------------------------------------------- ;----------------------------------------------------------------------------------- pro print_readu @com_globals.pro ; print profile header information printf,unit_w,nxs.syncvalue,nxs.majorversionnumber,nxs.minorversionnumber,nxs.datatakeid,nxs.orbitnumber,nxs.idnumber printf,unit_w,nxs.gmtday,nxs.gmthour,nxs.gmtmin,nxs.gmtsec,nxs.gmthund printf,unit_w,nxs.metday,nxs.methour,nxs.metmin,nxs.metsec,nxs.methund printf,unit_w,nxs.latitude,nxs.longitude,nxs.shuttlealtitude,nxs.offnadirangle,nxs.digitizerondelay printf,unit_w,nxs.datatakemode,nxs.specialopsmode,nxs.profilevalidstatus,nxs.landwaterflag,nxs.surfelevfootprint printf,unit_w,nxs.alttropopause,nxs.temptropopause printf,unit_w,nxs.laserselected,nxs.baalignmentstatus,nxs.isdbstatus,nxs.badatastatus printf,unit_w,nxs.aodatastatus,nxs.motorinmotion,nxs.aperwheelstatus,nxs.backgroundmongain printf,unit_w,nxs.surfacemode355,nxs.dbattenuation355,nxs.numbersatabovesurf355,nxs.highestsatsample355 printf,unit_w,nxs.numberunderflows355,nxs.filterstatus355,nxs.callibrationstatus355,nxs.calibrationfactor355 printf,unit_w,nxs.baselinerippleremvd355,nxs.oscillationremoved355,nxs.backgroundvalue355 printf,unit_w,nxs.highvoltage355enabled,nxs.highvoltage355,nxs.energymonitor355,nxs.pmtgain355 printf,unit_w,nxs.baselinesubmethod355,nxs.subregionunderflow355,nxs.anomalousprof355 printf,unit_w,nxs.syncvalue,nxs.majorversionnumber,nxs.minorversionnumber,nxs.datatakeid,nxs.orbitnumber,nxs.idnumber printf,unit_w,nxs.gmtday,nxs.gmthour,nxs.gmtmin,nxs.gmtsec,nxs.gmthund printf,unit_w,nxs.metday,nxs.methour,nxs.metmin,nxs.metsec,nxs.methund printf,unit_w,nxs.latitude,nxs.longitude,nxs.shuttlealtitude,nxs.offnadirangle,nxs.digitizerondelay printf,unit_w,nxs.datatakemode,nxs.specialopsmode,nxs.profilevalidstatus,nxs.landwaterflag,nxs.surfelevfootprint printf,unit_w,nxs.alttropopause,nxs.temptropopause printf,unit_w,nxs.laserselected,nxs.baalignmentstatus,nxs.isdbstatus,nxs.badatastatus printf,unit_w,nxs.aodatastatus,nxs.motorinmotion,nxs.aperwheelstatus,nxs.backgroundmongain printf,unit_w,nxs.surfacemode532,nxs.dbattenuation532,nxs.numbersatabovesurf532,nxs.highestsatsample532 printf,unit_w,nxs.numberunderflows532,nxs.filterstatus532,nxs.callibrationstatus532,nxs.calibrationfactor532 printf,unit_w,nxs.baselinerippleremvd532,nxs.oscillationremoved532,nxs.backgroundvalue532 printf,unit_w,nxs.highvoltage532enabled,nxs.highvoltage532,nxs.energymonitor532,nxs.pmtgain532 printf,unit_w,nxs.baselinesubmethod532,nxs.subregionunderflow532,nxs.anomalousprof532 printf,unit_w,nxs.syncvalue,nxs.majorversionnumber,nxs.minorversionnumber,nxs.datatakeid,nxs.orbitnumber,nxs.idnumber printf,unit_w,nxs.gmtday,nxs.gmthour,nxs.gmtmin,nxs.gmtsec,nxs.gmthund printf,unit_w,nxs.metday,nxs.methour,nxs.metmin,nxs.metsec,nxs.methund printf,unit_w,nxs.latitude,nxs.longitude,nxs.shuttlealtitude,nxs.offnadirangle,nxs.digitizerondelay printf,unit_w,nxs.datatakemode,nxs.specialopsmode,nxs.profilevalidstatus,nxs.landwaterflag,nxs.surfelevfootprint printf,unit_w,nxs.alttropopause,nxs.temptropopause printf,unit_w,nxs.laserselected,nxs.baalignmentstatus,nxs.isdbstatus,nxs.badatastatus printf,unit_w,nxs.aodatastatus,nxs.motorinmotion,nxs.aperwheelstatus,nxs.backgroundmongain printf,unit_w,nxs.surfacemode064,nxs.dbattenuation064,nxs.numbersatabovesurf064,nxs.highestsatsample064 printf,unit_w,nxs.numberunderflows064,nxs.filterstatus064,nxs.callibrationstatus064,nxs.calibrationfactor064 printf,unit_w,nxs.baselinerippleremvd064,nxs.oscillationremoved064,nxs.backgroundvalue064 printf,unit_w,nxs.highvoltage064enabled,nxs.highvoltage064,nxs.energymonitor064,nxs.apdgain064 printf,unit_w,nxs.baselinesubmethod064,nxs.subregionunderflow064,nxs.anomalousprof064 printf,unit_w,nxs.timeedsinthour,nxs.timeedsintmin,nxs.timeedsintsec,nxs.timeedsinthund printf,unit_w,nxs.highvoltage355cmd,nxs.highvoltage532cmd printf,unit_w,nxs.b0_355,nxs.b0_532,nxs.b0_064 printf,unit_w,nxs.outofrng355abv40,nxs.outofrng532abv40,nxs.outofrng064abv40 printf,unit_w,nxs.top355,nxs.bottom355,nxs.top532,nxs.bottom532,nxs.top064,nxs.bottom064 end ;----------------------------------------------------------------------------------- ;----------------------------------------------------------------------------------- pro new_alts @com_globals.pro ; define altitude array next = 40.0 * 1000.0 altitude(0) = next altitude(0) = altitude(0)/1000.0 incre = 15.0 for i=1,2999 do begin next = next - incre altitude(i) = next altitude(i) = altitude(i)/1000.0 end end ;----------------------------------------------------------------------------------- ;----------------------------------------------------------------------------------- pro initunpack @com_globals.pro ; Initialize arrays used in unpacking the out of range packed byte arrays ; (nxs.outofrange355, nxs.outofrange532, and nxs.outofrange064). outarr = bytarr(3000) temparr = reverse(bindgen(3000)) ; temparr is an array of 3000 values and is defined as: ; [183,182,181,180,179,178,177,176, ; 175,174,173,172,171,170,169,168, ; ..., ; 7, 6, 5, 4, 3, 2, 1, 0, ; 255,254,253,252,251,250,249,248, ; 247,246,245,244,243,242,241,240, ; ..., ; 7, 6, 5, 4, 3, 2, 1, 0, ; ..., ; 255,254,253,252,251,250,249,248, ; 247,246,245,244,243,242,241,240, ; ..., ; 7, 6, 5, 4, 3, 2, 1, 0] ; Each row corresponds to one packed word, there are 375 packed words (8*375=3000). andarr = byte(2^(temparr mod 8)) ; 183 mod 8 = 7, 2^7=128 ; 182 mod 8 = 6, 2^6= 64 ; 181 mod 8 = 5, 2^5= 32 ; ... ; 176 mod 8 = 0, 2^4= 1 ; andarr is an array of 3000 values and is defined as: ; [128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,...] end