RPW lead CoI for LFR
thomas.chust@lpp.polytechnique.fr


#%matplotlib inline
%matplotlib notebook
import sys
import os
print('sys.path:', sys.path, '\n')
# python package directory "tch" shall be included in sys.path
# or its content shall be copied in the present tutorial working directory
import matplotlib.pyplot as plt
import numpy as np
import glob
from spacepy import pycdf
from datetime import datetime, timedelta
from numpy.linalg import norm
from lib_lfr.global_params import *
from lib_lfr.load_routines import (load_bp2_CDF_L2, load_bp1_CDF_L2,
load_swf_e_CDF_L2, load_swf_b_CDF_L2,
load_cwf_b_CDF_L2, load_cwf_e_CDF_L2,
meld_swf_E_bias_L2, meld_cwf_E_bias_L2)
from lib_lfr.calib_routines import sm_from_swf, sm_from_cwf
from lib_lfr.transform_routines import transform_from_UARF_to_SRF
from lib_lfr.time_routines import index_from_date
from lib_lfr.bp_routines import Fce_from_B0, wave_normal_vector_theta, sm_3b2e_bp1
from lib_lfr.swf_routines import select_oneSWF, filtering_oneSWF, fig_oneSWF
from lib_plot.spectral_routines import fig_spectrograms
from lib_plot.curves_routines import fig_waveforms
from lib_solo.load_routines import load_mag_CDF_L2
from lib_maths.conversion_routines import B_to_Fce
dir_plots = './plots' # shall be defined in the present tutorial working directory
#dir_plots = '/home/chust/Plots'
sys.path: ['/Users/xbonnin/Work/Projects/SolarOrbiter/RPW/ROC/Software/Git/Tutorials/python-lfr-tutorial', '/Users/xbonnin/Work/Software/StartupItems/Python/Library', '/Users/xbonnin/Work/Projects/SolarOrbiter/RPW/ROC/Software/Git/Tutorials/python-lfr-tutorial', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python38.zip', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload', '', '/Users/xbonnin/.virtualenvs/notebook/lib/python3.8/site-packages']
Thomas' shared links
Solar Orbiter school
LESIA
ESA
The LFR signal processing, based on a FPGA, provides routinely,
at different time and frequency resolutions:
A. LFR Normal Mode (NM)
B. LFR Burst Mode (BM) and Selected Burst Mode 2 (SBM2)
C. LFR Selected Burst Mode 1 (SBM1)
def filter_scm_swf_QBM(scm_swf, l2_quality_bitmask, value=np.nan):
"""
scm_swf[npt, 3], i.e. reshaped swf
npt = nsnap x 2048
"""
scm_swf_filtered = scm_swf.copy()
tag_per_swf = (l2_quality_bitmask & 2) == 2
reshaped_tag = np.ravel(np.full((2048, len(tag_per_swf)), tag_per_swf), order='F')
scm_swf_filtered[reshaped_tag, :] = value
return scm_swf_filtered
def filter_scm_cwf_QBM(scm_cwf, l2_quality_bitmask, value=np.nan):
"""
scm_cwf[npt, 3]
"""
scm_cwf_filtered = scm_cwf.copy()
scm_cwf_filtered[(l2_quality_bitmask & 2) == 2, :] = value
return scm_cwf_filtered
def transform_from_ANT_to_SRF_bis(E, A2Y=-6.99, A1Z=-7.04, alpha12=1.):
"""
E(npts, ncomp): input array of 2-D vectors of differential potential measurement expressed in the
ANT coordinate system (ANT12, ANT23) in V (or count) unit (Vij = Vi - Vj, so that
it points in the direction of the corresponding electric field)
to be transformed and calibrated into the SRF (so called "Spacecraft") coordinate
system in V/m (or count/m) unit.
E_output(:, 0): EY = -V23 / Leff_Y
E_output(:, 1): EZ = -(2*V12*alpha12 + V23) / 2 / Leff_Z
when alpha12 >> 1 then EZ = -V12 * (alpha12/Leff_Z)
"""
return np.stack((E[:,1] / A2Y, (2*alpha12*E[:,0] + E[:,1]) / (2*A1Z)), axis=-1)
dir_DATA = os.path.join(os.getcwd(), 'data') # shall be defined in the present tutorial working directory
print("Data directory: %s"%(dir_DATA))
YYYY = '2022'
MM = '03'
DD = '26'
day_data = YYYY + MM + DD
print("Day of the data: %s"%(day_data))
Data directory: /Users/xbonnin/Work/Projects/SolarOrbiter/RPW/ROC/Software/Git/Tutorials/python-lfr-tutorial/data Day of the data: 20220326
cdffiles=glob.glob(os.path.join(dir_DATA, '*srf*normal*' + day_data + '*'))
cdffiles.sort()
for file in cdffiles:
print(os.path.basename(file))
mag_l2_cdffile = cdffiles[0]
mag_l2_bname = os.path.basename(mag_l2_cdffile)[:-4]
solo_L2_mag-srf-normal-internal_20220326_V00.cdf
t1, t2 = None, None
#t1, t2 = datetime(2022, 3, 26, 17, 0, 0), datetime(2022, 3, 26, 22, 0, 0)
raw_mag = False
mag_bvec, mag_time = load_mag_CDF_L2(mag_l2_cdffile, t1=t1, t2=t2, raw_Epoch=raw_mag, echo=True,
key_attrs=None, key_field=None)
mag_fce = B_to_Fce(norm(mag_bvec, axis=-1), nT=True, kHz=False)
PRINT cdf: B_SRF: CDF_FLOAT [691205, 3] EPOCH: CDF_TIME_TT2000 [691205] LBL1_B_SRF: CDF_UCHAR*3 [3] NRV QUALITY_BITMASK: CDF_UINT2 [691205] QUALITY_FLAG: CDF_UINT1 [691205] REP1_B_SRF: CDF_UCHAR*1 [3] NRV VECTOR_RANGE: CDF_UINT1 [691205] VECTOR_TIME_RESOLUTION: CDF_FLOAT [691205] start: 2022-03-26 00:00:00.095986 stop: 2022-03-26 23:59:59.991692 => 691205 elements Sampling frequency: 8.000041961890021
#plt.rcParams["date.autoformatter.hour"] = '%Y-%m-%d %H'
plt.rcParams["date.autoformatter.hour"] = '%H'
plt.rcParams["date.autoformatter.minute"] = '%H:%M'
plt.rcParams["date.autoformatter.second"] = '%H:%M:%S.%f'
fig=plt.figure(figsize=(9,5))
plt.title(mag_l2_bname)
plt.ylabel('nT')
plt.xlabel('tt2000 seconds' if raw_mag else '')
mag_comp = ['Bx_SRF', 'By_SRF', 'Bz_SRF']
for icomp in range(3):
plt.plot(mag_time/1e9 if raw_mag else mag_time, mag_bvec[:,icomp], label=mag_comp[icomp])
plt.plot(mag_time/1e9 if raw_mag else mag_time, norm(mag_bvec, axis=-1), color='black', label='|B|')
plt.legend(loc='lower right', ncol=4)
plt.grid(True)
fig.autofmt_xdate(rotation=30, ha='right')
cdffiles=glob.glob(os.path.join(dir_DATA, '*lfr*surv*bp1_' + day_data + '*'))
cdffiles.sort()
for file in cdffiles:
print(os.path.basename(file))
bp1_l2_cdffile = cdffiles[0]
bp1_l2_bname = os.path.basename(bp1_l2_cdffile)[:-4]
solo_L2_rpw-lfr-surv-bp1_20220326_V01.cdf
bp1_l2_cdf = load_bp1_CDF_L2(bp1_l2_cdffile, echo=True, params=True, params_bias=True,
key_attrs=['Software_version', 'Parents'], key_field=None,
key_field_attrs=['PB_N_F0'],
fill_value=None, SRF=True)
(bp1_l2_n_pb, bp1_l2_n_pe, bp1_l2_n_dop, bp1_l2_n_nvec, bp1_l2_n_ellip,
bp1_l2_n_sx_rea, bp1_l2_n_sx_arg, bp1_l2_n_vphi_rea, bp1_l2_n_vphi_arg,
bp1_l2_n_epoch, bp1_l2_n_freq, bp1_l2_n_params, bp1_l2_n_params_bias,
bp1_l2_b_pb, bp1_l2_b_pe, bp1_l2_b_dop, bp1_l2_b_nvec, bp1_l2_b_ellip,
bp1_l2_b_sx_rea, bp1_l2_b_sx_arg, bp1_l2_b_vphi_rea, bp1_l2_b_vphi_arg,
bp1_l2_b_epoch, bp1_l2_b_freq, bp1_l2_b_params, bp1_l2_b_params_bias) = bp1_l2_cdf
bp1_l2_n_epoch_datetime = 3*[None]
for F in [0,1,2]:
bp1_l2_n_epoch_datetime[F] = pycdf.lib.v_tt2000_to_datetime(bp1_l2_n_epoch[F])
bp1_l2_b_epoch_datetime = 2*[None]
for F in [0,1]:
bp1_l2_b_epoch_datetime[F] = pycdf.lib.v_tt2000_to_datetime(bp1_l2_b_epoch[F])
# incorparated in CALBUT version >= 2.0
corr_bp1_l2 = 4
psd_bp1_l2 = True
PRINT cdf: BIAS_MODE_BIAS1_ENABLED: CDF_UINT1 [69322] BIAS_MODE_BIAS2_ENABLED: CDF_UINT1 [69322] BIAS_MODE_BIAS3_ENABLED: CDF_UINT1 [69322] BIAS_MODE_HV_ENABLED: CDF_UINT1 [69322] BIAS_MODE_MUX_SET: CDF_UINT1 [69322] BIAS_ON_OFF: CDF_UINT1 [69322] BP1_CNT: CDF_UINT1 [0] BW: CDF_UINT1 [69322] B_F0: CDF_REAL4 [22] NRV B_F1: CDF_REAL4 [26] NRV COMMON_BIA_STATUS_FLAG: CDF_UINT1 [0] DOP_B_F0: CDF_REAL4 [3732, 22] DOP_B_F1: CDF_REAL4 [3732, 26] DOP_N_F0: CDF_REAL4 [20620, 11] DOP_N_F1: CDF_REAL4 [20619, 13] DOP_N_F2: CDF_REAL4 [20619, 12] ELLIP_B_F0: CDF_REAL4 [3732, 22] ELLIP_B_F1: CDF_REAL4 [3732, 26] ELLIP_N_F0: CDF_REAL4 [20620, 11] ELLIP_N_F1: CDF_REAL4 [20619, 13] ELLIP_N_F2: CDF_REAL4 [20619, 12] Epoch: CDF_TIME_TT2000 [69322] Epoch_B_F0: CDF_TIME_TT2000 [3732] Epoch_B_F1: CDF_TIME_TT2000 [3732] Epoch_N_F0: CDF_TIME_TT2000 [20620] Epoch_N_F1: CDF_TIME_TT2000 [20619] Epoch_N_F2: CDF_TIME_TT2000 [20619] FREQ: CDF_UINT1 [69322] L2_QUALITY_BITMASK: CDF_UINT2 [69322] NVEC_B_F0: CDF_REAL4 [3732, 22, 3] NVEC_B_F0_SRF: CDF_REAL4 [3732, 22, 3] NVEC_B_F1: CDF_REAL4 [3732, 26, 3] NVEC_B_F1_SRF: CDF_REAL4 [3732, 26, 3] NVEC_N_F0: CDF_REAL4 [20620, 11, 3] NVEC_N_F0_SRF: CDF_REAL4 [20620, 11, 3] NVEC_N_F1: CDF_REAL4 [20619, 13, 3] NVEC_N_F1_SRF: CDF_REAL4 [20619, 13, 3] NVEC_N_F2: CDF_REAL4 [20619, 12, 3] NVEC_N_F2_SRF: CDF_REAL4 [20619, 12, 3] N_F0: CDF_REAL4 [11] NRV N_F1: CDF_REAL4 [13] NRV N_F2: CDF_REAL4 [12] NRV PB_B_F0: CDF_REAL8 [3732, 22] PB_B_F1: CDF_REAL8 [3732, 26] PB_N_F0: CDF_REAL8 [20620, 11] PB_N_F1: CDF_REAL8 [20619, 13] PB_N_F2: CDF_REAL8 [20619, 12] PE_B_F0: CDF_REAL8 [3732, 22] PE_B_F1: CDF_REAL8 [3732, 26] PE_N_F0: CDF_REAL8 [20620, 11] PE_N_F1: CDF_REAL8 [20619, 13] PE_N_F2: CDF_REAL8 [20619, 12] QUALITY_BITMASK: CDF_UINT2 [69322] QUALITY_FLAG: CDF_UINT1 [69322] R0: CDF_UINT1 [69322] R1: CDF_UINT1 [69322] R2: CDF_UINT1 [69322] SCET: CDF_REAL8 [69322] SP0: CDF_UINT1 [69322] SP1: CDF_UINT1 [69322] SURVEY_MODE: CDF_UINT1 [69322] SX_ARG_B_F0: CDF_UINT1 [3732, 22] SX_ARG_B_F1: CDF_UINT1 [3732, 26] SX_ARG_N_F0: CDF_UINT1 [20620, 11] SX_ARG_N_F1: CDF_UINT1 [20619, 13] SX_ARG_N_F2: CDF_UINT1 [20619, 12] SX_REA_B_F0: CDF_REAL8 [3732, 22] SX_REA_B_F1: CDF_REAL8 [3732, 26] SX_REA_N_F0: CDF_REAL8 [20620, 11] SX_REA_N_F1: CDF_REAL8 [20619, 13] SX_REA_N_F2: CDF_REAL8 [20619, 12] SYNCHRO_FLAG: CDF_UINT1 [69322] VPHI_ARG_B_F0: CDF_UINT1 [3732, 22] VPHI_ARG_B_F1: CDF_UINT1 [3732, 26] VPHI_ARG_N_F0: CDF_UINT1 [20620, 11] VPHI_ARG_N_F1: CDF_UINT1 [20619, 13] VPHI_ARG_N_F2: CDF_UINT1 [20619, 12] VPHI_REA_B_F0: CDF_REAL8 [3732, 22] VPHI_REA_B_F1: CDF_REAL8 [3732, 26] VPHI_REA_N_F0: CDF_REAL8 [20620, 11] VPHI_REA_N_F1: CDF_REAL8 [20619, 13] VPHI_REA_N_F2: CDF_REAL8 [20619, 12] cdf['PB_N_F0'].attrs: CATDESC: Spectral power of B field in normal mode at F0 [CDF_CHAR] DEPEND_0: Epoch_N_F0 [CDF_CHAR] DISPLAY_TYPE: time_series [CDF_CHAR] FIELDNAM: PB_N_F0 [CDF_CHAR] FILLVAL: -1e+31 [CDF_REAL8] FORMAT: F32.6 [CDF_CHAR] LABLAXIS: PB_N_F0 [CDF_CHAR] SCALEMAX: 1e+30 [CDF_REAL8] SCALEMIN: -1e+30 [CDF_REAL8] SCALETYP: linear [CDF_CHAR] UNITS: [CDF_CHAR] VALIDMAX: 1e+30 [CDF_REAL8] VALIDMIN: -1e+30 [CDF_REAL8] VAR_NOTES: [CDF_CHAR] VAR_TYPE: data [CDF_CHAR] Software_version: 2.0.5 Parents: solo_L1_rpw-lfr-surv-bp1-cdag_20220326_V03.cdf solo_HK_rpw-lfr_20220326_V04.cdf solo_HK_rpw-bia_20220326_V04.cdf SOLO_CAL_RCT-LFR-SCM_V20190123171020.cdf SOLO_CAL_RCT-LFR-BIAS_V20190123171020.cdf SOLO_CAL_RCT-LFR-VHF_V20200720165743.cdf SOLO_CAL_RPW-SCM_SCM-FS-MEB-PFM_V20200428000000.cdf SOLO_CAL_RPW-BIAS_V202011191204.cdf SOLO_CAL_RPW-HF-PREAMP_V20200624000000.cdf bp1_n_time_epoch F0: (20620,) bp1_n_pb F0: (20620, 11) bp1_n_pe F0: (20620, 11) bp1_n_dop F0: (20620, 11) bp1_n_nvec F0: (20620, 11, 3) bp1_n_ellip F0: (20620, 11) bp1_n_sx_rea F0: (20620, 11) bp1_n_sx_arg F0: (20620, 11) bp1_n_vphi_rea F0: (20620, 11) bp1_n_vphi_arg F0: (20620, 11) bp1_n_freq F0: (11,) bp1_n_nvec is expressed in SRF bp1_n_time_epoch F1: (20619,) bp1_n_pb F1: (20619, 13) bp1_n_pe F1: (20619, 13) bp1_n_dop F1: (20619, 13) bp1_n_nvec F1: (20619, 13, 3) bp1_n_ellip F1: (20619, 13) bp1_n_sx_rea F1: (20619, 13) bp1_n_sx_arg F1: (20619, 13) bp1_n_vphi_rea F1: (20619, 13) bp1_n_vphi_arg F1: (20619, 13) bp1_n_freq F1: (13,) bp1_n_nvec is expressed in SRF bp1_n_time_epoch F2: (20619,) bp1_n_pb F2: (20619, 12) bp1_n_pe F2: (20619, 12) bp1_n_dop F2: (20619, 12) bp1_n_nvec F2: (20619, 12, 3) bp1_n_ellip F2: (20619, 12) bp1_n_sx_rea F2: (20619, 12) bp1_n_sx_arg F2: (20619, 12) bp1_n_vphi_rea F2: (20619, 12) bp1_n_vphi_arg F2: (20619, 12) bp1_n_freq F2: (12,) bp1_n_nvec is expressed in SRF bp1_b_time_epoch F0: (3732,) bp1_b_pb F0: (3732, 22) bp1_b_pe F0: (3732, 22) bp1_b_dop F0: (3732, 22) bp1_b_nvec F0: (3732, 22, 3) bp1_b_ellip F0: (3732, 22) bp1_b_sx_rea F0: (3732, 22) bp1_b_sx_arg F0: (3732, 22) bp1_b_vphi_rea F0: (3732, 22) bp1_b_vphi_arg F0: (3732, 22) bp1_b_freq F0: (22,) bp1_b_nvec is expressed in SRF bp1_b_time_epoch F1: (3732,) bp1_b_pb F1: (3732, 26) bp1_b_pe F1: (3732, 26) bp1_b_dop F1: (3732, 26) bp1_b_nvec F1: (3732, 26, 3) bp1_b_ellip F1: (3732, 26) bp1_b_sx_rea F1: (3732, 26) bp1_b_sx_arg F1: (3732, 26) bp1_b_vphi_rea F1: (3732, 26) bp1_b_vphi_arg F1: (3732, 26) bp1_b_freq F1: (26,) bp1_b_nvec is expressed in SRF
cmap_list = 7*[plt.cm.jet] + [plt.cm.seismic] + [plt.cm.PiYG]
ampl_rg_N_F0F1F2_BP1 = [[[2e-10, 6e-9],[2e-12/49, 2e-9/49],[0.01, 0.99],[0.01, 0.99],
[-0.999, 0.999],[-0.999, 0.999], [-0.999, 0.999],
[-0.5/800*4, 0.5/800*4],[-0.2, 1.2]],
[[3e-10, 6e-7],[4e-11/49, 2e-8/49],[0.01, 0.99],[0.01, 0.99],
[-0.999, 0.999],[-0.999, 0.999], [-0.999, 0.999],
[-0.5/80*4, 0.5/80*4],[-0.2, 1.2]],
[[3e-8, 3e-3],[2e-10/49, 2e-6/49],[0.01, 0.99],[0.01, 0.99],
[-0.999, 0.999],[-0.999, 0.999], [-0.999, 0.999],
[-0.5/8*4, 0.5/8*4],[-0.2, 1.2]]]
#for F in [0,1,2]:
for F in [2]:
ampl_range = ampl_rg_N_F0F1F2_BP1[F]
#ampl_range = None
#date_fmt = '%Y-%m-%d %H:%M:%S'
date_fmt = '%H:%M'
#date_fmt = '%H:%M:%S'
#date_fmt = None
fig_spectrograms([bp1_l2_n_pb[F], bp1_l2_n_pe[F], bp1_l2_n_dop[F], bp1_l2_n_ellip[F],
bp1_l2_n_nvec[F][...,0], bp1_l2_n_nvec[F][...,1], bp1_l2_n_nvec[F][...,2],
bp1_l2_n_sx_rea[F], bp1_l2_n_sx_arg[F]],
bp1_l2_n_epoch_datetime[F], bp1_l2_n_freq[F],
cmap=cmap_list, figsize=(10,22), hspace=0.05, cbar_aspect=15, cbar_pad=0.02,
fontsize=(15,14), fs_name=14, fs_title=13, ticklabel_fs=(13,12), cbar_ticklabel_fs=11,
ylabel='freq. (Hz)', xlabel=True, xtl_rot=0., xtl_ha='center', dt_i1i2=1, date_fmt=date_fmt,
fname=dir_plots+'/'+bp1_l2_bname+'_BP1_F%s_spectrogram_all-srf_corr=%4.2f.png'%(F, corr_bp1_l2),
log=[True, True, False, False, False, False, False, False, False],
psd=[True, True, False, False, False, False, False, False, False],
nop=[False, False, True, True, True, True, True, True, True],
units=['nT', '[V/m]', '[0,1]', '[0,1]', '[-1,+1]', '[-1,+1]', '[-1,+1]', 'nW/m$^2$/Hz',
'bit'],
names=['PB', 'PE', 'DOP', 'ellip',
#'n1', 'n2', 'n3',
'$n_X$ (SRF)', '$n_Y$ (SRF)', '$n_Z$ (SRF)',
'S$_X$ (SRF)', 'arg($\hat{S}_{\!X}$)'],
comment='{} @F{:d} '.format('BP1', F) + bp1_l2_bname, fill_value=None,
time_gap=True, gap_echo=True, ampl_range=ampl_range)
gap insertion here: 2022-03-26 12:02:55.780203 2022-03-26 12:08:58.252862 2022-03-26 14:51:44.210760 2022-03-26 14:59:31.208492 gap interval: 0:00:18.474306 0:02:54.003925 0:00:06.999966 1:02:21.071494
datet1 = datetime(2022, 3, 26, 17, 45, 0)
datet2 = datetime(2022, 3, 26, 20, 45, 0)
cmap_list = 7*[plt.cm.jet] + [plt.cm.seismic] + [plt.cm.PiYG]
ampl_rg_N_F0F1F2_BP1 = [[[2e-10, 6e-9],[2e-12/49, 2e-9/49],[0.01, 0.99],[0.01, 0.99],
[-0.999, 0.999],[-0.999, 0.999], [-0.999, 0.999],
[-0.5/800*4, 0.5/800*4],[-0.2, 1.2]],
[[3e-10, 6e-7],[4e-11/49, 2e-8/49],[0.01, 0.99],[0.01, 0.99],
[-0.999, 0.999],[-0.999, 0.999], [-0.999, 0.999],
[-0.5/80*4, 0.5/80*4],[-0.2, 1.2]],
[[3e-8, 3e-3],[2e-10/49, 2e-6/49],[0.01, 0.99],[0.01, 0.99],
[-0.999, 0.999],[-0.999, 0.999], [-0.999, 0.999],
[-0.5/8*4, 0.5/8*4],[-0.2, 1.2]]]
#for F in [0,1,2]:
for F in [2]:
i1 = index_from_date(datet1, bp1_l2_n_epoch_datetime[F])
i2 = index_from_date(datet2, bp1_l2_n_epoch_datetime[F])
sx = slice(i1, i2+1)
j1 = np.argmin(np.abs(bp1_l2_n_freq[F][:] - 0.))
#j2 = np.argmin(np.abs(bp1_l2_n_freq[F][:] - 66.))
j2 = len(bp1_l2_n_freq[F]) - 1
sy = slice(j1, j2+1)
#sy = ...
dop = 0.84
dop_filter = np.heaviside(bp1_l2_n_dop[F][sx,sy]-dop, 1)
dop_filter[dop_filter == 0] = np.nan
ampl_range = ampl_rg_N_F0F1F2_BP1[F]
#ampl_range = None
#date_fmt = '%Y-%m-%d %H:%M:%S'
date_fmt = '%H:%M'
#date_fmt = '%H:%M:%S'
#date_fmt = None
fig_spectrograms([bp1_l2_n_pb[F][sx,sy], bp1_l2_n_pe[F][sx,sy],
bp1_l2_n_dop[F][sx,sy], bp1_l2_n_ellip[F][sx,sy]*dop_filter,
bp1_l2_n_nvec[F][sx,sy,0]*dop_filter,
bp1_l2_n_nvec[F][sx,sy,1]*dop_filter,
bp1_l2_n_nvec[F][sx,sy,2]*dop_filter,
bp1_l2_n_sx_rea[F][sx,sy]*dop_filter, bp1_l2_n_sx_arg[F][sx,sy]*dop_filter],
bp1_l2_n_epoch_datetime[F][sx], bp1_l2_n_freq[F][sy],
cmap=cmap_list, figsize=(10,22), hspace=0.05, cbar_aspect=15, cbar_pad=0.02,
fontsize=(15,14), fs_name=14, fs_title=13, ticklabel_fs=(13,12), cbar_ticklabel_fs=11,
ylabel='freq. (Hz)', xlabel=True, xtl_rot=0., xtl_ha='center', dt_i1i2=1, date_fmt=date_fmt,
fname=dir_plots+'/'+bp1_l2_bname+'_BP1_F%s_spectrogram-all-srf'%(F) + \
'_corr=%4.2f_dop=%4.2f'%(corr_bp1_l2, dop)+\
'_i1=%s_i2=%s_j1=%s_j2=%s.png'%(i1, i2, j1, j2),
log=[True, True, False, False, False, False, False, False, False],
psd=[True, True, False, False, False, False, False, False, False],
nop=[False, False, True, True, True, True, True, True, True],
units=['nT', '[V/m]', '[0,1]', '[0,1]', '[-1,+1]', '[-1,+1]', '[-1,+1]', 'nW/m$^2$/Hz',
'bit'],
names=['PB', 'PE', 'DOP', 'ellip',
#'n1', 'n2', 'n3',
'$n_X$ (SRF)', '$n_Y$ (SRF)', '$n_Z$ (SRF)',
'S$_X$ (SRF)', 'arg($\hat{S}_{\!X}$)'],
comment='{} @F{:d} '.format('BP1', F) + bp1_l2_bname, fill_value=None,
time_gap=True, gap_echo=True, ampl_range=ampl_range)
gap insertion here: gap interval:
# figure with fce lines and angle between wave normal vector n and B0
datet1 = datetime(2022, 3, 26, 17, 45, 0)
datet2 = datetime(2022, 3, 26, 20, 45, 0)
cmap_list = 8*[plt.cm.jet] + [plt.cm.seismic] + [plt.cm.PiYG]
ampl_rg_N_F0F1F2_BP1 = [[[2e-10, 6e-9],[2e-12/49, 2e-9/49],[0.01, 0.99],[0.01, 0.99],
[-0.999, 0.999],[-0.999, 0.999],[-0.999, 0.999],[0,40],
[-0.5/800*4, 0.5/800*4],[-0.2, 1.2]],
[[3e-10, 6e-7],[4e-11/49, 2e-8/49],[0.01, 0.99],[0.01, 0.99],
[-0.999, 0.999],[-0.999, 0.999],[-0.999, 0.999],
[0,40],[-0.5/80*4, 0.5/80*4],[-0.2, 1.2]],
[[3e-8, 3e-3],[2e-10/49, 2e-6/49],[0.01, 0.99],[0.01, 0.99],
[-0.999, 0.999],[-0.999, 0.999], [-0.999, 0.999], [0, 40],
[-0.5/8*4, 0.5/8*4],[-0.2, 1.2]]]
#for F in [0,1,2]:
for F in [2]:
i1 = index_from_date(datet1, bp1_l2_n_epoch_datetime[F])
i2 = index_from_date(datet2, bp1_l2_n_epoch_datetime[F])
sx = slice(i1, i2+1)
j1 = np.argmin(np.abs(bp1_l2_n_freq[F][:] - 0.))
#j2 = np.argmin(np.abs(bp1_l2_n_freq[F][:] - 66.))
j2 = len(bp1_l2_n_freq[F]) - 1
sy = slice(j1, j2+1)
#sy = ...
bp1_l2_n_fce_datetime = bp1_l2_n_epoch_datetime[F][sx] + timedelta(seconds=2)
bp1_l2_n_fce_value = Fce_from_B0(bp1_l2_n_fce_datetime, mag_bvec, mag_time)
bp1_l2_n_nvec_B0_theta = wave_normal_vector_theta(bp1_l2_n_nvec[F][sx, sy, :],
bp1_l2_n_fce_datetime,
mag_bvec, mag_time, deg=True)
dop = 0.84
dop_filter = np.heaviside(bp1_l2_n_dop[F][sx,sy]-dop, 1)
dop_filter[dop_filter == 0] = np.nan
ampl_range = ampl_rg_N_F0F1F2_BP1[F]
#ampl_range = None
#date_fmt = '%Y-%m-%d %H:%M:%S'
date_fmt = '%H:%M'
#date_fmt = '%H:%M:%S'
#date_fmt = None
l1, l2 = 0.05, 0.10
fig_spectrograms([bp1_l2_n_pb[F][sx,sy], bp1_l2_n_pe[F][sx,sy],
bp1_l2_n_dop[F][sx,sy], bp1_l2_n_ellip[F][sx,sy]*dop_filter,
bp1_l2_n_nvec[F][sx,sy,0]*dop_filter,
bp1_l2_n_nvec[F][sx,sy,1]*dop_filter,
bp1_l2_n_nvec[F][sx,sy,2]*dop_filter,
bp1_l2_n_nvec_B0_theta*dop_filter,
bp1_l2_n_sx_rea[F][sx,sy]*dop_filter, bp1_l2_n_sx_arg[F][sx,sy]*dop_filter],
bp1_l2_n_epoch_datetime[F][sx], bp1_l2_n_freq[F][sy],
cmap=cmap_list, figsize=(10,22), hspace=0.05, cbar_aspect=15, cbar_pad=0.02,
fontsize=(15,14), fs_name=14, fs_title=13, ticklabel_fs=(13,12), cbar_ticklabel_fs=11,
ylabel='freq. (Hz)', xlabel=True, xtl_rot=0., xtl_ha='center', dt_i1i2=1, date_fmt=date_fmt,
fname=dir_plots+'/'+bp1_l2_bname+'_BP1_F%s_spectrogram-all-srf+theta'%(F) + \
'_corr=%4.2f_dop=%4.2f'%(corr_bp1_l2, dop)+\
'_i1=%s_i2=%s_j1=%s_j2=%s.png'%(i1, i2, j1, j2)+\
'_l1=%d_l2=%d.png'%(l1*100, l2*100),
log=[True, True, False, False, False, False, False, False, False, False],
psd=[True, True, False, False, False, False, False, False, False, False],
nop=[False, False, True, True, True, True, True, True, True, True],
units=['nT', '[V/m]', '[0,1]', '[0,1]', '[-1,+1]', '[-1,+1]', '[-1,+1]', 'degree',
'nW/m$^2$/Hz', 'bit'],
names=['PB', 'PE', 'DOP', 'ellip',
#'n1', 'n2', 'n3',
'$n_X$ (SRF)', '$n_Y$ (SRF)', '$n_Z$ (SRF)',
r'$\theta_{\mathbf{n}, \mathbf{B}_0}$', 'S$_X$ (SRF)', 'arg($\hat{S}_{\!X}$)'],
comment='{} @F{:d} '.format('BP1', F) + bp1_l2_bname, fill_value=None,
time_gap=True, gap_echo=True, ampl_range=ampl_range,
rec_wf_list = [{'ipanel': i, 'multi_x': 2*[bp1_l2_n_fce_datetime],
'multi_y': [l1*bp1_l2_n_fce_value, l2*bp1_l2_n_fce_value],
'multi_color': 2*['white'], 'multi_linestyle': 2*['-'],
'multi_marker': 2*[''], 'multi_linewidth': 2*[1.5]} for i in range(2)])
gap insertion here: gap interval:
cdffiles=glob.glob(os.path.join(dir_DATA, '*lfr*surv*bp2_' + day_data + '*'))
cdffiles.sort()
for file in cdffiles:
print(os.path.basename(file))
bp2_l2_cdffile = cdffiles[0]
bp2_l2_bname = os.path.basename(bp2_l2_cdffile)[:-4]
solo_L2_rpw-lfr-surv-bp2_20220326_V01.cdf
# for CALBUT version >= 2.0
# L2 SURVEY BP2 data in SRF
bp2_l2_cdf_srf = load_bp2_CDF_L2(bp2_l2_cdffile, echo=True, params=True, SRF=True,
key_attrs=['Pipeline_version', 'Software_version', 'Parents'],
#key_field=["BP2_RE_N_F2", "BP2_RE_N_F2_SRF"],
key_field=["N_F2", "N_F1", "N_F0"],
#key_field=None,
key_field_attrs=["BP2_IM_N_F0", "BP2_IM_N_F0_SRF"])
(bp2_l2_n_data_srf, bp2_l2_n_epoch, bp2_l2_n_freq, bp2_l2_n_params, bp2_l2_n_params_bias,
bp2_l2_b_data_srf, bp2_l2_b_epoch, bp2_l2_b_freq, bp2_l2_b_params, bp2_l2_b_params_bias) = bp2_l2_cdf_srf
bp2_l2_n_epoch_datetime = 3*[None]
for F in [0,1,2]:
bp2_l2_n_epoch_datetime[F] = pycdf.lib.v_tt2000_to_datetime(bp2_l2_n_epoch[F])
bp2_l2_b_epoch_datetime = 2*[None]
for F in [0,1]:
bp2_l2_b_epoch_datetime[F] = pycdf.lib.v_tt2000_to_datetime(bp2_l2_b_epoch[F])
# incorparated in CALBUT version >= 2.0
corr_bp2_l2 = 4
psd_bp2_l2 = True
PRINT cdf: BIAS_MODE_BIAS1_ENABLED: CDF_UINT1 [13859] BIAS_MODE_BIAS2_ENABLED: CDF_UINT1 [13859] BIAS_MODE_BIAS3_ENABLED: CDF_UINT1 [13859] BIAS_MODE_HV_ENABLED: CDF_UINT1 [13859] BIAS_MODE_MUX_SET: CDF_UINT1 [13859] BIAS_ON_OFF: CDF_UINT1 [13859] BP2_CNT: CDF_UINT1 [0] BP2_IM_B_F0: CDF_REAL8 [746, 22, 5, 5] BP2_IM_B_F0_SRF: CDF_REAL8 [746, 22, 5, 5] BP2_IM_B_F1: CDF_REAL8 [746, 26, 5, 5] BP2_IM_B_F1_SRF: CDF_REAL8 [746, 26, 5, 5] BP2_IM_N_F0: CDF_REAL8 [4123, 11, 5, 5] BP2_IM_N_F0_SRF: CDF_REAL8 [4123, 11, 5, 5] BP2_IM_N_F1: CDF_REAL8 [4122, 13, 5, 5] BP2_IM_N_F1_SRF: CDF_REAL8 [4122, 13, 5, 5] BP2_IM_N_F2: CDF_REAL8 [4122, 12, 5, 5] BP2_IM_N_F2_SRF: CDF_REAL8 [4122, 12, 5, 5] BP2_RE_B_F0: CDF_REAL8 [746, 22, 5, 5] BP2_RE_B_F0_SRF: CDF_REAL8 [746, 22, 5, 5] BP2_RE_B_F1: CDF_REAL8 [746, 26, 5, 5] BP2_RE_B_F1_SRF: CDF_REAL8 [746, 26, 5, 5] BP2_RE_N_F0: CDF_REAL8 [4123, 11, 5, 5] BP2_RE_N_F0_SRF: CDF_REAL8 [4123, 11, 5, 5] BP2_RE_N_F1: CDF_REAL8 [4122, 13, 5, 5] BP2_RE_N_F1_SRF: CDF_REAL8 [4122, 13, 5, 5] BP2_RE_N_F2: CDF_REAL8 [4122, 12, 5, 5] BP2_RE_N_F2_SRF: CDF_REAL8 [4122, 12, 5, 5] BW: CDF_UINT1 [13859] B_F0: CDF_REAL4 [22] NRV B_F1: CDF_REAL4 [26] NRV COMMON_BIA_STATUS_FLAG: CDF_UINT1 [0] Epoch: CDF_TIME_TT2000 [13859] Epoch_B_F0: CDF_TIME_TT2000 [746] Epoch_B_F1: CDF_TIME_TT2000 [746] Epoch_N_F0: CDF_TIME_TT2000 [4123] Epoch_N_F1: CDF_TIME_TT2000 [4122] Epoch_N_F2: CDF_TIME_TT2000 [4122] FREQ: CDF_UINT1 [13859] N_F0: CDF_REAL4 [11] NRV N_F1: CDF_REAL4 [13] NRV N_F2: CDF_REAL4 [12] NRV QUALITY_BITMASK: CDF_UINT2 [13859] QUALITY_FLAG: CDF_UINT1 [13859] R0: CDF_UINT1 [13859] R1: CDF_UINT1 [13859] R2: CDF_UINT1 [13859] SCET: CDF_REAL8 [13859] SP0: CDF_UINT1 [13859] SP1: CDF_UINT1 [13859] SURVEY_MODE: CDF_UINT1 [13859] SYNCHRO_FLAG: CDF_UINT1 [13859] N_F2: [10.5 18.5 26.5 34.5 42.5 50.5 58.5 66.5 74.5 82.5 90.5 98.5] N_F1: [ 152. 280. 408. 536. 664. 792. 920. 1048. 1176. 1304. 1432. 1560. 1688.] N_F0: [1968. 2736. 3504. 4272. 5040. 5808. 6576. 7344. 8112. 8880. 9648.] cdf['BP2_IM_N_F0'].attrs: CATDESC: All the imaginary part of the 5x5 calibrated matrices for all bins of F0 sampling frequency in the SCM B1-B2-B3 axis system frame. [CDF_CHAR] DEPEND_0: Epoch_N_F0 [CDF_CHAR] DEPEND_1: N_F0 [CDF_CHAR] DISPLAY_TYPE: time_series [CDF_CHAR] FIELDNAM: BP2_IM_N_F0 [CDF_CHAR] FILLVAL: -1e+31 [CDF_REAL8] FORMAT: F32.6 [CDF_CHAR] LABLAXIS: BP2_IM_N_F0 [CDF_CHAR] SCALEMAX: 1e+30 [CDF_REAL8] SCALEMIN: -1e+30 [CDF_REAL8] SCALETYPE: linear [CDF_CHAR] UNITS: [CDF_CHAR] VALIDMAX: 1e+30 [CDF_REAL8] VALIDMIN: -1e+30 [CDF_REAL8] VAR_NOTES: [CDF_CHAR] VAR_TYPE: data [CDF_CHAR] cdf['BP2_IM_N_F0_SRF'].attrs: CATDESC: All the imaginary part of the 5x5 calibrated matrices for all bins of F0 sampling frequency in spacecraft reference frame (SRF). [CDF_CHAR] DEPEND_0: Epoch_N_F0 [CDF_CHAR] DEPEND_1: N_F0 [CDF_CHAR] DISPLAY_TYPE: time_series [CDF_CHAR] FIELDNAM: BP2_IM_N_F0_SRF [CDF_CHAR] FILLVAL: -1e+31 [CDF_REAL8] FORMAT: F32.6 [CDF_CHAR] LABLAXIS: BP2_IM_N_F0_SRF [CDF_CHAR] SCALEMAX: 1e+30 [CDF_REAL8] SCALEMIN: -1e+30 [CDF_REAL8] SCALETYPE: linear [CDF_CHAR] UNITS: [CDF_CHAR] VALIDMAX: 1e+30 [CDF_REAL8] VALIDMIN: -1e+30 [CDF_REAL8] VAR_NOTES: [CDF_CHAR] VAR_TYPE: data [CDF_CHAR] Pipeline_version: Software_version: 2.0.4 Parents: solo_L1_rpw-lfr-surv-bp2-cdag_20220326_V03.cdf solo_HK_rpw-lfr_20220326_V04.cdf solo_HK_rpw-bia_20220326_V04.cdf SOLO_CAL_RCT-LFR-SCM_V20190123171020.cdf SOLO_CAL_RCT-LFR-BIAS_V20190123171020.cdf SOLO_CAL_RCT-LFR-VHF_V20200720165743.cdf SOLO_CAL_RPW-SCM_SCM-FS-MEB-PFM_V20200428000000.cdf SOLO_CAL_RPW-BIAS_V202011191204.cdf SOLO_CAL_RPW-HF-PREAMP_V20200624000000.cdf data are expressed in SRF bp2_n_time_epoch F0: (4123,) bp2_n_data F0: (4123, 11, 5, 5) bp2_n_freq F0: (11,) data are expressed in SRF bp2_n_time_epoch F1: (4122,) bp2_n_data F1: (4122, 13, 5, 5) bp2_n_freq F1: (13,) data are expressed in SRF bp2_n_time_epoch F2: (4122,) bp2_n_data F2: (4122, 12, 5, 5) bp2_n_freq F2: (12,) data are expressed in SRF bp2_b_time_epoch F0: (746,) bp2_b_data F0: (746, 22, 5, 5) bp2_b_freq F0: (22,) data are expressed in SRF bp2_b_time_epoch F1: (746,) bp2_b_data F1: (746, 26, 5, 5) bp2_b_freq F1: (26,)
Leff = 7.
ampl_rg_N_F0F1F2_BP2 = [[[6e-11, 2e-9],[6e-11, 2e-9],[6e-11, 2e-9],
[1e-12/Leff**2, 1e-9/Leff**2], [1e-12/Leff**2, 1e-9/Leff**2]],
[[1e-10, 2e-7],[1e-10, 2e-7],[1e-10, 2e-7],
[2e-11/Leff**2, 1e-8/Leff**2], [2e-11/Leff**2, 1e-8/Leff**2]],
[[1e-8, 1e-3],[1e-8, 1e-3],[1e-8, 1e-3],
[1e-10/Leff**2, 1e-6/Leff**2], [1e-10/Leff**2, 1e-6/Leff**2]]]
#for F in [0,1,2]:
for F in [2]:
ampl_range = ampl_rg_N_F0F1F2_BP2[F]
#ampl_range = [[4e-8, 8e-4],[4e-8, 8e-4],[4e-8, 8e-4], [2e-10/100, 6e-8/100], [6e-10/100, 6e-8/100]]
#ampl_range = None
#date_fmt = '%Y-%m-%d %H:%M:%S'
date_fmt = '%H:%M'
#date_fmt = '%H:%M:%S'
#date_fmt = None
fig_spectrograms([bp2_l2_n_data_srf[F][:,:,0,0].real, bp2_l2_n_data_srf[F][:,:,1,1].real,
bp2_l2_n_data_srf[F][:,:,2,2].real, bp2_l2_n_data_srf[F][:,:,3,3].real,
bp2_l2_n_data_srf[F][:,:,4,4].real],
bp2_l2_n_epoch_datetime[F][:], bp2_l2_n_freq[F][:],
cmap=plt.cm.jet, figsize=(10,16), hspace=0.05, cbar_aspect=20, cbar_pad=0.02,
fontsize=(15,14), fs_name=14, fs_title=13, ticklabel_fs=(13,12), cbar_ticklabel_fs=11,
ylabel='freq. (Hz)', xlabel=True, xtl_rot=0., xtl_ha='center', date_fmt=date_fmt,
fname=dir_plots+'/'+bp2_l2_bname+'_BP2_F%s_spectrogram5-srf_corr=%4.2f.png'%(F,
corr_bp2_l2),
log=5*[True], psd=5*[psd_bp2_l2], nop=5*[False], dt_i1i2=1,
units=3*['nT']+2*['[V/m]'],
names=['$B_X$ (SRF)', '$B_Y$ (SRF)', '$B_Z$ (SRF)', '$E_Y$ (SRF)', '$E_Z$ (SRF)'],
comment=' {} @F{:d} '.format('BP2', F) + bp2_l2_bname,
time_gap=True, gap_echo=True, ampl_range=ampl_range)