Page 1 of 1

Adjusting L2gen gain factors for different atmospheric corrections

Posted: Wed Nov 29, 2023 7:52 am America/New_York
by eli_tes
Hi, I'm using MODIS-Aqua data in SeaDAS (in Ubuntu 22.04).
I'm wondering about how to adjust the gain factors in the l2gen processor.
Did I understand correctly that I need to change the gain factors anytime I use a different atmospheric correction (meaning select a different aer_opt that uses different bands?). Are the gain factors that are already included specifically for aer-opt -17?

For example from the ocean optics webbook: "It must be remembered that a set of gains must be determined for each sensor and atmospheric correction algorithm. As improvements are made to the atmospheric correction algorithms described in Level 2 of this chapter, the gains must be recomputed. However, these recomputations can be made using the original target radiances. Gain recalculation is a part of the standard reprocessing of data sets."

If changing them is needed for example to use the SWIR correction instead, can anyone point me towards any resources on how that is done correctly?

Cheers + thanks for any help!

Disclaimer: I asked a similar question in this topic: viewtopic.php?p=16961#p16961 but I don't think anybody saw.

Re: Adjusting L2gen gain factors for different atmospheric corrections

Posted: Fri Dec 01, 2023 11:29 am America/New_York
by OB.DAAC - SeanBailey
It's not a trivial undertaking...

The process we currently employ is based on Franz, et al., (2007)*. In practice it requires running the l2gen code with a particular configuration that inverts the forward process of atmospheric correction.

For the NIR (or SWIR) bands used in the aerosol model selection, we use data over clear ocean waters with stable maritime aerosols such that we can assume a single model. We fix the l2gen inversion process to use that single model (e.g. aermodels=r70f10v01; aer_opt=-1). The model used was chosen based on an analysis of aerosol data from the AERONET station on Tahiti (the closest to the South Pacific Gyre (SPG) region we use for the NIR calibration).

We also set all gains to unity. The option that does the magic, is vcal_opt. Setting it to 1 tells l2gen to use a 'black' ocean (zero water-leaving radiance). We then process the scene outputting a product called vgain (vicarious gain; alternatively you can output Lt and vLt- vicarious Lt and compute the gain yourself).

This process is repeated for as many scenes as possible throughout the mission to ensure we get the central tendency. An average gain of the valid pixels for each scene is derived and then a filered mean of those individual scene gains is used to define the final NIR (or SWIR) gain for the aer_wave_short band (the long waveband is defined as unity).

With that we have the aerosols covered. On to the visible bands.

A similar process is used, but rather than a region in the SPG, we target NOAA's Marine Optical Buoy (MOBY)

Since we're now targeting a non-black ocean, we use the water leaving radiances from MOBY as input to l2gen via the vcal_lw parameter (an array of Lw values for all visible bands) and set vcal_opt=3 (which tells l2gen we're giving it Lw values to replace what it derives). The gains are also set such that all are unity except the aer_wave_short band for which we use the value obtained from the "NIR" calibration process. The aer_opt is set to the aerosol option we're desiring to calibrate - with the stipulation that it should be a variant that does not employ any iterative NIR correction (which is unnecessary at MOBY anyway). Repeat for as many valid matchups with MOBY as we can get.

BTW, the in situ source doesn't have to be MOBY. It can be any trusted in situ source, but with MOBY we can get in situ data convolved to match the spectral response function for the sensors we're calibrating. Which brings up the need to set the outband_opt to zero (turning off the out of band correction, which isn't necessary when the target data are convolved to the sensor spectral response).

In summary, the NIR calibration parameters:

gain=[<array of 1s matching the number of bands for the sensor>]
l2prod=vgain_### (where ### is the aer_wave_short value, e.g. vgain_748)

VIS calibration parameters:
aer_opt=-1 (or other appropriate value)
vcal_lw=[<array of Lws for each visible band>]
vcal_solz=<solar zenith angle for time of in situ data collection>
gain=[<array of 1s matching the number of bands for the sensor, except for aer_wave_short, which is the gain derived from the NIR calibration process>]
l2prod=vgain_vvv (vvv gets expanded to the visible bands)

So, I'll's not trivial...

* Bryan A. Franz, Sean W. Bailey, P. Jeremy Werdell, and Charles R. McClain, "Sensor-independent approach to the vicarious calibration of satellite ocean color radiometry," Appl. Opt. 46, 5068-5082 (2007)