pro rbsp_efw_cal_fbk, probe=probe, trange=trange, datatype=datatype, pT=pT
if datatype ne 'fbk' then begin
print,'NOT FILTERBANK DATA....ABORTING CALIBRATION'
return
endif
get_data,'rbsp'+probe+'_efw_fbk_13_fbk_13_select',data=data13
get_data,'rbsp'+probe+'_efw_fbk_7_fbk_7_select',data=data7
if is_struct(data7) then source7_13 = '7'
if is_struct(data13) then source7_13 = '13'
if ~is_struct(data7) and ~is_struct(data13) then begin
print,'SOURCE DATA MISSING.....ABORTING CALIBRATION'
return
endif
if source7_13 eq '13' then chns = [data13.y[0,0],data13.y[0,1]] $
else chns = [data7.y[0,0],data7.y[0,1]]
compile_opt idl2
if ~keyword_set(trange) then trange = timerange()
fbk_channels=['E12DC','E34DC','E56DC','E12AC','E34AC','E56AC', $
'SCMU', 'SCMV', 'SCMW','VDC']
channel = fbk_channels[chns]
cp0 = rbsp_efw_get_cal_params(trange[0])
fcals = rbsp_efw_get_gain_results()
bl = rbsp_efw_boom_deploy_history(trange[0])
case strlowcase(probe) of
'a': cp = cp0.a
'b': cp = cp0.b
else: dprint, 'Invalid probe name. Calibration aborted.'
endcase
rbspx = 'rbsp' + probe[0]
gain = fltarr(2)
unit = strarr(2)
offset = fltarr(2)
boomlength = fltarr(2)
case channel[0] of
'E12DC': begin
gain[0] = cp.ADC_gain_EDC[0]
offset[0] = cp.ADC_offset_EDC[0]
unit[0] = 'mV/m'
if probe eq 'a' then begin
gain_f13_1 = fcals.cal_fbk.e12DC_a_fbk13.gain_vs_freq
gain_f7_1 = fcals.cal_fbk.e12DC_a_fbk7.gain_vs_freq
boomlength[0] = bl.A12
endif else begin
gain_f13_1 = fcals.cal_fbk.e12DC_b_fbk13.gain_vs_freq
gain_f7_1 = fcals.cal_fbk.e12DC_b_fbk7.gain_vs_freq
boomlength[0] = bl.B12
endelse
end
'E34DC': begin
gain[0] = cp.ADC_gain_EDC[1]
offset[0] = cp.ADC_offset_EDC[1]
unit[0] = 'mV/m'
if probe eq 'a' then begin
gain_f13_1 = fcals.cal_fbk.e34DC_a_fbk13.gain_vs_freq
gain_f7_1 = fcals.cal_fbk.e34DC_a_fbk7.gain_vs_freq
boomlength[0] = bl.A34
endif else begin
gain_f13_1 = fcals.cal_fbk.e34DC_b_fbk13.gain_vs_freq
gain_f7_1 = fcals.cal_fbk.e34DC_b_fbk7.gain_vs_freq
boomlength[0] = bl.B12
endelse
end
'E56DC': begin
gain[0] = cp.ADC_gain_EDC[2]
offset[0] = cp.ADC_offset_EDC[2]
unit[0] = 'mV/m'
if probe eq 'a' then begin
gain_f13_1 = fcals.cal_fbk.e56DC_a_fbk13.gain_vs_freq
gain_f7_1 = fcals.cal_fbk.e56DC_a_fbk7.gain_vs_freq
boomlength[0] = bl.A56
endif else begin
gain_f13_1 = fcals.cal_fbk.e56DC_b_fbk13.gain_vs_freq
gain_f7_1 = fcals.cal_fbk.e56DC_b_fbk7.gain_vs_freq
boomlength[0] = bl.B56
endelse
end
'E12AC': begin
gain[0] = cp.ADC_gain_EAC[0]
offset[0] = cp.ADC_offset_EAC[0]
unit[0] = 'mV/m'
if probe eq 'a' then boomlength[0] = bl.A12
if probe eq 'b' then boomlength[0] = bl.B12
gain_f13_1 = replicate(1.,13)
gain_f7_1 = replicate(1.,7)
end
'E34AC': begin
gain[0] = cp.ADC_gain_EAC[1]
offset[0] = cp.ADC_offset_EAC[1]
unit[0] = 'mV/m'
if probe eq 'a' then boomlength[0] = bl.A34
if probe eq 'b' then boomlength[0] = bl.B34
gain_f13_1 = replicate(1.,13)
gain_f7_1 = replicate(1.,7)
end
'E56AC': begin
gain[0] = cp.ADC_gain_EAC[2]
offset[0] = cp.ADC_offset_EAC[2]
unit[0] = 'mV/m'
if probe eq 'a' then boomlength[0] = bl.A56
if probe eq 'b' then boomlength[0] = bl.B56
gain_f13_1 = replicate(1.,13)
gain_f7_1 = replicate(1.,7)
end
'SCMU': begin
gain[0] = cp.ADC_gain_MSC[0]
offset[0] = cp.ADC_offset_MSC[0]
if probe eq 'a' then begin
nT_volt_f13 = fcals.cal_fbk.scmu_a_fbk13.stimcoil_nt2v
nT_volt_f7 = fcals.cal_fbk.scmu_a_fbk7.stimcoil_nt2v
gain_fscmu_13 = fcals.cal_fbk.scmu_a_fbk13.gain_vs_freq
gain_fscmu_7 = fcals.cal_fbk.scmu_a_fbk7.gain_vs_freq
endif else begin
nT_volt_f13 = fcals.cal_fbk.scmu_b_fbk13.stimcoil_nt2v
nT_volt_f7 = fcals.cal_fbk.scmu_b_fbk7.stimcoil_nt2v
gain_fscmu_13 = fcals.cal_fbk.scmu_b_fbk13.gain_vs_freq
gain_fscmu_7 = fcals.cal_fbk.scmu_b_fbk7.gain_vs_freq
endelse
gain_f13_1 = nT_volt_f13*gain_fscmu_13
gain_f7_1 = nT_volt_f7*gain_fscmu_7
if ~keyword_set(pT) then unit[0] = 'nT' else $
unit[0] = 'pT'
boomlength[0] = !values.f_nan
end
'SCMV': begin
gain[0] = cp.ADC_gain_MSC[1]
offset[0] = cp.ADC_offset_MSC[1]
if probe eq 'a' then begin
nT_volt_f13 = fcals.cal_fbk.scmv_a_fbk13.stimcoil_nt2v
nT_volt_f7 = fcals.cal_fbk.scmv_a_fbk7.stimcoil_nt2v
gain_fscmv_13 = fcals.cal_fbk.scmv_a_fbk13.gain_vs_freq
gain_fscmv_7 = fcals.cal_fbk.scmv_a_fbk7.gain_vs_freq
endif else begin
nT_volt_f13 = fcals.cal_fbk.scmv_b_fbk13.stimcoil_nt2v
nT_volt_f7 = fcals.cal_fbk.scmv_b_fbk7.stimcoil_nt2v
gain_fscmv_13 = fcals.cal_fbk.scmv_b_fbk13.gain_vs_freq
gain_fscmv_7 = fcals.cal_fbk.scmv_b_fbk7.gain_vs_freq
endelse
gain_f13_1 = nT_volt_f13*gain_fscmv_13
gain_f7_1 = nT_volt_f7*gain_fscmv_7
if ~keyword_set(pT) then unit[0] = 'nT' else $
unit[0] = 'pT'
boomlength[0] = !values.f_nan
end
'SCMW': begin
gain[0] = cp.ADC_gain_MSC[2]
offset[0] = cp.ADC_offset_MSC[2]
if probe eq 'a' then begin
nT_volt_f13 = fcals.cal_fbk.scmw_a_fbk13.stimcoil_nt2v
nT_volt_f7 = fcals.cal_fbk.scmw_a_fbk7.stimcoil_nt2v
gain_fscmw_13 = fcals.cal_fbk.scmw_a_fbk13.gain_vs_freq
gain_fscmw_7 = fcals.cal_fbk.scmw_a_fbk7.gain_vs_freq
endif else begin
nT_volt_f13 = fcals.cal_fbk.scmw_b_fbk13.stimcoil_nt2v
nT_volt_f7 = fcals.cal_fbk.scmw_b_fbk7.stimcoil_nt2v
gain_fscmw_13 = fcals.cal_fbk.scmw_b_fbk13.gain_vs_freq
gain_fscmw_7 = fcals.cal_fbk.scmw_b_fbk7.gain_vs_freq
endelse
gain_f13_1 = nT_volt_f13*gain_fscmw_13
gain_f7_1 = nT_volt_f7*gain_fscmw_7
if ~keyword_set(pT) then unit[0] = 'nT' else $
unit[0] = 'pT'
boomlength[0] = !values.f_nan
end
'VDC': begin
gain[0] = cp.ADC_gain_VDC[0]
gain_f13_1a = replicate(1.,13)
gain_f7_1a = replicate(1.,7)
gain_f13_1b = gain_f13_1a
gain_f7_1b = gain_f7_1a
end
else: dprint, 'Invalid filterbank channel. Calibration aborted.'
endcase
case channel[1] of
'E12DC': begin
gain[1] = cp.ADC_gain_EDC[0]
offset[1] = cp.ADC_offset_EDC[0]
unit[1] = 'mV/m'
if probe eq 'a' then begin
gain_f13_2 = fcals.cal_fbk.e12DC_a_fbk13.gain_vs_freq
gain_f7_2 = fcals.cal_fbk.e12DC_a_fbk7.gain_vs_freq
boomlength[1] = bl.A12
endif else begin
gain_f13_2 = fcals.cal_fbk.e12DC_b_fbk13.gain_vs_freq
gain_f7_2 = fcals.cal_fbk.e12DC_b_fbk7.gain_vs_freq
boomlength[1] = bl.B12
endelse
end
'E34DC': begin
gain[1] = cp.ADC_gain_EDC[1]
offset[1] = cp.ADC_offset_EDC[1]
unit[1] = 'mV/m'
if probe eq 'a' then begin
gain_f13_2 = fcals.cal_fbk.e34DC_a_fbk13.gain_vs_freq
gain_f7_2 = fcals.cal_fbk.e34DC_a_fbk7.gain_vs_freq
boomlength[1] = bl.A34
endif else begin
gain_f13_2 = fcals.cal_fbk.e34DC_b_fbk13.gain_vs_freq
gain_f7_2 = fcals.cal_fbk.e34DC_b_fbk7.gain_vs_freq
boomlength[1] = bl.B34
endelse
end
'E56DC': begin
gain[1] = cp.ADC_gain_EDC[2]
offset[1] = cp.ADC_offset_EDC[2]
unit[1] = 'mV/m'
if probe eq 'a' then begin
gain_f13_2 = fcals.cal_fbk.e56DC_a_fbk13.gain_vs_freq
gain_f7_2 = fcals.cal_fbk.e56DC_a_fbk7.gain_vs_freq
boomlength[1] = bl.A56
endif else begin
gain_f13_2 = fcals.cal_fbk.e56DC_b_fbk13.gain_vs_freq
gain_f7_2 = fcals.cal_fbk.e56DC_b_fbk7.gain_vs_freq
boomlength[1] = bl.B56
endelse
end
'E12AC': begin
gain[1] = cp.ADC_gain_EAC[0]
offset[1] = cp.ADC_offset_EAC[0]
unit[1] = 'mV/m'
if probe eq 'a' then boomlength[1] = bl.A12
if probe eq 'b' then boomlength[1] = bl.B12
gain_f13_2 = replicate(1.,13)
gain_f7_2 = replicate(1.,7)
end
'E34AC': begin
gain[1] = cp.ADC_gain_EAC[1]
offset[1] = cp.ADC_offset_EAC[1]
unit[1] = 'mV/m'
if probe eq 'a' then boomlength[1] = bl.A34
if probe eq 'b' then boomlength[1] = bl.B34
gain_f13_2 = replicate(1.,13)
gain_f7_2 = replicate(1.,7)
end
'E56AC': begin
gain[1] = cp.ADC_gain_EAC[2]
offset[1] = cp.ADC_offset_EAC[2]
unit[1] = 'mV/m'
if probe eq 'a' then boomlength[1] = bl.A56
if probe eq 'b' then boomlength[1] = bl.B56
gain_f13_2 = replicate(1.,13)
gain_f7_2 = replicate(1.,7)
end
'SCMU': begin
gain[1] = cp.ADC_gain_MSC[0]
offset[1] = cp.ADC_offset_MSC[0]
if probe eq 'a' then begin
nT_volt_f13 = fcals.cal_fbk.scmu_a_fbk13.stimcoil_nt2v
nT_volt_f7 = fcals.cal_fbk.scmu_a_fbk7.stimcoil_nt2v
gain_fscmu_13 = fcals.cal_fbk.scmu_a_fbk13.gain_vs_freq
gain_fscmu_7 = fcals.cal_fbk.scmu_a_fbk7.gain_vs_freq
endif else begin
nT_volt_f13 = fcals.cal_fbk.scmu_b_fbk13.stimcoil_nt2v
nT_volt_f7 = fcals.cal_fbk.scmu_b_fbk7.stimcoil_nt2v
gain_fscmu_13 = fcals.cal_fbk.scmu_b_fbk13.gain_vs_freq
gain_fscmu_7 = fcals.cal_fbk.scmu_b_fbk7.gain_vs_freq
endelse
gain_f13_2 = nT_volt_f13*gain_fscmu_13
gain_f7_2 = nT_volt_f7*gain_fscmu_7
if ~keyword_set(pT) then unit[1] = 'nT' else $
unit[1] = 'pT'
boomlength[1] = !values.f_nan
end
'SCMV': begin
gain[1] = cp.ADC_gain_MSC[1]
offset[1] = cp.ADC_offset_MSC[1]
if probe eq 'a' then begin
nT_volt_f13 = fcals.cal_fbk.scmv_a_fbk13.stimcoil_nt2v
nT_volt_f7 = fcals.cal_fbk.scmv_a_fbk7.stimcoil_nt2v
gain_fscmv_13 = fcals.cal_fbk.scmv_a_fbk13.gain_vs_freq
gain_fscmv_7 = fcals.cal_fbk.scmv_a_fbk7.gain_vs_freq
endif else begin
nT_volt_f13 = fcals.cal_fbk.scmv_b_fbk13.stimcoil_nt2v
nT_volt_f7 = fcals.cal_fbk.scmv_b_fbk7.stimcoil_nt2v
gain_fscmv_13 = fcals.cal_fbk.scmv_b_fbk13.gain_vs_freq
gain_fscmv_7 = fcals.cal_fbk.scmv_b_fbk7.gain_vs_freq
endelse
gain_f13_2 = nT_volt_f13*gain_fscmv_13
gain_f7_2 = nT_volt_f7*gain_fscmv_7
if ~keyword_set(pT) then unit[1] = 'nT!' else $
unit[1] = 'pT'
boomlength[1] = !values.f_nan
end
'SCMW': begin
gain[1] = cp.ADC_gain_MSC[2]
offset[1] = cp.ADC_offset_MSC[2]
if probe eq 'a' then begin
nT_volt_f13 = fcals.cal_fbk.scmw_a_fbk13.stimcoil_nt2v
nT_volt_f7 = fcals.cal_fbk.scmw_a_fbk7.stimcoil_nt2v
gain_fscmw_13 = fcals.cal_fbk.scmw_a_fbk13.gain_vs_freq
gain_fscmw_7 = fcals.cal_fbk.scmw_a_fbk7.gain_vs_freq
endif else begin
nT_volt_f13 = fcals.cal_fbk.scmw_b_fbk13.stimcoil_nt2v
nT_volt_f7 = fcals.cal_fbk.scmw_b_fbk7.stimcoil_nt2v
gain_fscmw_13 = fcals.cal_fbk.scmw_b_fbk13.gain_vs_freq
gain_fscmw_7 = fcals.cal_fbk.scmw_b_fbk7.gain_vs_freq
endelse
gain_f13_2 = nT_volt_f13*gain_fscmw_13
gain_f7_2 = nT_volt_f7*gain_fscmw_7
if ~keyword_set(pT) then unit[1] = 'nT' else $
unit[1] = 'pT'
boomlength[1] = !values.f_nan
end
'VDC': begin
gain[1] = cp.ADC_gain_VDC[0]
gain_f13_2 = replicate(1.,13)
gain_f7_2 = replicate(1.,7)
end
else: dprint, 'Invalid filterbank channel. Calibration aborted.'
endcase
nT = 1.
if source7_13 eq '7' then begin
tvar = rbspx + ['_efw_fbk_7_fb1_av',$
'_efw_fbk_7_fb1_pk',$
'_efw_fbk_7_fb2_av',$
'_efw_fbk_7_fb2_pk']
gains = [gain[0],gain[0],gain[1],gain[1]]
gain_f = [[gain_f7_1],[gain_f7_1],[gain_f7_2],[gain_f7_2]]
offsets = [offset[0],offset[0],offset[1],offset[1]]
channels = [channel[0],channel[0],channel[1],channel[1]]
units = [unit[0],unit[0],unit[1],unit[1]]
unit_conv = replicate(1.,4)
if (channel[0] eq 'SCMU') or (channel[0] eq 'SCMV') or (channel[0] eq 'SCMW') then begin
if ~keyword_set(pT) then unit_conv[0:1] = nT else unit_conv[0:1] = 1000.*nT
endif else unit_conv[0:1] = 1000./boomlength[0]
if (channel[1] eq 'SCMU') or (channel[1] eq 'SCMV') or (channel[1] eq 'SCMW') then begin
if ~keyword_set(pT) then unit_conv[2:3] = nT else unit_conv[2:3] = 1000.*nT
endif else unit_conv[2:3] = 1000./boomlength[1]
for j=0,3 do begin
get_data,tvar[j],data=data,dlim=dlim
if j lt 2 then dlim.data_att.channel = channel[0]
if j ge 2 then dlim.data_att.channel = channel[1]
if dlim.data_att.units eq 'ADC' then begin
tst = size(data)
if tst[0] ne 0 then begin
new_y = double(data.y)
new_y = (new_y - offsets[j]) * gains[j] * unit_conv[j]
gain_tmp = reform(gain_f[*,j])
for f=0,6 do new_y[*,f] = new_y[*,f]*gain_tmp[f]
new_data = {x:data.x,y:new_y,v:data.v}
dlim.data_att.units = units[j]
str_element, dlim, 'cdf', /delete
str_element, dlim, 'code_id', /delete
newname = tvar[j]
store_data, newname,data=new_data,dlim=dlim
options,newname,'ztitle',units[j]+'!C!CRBSP'+probe+' '+channels[j]
options,newname,'ysubtitle',''
if j eq 0 or j eq 2 then $
options,newname,'ytitle','FBK7!Caverage!C[Hz]' $
else options,newname,'ytitle','FBK7!Cpeak!C[Hz]'
endif
endif else print,tvar[j] + ' is already calibrated***************'
endfor
endif
if source7_13 eq '13' then begin
tvar = rbspx + ['_efw_fbk_13_fb1_av',$
'_efw_fbk_13_fb1_pk',$
'_efw_fbk_13_fb2_av',$
'_efw_fbk_13_fb2_pk']
gains = [gain[0],gain[0],gain[1],gain[1]]
gain_f = [[gain_f13_1],[gain_f13_1],[gain_f13_2],[gain_f13_2]]
offsets = [offset[0],offset[0],offset[1],offset[1]]
channels = [channel[0],channel[0],channel[1],channel[1]]
units = [unit[0],unit[0],unit[1],unit[1]]
unit_conv = replicate(1.,4)
if (channel[0] eq 'SCMU') or (channel[0] eq 'SCMV') or (channel[0] eq 'SCMW') then begin
if ~keyword_set(pT) then unit_conv[0:1] = nT else unit_conv[0:1] = 1000.*nT
endif else unit_conv[0:1] = 1000./boomlength[0]
if (channel[1] eq 'SCMU') or (channel[1] eq 'SCMV') or (channel[1] eq 'SCMW') then begin
if ~keyword_set(pT) then unit_conv[2:3] = nT else unit_conv[2:3] = 1000.*nT
endif else unit_conv[2:3] = 1000./boomlength[1]
for j=0,3 do begin
get_data,tvar[j],data=data,dlim=dlim
if j lt 2 then dlim.data_att.channel = channel[0]
if j ge 2 then dlim.data_att.channel = channel[1]
if dlim.data_att.units eq 'ADC' then begin
tst = size(data)
if tst[0] ne 0 then begin
new_y = double(data.y)
new_y = (data.y - offsets[j]) * gains[j] * unit_conv[j]
gain_tmp = reform(gain_f[*,j])
for f=0,12 do new_y[*,f] = new_y[*,f]*gain_tmp[f]
new_data = {x:data.x,y:new_y,v:data.v}
dlim.data_att.units = units[j]
str_element, dlim, 'cdf', /delete
str_element, dlim, 'code_id', /delete
newname = tvar[j]
store_data, newname,data=new_data,dlim=dlim
options,newname,'ztitle',units[j]+'!C!CRBSP'+probe+' ' + channels[j]
options,newname,'ysubtitle',''
if j eq 0 or j eq 2 then $
options,newname,'ytitle','FBK13!Caverage!C[Hz]' $
else options,newname,'ytitle','FBK13!Cpeak!C[Hz]'
endif
endif else print,tvar[j] + ' is already calibrated**************'
endfor
endif
fbk13_binsC = fcals.cal_fbk.freq_fbk13c
fbk7_binsC = fcals.cal_fbk.freq_fbk7c
fbk13_binsL = fcals.cal_fbk.freq_fbk13L
fbk7_binsL = fcals.cal_fbk.freq_fbk7L
fbk13_binsH = fcals.cal_fbk.freq_fbk13H
fbk7_binsH = fcals.cal_fbk.freq_fbk7H
if source7_13 eq '7' then begin
tplot_names,'*fbk_7_fb1*',names=tnames1
tplot_names,'*fbk_7_fb2*',names=tnames2
endif else begin
tplot_names,'*fbk_13_fb1*',names=tnames1
tplot_names,'*fbk_13_fb2*',names=tnames2
endelse
tnames = [tnames1,tnames2]
if tnames[0] ne '' then begin
for i=0,size(tnames,/n_elements)-1 do begin
get_data,tnames[i],data=d,limits=l,dlimits=dl
if source7_13 eq '7' then d.v=fbk7_binsH else d.v=fbk13_binsH
store_data,tnames[i],data=d,limits=l,dlimits=dl
ylim,tnames[i],1,1d4,1
goo = strpos(tnames[i],'fb1')
if goo[0] ne -1 then begin
if (channel[0] eq 'SCMU') or (channel[0] eq 'SCMV') or (channel[0] eq 'SCMW') then begin
if ~keyword_set(pT) then $
zlim,tnames[i],0.0001,0.1,1 else $
zlim,tnames[i],0.1,100.,1
endif else zlim,tnames[i],0.01,1,1
endif
goo = strpos(tnames[i],'fb2')
if goo[0] ne -1 then begin
if (channel[1] eq 'SCMU') or (channel[1] eq 'SCMV') or (channel[1] eq 'SCMW') then begin
if ~keyword_set(pT) then $
zlim,tnames[i],0.0001,0.1,1 else $
zlim,tnames[i],0.1,100.,1
endif else zlim,tnames[i],0.01,1,1
endif
endfor
endif
end