OSCAR data processing chain

OSCAR data processing follows a data-level heirarchy with the following levels:
  • L1A (Level-1A): SAR-focussed Single-Look Complex (SLC) images from one of the three OSCAR look directions (Fore, Mid, Aft). Provided by MetaSensing BV.

  • L1AP (Level-1AP): L1A data pre-processed using MATLAB to inject required data fields (e.g., Squint, Incidence Angle)

  • L1B (Level-1B): Combined dataset with all three independent looks (Fore, Aft, Mid) from a single acquisition. Processed for Multilooking, computation of Radial Surface Velocity, Sigma0, etc.

  • L1C (Level-1C): Calibrated L1B dataset. Calibration takes the form of over-land or over-ocean methods to correct for incidence angle dependent biases in Sigma0 and Interferometric phase.

  • L2A (Level-2A): Retrieved Total Surface Current Vector (TSCV) and Ocean Surface Vector Wind (OSVW) from the Wind-Current Retrieval (WCR) method, including full output from all ambiguities.

  • L2B (Level-2B): Retrieved TSCV and OSVW using either the the Wind-Current Retrieval (WCR) or Sequential Current Retrieval (SCR) methods.

Examples of use

For the following examples the OSCAR test dataset is used, found in seastar_project\test_data To process from L1 to L2 the function processing_OSCAR_L1_to_L2 can be used in the following way:

import seastar as ss
import glob
import os
import xarray as xr

dict_L2_process = {
'gmf':{'doppler':{'name':'mouche12'}, # Doppler GMF of Mouce (2012)
      'nrcs':{'name':'nscat4ds'}}, # NRCS GMF of NSCAT-4DS
'L2_processor':'WCR', # Simultaneous Wind-Current retrieval method
'RSV_Noise':0.2, # Radial Surface Velocity noise for the WCR method. Here set to 0.2m/s
'Kp':0.2, # Radiometric resolution for the WCR method. Here set to 20%
}
dict_ambiguity = {'name' : 'sort_by_cost'} # Set ambiguity removal to lowest cost

(ds_L2A, ds_L2B) = processing_OSCAR_L1_to_L2(ds_L1, dict_L2_process, dict_ambiguity, dict_env)
L1_file_list = glob.glob(os.path.join('test_data','*.nc'))
filename = L1_file_list[0] # Load first file in list of test_data files
ds_L1C = xr.open_dataset(filename)
ds_L2B = ss.oscar.processing_chain.processing_OSCAR_L1_to_L2(ds_L1C,
                                                            dict_L2_process=dict_L2_process,
                                                            dict_ambiguity=dict_ambiguity,
                                                            write_nc=False,
                                                            write_L2A_nc=False,
                                                           )

To process L1AP to L1B data the function processing_OSCAR_L1AP_to_L1B is used in the following way:

import seastar as ss

L1B_options = {'vars_to_keep' : ['LatImage',
                                 'LonImage',
                                 'IncidenceAngleImage',
                                 'LookDirection',
                                 'SquintImage',
                                 'CentralFreq',
                                 'OrbitHeadingImage',
                                 'OrbTimeImage'],
           'vars_to_send' : ['Intensity', 'Interferogram', 'Coherence'],
           'window' : 7}
L1AP_folder = 'path/to/L1AP_data'
campaign = '202205_IroiseSea' # Campaign name as found in config\OSCAR_config.ini
flight = '20220517' # Flight date as found in fields of 202205_IroiseSea_TrackNames.ini
track = 'Track_1' # Track name as found in 202205_IroiseSea_TrackNames.ini
ds_L1B = ss.oscar.processing_chain.processing_OSCAR_L1AP_to_L1B(
    L1AP_path,
    campaign,
    flight,
    track,
    dict_L1B_process=L1B_options,
    write_nc=False
    )

To perform the calibration step from L1B to L1C data the function processing_OSCAR_L1B_to_L1C is used in the following way:

import seastar as ss
import os

L1B_path = 'path/to/L1B_data'
campaign = '202205_IroiseSea' # Campaign name as found in config\OSCAR_config.ini
flight = '20220517' # Flight date as found in fields of 202205_IroiseSea_TrackNames.ini
track = 'Track_1' # Track name as found in 202205_IroiseSea_TrackNames.ini
# calib_dict contains the NRCS (Sigma0) and Interferogram calibration file names. These can be found along with the rest of the OSCAR
# campaign data in the ESA data store under campaign_name/calib
calib_dict = {'Sigma0_calib_file':os.path.join(calib_file_path, NRCS_OceanPattern_file_name),
          'Interferogram_calib_file':os.path.join(calib_file_path, InterferogramCalib_file_name)}
ds_L1C = ss.oscar.processing_chain.processing_OSCAR_L1B_to_L1C(L1B_path,
                                                               campaign,
                                                               flight,
                                                               track,
                                                               calib_dict,
                                                               write_nc=False)

If write_nc is set to True, a formatted L1B or L1C netCDF file will be written to disk in a new or existing folder tree mirroring the L1AP file structure. It is recommended that the following file tree structure is followed:

OSCAR
├── Campaign Name
    ├── Processing Level
        ├── Data Version
            ├── Flight

All OSCAR data processors when the write_nc switch is set to True will write their outputs to a mirrored structure, e.g.:

OSCAR
├── Campaign Name
    ├── L1AP
    ├   ├── Data Version
    ├       ├── Flight
    ├── L1B
        ├── Data Version
            ├── Flight

Processing chain functions