pro rbsp_efw_cal_spec, probe=probe, trange=trange, datatype=datatype, pT=pT
get_data,'rbsp'+probe+'_efw_spec_64_ccsds_data_DFB_config',data=dfbc
dfbconfig = rbsp_get_efw_dfb_config(dfbc.y)
src = dfbconfig[0].spec_config.spec_src
if datatype eq 'spec' then begin
compile_opt idl2
if ~keyword_set(trange) then trange = timerange()
cp0 = rbsp_efw_get_cal_params(trange[0])
fcals = rbsp_efw_get_gain_results()
bl = rbsp_efw_boom_deploy_history(trange[0])
names=''
nn=''
names=tnames('rbsp'+probe+'*spec?')
if strlen(names[0]) ne 0 then nn=strmid(names[0],10,1)
case nn of
'3': bins = '36'
'6': bins = '64'
'1': bins = '112'
else: dprint,'NOT CORRECT NUMBER OF BINS...CALIBRATION ABORTED**************'
endcase
case strlowcase(probe) of
'a': cp = cp0.a
'b': cp = cp0.b
else: dprint, 'INVALID PROBE NAME. CALIBRATION ABORTED*************'
endcase
adc_factor = 2.5d / 32767.5d
rbspx = 'rbsp' + probe[0]
tvar = rbspx + ['_efw_64_spec0',$
'_efw_64_spec1',$
'_efw_64_spec2',$
'_efw_64_spec3',$
'_efw_64_spec4',$
'_efw_64_spec5',$
'_efw_64_spec6']
gain = replicate(0.,n_elements(src))
offset = replicate(0.,n_elements(src))
conversion = replicate(0.,n_elements(src))
units = replicate('',n_elements(src))
zlims = replicate(0d,n_elements(src),2)
if ~keyword_set(pT) then pTf = 1. else pTf = 1000.
if ~keyword_set(pT) then pTnT = 'nT' else pTnT = 'pT'
if ~keyword_set(pT) then pTnT_zscale = 1. else pTnT_zscale=1d3
fbins_36L = fcals.cal_spec.freq_spec36L
fbins_36H = fcals.cal_spec.freq_spec36H
fbins_36C = fcals.cal_spec.freq_spec36C
fbins_64L = fcals.cal_spec.freq_spec64L
fbins_64H = fcals.cal_spec.freq_spec64H
fbins_64C = fcals.cal_spec.freq_spec64C
fbins_112L = fcals.cal_spec.freq_spec112L
fbins_112H = fcals.cal_spec.freq_spec112H
fbins_112C = fcals.cal_spec.freq_spec112C
if bins eq '36' then gainf = replicate(0.,36,7)
if bins eq '64' then gainf = replicate(0.,64,7)
if bins eq '112' then gainf = replicate(0.,112,7)
for bb=0,6 do begin
case src[bb] of
'E12AC': begin
gain[bb] = cp.adc_gain_eac[0]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_eac[0]
if probe eq 'a' then conversion[bb] = 1000./bl.A12
if probe eq 'b' then conversion[bb] = 1000./bl.B12
units[bb] = '(mV/m)!U2!N'
zlims[bb,*] = [1d-3^2,1d-1^2]
end
'E34AC': begin
gain[bb] = cp.adc_gain_eac[1]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_eac[1]
if probe eq 'a' then conversion[bb] = 1000./bl.A34
if probe eq 'b' then conversion[bb] = 1000./bl.B34
units[bb] = '(mV/m)!U2!N'
zlims[bb,*] = [1d-3^2,1d-1^2]
end
'E56AC': begin
gain[bb] = cp.adc_gain_eac[2]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_eac[2]
if probe eq 'a' then conversion[bb] = 1000./bl.A56
if probe eq 'b' then conversion[bb] = 1000./bl.B56
units[bb] = '(mV/m)!U2!N'
zlims[bb,*] = [1d-3^2,1d-1^2]
end
'E12DC': begin
gain[bb] = cp.adc_gain_edc[0]
if probe eq 'a' then begin
if bins eq '36' then gainf[*,bb] = fcals.cal_spec.e12DC_a_spec36.gain_vs_freq
if bins eq '64' then gainf[*,bb] = fcals.cal_spec.e12DC_a_spec64.gain_vs_freq
if bins eq '112' then gainf[*,bb] = fcals.cal_spec.e12DC_a_spec112.gain_vs_freq
endif else begin
if bins eq '36' then gainf[*,bb] = fcals.cal_spec.e12DC_b_spec36.gain_vs_freq
if bins eq '64' then gainf[*,bb] = fcals.cal_spec.e12DC_b_spec64.gain_vs_freq
if bins eq '112' then gainf[*,bb] = fcals.cal_spec.e12DC_b_spec112.gain_vs_freq
endelse
offset[bb] = cp.adc_offset_edc[0]
if probe eq 'a' then conversion[bb] = 1000./bl.A12
if probe eq 'b' then conversion[bb] = 1000./bl.B12
units[bb] = '(mV/m)!U2!N'
zlims[bb,*] = [1d-3^2,1d-1^2]
end
'E34DC': begin
gain[bb] = cp.adc_gain_edc[1]
if probe eq 'a' then begin
if bins eq '36' then gainf[*,bb] = fcals.cal_spec.e34DC_a_spec36.gain_vs_freq
if bins eq '64' then gainf[*,bb] = fcals.cal_spec.e34DC_a_spec64.gain_vs_freq
if bins eq '112' then gainf[*,bb] = fcals.cal_spec.e34DC_a_spec112.gain_vs_freq
endif else begin
if bins eq '36' then gainf[*,bb] = fcals.cal_spec.e34DC_b_spec36.gain_vs_freq
if bins eq '64' then gainf[*,bb] = fcals.cal_spec.e34DC_b_spec64.gain_vs_freq
if bins eq '112' then gainf[*,bb] = fcals.cal_spec.e34DC_b_spec112.gain_vs_freq
endelse
offset[bb] = cp.adc_offset_edc[1]
if probe eq 'a' then conversion[bb] = 1000./bl.A34
if probe eq 'b' then conversion[bb] = 1000./bl.B34
units[bb] = '(mV/m)!U2!N'
zlims[bb,*] = [1d-3^2,1d-1^2]
end
'E56DC': begin
gain[bb] = cp.adc_gain_edc[2]
if probe eq 'a' then begin
if bins eq '36' then gainf[*,bb] = fcals.cal_spec.e56DC_a_spec36.gain_vs_freq
if bins eq '64' then gainf[*,bb] = fcals.cal_spec.e56DC_a_spec64.gain_vs_freq
if bins eq '112' then gainf[*,bb] = fcals.cal_spec.e56DC_a_spec112.gain_vs_freq
endif else begin
if bins eq '36' then gainf[*,bb] = fcals.cal_spec.e56DC_b_spec36.gain_vs_freq
if bins eq '64' then gainf[*,bb] = fcals.cal_spec.e56DC_b_spec64.gain_vs_freq
if bins eq '112' then gainf[*,bb] = fcals.cal_spec.e56DC_b_spec112.gain_vs_freq
endelse
offset[bb] = cp.adc_offset_edc[2]
if probe eq 'a' then conversion[bb] = 1000./bl.A56
if probe eq 'b' then conversion[bb] = 1000./bl.B56
units[bb] = '(mV/m)!U2!N'
zlims[bb,*] = [1d-3^2,1d-1^2]
end
'V1DC': begin
gain[bb] = cp.adc_gain_vdc[0]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_vdc[0]
conversion[bb] = 1.
units[bb] = 'volts!U2!N'
zlims[bb,*] = [1d-4^2,1d-2^2]
end
'V2DC': begin
gain[bb] = cp.adc_gain_vdc[1]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_vdc[1]
conversion[bb] = 1.
units[bb] = 'volts!U2!N'
zlims[bb,*] = [1d-4^2,1d-2^2]
end
'V3DC': begin
gain[bb] = cp.adc_gain_vdc[2]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_vdc[2]
conversion[bb] = 1.
units[bb] = 'volts!U2!N'
zlims[bb,*] = [1d-4^2,1d-2^2]
end
'V4DC': begin
gain[bb] = cp.adc_gain_vdc[3]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_vdc[3]
conversion[bb] = 1.
units[bb] = 'volts!U2!N'
zlims[bb,*] = [1d-4^2,1d-2^2]
end
'V5DC': begin
gain[bb] = cp.adc_gain_vdc[4]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_vdc[4]
conversion[bb] = 1.
units[bb] = 'volts!U2!N'
zlims[bb,*] = [1d-4^2,1d-2^2]
end
'V6DC': begin
gain[bb] = cp.adc_gain_vdc[5]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_vdc[5]
conversion[bb] = 1.
units[bb] = 'volts!U2!N'
zlims[bb,*] = [1d-4^2,1d-2^2]
end
'V1AC': begin
gain[bb] = cp.adc_gain_vac[0]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_vac[0]
conversion[bb] = 1.
units[bb] = 'volts!U2!N'
zlims[bb,*] = [1d-4^2,1d-2^2]
end
'V2AC': begin
gain[bb] = cp.adc_gain_vac[1]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_vac[1]
conversion[bb] = 1.
units[bb] = 'volts!U2!N'
zlims[bb,*] = [1d-4^2,1d-2^2]
end
'V3AC': begin
gain[bb] = cp.adc_gain_vac[2]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_vac[2]
conversion[bb] = 1.
units[bb] = 'volts!U2!N'
zlims[bb,*] = [1d-4^2,1d-2^2]
end
'V4AC': begin
gain[bb] = cp.adc_gain_vac[3]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_vac[3]
conversion[bb] = 1.
units[bb] = 'volts!U2!N'
zlims[bb,*] = [1d-4^2,1d-2^2]
end
'V5AC': begin
gain[bb] = cp.adc_gain_vac[4]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_vac[4]
conversion[bb] = 1.
units[bb] = 'volts!U2!N'
zlims[bb,*] = [1d-4^2,1d-2^2]
end
'V6AC': begin
gain[bb] = cp.adc_gain_vac[5]
if bins eq '36' then gainf[*,bb] = replicate(1.,36)
if bins eq '64' then gainf[*,bb] = replicate(1.,64)
if bins eq '112' then gainf[*,bb] = replicate(1.,112)
offset[bb] = cp.adc_offset_vac[5]
conversion[bb] = 1.
units[bb] = 'volts!U2!N'
zlims[bb,*] = [1d-4^2,1d-2^2]
end
'SCMU': begin
gain[bb] = cp.adc_gain_msc[0]
if probe eq 'a' then begin
if bins eq '36' then gain_tmp = fcals.cal_spec.scmu_a_spec36.gain_vs_freq
if bins eq '64' then gain_tmp = fcals.cal_spec.scmu_a_spec64.gain_vs_freq
if bins eq '112' then gain_tmp = fcals.cal_spec.scmu_a_spec112.gain_vs_freq
if bins eq '36' then nT_volt = fcals.cal_spec.scmu_a_spec36.stimcoil_nt2v
if bins eq '64' then nT_volt = fcals.cal_spec.scmu_a_spec64.stimcoil_nt2v
if bins eq '112' then nT_volt = fcals.cal_spec.scmu_a_spec112.stimcoil_nt2v
endif else begin
if bins eq '36' then gain_tmp = fcals.cal_spec.scmu_b_spec36.gain_vs_freq
if bins eq '64' then gain_tmp = fcals.cal_spec.scmu_b_spec64.gain_vs_freq
if bins eq '112' then gain_tmp = fcals.cal_spec.scmu_b_spec112.gain_vs_freq
if bins eq '36' then nT_volt = fcals.cal_spec.scmu_b_spec36.stimcoil_nt2v
if bins eq '64' then nT_volt = fcals.cal_spec.scmu_b_spec64.stimcoil_nt2v
if bins eq '112' then nT_volt = fcals.cal_spec.scmu_b_spec112.stimcoil_nt2v
endelse
gainf[*,bb] = 1/(gain_tmp * nT_volt)
offset[bb] = cp.adc_offset_msc[0]
conversion[bb] = pTf
units[bb] = pTnT+'!U2!N'
zlims[bb,*] = [(pTnT_zscale*1d-4)^2,(pTnT_zscale*1d-2)^2]
end
'SCMV': begin
gain[bb] = cp.adc_gain_msc[1]
if probe eq 'a' then begin
if bins eq '36' then gain_tmp = fcals.cal_spec.scmv_a_spec36.gain_vs_freq
if bins eq '64' then gain_tmp = fcals.cal_spec.scmv_a_spec64.gain_vs_freq
if bins eq '112' then gain_tmp = fcals.cal_spec.scmv_a_spec112.gain_vs_freq
if bins eq '36' then nT_volt = fcals.cal_spec.scmv_a_spec36.stimcoil_nt2v
if bins eq '64' then nT_volt = fcals.cal_spec.scmv_a_spec64.stimcoil_nt2v
if bins eq '112' then nT_volt = fcals.cal_spec.scmv_a_spec112.stimcoil_nt2v
endif else begin
if bins eq '36' then gain_tmp = fcals.cal_spec.scmv_b_spec36.gain_vs_freq
if bins eq '64' then gain_tmp = fcals.cal_spec.scmv_b_spec64.gain_vs_freq
if bins eq '112' then gain_tmp = fcals.cal_spec.scm_b_spec112.gain_vs_freq
if bins eq '36' then nT_volt = fcals.cal_spec.scmv_b_spec36.stimcoil_nt2v
if bins eq '64' then nT_volt = fcals.cal_spec.scmv_b_spec64.stimcoil_nt2v
if bins eq '112' then nT_volt = fcals.cal_spec.scmv_b_spec112.stimcoil_nt2v
endelse
gainf[*,bb] = 1/(gain_tmp * nT_volt)
offset[bb] = cp.adc_offset_msc[1]
conversion[bb] = pTf
units[bb] = pTnT+'!U2!N'
zlims[bb,*] = [(pTnT_zscale*1d-4)^2,(pTnT_zscale*1d-2)^2]
end
'SCMW': begin
gain[bb] = cp.adc_gain_msc[2]
if probe eq 'a' then begin
if bins eq '36' then gain_tmp = fcals.cal_spec.scmw_a_spec36.gain_vs_freq
if bins eq '64' then gain_tmp = fcals.cal_spec.scmw_a_spec64.gain_vs_freq
if bins eq '112' then gain_tmp = fcals.cal_spec.scmw_a_spec112.gain_vs_freq
if bins eq '36' then nT_volt = fcals.cal_spec.scmw_a_spec36.stimcoil_nt2v
if bins eq '64' then nT_volt = fcals.cal_spec.scmw_a_spec64.stimcoil_nt2v
if bins eq '112' then nT_volt = fcals.cal_spec.scmw_a_spec112.stimcoil_nt2v
endif else begin
if bins eq '36' then gain_tmp = fcals.cal_spec.scmw_b_spec36.gain_vs_freq
if bins eq '64' then gain_tmp = fcals.cal_spec.scmw_b_spec64.gain_vs_freq
if bins eq '112' then gain_tmp = fcals.cal_spec.scmw_b_spec112.gain_vs_freq
if bins eq '36' then nT_volt = fcals.cal_spec.scmw_b_spec36.stimcoil_nt2v
if bins eq '64' then nT_volt = fcals.cal_spec.scmw_b_spec64.stimcoil_nt2v
if bins eq '112' then nT_volt = fcals.cal_spec.scmw_b_spec112.stimcoil_nt2v
endelse
gainf[*,bb] = 1/(gain_tmp * nT_volt)
offset[bb] = cp.adc_offset_msc[2]
conversion[bb] = pTf
units[bb] = pTnT+'!U2!N'
zlims[bb,*] = [(pTnT_zscale*1d-4)^2,(pTnT_zscale*1d-2)^2]
end
endcase
endfor
gain = gain/adc_factor
ylabel = src
zlabel = 'RBSP'+probe+' EFW spec'
ytitle = ylabel + '!C[Hz]'
ztitle = strarr(7)
for j=0,6 do ztitle[j] = '!C' + units[j] + '/[Hz]!C!C' + zlabel
for j=0,6 do begin
get_data,tvar[j],data=data,dlimits=dlim
if dlim.data_att.units eq 'ADC' then begin
tst = size(data)
if tst[0] ne 0 then begin
new_y = (double(data.y) - offset[j])
new_y /= 4.^2
new_y[*,0] /= 4.
new_y /= 0.375^2
new_y *= adc_factor^2
new_y *= gain[j]^2
new_y *= conversion[j]^2
gtmp = reform(gainf[*,j])^2
for qq=0,n_elements(new_y[*,0])-1 do new_y[qq,*] = new_y[qq,*]*gtmp
new_data = {x:data.x,y:new_y,v:data.v}
dlim.data_att.units = units[j]
dlim.data_att.channel = src[j]
colors = [1]
str_element, dlim, 'cdf', /delete
str_element, dlim, 'code_id', /delete
newname = tvar[j]
store_data, newname,data=new_data,dlim=dlim
options,newname,labflag=1
options,newname,'ytitle',ytitle[j]
options,newname,'ztitle',ztitle[j]
ylim,newname,3,10000,1
endif
endif else print,tvar[j], ' is already calibrated'
endfor
endif else begin
print, ''
dprint, 'Invalid datatype. Calibration aborted.'
print, ''
return
endelse
zlim,rbspx +'_efw_'+bins+'_spec0',zlims[0,0],zlims[0,1],1
zlim,rbspx +'_efw_'+bins+'_spec1',zlims[1,0],zlims[1,1],1
zlim,rbspx +'_efw_'+bins+'_spec2',zlims[2,0],zlims[2,1],1
zlim,rbspx +'_efw_'+bins+'_spec3',zlims[3,0],zlims[3,1],1
zlim,rbspx +'_efw_'+bins+'_spec4',zlims[4,0],zlims[4,1],1
zlim,rbspx +'_efw_'+bins+'_spec5',zlims[5,0],zlims[5,1],1
zlim,rbspx +'_efw_'+bins+'_spec6',zlims[6,0],zlims[6,1],1
if bins eq '36' then begin
tplot_names,'*efw_36_spec*',names=tnames
fbin_label_36 = strtrim(fbins_36L,2) + '-' + strtrim(fbins_36H,2) + ' Hz'
for i=0,size(tnames,/n_elements)-1 do begin
get_data,tnames[i],data=d,limits=l,dlimits=dl
if is_struct(d) then d.v=fbins_36c[0:35]
store_data,tnames[i],data=d,limits=l,dlimits=dl
endfor
endif
if bins eq '64' then begin
tplot_names,'*efw_64_spec*',names=tnames
fbin_label_64 = strtrim(fbins_64L,2) + '-' + strtrim(fbins_64H,2) + ' Hz'
for i=0,size(tnames,/n_elements)-1 do begin
get_data,tnames[i],data=d,limits=l,dlimits=dl
if is_struct(d) then d.v=fbins_64c[0:63]
store_data,tnames[i],data=d,limits=l,dlimits=dl
endfor
endif
if bins eq '112' then begin
tplot_names,'*efw_112_spec*',names=tnames
fbin_label_112 = strtrim(fbins_112L,2) + '-' + strtrim(fbins_112H,2) + ' Hz'
for i=0,size(tnames,/n_elements)-1 do begin
get_data,tnames[i],data=d,limits=l,dlimits=dl
if is_struct(d) then d.v=fbins_112c[0:111]
store_data,tnames[i],data=d,limits=l,dlimits=dl
endfor
endif
end