L1A Processing#
L1A processing takes data from CCSDS packets to L1A Dataset objects suitable for writing as NetCDF.
Each L1A data product contains a single packet type (APID), decoded and reformatted for easier usage in the processing system. The structure of L1A products is controlled by L1A processing packet configurations, which instruct the L1A pipeline how to restructure the packet data. For example, packets that contain multiple samples of a single data point are restructured to pivot the samples into their own data array with a time dimension for the sample time. Fields that appear only once per packet are left associated with the “packet” index dimension (no coordinate).
Steps:
Read packet data using Space Packet Parser
Fetch the L1A PacketConfiguration object to configure L1A processing
Create an xr.Dataset according to the PacketConfiguration
Write the Dataset to NetCDF
L1A Product Structure#
This varies by packet but there is some consistent behavior:
Every L1A product has a “packet” index dimension that is simply an index of packets
Every L1A product has a packet time coordinate with dimension “packet”
Fields appearing once per packet are associated with the “packet” index dimension
Every sample set (possibly multiple) has a sample time coordinate that is a dimension coordinate (coordinate name == dimension name)
Every sample variable has dimension for its sample time
Samples (possibly multiple) taken at the same time are associated with the same sample time dimension
For example, for N packets, the AXIS_SAMPLE packet containing Azimuth and Elevation mechanism data
comes down with 50 Az and El samples per packet (a sample group). It’s L1A product has:
coordinates:
# Packet timestamp
PACKET_ICIE_TIME:
dtype: datetime64[ns]
dimensions: ["packet"]
attributes:
long_name: Packet timestamp from ICIE main processor
encoding:
units: nanoseconds since 1958-01-01
calendar: standard
dtype: int64
# Sample timestamp
AXIS_SAMPLE_ICIE_TIME:
dtype: datetime64[ns]
dimensions: ["AXIS_SAMPLE_ICIE_TIME"]
attributes:
long_name: Azimuth and elevation encoder sample timestamp
encoding:
units: nanoseconds since 1958-01-01
calendar: standard
dtype: int64
variables:
# There are more variables not listed here
# Per packet checksum
ICIE__AXIS_SAMPLE_CHECKSUM:
dtype: uint32
dimensions: ["packet"]
attributes:
long_name: ICIE axis sample packet checksum
# Azimuth samples
ICIE__AXIS_AZ_FILT:
dtype: float32
dimensions: ["AXIS_SAMPLE_ICIE_TIME"]
attributes:
long_name: ICIE azimuth axis filtered encoder reading
units: radians
# Elevation samples
ICIE__AXIS_EL_FILT:
dtype: float32
dimensions: ["AXIS_SAMPLE_ICIE_TIME"]
attributes:
long_name: ICIE elevation axis filtered encoder reading
units: radians
# Packet index for each sample
AXIS_SAMPLE_packet_index:
dtype: int64
dimensions: ["AXIS_SAMPLE_ICIE_TIME"]
attributes:
long_name: Packet index for axis sample data
comment: Maps each axis sample to its originating packet index