function sofie_read_mission,file,idump,imode ;----------------------------------------------------------------------------------------------------------- ; Routine reads a SOFIE level2 "mission" (L2m) NetCDF file. ; The L2m files contain 1 variable (e.g., temperature, H2O, etc...) for the entire ; mission, for sunrise and sunset. ; ; Input: ; ; file.......path + name of the SOFIE data file ; idump......1 = echo the variable names ; 0 = be quiet ; imode......0 = return only sunrise events ; 1 = return only sunset events ; -1 = return all events (rise and set) ; ; Output: ; ; Scalars, header info: ; ; dp_vers.....SOFIE data product version, string, scalar ; nevent......number of events, scalar ; nz..........number of altitude points in profiles, scalar ; miss........number that represents missing data (-1e24) ; ; Vectors, 1 value per event: ; ; orbit........AIM orbit number ; event........SOFIE event number ; mode.........occultation mode, 0 = sunrise, 1 = sunset ; date.........date as yyyyddd ; time.........time at 83 km tangent point, as UT ; doy..........day of year (decimal day) ; dfs..........days from summer solstice (decimal day, e.g., -20.45) ; yrd..........decimal year ; lst..........local solar time ; lat..........latitude (deg, -90 to 90), @ 83 km tangent point ; lon..........longitude (deg E, 0 to 360), @ 83 km tangent point ; rtopz........top of refraction angle T/P retrieval (km), actually middle of refraction to CO2 T/P merge window ; ; Profile data: ; ; z............altitude scale (km), dblarr(nz) ; data.........the data for this file, dblarr(nz,nevent) ; (e.g., T (K), H2O (ppmv), O3 (ppmv), CH4 (ppmv), NO (ppmv), CO2 (ppmv), ...) ; ; Source: Mark Hervig, GATS Inc. ; ; Revision: 9/24/2012: created ; ;---------------------------------------------------------------------------------------------------------------- ;- miscelaneous miss = -1d24 ; missing data value ;- open the file id = ncdf_open(file,/nowrite) glob = ncdf_inquire(id) ;- echo the file contents glob = ncdf_inquire(id) varname = strarr(glob.nvars) ; this will contain the variable names for i = 0,glob.nvars-1 do begin info = ncdf_varinq(id, i) varname(i) = info.name if (idump eq 1) then print,info.name endfor ;- get the global attributes ncdf_diminq,id,'altitude',name,nz ; number of points in profiles ncdf_attget,id,/global,'Title',out & title = string(out) ncdf_attget,id,/global,'DP_Type',out & dp_type = string(out) ncdf_attget,id,/global,'Source',out & source = string(out) ncdf_attget,id,/global,'Mission',out & mission = string(out) ncdf_attget,id,/global,'DP_Version',out & dp_vers = string(out) ncdf_attget,id,/global,'PF_Version',out & pf_version = string(out) ncdf_attget,id,/global,'SW_Version',out & sw_version = string(out) ncdf_attget,id,/global,'SW_Name',out & sw_name = string(out) ncdf_attget,id,/global,'Calib_Version',out & cal_version = string(out) ncdf_attget,id,/global,'Description',out & description = string(out) ncdf_attget,id,/global,'History',out & history = string(out) ncdf_attget,id,/global,'Gen_Date',out & gen_date = string(out) if (idump eq 1) then begin print,' ' print,'Title: ',title print,'DP_Type: ',dp_type print,'Source: ',source print,'DP_Version: ',dp_vers print,'PF_Version: ',pf_version print,'SW_Version: ',sw_version print,'SW_Name: ',sw_name print,'Calib_Version: ',cal_version print,'Gen_Date: ',gen_date endif ;- Read the header data ncdf_varget,id,'event' , event ncdf_varget,id,'Orbit' , orbit ncdf_varget,id,'Mode' , mode ncdf_varget,id,'Date' , date ncdf_varget,id,'Time_UT' , time ; UT time ncdf_varget,id,'Longitude_83km', lon ncdf_varget,id,'Latitude_83km' , lat losb = event * 0 -999 k = where(varname eq 'LOS_Bearing',nk) if nk gt 0 then ncdf_varget,id,'LOS_Bearing', LOSb fovl = event * 0 -999 k = where(varname eq 'FOV_Lock',nk) if nk gt 0 then ncdf_varget,id,'FOV_Lock', FOVl rtopz = event * 0 -999 k = where(varname eq 'RefT_Top',nk) if nk gt 0 then ncdf_varget,id,'RefT_Top', rtopz nevent = n_elements(event) ;- Read the data ncdf_varget,id,'Altitude' , z data = miss vect = 'n' ; IWC is a vector, others are fltarr(z,time) vout = 'dat' k = where(varname eq 'Pressure',nk) if nk gt 0 then begin ncdf_varget,id,'Pressure', data vout = 'p' endif k = where(varname eq 'Temperature',nk) if nk gt 0 then begin ncdf_varget,id,'Temperature', data vout = 't' endif k = where(varname eq 'Temperature_ext',nk) if nk gt 0 then begin ncdf_varget,id,'Temperature_ext' , data ; T profiles extended up to 150 km using MSIS vout = 't_ex' endif k = where(varname eq 'Pressure_ext',nk) if nk gt 0 then begin ncdf_varget,id,'Pressure_ext' , data ; T profiles extended up to 150 km using MSIS vout = 'p_ex' endif k = where(varname eq 'H2O_vmr',nk) if nk gt 0 then begin ncdf_varget,id,'H2O_vmr', data data = data *1d6 ; ppmv vout = 'h2o' endif k = where(varname eq 'O3_vmr',nk) if nk gt 0 then begin ncdf_varget,id,'O3_vmr', data data = data *1d6 ; ppmv vout = 'o3' endif k = where(varname eq 'O3_band2',nk) if nk gt 0 then begin ncdf_varget,id,'O3_band2', data data = data *1d6 ; ppmv vout = 'o3' endif k = where(varname eq 'O3_vmr_merge',nk) if nk gt 0 then begin ncdf_varget,id,'O3_vmr_merge', data data = data *1d6 ; ppmv vout = 'o3' endif k = where(varname eq 'CH4_vmr',nk) if nk gt 0 then begin ncdf_varget,id,'CH4_vmr', data data = data *1d6 ; ppmv vout = 'ch4' endif k = where(varname eq 'CO2_vmr',nk) if nk gt 0 then begin ncdf_varget,id,'CO2_vmr', data data = data *1d6 ; ppmv vout = 'co2' endif k = where(varname eq 'CO2_B13',nk) if nk gt 0 then begin ncdf_varget,id,'CO2_B13', data data = data *1d6 ; ppmv vout = 'co2' endif k = where(varname eq 'NO_vmr',nk) if nk gt 0 then begin ncdf_varget,id,'NO_vmr', data data = data *1d6 ; ppmv vout = 'no' endif k = where(varname eq 'NO_den',nk) if nk gt 0 then begin ncdf_varget,id,'NO_den', data ; #/cm3 vout = 'no' endif k = where(varname eq 'WACCM_CO2',nk) if nk gt 0 then begin ncdf_varget,id,'WACCM_CO2', data data = data *1d6 ; ppmv vout = 'co2' endif k = where(varname eq 'IWC',nk) if nk gt 0 then begin ncdf_varget,id,'IWC', data vect = 'y' ; IWC is a vector, others are fltarr(z,time) vout = 'iwc' endif k = where(varname eq 'Extinction_0330',nk) if nk gt 0 then begin ncdf_varget,id,'Extinction_0330', data vout = 'ext2' endif k = where(varname eq 'Extinction_0867',nk) if nk gt 0 then begin ncdf_varget,id,'Extinction_0867', data vout = 'ext3' endif k = where(varname eq 'Extinction_1037',nk) if nk gt 0 then begin ncdf_varget,id,'Extinction_1037', data vout = 'ext4' endif k = where(varname eq 'Extinction_2939',nk) if nk gt 0 then begin ncdf_varget,id,'Extinction_2939', data vout = 'ext8' endif k = where(varname eq 'Extinction_3064',nk) if nk gt 0 then begin ncdf_varget,id,'Extinction_3064', data vout = 'ext9' endif k = where(varname eq 'Extinction_3186',nk) if nk gt 0 then begin ncdf_varget,id,'Extinction_3186', data vout = 'ext10' endif ;- Return selected mode (rise or set) if (imode eq 0 or imode eq 1) then begin k = where(mode eq imode, nevent) if (vect eq 'n') then data = data(*,k) if (vect eq 'y') then data = data(k) orbit= orbit(k) event= event(k) mode = mode(k) date = date(k) time = time(k) dfs = dfs(k) doy = doy(k) yrd = yrd(k) lat = lat(k) lon = lon(k) lst = lst(k) rtopz = rtopz(k) losb = losb(k) fovl = fovl(k) endif dfs = yyyydoy_2_dfs(date,lat) doy = yyyydoy_2_doy(date) yrd = yyyydoy_2_decyr(date) lst = solar_time(time,lon) print,'file: ',file print,'returning ',nevent,' events' ;- Close the file ncdf_close,id ;- Create an IDL structure if (vect eq 'n') then begin s = create_struct($ 'name', 'sofie',$ 'nz', n_elements(z), $ 'nrec', nevent, $ 'orbit',lonarr(nevent),$ 'event',lonarr(nevent),$ 'mode', intarr(nevent),$ 'date', lonarr(nevent),$ 'time', fltarr(nevent),$ 'dfs', fltarr(nevent),$ 'doy', fltarr(nevent),$ 'yrd', fltarr(nevent),$ 'lat', fltarr(nevent),$ 'lon', fltarr(nevent),$ 'lst', fltarr(nevent),$ 'rtopz',fltarr(nevent),$ 'z', fltarr(nz), $ vout, data ) ; fltarr(nz,nevent) endif if (vect eq 'y') then begin s = create_struct($ 'name', 'sofie',$ 'orbit',lonarr(nevent),$ 'event',lonarr(nevent),$ 'mode', intarr(nevent),$ 'date', lonarr(nevent),$ 'time', fltarr(nevent),$ 'dfs', fltarr(nevent),$ 'doy', fltarr(nevent),$ 'yrd', fltarr(nevent),$ 'lat', fltarr(nevent),$ 'lon', fltarr(nevent),$ 'lst', fltarr(nevent),$ 'rtopz',fltarr(nevent),$ 'z', fltarr(nz), $ vout, data ) ; fltarr(nevent) endif s.orbit = orbit s.event = event s.mode = mode s.date = date s.time = time s.dfs = dfs s.doy = doy s.yrd = yrd s.lat = lat s.lon = lon s.lst = lst s.rtopz = rtopz s.z = z ;- Done return,s end