Solar Orbiter LFR Data Tutorial¶

RPW Low Frequency Receiver (LFR)¶


As part of the Radio and Plasma Waves (RPW) instrument on the Solar Orbiter mission, the Low Frequency Receiver (LFR) is designed to digitize and process the signals from a triaxal coplanar electric antenna system (ANT), its associated biasing unit (BIAS), and a triaxal search-coil magnetometer over a frequency range of quasi DC to 10 kHz.

Thomas Chust, LPP (https://www.lpp.polytechnique.fr)¶

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

  1. Useful links
  2. Brief descriptions
  3. Extra routines
  4. Directory and day selection of the data
  5. L2 Normal MAG data
  6. L2 Normal BP1 data
    1. Full day spectrogram
    2. Zoomed-in spectrogram
    3. Zoomed-in spectrogram with $F_{ce}$ lines (5 % and 10%) and $\theta$ angle (n, B0)
  7. L2 Normal BP2 data
    1. Full day spectrogram
    2. Zoomed-in spectrogram
    3. Zoomed-in spectrogram with $F_{ce}$ lines (5 % and 10%)
    4. Zoomed-in "BP1" spectrogram with $F_{ce}$ lines (5 % and 10%) and $\theta$ angle (n, B0)
  8. L2 Normal SWF data
    1. Full day PSD spectrogram
    2. Zoomed-in PSD spectrogram
    3. Zoomed-in "BP1" spectrogram with $F_{ce}$ lines (5 % and 10%) and $\theta$ angle (n, B0)
    4. Plot of selected waveform snapshot
  9. L2 Burst CWF data
    1. Full day PSD spectrogram
    2. Zoomed-in PSD spectrogram
    3. Zoomed-in "BP1" spectrogram with $F_{ce}$ lines (5 % and 10%) and $\theta$ angle (n, B0)
    4. Plot of selected waveform
  10. End
In [1]:
#%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'] 

Useful links previous next¶

  1. Thomas' shared links

    1. RPW/LFR slides and plots: https://ao.lpp.polytechnique.fr/index.php/s/iizK4Y6RcmHPx5i
    2. Python package "tch" : https://ao.lpp.polytechnique.fr/index.php/s/gzosYYdLAxxgrCN
    3. Chust et al., A&A, 2021: https://doi.org/10.1051/0004-6361/202140932
  2. Solar Orbiter school

    1. Sète 2022: https://owncloud.ias.u-psud.fr/index.php/s/R2x3mCwrYLN2kJs?dir=undefined&openfile=5975769
  3. LESIA

    1. SOLO data (public): https://rpw.lesia.obspm.fr/roc/data/pub/solo/rpw/data/
    2. How to retrieve the RPW data? https://rpw.lesia.obspm.fr/rpw-data/data-retrieval/
    3. Summary plot daily: https://rpw.lesia.obspm.fr/rpw-data/daily-summary-plots/
    4. Summary plot SBM: https://rpw.lesia.obspm.fr/rpw-data/sbm-summary-plots/
    5. RPW data products: https://confluence-lesia.obspm.fr/display/ROC/RPW+Data+Products
  4. ESA

    1. SOAR: http://soar.esac.esa.int/soar/
    2. SOC Public: https://issues.cosmos.esa.int/solarorbiterwiki/display/SOSP/
    3. Orbit plots: https://issues.cosmos.esa.int/solarorbiterwiki/display/SOSP/Orbit+Plots
    4. Where is SO: https://www.cosmos.esa.int/web/solar-orbiter/where-is-solar-orbiter

Brief descriptions start next¶

1. RPW instrument overview¶


2. Spacecraft Reference Frame (SRF)¶



3. LFR nominal inputs : 3B + 2E + 1V (≤ 10 kHz)¶

4. LFR data products and data streams¶

The LFR signal processing, based on a FPGA, provides routinely,

  • waveforms (SWF & CWF)
  • spectral matrices (ASM & BP2)
  • basic wave parameters (BP1)

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)

4. LFR spectral products (ASM, BP2, BP1)¶

Extra routines previous next end¶

In [2]:
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) 

Directory and day selection of the data start next end¶

In [3]:
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

L2 Normal MAG data start next end¶

In [4]:
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
In [5]:
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
In [6]:
#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')    

L2 Normal BP1 data start previous next end¶

In [7]:
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
In [8]:
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

Full day spectrogram of L2 Normal BP1 data¶

In [9]:
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

Zoomed-in spectrogram of L2 Normal BP1 data¶

In [10]:
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:

Zoomed-in spectrogram of L2 Normal BP1 data with $F_{ce}$ lines (5 % and 10%) and $\theta$ angle (n, B0)¶

In [11]:
# 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:

In [ ]:
 

L2 Normal BP2 data start previous next end¶

In [12]:
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
In [13]:
# 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,)

Full day spectrogram of L2 Normal BP2 data¶

In [14]:
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)