;+ ;PROCEDURE: mvn_lpw_prd_w_spec ; ;Takes LF, MF, and HF spectra (from act or pas) and combines them into one tplot spectra for L2-production. ;The error information and flag information is taking also into consideration information from other sources such as spacecraft atitude. ; The tplot variables mvn_lpw_act_E12 and mvn_lpw_pas_E12 must be loaded into tplot memory before running this routine. ; There are additional variables that need to be loaded ; Presently this routine do not go an grab them if they are missing. ; ;INPUTS: ; - type ;'act'or 'pas' which subcycle to work with ; ext ;'l1a' 'l1b' or 'l2' what level of quality to produce ('l2' is full information to be archived) ; ; ;EXAMPLE: ; mvn_lpw_prd_w_spec,type,ext ; ; ;CREATED BY: Laila Andersson 03-30-15 ;FILE: mvn_lpw_prd_w_spec.pro ;VERSION: 1.2 ;LAST MODIFICATION: ; 2014-05-22 L. Andersson sigificant update and working ; 2015-03-30 L. Andersson update to make the firs L2 production ;- pro mvn_lpw_prd_w_spec,type,ext print,'Running: mvn_lpw_prd_w_spec', ' ',type,' ',ext t_routine = SYSTIME(0) vers_prd = 'version prd_w_spec_'+type+' 1.2' ; the version number of this routine ;--------------------------------------------------------------------------------------------------- ;Check Inputs: ;--------------------------------------------------------------------------------------------------- IF size(ext, /type) NE 7 THEN BEGIN print, "### WARNING ###: Input 'ext' must be a string: l1a, l1b or l2. Returning." retall ENDIF ;--------------------------------------------------------------------------------------------------- ; Check tplot variables exist before using them: ;--------------------------------------------------------------------------------------------------- names = tnames(s) ;names is an array containing all tplot variable names currently in IDL memory. variables=['mvn_lpw_spec2_lf_'+type,'mvn_lpw_spec2_mf_'+type,'mvn_lpw_spec2_hf_'+type] variables2=['mvn_lpw_spec_lf_'+type+'_mode','mvn_lpw_spec_mf_'+type+'_mode','mvn_lpw_spec_hf_'+type+'_mode'] missing_variable =' The following variables are missing: ' ; keep track if the data existed or not IF total(strmatch(names, variables[0])) EQ 1 THEN get_data,variables[0],data=data0,limit=limit0,dlimit=dlimit0 ELSE missing_variable=[missing_variable,variables[0]+' was not found'] IF total(strmatch(names, variables[1])) EQ 1 THEN get_data,variables[1],data=data1,limit=limit1,dlimit=dlimit1 ELSE missing_variable=[missing_variable,variables[1]+' was not found'] IF total(strmatch(names, variables[2])) EQ 1 THEN get_data,variables[2],data=data2,limit=limit2,dlimit=dlimit2 ELSE missing_variable=[missing_variable,variables[2]+' was not found'] found_variables='found :' If size(data0, /type) EQ 8 then found_variables=[found_variables,variables(0)] If size(data1, /type) EQ 8 then found_variables=[found_variables,variables(1)] If size(data2, /type) EQ 8 then found_variables=[found_variables,variables(2)] IF n_elements(found_variables) GT 1 THEN BEGIN ;big loop ;--------------------------------------------------------------------------------------------------- ; Merge the dlimit and limit information for tplot production in a routine called mvn_lpw_prd_limit_dlimt ;--------------------------------------------------------------------------------------------------- dlimit_merge = mvn_lpw_prd_merge_dlimit(found_variables) get_data,found_variables(1),data=data,limit=limit,dlimit=dlimit ; use data for default time array and limit for limit_l2 get_data,variables2(0),data=data_mode ; use data for default time array and limit for limit_l2 get_data,'mvn_lpw_'+type+'_V1',data=datV1 ; use data for default time array and limit for limit_l2 get_data,'mvn_lpw_'+type+'_V2',data=datV2 ; use data for default time array and limit for limit_l2 ;--------------------------------------------------------------------------------------------------- ; dlimit and limit created ;--------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------- ; Creating the data_l2 product: ; Merge the data ; Modify the error information with respect of atitude and other things, for L1b, L2 ; Create a quality flag, for L1b, L2 ;--------------------------------------------------------------------------------------------------- data_l2_x=data.x ; the default time array to be rewritten ; mvn_lpw_prd_add_time,data_l2_x,data0 mvn_lpw_prd_add_time,data_l2_x,data1, 'spectra' mvn_lpw_prd_add_time,data_l2_x,data2, 'spectra'; ----- get the new frequency spectra: might be moved into a seperate routine if so mvn_lpw_pdr_w_spec_merge ----- ; ----- this is where the frequencies is selected ------ nn=n_elements(data_l2_x) f1_lf = 0 f2_lf = 47 ;of 56 f1_mf = 4 f2_mf = 47 ;of 56 f1_hf = 4 f2_hf = 127 ; of 128 ff_no = f2_lf-f1_lf+1 + f2_mf-f1_mf+1 + f2_hf-f1_hf+1 ; how many frequencies ff_aa = [0,(f2_lf-f1_lf),(f2_lf-f1_lf+1),(f2_lf-f1_lf+1)+(f2_mf-f1_mf),(f2_lf-f1_lf+1)+(f2_mf-f1_mf+1),ff_no-1] ;---------------- data_l2_y = fltarr(nn,ff_no) data_l2_dy = fltarr(nn,ff_no) data_l2_v = fltarr(nn,ff_no) data_l2_dv = fltarr(nn,ff_no) data_l2_flag = dblarr(nn) data_l2_mode = fltarr(nn) data_l2_cycle = fltarr(nn) if min(data0.dv) lt 0 then stanna if min(data1.dv) lt 0 then stanna if min(data2.dv) lt 0 then stanna nnV1=n_elements(datV1.x) nnV2=n_elements(datV2.x) IF size(data0, /type) EQ 8 THEN BEGIN index = fltarr(n_elements(data0.x)) indexV = fltarr(n_elements(data0.x)) FOR i = 0,n_elements(data0.x)-1 do begin tmp=min(abs(data_l2_x - data0.x(i)),nn) index[i] = nn tmp = min(abs(datV1.x-data0.x(i)),nnV1) tmp = min(abs(datV2.x-data0.x(i)),nnV2) indexV[i] = (mean( datV1.y[ (nnV1-10)>0 : (nnV1+10)<(nnV1-1) ] GT -20)*(mean(datV1.y[ (nnV1-10)>0 : (nnV1+10)<(nnV1-1) ]) LT 20))* $ (mean( datV2.y[ (nnV2-10)>0 : (nnV2+10)<(nnV2-1) ] GT -20)*(mean(datV2.y[ (nnV2-10)>0 : (nnV2+10)<(nnV2-1) ]) LT 20)) ENDFOR data_l2_y( index,ff_aa[0]:ff_aa[1]) = data0.y(*,f1_lf:f2_lf) data_l2_dy(index,ff_aa[0]:ff_aa[1]) = data0.dy(*,f1_lf:f2_lf) data_l2_v( index,ff_aa[0]:ff_aa[1]) = data0.v(*,f1_lf:f2_lf) data_l2_dv(index,ff_aa[0]:ff_aa[1]) = data0.dv(*,f1_lf:f2_lf) ;; data_l2_flag(index) = 80. - 25 * (total(data0.y(*,f1_lf:f2_lf),2 ) LT 1e-10) data_l2_flag(index) = 80. - 25 * (total(data0.y(*,f1_lf:f2_lf),2 ) LT 1e-9) ENDIF ;remove data when V1 and V2 is at extreme from LF frequency band tmp=where(indexV EQ 0,nq) FOR i=ff_aa[0],ff_aa[1] do data_l2_y[tmp,i]=!values.f_nan IF size(data1, /type) EQ 8 THEN BEGIN index = fltarr(n_elements(data1.x)) FOR i = 0,n_elements(data1.x)-1 do begin tmp=min(abs(data_l2_x - data1.x(i)),nn) index[i] = nn ENDFOR data_l2_y(index,ff_aa[2]:ff_aa[3]) = data1.y(*,f1_mf:f2_mf) data_l2_dy(index,ff_aa[2]:ff_aa[3]) = data1.dy(*,f1_mf:f2_mf) data_l2_v(index,ff_aa[2]:ff_aa[3]) = data1.v(*,f1_mf:f2_mf) data_l2_dv(index,ff_aa[2]:ff_aa[3]) = data1.dv(*,f1_mf:f2_mf) ENDIF IF size(data2, /type) EQ 8 THEN BEGIN index = fltarr(n_elements(data2.x)) FOR i = 0,n_elements(data2.x)-1 do begin tmp=min(abs(data_l2_x - data2.x(i)),nn) index[i] = nn ENDFOR data_l2_y(index,ff_aa[4]:ff_aa[5]) = data2.y(*,f1_hf:f2_hf) data_l2_dy(index,ff_aa[4]:ff_aa[5]) = data2.dy(*,f1_hf:f2_hf) data_l2_v(index,ff_aa[4]:ff_aa[5]) = data2.v(*,f1_hf:f2_hf) data_l2_dv(index,ff_aa[4]:ff_aa[5]) = data2.dv(*,f1_hf:f2_hf) ENDIF index2 = fltarr(n_elements(data_l2_x)) FOR i = 0,n_elements(data_l2_x)-1 do begin nn2 = min(abs(data_mode.x-data_l2_x(i)),nq2) index2[i] = nq2 ENDFOR ; data_l2_flag[*] = 80 * ((data_mode.y[index2] NE 8)) + (type EQ 'pas')/10 + 1.0*(total(data_l2_y,2) GT 1e-4)/100 tmp=where(data_mode.y[index2] EQ 8,nq) ; The instrument is not in electric field mode FOR i=0,ff_no-1 do begin data_l2_y[tmp,i]=!values.f_nan ENDFOR if min(data_l2_dy) lt 0 then stanna if min(data_l2_dv) lt 0 then stanna ;------------------------------------------ ; calibration errorflag etc ;----------------------------------------- IF (ext EQ 'l2') THEN BEGIN ;(ext EQ 'l2') IF strpos(dlimit_merge.spice_kernel_flag, 'not') eq -1 THEN $ ; what aspects should be evaluates check_varariables=['wake','sc_shadow','planet_shadow','sc_att','sc_pos','thrusters','gyros'] ELSE $ check_varariables=['fake_flag'] ; for now mvn_lpw_prd_w_flag, data_l2_x,check_varariables,flag, flag_info, flag_source, vers_prd ,scale ; this is based on mag resolution ENDIF ELSE BEGIN ;(ext EQ 'l1a') OR (ext EQ 'l1b') ; this is just so we can do l1a and l1b data products check_varariables = 'fake_flag' ; flag_info = ' The uncertanty of the values 100. is the best quality ' flag_source = 'Example '+ ' mvn_lpw_anc_angles '+' mvn_lpw_anc_pos_mso ' scale = 1.0 flag = 0.0 ENDELSE ;bad_lf= (total(data_l2_y[*,1:46],2,/nan) GT 1e-11) ;if there is data in the lf range ;bad_hf= (total(data_l2_y[*,150:215],2,/nan) LT 1e-11) ;that tehe gain has been corrected for bad_lf= (total(data_l2_y[*,1:46],2,/nan) GT 1e-10) ;if there is data in the lf range bad_hf= (total(data_l2_y[*,150:215],2,/nan) LT 1e-10) ;that there gain has been corrected for data_l2_flag = DOUBLE( scale * data_l2_flag * bad_lf * bad_hf + (1+(type EQ 'pas'))/10 + 1.0 * bad_lf/100 + 3.0 * bad_hf/100+ flag ) ;print,1.0*(total(data_l2_y,2) GT 1e-4)/100 ;print,' ####', (1+(type EQ 'pas'))/10 , ' $$$ ',type ;--------------------------------------------------------------------------------------------------- ; end of creating the data_l2 product ;--------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------- ; Create the L2 tplot variables ;--------------------------------------------------------------------------------------------------- ;------------------ Variables created not stored in CDF files ------------------- ; store_data,'spec_flag',data={x:data_l2_x,y:data_l2_flag} store_data,'spec_decimal',data={x:data_l2_x,y:flag} ; ;------------------ Variables created not stored in CDF files ------------------- ;------------------All information based on the SIS document------------------- ;-------------------- tplot variable 'mvn_lpw_w_spec_L2' ------------------- ;--------------------- SIS name: LPW.calibrated.w_spec (act/pas) ------------------- ;------------------- There will be 1 CDF file per day -------------------- data_l2 = create_struct( $ ; Which are used should follow the SIS document for this variable !! Look at: Table 14: Contents for LPW.calibrated.w_spec_act and LPW.calibrated.w_spec_pas calibrated data filed. 'x', data_l2_x, $ ; double 1-D arr 'y', data_l2_y, $ ; most of the time float and 1-D or 2-D 'dy', data_l2_dy, $ ; same size as y 'v', data_l2_v, $ ; same size as y 'dv', data_l2_dv, $ ;same size as y <--- here this is frequemcy width 'flag', data_l2_flag) ;1-D ;------------------------------------------- dlimit_l2=create_struct( $ 'Product_name', 'MVN LPW Electric field Spectra, Level: '+ext, $ 'Project', dlimit_merge.Project, $ 'Source_name', dlimit_merge.Source_name, $ ;Required for cdf production... 'Discipline', dlimit_merge.Discipline, $ 'Instrument_type', dlimit_merge.Instrument_type, $ 'Data_type', dlimit_merge.Data_type , $ 'Data_version', dlimit_merge.Data_version, $ 'Descriptor', dlimit_merge.Descriptor, $ 'PI_name', dlimit_merge.PI_name, $ 'PI_affiliation', dlimit_merge.PI_affiliation, $ 'TEXT', dlimit_merge.TEXT, $ 'Mission_group', dlimit_merge.Mission_group, $ 'Generated_by', dlimit_merge.Generated_by, $ 'Generation_date' , dlimit_merge.generation_date + ' # ' + t_routine, $ 'Rules_of_use', dlimit_merge.Rules_of_use, $ 'Acknowledgement', dlimit_merge.Acknowledgement, $ 'x_catdesc', 'Timestamps for each data point, in UNIX time.', $ 'y_catdesc', 'y: Spectra power [(V/m)^2/Hz]', $ ;### ARE UNITS CORRECT? v/m? 'v_catdesc', 'v: Center Frequency [Hz]', $ ;### 'dy_catdesc', 'dy: Uncertainty in Power [(V/m)^2/Hz]', $ ;### 'dv_catdesc', 'dv: Frequency Width [Hz]', $ ;### 'flag_catdesc', 'Quality of Wave power.'+ flag_info, $ ; ### 'x_Var_notes', 'UNIX time: Number of seconds elapsed since 1970-01-01/00:00:00.', $ 'y_Var_notes', 'For mode: '+strtrim(type,2), $ 'v_Var_notes', 'Center Frequency ', $ 'dy_Var_notes', 'Uncertainty in Power [(V/m)^2/Hz]', $ 'dv_Var_notes', 'Frequency width [Hz]', $ 'flag_Var_notes', 'Quality flag', $ 'xFieldnam', 'x: Time', $ ;### 'yFieldnam', 'y: Power', $ 'vFieldnam', 'v: Frequency', $ 'dyFieldnam', 'dy: dPower', $ 'dvFieldnam', 'dv: Frequency width', $ 'flagFieldnam', 'flag: Quality', $ 'derivn', 'NA', $ ;dlimit_merge.derivn, $ ;#### 'sig_digits', 2, $ ;dlimit_merge.sig_digits, $ ;##### 'SI_conversion', 'NA', $ ; dlimit_merge.SI_conversion, $ ;#### 'Var_type', 'data', $;dlimit_merge.Var_type, $ 'MONOTON', dlimit_merge.MONOTON, $ 'SCALEMIN', min(data_l2_v), $ 'SCALEMAX', max(data_l2_v), $ ;..end of required for cdf production. 't_epoch' , dlimit_merge.t_epoch, $ 'Time_start' , dlimit_merge.Time_start, $ 'Time_end' , dlimit_merge.Time_end, $ 'Time_field' , dlimit_merge.Time_field, $ 'SPICE_kernel_version', dlimit_merge.SPICE_kernel_version, $ 'SPICE_kernel_flag', dlimit_merge.SPICE_kernel_flag, $ 'Flag_info' , flag_info, $ 'Flag_source' , flag_source, $ 'L0_datafile' , dlimit_merge.L0_datafile, $ 'cal_vers' , dlimit_merge.cal_vers+ ' # ' + vers_prd,$ 'cal_y_const1' , dlimit_merge.cal_y_const1, $ 'cal_y_const2' , 'Merge level:' +strcompress(1,/remove_all) ,$ 'cal_datafile' , dlimit_merge.cal_datafile, $ 'cal_source' , dlimit_merge.cal_source, $ 'xsubtitle' , '[sec]', $ 'ysubtitle' , '[Hz]', $ 'cal_v_const1' , dlimit_merge.cal_v_const1, $ 'cal_v_const2' , 'Merge level:' +strcompress(f1_lf,/remove_all)+' '+strcompress(f2_lf,/remove_all)+' '+strcompress(f1_mf,/remove_all)+' ' $ +strcompress(f2_mf,/remove_all)+' '+strcompress(f1_hf,/remove_all)+' '+strcompress(f2_hf,/remove_all) , $ 'zsubtitle' , '[(V/m)^2/Hz]') ;------------------------------------------- limit_l2=create_struct( $ ; Which are used should follow the SIS document for this variable !! Look at: Table 14: Contents for LPW.calibrated.w_spec_act and LPW.calibrated.w_spec_pas calibrated data file. 'char_size' , limit.char_size ,$ 'xtitle' , limit.xtitle ,$ 'ytitle' , 'Frequency ('+type+')' ,$ 'yrange' , [1,2e6] ,$ 'ystyle' , 1 ,$ 'ylog' , 1 ,$ 'ztitle' , 'Power [(V/m)^2/Hz]' ,$ 'zrange' , [1e-14,1e-5],$ 'zlog' , 1 ,$ 'spec' , 1 ) ; 'noerrorbars', limit_merge.noerrorbars, $ ; not used for this product ; 'labels' , limit.labels,$ ; not used for this product ; 'colors' , limit.colors,$ ; not used for this product ; 'labflag' , limit.labflag) ; not used for this product ;--------------------------------------------- store_data,'mvn_lpw_w_spec_'+type+'_'+ext,data=data_l2,limit=limit_l2,dlimit=dlimit_l2 ;--------------------------------------------- options, '*spec*'+ext, no_interp = 1 options, '*spec*'+ext, DATAGAP = 256 ;--------------------------------------------------------------------------------------------------- ; end tplot production ;--------------------------------------------------------------------------------------------------- ENDIF ELSE print, "#### WARNING #### No act or pas data present; mvn_lpw_prd_w_spec.pro skipped..." end ;*******************************************************************