L2O internal DataTree format (output of PRE_PRO, supplemented by WND_PRO, WAV_PRO, CUR_PRO)

measurements/
	l1_slc/ # full resolution level 1 complex SAR data
		subswath_id/
			burst_id/
				dimensions: azimuth_channel, polarization, azimuth_time, slant_range_time
				data variables:
					slc_cpc (polarization, azimuth_time, slant_range_time) complex64
						# complex measurement combined phase center (original L1 grid)
					slc_ipc (azimuth_channel, polarization, azimuth_time, slant_range_time) complex64
						# complex measurement individual phase centers (original L1 grid)
				coordinates:
					azimuth_channel (azimuth_channel) uint8
						# Azimuth channel ID
					polarization (polarization) <U2
						# polarization labels ('HH', 'HV', 'VH', 'VV')
					azimuth_time (azimuth_time) datetime64[ns]
						# azimuth time in nanosecond accuracy
					slant_range_time (slant_range_time) float64
						# range distance in meter
					line (azimuth_time) int64
						# enumerates lines 0, ..., n (can be omitted?)
					pixel (slant_range_time) int64
						# enumerates pixels 0, ..., m (can be omitted?)
	l1_grd/ # level 1 SAR data (combined phase centers) resampled to square ground pixels, populated by PRE_PRO
		dimensions: polarization: p, azimuth_time: n, ground_range: m
		data variables:
			grd (polarization, azimuth_time, ground_range) float64
				# absolute value of measurement (resampled to ground range)
			nrcs (polarization, azimuth_time, ground_range) float64
				# normalized radar cross section (sigma nought)
			ocean_calibrated (polarization, azimuth_time, ground_range) float64
				# backscatter after ocean calibration
		coordinates:
			polarization (polarization) <U2
				# polarization labels ('HH', 'HV', 'VH', 'VV')
			azimuth_time (azimuth_time) datetime64[ns]
				# azimuth time in nanosecond accuracy
			ground_range (ground_range) float64
				# range distance in meter
			line (azimuth_time) int64
				# enumerates lines 0, ..., n (can be omitted?)
			pixel (ground_range) int64
				# enumerates pixels 0, ..., m (can be omitted?)
		attrs:
			line_spacing float64
				# ground distance between lines in azimuth direction in meter
			pixel_spacing float64
				# ground distance between pixels in range direction in meter
	features/ # feature grid, populated by PRE_PRO
		dimensions: azimuth_time: n_f, ground_range: m_f
		data variables:
			nrcs_mean (azimuth_time, ground_range) float64
			nrcs_nstd (azimuth_time, ground_range) float64
			nrcs_skewness (azimuth_time, ground_range) float64
			nrcs_kurtosis (azimuth_time, ground_range) float64
			... (azimuth_time, ground_range) float64
		coordinates:
			azimuth_time (azimuth_time) datetime64[ns]
				# subset of measurements/azimuth_time
			ground_range (ground_range) float64
				# subset of measurements/ground_range
			line (azimuth_time) int64
				# subset of measurements/line (can be omitted?)
			pixel (ground_range) int64
				# subset of measurements/pixel (can be omitted?)
	l2o/ # individual grids for wind, wave, currents?
		wind/ # populated by WND_PRO
			dimensions: azimuth_time, ground_range # separate grid?
			data variables:
				u10s (azimuth_time, ground_range) float64
				v10s (azimuth_time, ground_range) float64
				tau_u (azimuth_time, ground_range) float64
				tau_v (azimuth_time, ground_range) float64
			coordinates:
				azimuth_time (azimuth_time) datetime64[ns]
					# subset of measurements/azimuth_time
				ground_range (ground_range) float64
					# subset of measurements/ground_range
				line (azimuth_time) int64
					# subset of measurements/line (can be omitted?)
				pixel (ground_range) int64
					# subset of measurements/pixel (can be omitted?)
		wave/ # populated by WAV_PRO
			dimensions: azimuth_time: n_f, ground_range: m_f, direction, frequency
			data variables:
				H_s (azimuth_time, ground_range) float64
				H_sww (azimuth_time, ground_range) float64
				H_sw1 (azimuth_time, ground_range) float64
				H_sw2 (azimuth_time, ground_range) float64
				T_m0_1 (azimuth_time, ground_range) float64
				T_m2 (azimuth_time, ground_range) float64
				T_sw1 (azimuth_time, ground_range) float64
				T_sw2 (azimuth_time, ground_range) float64
				T_ww (azimuth_time, ground_range) float64
				phi_sww (azimuth_time, ground_range) float64
				phi_sw1 (azimuth_time, ground_range) float64
				phi_sw2 (azimuth_time, ground_range) float64
				S (azimuth_time, ground_range, direction, frequency)
			coordinates:
				azimuth_time (azimuth_time) datetime64[ns]
					# same as measurements/features/azimuth_time
				ground_range (ground_range) float64
					# same as measurements/features/ground_range
				line (azimuth_time) int64
					# same as measurements/features/line (can be omitted?)
				pixel (ground_range) int64
					# same as measurements/features/pixel (can be omitted?)
		currents/ # populated by TSC_PRO
			dimensions: azimuth_time, ground_range # separate grid?
			data variables:
				rsc (azimuth_time, ground_range) float64
				rrsc (azimuth_time, ground_range) float64
			coordinates:
				azimuth_time (azimuth_time) datetime64[ns]
					# subset of measurements/azimuth_time
				ground_range (ground_range) float64
					# subset of measurements/ground_range
				line (azimuth_time) int64
					# subset of measurements/line (can be omitted?)
				pixel (ground_range) int64
					# subset of measurements/pixel (can be omitted?)
		other/ # intermediate/additional variables generated by the processor
			doppler/
				dimensions: # dimensions and grid TBD
				data variables:
					doppler_centroid (azimuth_time, ?) float64
					doppler_from_attitude (azimuth_time, ?) float64
					doppler_from_antenna_electronic_mispointing (azimuth_time, ?) float64
					doppler_other_non_geophysical (azimuth_time, ?) float64
					doppler_geophysical (azimuth_time, ?) float64
				coordinates:
					azimuth_time (azimuth_time) datetime64[ns]
						# subset of measurements/azimuth_time
					ground_range (ground_range) float64 # ??
						# subset of measurements/ground_range
			azimuth_cutoff/
				dimensions: azimuth_time, ground_range # 1x1 km
				data variables:
					azimuth_cutoff (azimuth_time, ground_range) float64
				coordinates:
					azimuth_time (azimuth_time) datetime64[ns]
						# subset of measurements/azimuth_time
					ground_range (ground_range) float64
						# subset of measurements/ground_range
			inverse_wave_age/
				dimensions: azimuth_time, ground_range # dimensions and grid TBD
				data variables:
					inverse_wave_age (azimuth_time, ground_range) float64
				coordinates:
					azimuth_time (azimuth_time) datetime64[ns]
						# subset of measurements/azimuth_time
					ground_range (ground_range) float64
						# subset of measurements/ground_range
			spectra/
				dimensions: azimuth_time, ground_range # dimensions and grid TBD. MACS 1x1 km
				data variables:
					cross_spectrum (azimuth_time, ground_range)
					mean_average_cross_spectrum (azimuth_time, ground_range)
				coordinates:
					azimuth_time
						# subset of measurements/azimuth_time
					ground_range
						# subset of measurements/ground_range
			co_cross_polarization_coherence/ # 1x1 km
				dimensions: azimuth_time, ground_range # dimensions and grid TBD
				data variables:
					co_cross_polarization_coherence (azimuth_time, ground_range) float64
				coordinates:
					azimuth_time (azimuth_time) datetime64[ns]
						# subset of measurements/azimuth_time
					ground_range (ground_range) float64
						# subset of measurements/ground_range
			ati/
				dimensions: azimuth_time, ground_range # dimensions and grid TBD
				data variables:
					ati_coherence (azimuth_time, ?)
					ati_doppler (azimuth_time, ?)
				coordinates:
					azimuth_time
						# subset of measurements/azimuth_time
					ground_range
						# subset of measurements/ground_range
			ml_wind/ # ML-derived wind directions as a first guess for final retrieval
				dimensions: azimuth_time, ground_range # dimensions and grid TBD
				data variables:
					wind_direction (azimuth_time, ground_range) float64
						# wind direction in degrees
				coordinates:
					azimuth_time
						# subset of measurements/azimuth_time
					ground_range
						# subset of measurements/ground_range
conditions/ # populated by PRE_PRO
	gcp/ # from Level-1 product
		dimensions: azimuth_time: n_g, ground_range: m_g
		data variables:
			latitude (azimuth_time, ground_range) float64
			longitude (azimuth_time, ground_range) float64
			incidence_angle (azimuth_time, ground_range) float64
			elevation_angle (azimuth_time, ground_range) float64
			height (azimuth_time, ground_range) float64
			azimuth_look_angle (azimuth_time, ground_range)? # is this contained somewhere else, e.g. antenna pattern?; separate grid?
		coordinates:
			azimuth_time (azimuth_time) datetime64[ns]
				# subset of measurements/l1/azimuth_time
			ground_range (ground_range) float64
				# subset of measurements/l1/ground_range
			line (azimuth_time) int64
				# subset of measurements/l1/line (can be omitted?)
			pixel (ground_range) int64
				# subset of measurements/l1/pixel (can be omitted?)
	doppler_centroid/ # from Level-1 product
		dimensions: azimuth_time, degree # grid TBD
		data variables:
			data_dc_polynomial (azimuth_time, degree) float32
				# doppler centroid estimated from data
			geometry_dc_polynomial (azimuth_time, degree) float32
				# doppler centroid estimated from orbit
		coordinates:
			azimuth_time (azimuth_time) datetime64[ns]
				# subset of measurements/l1/azimuth_time
			degree (degree) int64
				# polynomial degree
	attitude/ # from Level-1 product
		dimensions: azimuth_time # grid TBD
		data variables:
			pitch (azimuth_time) float64 # needed?
			q0 (azimuth_time) float64 # needed?
			q1 (azimuth_time) float64 # needed?
			q2 (azimuth_time) float64 # needed?
			q3 (azimuth_time) float64 # needed?
			roll (azimuth_time) float64 # needed?
			wx (azimuth_time) float64 # needed?
			wy (azimuth_time) float64 # needed?
			wz (azimuth_time) float64 # needed?
			yaw (azimuth_time) float64 # needed?
		coordinates:
			azimuth_time (azimuth_time) datetime64[ns]
				# subset of measurements/l1/azimuth_time
	orbit/ # from Level-1 product
		dimensions: azimuth_time, axis # grid TBD; axis=x,y,z
		data variables:
			position (azimuth_time, axis) float64 # needed?
			velocity (azimuth_time, axis) float64 # needed?
		coordinates:
			azimuth_time (azimuth_time) datetime64[ns]
				# subset of measurements/l1/azimuth_time
			axis (axis) <U1
				# axis labels ('x', 'y', 'z')
	antenna_pattern/ # from Level-1 product
		dimensions: azimuth_time # grid TBD
		data variables:
			swath (azimuth_time) <U3
			slant_range_time (azimuth_time) float64
			elevation_angle (azimuth_time) float64
			incidence_angle (azimuth_time) float64
			roll (azimuth_time) float64
			terrain_height (azimuth_time) float64
	masks/ # full resolution
		dimensions: azimuth_time: n, ground_range: m
		data variables:
			ice (azimuth_time, ground_range) bool # move to /conditions/models/?
			land (azimuth_time, ground_range) bool
		coordinates: # same as measurements/l1 minus polarization
	models/
		wind/
			dimensions: latitude, longitude # grid TBD
			data variables:
				u10s (latitude, longitude) float64
				v10s (latitude, longitude) float64
			coordinates:
				latitude (latitude) float64
				longitude (longitude) float64
				azimuth_time (latitude, longitude) datetime64[ns]
				ground_range (latitude, longitude) float64
		wave/
			dimensions: latitude, longitude # grid TBD
			data variables:
				H_s (latitude, longitude) float64
				T_m (latitude, longitude) float64
				phi_m (latitude, longitude) float64
			coordinates:
				latitude (latitude) float64
				longitude (longitude) float64
				azimuth_time (latitude, longitude) datetime64[ns]
				ground_range (latitude, longitude) float64
		currents/
			dimensions: latitude, longitude # grid TBD
			data variables:
				...
			coordinates:
				latitude (latitude) float64
				longitude (longitude) float64
				azimuth_time (latitude, longitude) datetime64[ns]
				ground_range (latitude, longitude) float64
	gmf/
		dimensions: polarization, wind_speed, wind_direction, incidence_angle # about 3x250x73x51
		data variables:
			wind_gmf (polarization, wind_speed, wind_direction, incidence_angle)
		coordinates:
			polarization (polarization) <U2
				# polarization labels ('VV', 'HH', 'HV')
			wind_speed (wind_speed) float32
				# wind speed in m/s
			wind_direction (wind_direction) float32
				# wind direction in degrees
			incidence_angle (incidence_angle) float32
				# incidence angle in degrees
	ocean_calibration/
		dimensions: incidence_angle
		data variables:
			calibration_factors (incidence_angle)
		coordinates:
			incidence_angle (incidence_angle) float32
quality/
	l2o/
		wind/ # populated by WND_PRO
			...
		wave/ # populated by WAV_PRO
			...
		currents/ # populated by CUR_PRO
			...
attrs:
	- mission and acquisition metadata
	- processing parameters
	- ...?


TODO:
	- where do the models go (LMOD, LDOP, EMF, etc.)?
	- bathymetry?
