Skip to content

Add unnormalized_reflectance to VIIRS SDR (viirs_sdr) reader #3411

Description

@djhoese

There are currently two level 1 readers for the VIIRS instrument. viirs_sdr for the NOAA VIIRS SDR and viirs_l1b for the NASA VIIRS L1b format. The L1Bs follow many other file formats for level 1 data and do not include any normalization of the reflectance data by / cos(SZA). However, the SDR format does include this correction already and DataIDs coming from this reader include modifiers=("sunz_corrected",) to reflect this. This complicates some of the changes we want to make for Satpy 1.0 like #3397. In that PR we'd like to make the default normalization for RGBs be the effective_solar_pathlength_corrected modifier (Li and Shibata) for better looking RGBs and to remove the default correction limits of the sunz_corrected modifier so users could get the scientifically accurate "reflectance" value without the correction limits used for RGB composites.

The primary issue is that if VIIRS composite definitions were changed to request inputs with the pathlength correction then data from the VIIRS SDR reader would never be found by the dependency tree in Satpy. For example, if an RGB composite requests an input with ("effective_solar_pathlength_corrected", "rayleigh_corrected") modifiers, then the dependency tree will first look for a dataset matching those exact modifiers from already loaded datasets and then the reader. The dependency tree would then remove the last modifier in the sequence and search for a dataset matching that set of modifiers, so ("effective_solar_pathlength_corrected",). Failing to find a match in the already loaded data and the reader, the dependency tree then looks for the "base" dataset with no modifiers modifiers=(). In the VIIRS SDR reader, as currently implemented, this search would always fail as there is only the modifiers=("sunz_corrected",) version of this data.

The initial proposal was to overwrite the sunz_corrected modifier for VIIRS and make it equal to the effective pathlength correction. This has the benefit of RGBs still looking nice, but the downside that users requesting DataQuery(name="I01", modifiers=("sunz_corrected",)) for the real reflectance, would not get a / cos(SZA) operation as they would with every other instrument in Satpy after #3397 is merged.

During today's monthly community meeting a new idea was considered where the viirs_sdr would be modified to provide the base no-modifier version of the reflectance data by loading the Radiance data from the file and doing the reflectance calibration itself but not do the / cos(SZA). With this, the dependency tree will find this base dataset when trying to fulfill dependencies for RGB recipes requesting modifiers=("effective_solar_pathlength_corrected","). This has the benefit of SDR data getting the preferred effective solar pathlength correction for RGBs and the sunz_corrected modifier behaving the same way it does for every instrument. In this case, requesting modifiers=("sunz_corrected",) will still load the expected and desired file-based version of the reflectance data for scientific use.

So the remaining questions are:

  1. Do VIIRS SDR files have the necessary information to properly calibrate radiances to unnormalized reflectances?
  2. If the SDR reader is updated to do this, do the composite YAML files need to be updated beyond the existing expected changes of using the pathlength correction for RGBs?

I'm hoping @adybbroe and/or @simonrp84 or @mraspaud or someone can help me answer question 1. I will have to think about question 2 and I'll update this description or post a comment when I have a better idea. I've asked some questions on slack for how loading unnormalized reflectance and reflectance will behave after #3292 is merged. That behavior will determine the answer for question 2 above as we may need to know what happens when we request something just by name (ex. "I01"). Do we get the least-modified DataID (the unnormalized reflectance) or the highest calibration (sunz corrected reflectance).

Metadata

Metadata

Type

No type
No fields configured for issues without a type.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions