;+ ; ;Procedure: thm_l2gen_sst ; ;Purpose: Creates Level 2 data CDF file of THEMIS SST data. ; File includes SST (Solid State Telescope) ion and electron spectrograms. ; File includes all metadata (global and variable attributes) necessary ; to be ISTP compliant and QSAS compatible. ; Program is intended primarily for generation of 1 day files. ; ;Inputs: probe: A string indicating probe. ; Valid names are : 'a', 'b', 'c', 'd' and 'e'. ; date: A string indicating the start time. ; Format: YYYY-MM-DD/hh:mm:ss ; dur: Number indicating the duration. ; days: A keyword that sets the units for dur to be day (default). ; hours: A keyword that sets the units for dur to be hours. ; minutes: A keyword that sets the units for dur to be minutes. ; noload: A keyword that prevents data from being loaded. ; Note: Data must already be loaded. ; mastercdf:A string indicating the location of the mastercdf to be use. ; This master contains all the L2 metadata. ; ;Outputs: File is created in local directory. ; Filename format: thx_l2_sst_YYYYMMDD_v01.cdf ; ;Example: thm_l2gen_sst,probe='a',date='2007-03-23',dur=1,/noload ; ;Written by: Matt Davis ; ;- pro thm_l2gen_sst, probe=probe, date=date, dur=dur, days=days, hours=hours, minutes=minutes, noload=noload, mastercdf=mastercdf thm_init ;take a little look at the inputs ;----------------------------------------------------------------------------- if keyword_set(probe) ne 1 then begin print,'You did not select a probe. Please select probe.' print,"i.e., thm_l2gen_sst,probe='a'" return endif probe_list=['a','b','c','d','e'] index=where(probe eq probe_list) if index eq -1 then begin print, 'You entered invalid probe ID : ',strtrim(probe,2) print, "Valid names are : 'a', 'b', 'c', 'd' and 'e'" print, "i.e., thm_l2gen_sst,probe='a'" return endif case 1 of keyword_set(hours) : dur=dur/24. keyword_set(minutes) : dur=dur/1440. else : dur=dur endcase sc='th'+probe if not keyword_set(mastercdf) then mastercdf='mastercdfs/'+sc+'_l2_sst_00000000_v01.cdf' ;load up all the data we'll be playing with ;----------------------------------------------------------------------------- timespan,date,dur if (keyword_set(noload) eq 0) then begin del_data,'*' ; give ourselves a clean slate ;load SST data thm_load_sst,probe=probe thm_part_spec_calc,probe=probe,types=['psif','psef'] endif ; data load ;read in master CDF file ;----------------------------------------------------------------------------- sst_l2_structure=cdf_load_vars(mastercdf,/all) ;find which tplot variables exist ;----------------------------------------------------------------------------- sst_allvars=[strjoin(sc+'_psif_en_eflux'), $ strjoin(sc+'_psef_en_eflux')] sst_vars=tnames(sst_allvars) ;strip out 'Nan' time records ;----------------------------------------------------------------------------- for i=0,n_elements(sst_vars)-1 do begin get_data,sst_vars(i),data=dd if (size(dd,/type) eq 8) then index=where(finite(dd.x) eq 1) else index=-1 if index(0) ne -1 then begin str_element,dd,'v',success=success if success eq 1 then store_data,sst_vars(i),data={x:dd.x(index),y:dd.y(index,*),v:dd.v} $ else store_data,sst_vars(i),data={x:dd.x(index),y:dd.y(index,*)} endif endfor ;insert data into sst_l2_structure ;----------------------------------------------------------------------------- mastertags=sst_l2_structure.vars.name ;ion spectrogram and time tag ;---------------------------- get_data,strjoin(sc+'_psif_en_eflux'),data=di if size(di,/type) eq 8 then begin index=where(strjoin(sc+'_psif_en_eflux') eq mastertags) sst_l2_structure.vars[index].dataptr=ptr_new(di.y) index=where(strjoin(sc+'_psif_en_eflux_time') eq mastertags) sst_l2_structure.vars[index].dataptr=ptr_new(di.x) endif ;electron spectrogram and time tag ;--------------------------------- get_data,strjoin(sc+'_psef_en_eflux'),data=de if size(de,/type) eq 8 then begin index=where(strjoin(sc+'_psef_en_eflux') eq mastertags) sst_l2_structure.vars[index].dataptr=ptr_new(de.y) index=where(strjoin(sc+'_psef_en_eflux_time') eq mastertags) sst_l2_structure.vars[index].dataptr=ptr_new(de.x) endif ;yaxis/energy levels ;------------------- get_data,strjoin(sc+'_psif_en_eflux'),data=di str_element,di,'v',success=success if success eq 1 then begin i_en=dblarr(n_elements(di.x),n_elements(di.v)) for i=0,n_elements(di.v)-1 do i_en(*,i)=di.v(i) index=where(strjoin(sc+'_psif_en_eflux_yaxis') eq mastertags) sst_l2_structure.vars[index].dataptr=ptr_new(i_en) endif get_data,strjoin(sc+'_psef_en_eflux'),data=de str_element,di,'v',success=success if success eq 1 then begin e_en=dblarr(n_elements(de.x),n_elements(de.v)) for i=0,n_elements(de.v)-1 do e_en(*,i)=de.v(i) index=where(strjoin(sc+'_psef_en_eflux_yaxis') eq mastertags) sst_l2_structure.vars[index].dataptr=ptr_new(e_en) endif ;range_epoch ;----------- range_epoch_vals=[time_string(date),time_string(time_double(date)+86400.*dur)] reval_strs=time_string(range_epoch_vals) year=strmid(reval_strs,0,4) month=strmid(reval_strs,5,2) day=strmid(reval_strs,8,2) hour=strmid(reval_strs,11,2) minu=strmid(reval_strs,14,2) sec=strmid(reval_strs,17,2) cdf_epoch,range_epoch_min,year(0),month(0),day(0),hour(0),minu(0),sec(0),/compute_epoch cdf_epoch,range_epoch_max,year(1),month(1),day(1),hour(1),minu(1),sec(1),/compute_epoch range_epoch_values=[range_epoch_min,range_epoch_max] index=where(strjoin('range_epoch') eq mastertags) sst_l2_structure.vars[index].dataptr=ptr_new(range_epoch_values) ; write sst_l2_structure to L2 CDF file ;----------------------------------------------------------------------------- filename=strjoin(sc+'_l2_sst_'+strmid(date,0,4)+strmid(date,5,2)+strmid(date,8,2)+'_v01.cdf') dummy=cdf_save_vars(sst_l2_structure,filename) print, 'L2 SST CDF file written! Filename: ',filename ;clean up ;----------------------------------------------------------------------------- unused_ptrs = ptr_extract(sst_l2_structure) ptr_free,unused_ptrs end