function thm_efi_clean_efp_deconvol_inst_resp, E_array, srate, boom_type
Exf = E_array
nt_burst = n_elements(Exf)
fsample = srate
kernel_length = 512L
df = fsample / double(kernel_length)
f = dindgen(kernel_length)*df
f[kernel_length/2+1:*] -= double(kernel_length) * df
thm_comp_efi_response, boom_type, f, boom_resp, rsheath=5d6, /complex_response
E12_resp = 1 / boom_resp
E12_resp = shift((fft(E12_resp,1)), kernel_length/2) / kernel_length
b_length = 8 * kernel_length
while b_length gt nt_burst do b_length /= 2
indx = where(finite(Exf), nindx)
if nindx ne nt_burst then Exf = interpol(Exf[indx], t[indx], t)
Exf = [Exf, fltarr(kernel_length/2)]
Exf = shift(blk_con(E12_resp, Exf, b_length=b_length),-kernel_length/2)
Exf = Exf[0:nt_burst-1]
return, Exf
end
pro thm_efi_clean_efp, probe=probe, Ename=Ename, Vname=Vname, $
Bdslname=Bdslname, $
trange=trange, talk=talk, $
subsolar=subsolar, $
duration_threshold = duration_threshold, $
Edslname = Edslname, Egsmname = Egsmname, $
Efacname = Efacname, $
SpinNsmooth=SpinNsmooth, SpinPoly=SpinPoly, $
SpinRemove=SpinRemove, $
VscPole=VscPole, Vpoly=Vpoly, $
VscRemove=VscRemove, $
use_electrons=use_electrons, TeName=TeName, $
SpikeRemove=SpikeRemove, SpikeNwin=SpikeNwin, $
SpikeSig=SpikeSig, SpikeSigmin=SpikeSigmin, $
SpikeNfit=SpikeNfit, SpikeFit=SpikeFit, $
EpochRemove=EpochRemove, $
FixAxial=FixAxial, AxPoly=AxPoly, $
Merge=Merge, FMerge=FMerge, $
MergeRatio=MergeRatio, $
MinBz=MinBz, MinRatio=MinRatio, $
BspinPoly=BspinPoly, Bsmooth=Bsmooth
IF not keyword_set(probe) then BEGIN
dprint, 'SC not set. Exiting...'
return
ENDIF
sc = probe(0)
IF keyword_set(subsolar) then BEGIN
if n_elements(Vpoly) EQ 0 then Vpoly = 4
if n_elements(use_electrons) EQ 0 then use_electrons = 0
if n_elements(Axpoly) EQ 0 then Axpoly = 7
if n_elements(Merge) EQ 0 then Merge = 1
if n_elements(MinRatio) EQ 0 then MinRatio = 0.05d
if n_elements(SpinNsmooth) EQ 0 then SpinNsmooth = 19
ENDIF
if n_elements(SpinRemove) EQ 0 then SpinRemove = 4
if n_elements(SpinNsmooth) EQ 0 then SpinNsmooth = 39
if n_elements(VscRemove) EQ 0 then VscRemove = 1
if n_elements(VscPole) EQ 0 then VscPole = 5.0d
if n_elements(Vpoly) EQ 0 then Vpoly = 2
if n_elements(SpikeRemove) EQ 0 then SpikeRemove = 1
if n_elements(FixAxial) EQ 0 then FixAxial = 0
if n_elements(Axpoly) EQ 0 then Axpoly = 2
if keyword_set(merge) then Fmerge = 5.0d
if not keyword_set(merge) then Fmerge = 0
IF keyword_set(merge) then BEGIN
if merge EQ 2 then softmerge=1
ENDIF
if n_elements(BspinPoly) EQ 0 then BspinPoly = 2
if n_elements(Bsmooth) EQ 0 then Bsmooth = 11
if n_elements(duration_threshold) eq 0 then duration_threshold = 15.
if not keyword_set(Ename) then Ename = 'th' + sc + '_efp'
IF thm_check_tvar(Ename) then BEGIN
get_data, ename(0), data=E, dlim=elim
if ~strcmp(elim.data_att.coord_sys, 'dsl', /fold) then begin
dprint, Ename + ' is not in DSL. Exiting...'
return
endif
ENDIF ELSE BEGIN
thm_load_efi, probe=sc, datatype=['efp', 'vap'], coord='dsl', trange=trange
get_data, ename(0), data=E, dlim=elim
IF size(/type,E) NE 8 then BEGIN
dprint, 'Cannot get electric field data. Exiting...'
return
ENDIF
ENDELSE
if ~keyword_set(Vname) then Vname = 'th' + sc + '_vap'
if ~keyword_set(Vscname) then Vscname = 'th' + sc + '_vsc'
IF thm_check_tvar(Vscname) then BEGIN
get_data, Vscname[0], data=Vsc
ENDIF ELSE BEGIN
thm_efi_get_potential, Vname(0), trange=trange
get_data, Vscname[0], data=Vsc
IF size(/type,Vsc) NE 8 then BEGIN
dprint, 'Cannot get SC potential. Exiting...'
return
ENDIF
ENDELSE
if not keyword_set(Bdslname) then Bdslname = 'th' + sc + '_fgh_dsl'
IF thm_check_tvar(Bdslname) then BEGIN
get_data, Bdslname(0), data=Bdsl, dlim=blim
ENDIF ELSE BEGIN
dprint, 'Mag data not stored in dsl. Fetching...'
thm_load_fgm, probe=sc, datatype = ['fgh'], coord=['dsl'], trange=trange, $
level = 2
Bdslname = 'th' + sc + '_fgh_dsl'
get_data, Bdslname(0), data=Bdsl, dlim=blim
IF size(/type,Bdsl) NE 8 then BEGIN
dprint, 'Cannot get MAG data. Exiting...'
return
ENDIF
ENDELSE
SpinName = 'th' + sc + '_state_spinper'
IF thm_check_tvar(Spinname) then BEGIN
get_data, SpinName[0], data=SpinPer
ENDIF ELSE BEGIN
thm_load_state, probe=sc, datatype='spinper'
get_data, SpinName[0], data=SpinPer
IF size(/type,SpinPer) NE 8 THEN BEGIN
dprint, 'Cannot get spin period. Exiting...'
return
ENDIF
ENDELSE
use_electrons = 0
E = {x:E.x, y:E.y}
vsc = {x:vsc.x, y:vsc.y}
Bdsl = {x:Bdsl.x, y:Bdsl.y}
IF keyword_set(trange) then BEGIN
trange_clip, E, trange(0), trange(1), /data, BadClip=BadEclip
trange_clip, Vsc, trange(0), trange(1), /data, BadClip=BadVclip
trange_clip, Bdsl, trange(0), trange(1), /data, BadClip=BadBclip
trange_clip, SpinPer, trange(0)-60.d, trange(1)+60.d, /data, BadClip=BadSclip
IF (keyword_set(BadEclip) OR keyword_set(BadVclip) OR $
keyword_set(BadBclip) OR $
keyword_set(BadSclip) OR keyword_set(BadPclip) ) THEN BEGIN
dprint, 'Problem with trange clip. Exiting...'
dprint, '0=OK; 1=Problem. E:', BadEclip, 'V:', BadVclip, 'B:', $
BadBclip, 'Spin:', BadSclip
return
ENDIF
ENDIF
EderSave = E.y(*,0) * 0
tE = E.x
thm_lsp_find_burst, E, istart=bstart, iend=bend, nbursts=nbursts, mdt=mdt
srate = round(1d / median(tE[1:*] - tE)) + 0d
FOR ib=0L, nbursts-1 DO BEGIN
dprint, 'BURST: ', ib+1, ' out of: ', nbursts
t = tE(bstart(ib):bend(ib))
Ex = E.y(bstart(ib):bend(ib),0)
Ey = E.y(bstart(ib):bend(ib),1)
Ez = E.y(bstart(ib):bend(ib),2)
Ttemp = [min(t)-mdt/2, max(t)+mdt/2]
blen = tE[bend[ib]] - tE[bstart[ib]]
dprint, 'burst temporal length = ', blen
if blen lt duration_threshold then begin
dprint, 'Burst #' + string(ib + 1, format='(I0)') + $
' is shorter than ' + string(duration_threshold, form = '(I0)') + $
' second ' + $
'and is skipped from cleaning.'
EderSave(bstart(ib):bend(ib)) = !values.d_nan
continue
endif
Ex = thm_efi_clean_efp_deconvol_inst_resp(Ex, srate, 'SPB')
Ey = thm_efi_clean_efp_deconvol_inst_resp(Ey, srate, 'SPB')
Ez = thm_efi_clean_efp_deconvol_inst_resp(Ez, srate, 'AXB')
ind = where( (SpinPer.x GE (Ttemp(0)-60.d)) AND $
(SpinPer.x LE (Ttemp(1)+60.d)), nind)
IF nind EQ 0 then BEGIN
dprint, 'Spin period missing during burst. Exiting...'
return
ENDIF
per = median(spinper.y(ind))
VscTemp = Vsc
trange_clip, VscTemp, Ttemp(0), Ttemp(1), /data
VscF = thm_lsp_remove_spintone(VscTemp.x, VscTemp.y, per, $
talk=talk, ns=SpinNsmooth, sp = spinpoly, fail = fail)
if fail gt 0 then VscF = VscTemp.y
VscF_old = VscF
VscF = thm_lsp_remove_spintone(VscTemp.x, VscF, per/2, $
talk=talk, ns=SpinNsmooth, sp = spinpoly, fail = fail)
if fail gt 0 then VscF = VscF_old
VscF_old = VscF
VscF = thm_lsp_remove_spintone(VscTemp.x, VscF, per/4, $
talk=talk, ns=SpinNsmooth, sp = spinpoly, fail = fail)
if fail gt 0 then VscF = VscF_old
IF keyword_set(SpinRemove) then BEGIN
Exf = thm_lsp_remove_spintone(t, Ex, per, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Exf = Ex
Eyf = thm_lsp_remove_spintone(t, Ey, per, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Eyf = Ey
Ezf = thm_lsp_remove_spintone(t, Ez, per, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Ezf = Ez
IF ( (SpinRemove EQ 2) OR (SpinRemove GE 4) ) then BEGIN
Exf_old = Exf
Exf = thm_lsp_remove_spintone(t, Exf, per/2, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Exf = Exf_old
Eyf_old = Eyf
Eyf = thm_lsp_remove_spintone(t, Eyf, per/2, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Eyf = Eyf_old
Ezf_old = Ezf
Ezf = thm_lsp_remove_spintone(t, Ezf, per/2, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Ezf = Ezf_old
ENDIF
IF (SpinRemove GE 3) then BEGIN
Exf_old = Exf
Exf = thm_lsp_remove_spintone(t, Exf, per/4, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Exf = Exf_old
Eyf_old = Eyf
Eyf = thm_lsp_remove_spintone(t, Eyf, per/4, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Eyf = Eyf_old
Ezf_old = Ezf
Ezf = thm_lsp_remove_spintone(t, Ezf, per/4, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Ezf = Ezf_old
ENDIF
ENDIF
if keyword_set(VscRemove) then $
Ezf = thm_lsp_remove_potential(t, Ezf, VscTemp.x, VscF, peeb_t=peeb_t, $
VscPole=VscPole, Vpoly=Vpoly, talk=talk)
IF keyword_set(SpikeRemove) then BEGIN
thm_lsp_remove_spikes, t, Exf, Eyf, Ezf, per, Nwin=SpikeNwin, $
SpikeSig=SpikeSig, Sigmin=SpikeSigmin, Nfit=SpikeNfit, Fit=SpikeFit, $
talk=talk, diagnose=diagnose, wt=wt
ENDIF
IF keyword_set(SpinRemove) then BEGIN
Exf_old = Exf
Exf = thm_lsp_remove_spintone(t, Exf, per, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Exf = Exf_old
Eyf_old = Eyf
Eyf = thm_lsp_remove_spintone(t, Eyf, per, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Eyf = Eyf_old
Ezf_old = Ezf
Ezf = thm_lsp_remove_spintone(t, Ezf, per, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Ezf = Ezf_old
IF ( (SpinRemove EQ 2) OR (SpinRemove GE 4) ) then BEGIN
Exf_old = Exf
Exf = thm_lsp_remove_spintone(t, Exf, per/2, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Exf = Exf_old
Eyf_old = Eyf
Eyf = thm_lsp_remove_spintone(t, Eyf, per/2, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Eyf = Eyf_old
Ezf_old = Ezf
Ezf = thm_lsp_remove_spintone(t, Ezf, per/2, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Ezf = Ezf_old
ENDIF
IF (SpinRemove GE 3) then BEGIN
Exf_old = Exf
Exf = thm_lsp_remove_spintone(t, Exf, per/4, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Exf = Exf_old
Eyf_old = Eyf
Eyf = thm_lsp_remove_spintone(t, Eyf, per/4, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Eyf = Eyf_old
Ezf_old = Ezf
Ezf = thm_lsp_remove_spintone(t, Ezf, per/4, $
talk=talk, ns=SpinNsmooth, sp=spinpoly, fail = fail)
if fail gt 0 then Ezf = Ezf_old
ENDIF
ENDIF
IF keyword_set(EpochRemove) then BEGIN
Exf = thm_lsp_remove_spin_epoch(t, Exf, per, talk=talk)
Eyf = thm_lsp_remove_spin_epoch(t, Eyf, per, talk=talk)
Ezf = thm_lsp_remove_spin_epoch(t, Ezf, per, talk=talk)
ENDIF
Btemp = Bdsl
IF keyword_set(FixAxial) then BEGIN
Etemp = E
trange_clip, Etemp, Ttemp(0), Ttemp(1), /data
trange_clip, Btemp, Ttemp(0), Ttemp(1), /data
Etemp.y(*,0) = Exf
Etemp.y(*,1) = Eyf
Etemp.y(*,2) = Ezf
Eder = thm_lsp_derive_Ez(Etemp, Btemp, minBz=minBz, $
minRat=MinRatio, ratio=ratio)
Ezf = thm_lsp_fix_axial(t, Ezf, Eder, talk=talk, $
AxPoly=Axpoly, soft=softmerge, $
Fmerge=Fmerge, MergeRatio=MergeRatio, ratio=ratio)
EderSave(bstart(ib):bend(ib)) = Eder
ENDIF
E.y(bstart(ib):bend(ib),0) = Exf
E.y(bstart(ib):bend(ib),1) = Eyf
E.y(bstart(ib):bend(ib),2) = Ezf
magstart = value_locate(Bdsl.x, Btemp.x(0)+1.d-8)
magstop = magstart + n_elements(Btemp.x) - 1L
IF BspinPoly GE 0 then BEGIN
tmp = thm_lsp_remove_spintone(Btemp.x, Btemp.y(*,0), per, $
talk=talk, spinpoly=Bspinpoly, fail = fail)
if fail eq 0 then Btemp.y[*, 0] = tmp
tmp = thm_lsp_remove_spintone(Btemp.x, Btemp.y(*,1), per, $
talk=talk, spinpoly=Bspinpoly, fail = fail)
if fail eq 0 then Btemp.y[*, 1] = tmp
tmp = thm_lsp_remove_spintone(Btemp.x, Btemp.y(*,2), per, $
talk=talk, spinpoly=Bspinpoly, fail = fail)
if fail eq 0 then Btemp.y[*, 2] = tmp
ENDIF
IF Bsmooth GT 1 THEN BEGIN
Btemp.y(*,0) = smooth(Btemp.y(*,0), Bsmooth, /nan, /edge_trunc)
Btemp.y(*,1) = smooth(Btemp.y(*,1), Bsmooth, /nan, /edge_trunc)
Btemp.y(*,2) = smooth(Btemp.y(*,2), Bsmooth, /nan, /edge_trunc)
ENDIF
Bdsl.y(magstart:magstop, 0) = Btemp.y(*,0)
Bdsl.y(magstart:magstop, 1) = Btemp.y(*,1)
Bdsl.y(magstart:magstop, 2) = Btemp.y(*,2)
ENDFOR
data_att = {DATA_TYPE: elim.data_att.DATA_TYPE, $
COORD_SYS: elim.data_att.COORD_SYS, $
UNITS: elim.data_att.UNITS, $
CAL_PAR_TIME: elim.data_att.CAL_PAR_TIME, $
OFFSET: elim.data_att.OFFSET, $
EDC_GAIN: elim.data_att.EDC_GAIN, $
EAC_GAIN: elim.data_att.EAC_GAIN, $
BOOM_LENGTH: elim.data_att.BOOM_LENGTH, $
BOOM_SHORTING_FACTOR: elim.data_att.BOOM_SHORTING_FACTOR, $
DSC_OFFSET: elim.data_att.DSC_OFFSET, $
BAND: 'DC - ~50 Hz'}
if ~keyword_set(Edslname) then Edslname = Ename + '_clean_dsl'
ename2 = Edslname
dlim = {CDF: elim.cdf, SPEC: 0b, LOG: 0b, YSUBTITLE: '(mV/m)', $
DATA_ATT: data_att, COLORS: elim.colors, $
LABELS: ['Ex', 'Ey', 'Ez'], LABFLAG: elim.labflag, $
YTITLE: 'E_DSL (th' + sc +')'}
store_data, ename2[0], data=E, dlim=dlim
bname2 = Bdslname + '_smooth'
store_data, bname2[0], data=Bdsl, dlim=blim
if keyword_set(FixAxial) then begin
Edername = ename + '_derived'
Etemp = dblarr(n_elements(E.x),4)
Etemp(*,0) = E.y(*,0)
Etemp(*,1) = E.y(*,1)
Etemp(*,2) = E.y(*,2)
Etemp(*,3) = EderSave
dlim = {CDF: elim.cdf, SPEC: 0b, LOG: 0b, YSUBTITLE: '(mV/m)', $
DATA_ATT: data_att, COLORS: [elim.colors, 0], $
LABELS: ['Ex', 'Ey', 'Ez', 'E!Dzder!N'], LABFLAG: elim.labflag, $
YTITLE: 'E - ' + data_att.coord_sys}
store_data, Edername[0], data={X:E.x, Y: Etemp, V: [1,2,3,4]}, dlim=dlim
endif
if ~keyword_set(Egsmname) then Egsmname = Ename + '_clean_gsm'
thm_cotrans, ename2, egsmname, in_coord='dsl', out_coord='gsm'
get_data, egsmname[0], data = data
data_att.coord_sys = 'gsm'
dlim = {CDF: elim.cdf, SPEC: 0b, LOG: 0b, YSUBTITLE: '(mV/m)', $
DATA_ATT: data_att, COLORS: elim.colors, $
LABELS: ['Ex', 'Ey', 'Ez'], LABFLAG: elim.labflag, $
YTITLE: 'E_GSM (th' + sc +')'}
store_data, egsmname[0], data = data, dlim = dlim
if ~keyword_set(Efacname) then Efacname = Ename + '_clean_fac'
thm_lsp_clean_timestamp, bname2
thm_lsp_clean_timestamp, ename2
thm_fac_matrix_make, bname2, other_dim='zdsl', newname='th'+sc+'_fgh_fac_mat'
tvector_rotate, 'th'+sc+'_fgh_fac_mat', ename2, $
newname=efacname, error=error
get_data, efacname[0], data = data
perp1 = 'E!DSP!N'
perp2 = 'E!Dperp!N'
para = 'E!D||!N'
data_att.coord_sys = 'fac: x in spin-plane'
dlim = {CDF: elim.cdf, SPEC: 0b, LOG: 0b, YSUBTITLE: '(mV/m)', $
DATA_ATT: data_att, COLORS: elim.colors, $
LABELS: [perp1, perp2, para], LABFLAG: elim.labflag, $
YTITLE: 'E_FAC (th' + sc +')'}
store_data, efacname[0], data = data, dlim = dlim
thx = 'th' + sc + '_'
store_data, [bname2[0], thx + 'fgh_fac_mat'], /del
end