Legacy Output¶
GAC I/O module¶
The I/O module generates three HDF5 files, one containing reflectances, brightness temperatures, and lat/lon information. The other output file contains solar and satellite zenith and azimuth angles. And the third file contains quality flags.
The output file name format is:
ECC_GAC_avhrr_satellitename_99999_yyyymmddThhmmsstZ_yyyymmddThhmmsstZ.h5
and
ECC_GAC_sunsatangles_satellitename_99999_yyyymmddThhmmsstZ_yyyymmddThhmmsstZ.h5
and
ECC_GAC_qualflags_satellitename_99999_yyyymmddThhmmsstZ_yyyymmddThhmmsstZ.h5
where,
ECC
: ESA CCI Clouds (This prefix can be changed/specified by the user)
avhrr
: denoting that it contains reflectances and BTs
sunsatangles
: denoting that it contains angles
qualflags
: denoting that it contains quality flag information
yyyymmddThhmmsstZ
: yy:year, mm:month, dd:day, hh:hour, mm:min, ss:sec, t:tenth of second (for the start and the end of the orbit).
Letters T
and Z
are separators for time info.
The value of 99999
is currently used instead of providing actual orbit
number.
Appendices A, B and C provide detailed format of these files, including variable names, scaling, etc.
The start and end times in the header and in actual L1b data can be different for orbits. The mismatch can range from few milliseconds to days. It was decided to trust the time stamps in L1b data in Pygac. After reorganizing based on scanline numbers (see issue highlighted above), the time stamps from the first and the last scanlines are taken as start and end times.
In some orbits, the latitude and longitude information contains corrupt values for a part/s of the orbit and these scanlines are not flagged in the corresponding scanline-by-scaline quality flags. Currently, Pygac uses only a simple if_else construct to constrain valid range. Further improvement could be done using extra- and interpolation techniques.
For extremely warm and cold temperatures, the channel 3b is saturating producing irrelevant brightness temperatures. Such saturation is often not flagged in quality information. Pygac currently uses a simple if_else construct to constrain valid range of Bts (170.0K<BT<350.0K). Such condition is also applied to split-window channels.
- pygac.gac_io.avhrrGAC_io(satellite_name, xutcs, startdate, enddate, starttime, endtime, arrLat_full, arrLon_full, ref1, ref2, ref3, bt3, bt4, bt5, arrSZA, arrSTZ, arrSAA, arrSTA, arrRAA, qual_flags, start_line, end_line, total_number_of_scan_lines, last_scan_line_number, corr, gac_file, midnight_scanline, miss_lines, output_file_prefix, avhrr_dir, qual_dir, sunsatangles_dir)¶
- pygac.gac_io.save_gac(satellite_name, xutcs, lats, lons, ref1, ref2, ref3, bt3, bt4, bt5, sun_zen, sat_zen, sun_azi, sat_azi, rel_azi, qual_flags, start_line, end_line, gac_file, meta_data, output_file_prefix, avhrr_dir, qual_dir, sunsatangles_dir)¶
Supplement A: Structure of an output file containing reflectances and brightness temperatures¶
Input: L1b file: NSS.GHRR.NN.D06279.S1800.E1955.B0711012.GC
Output:
Group how {
variables:
char channel_list(6, 9);
:_lastModified = "2014-10-29T13:55:05Z";
how:yaw_error = 0.0; // double
how:roll_error = 0.0; // double
how:pich_error = 0.0; // double
how:startepochs = 1160157611L; // long
how:endepochs = 1160164510L; // long
how:platform = "noaa18";
how:instrument = "avhrr";
how:orbit_number = 99999; // int
how:software = "pyGAC";
how:version = "1.0";
}
Group image1 {
variables:
short data(13686, 409);
:_lastModified = "2014-10-29T13:55:05Z";
Group how {
how:sun_earth_distance_correction_applied = "TRUE";
how:sun_earth_distance_correction_factor = 0.9982412208987179; // double
}
Group what {
what:product = "SATCH";
what:quantity = "REFL";
what:dataset_name = "Channel 1 reflectance";
what:units = "%";
what:gain = 0.01f; // float
what:offset = 0.0f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
image1:channel = "1";
image1:description = "AVHRR ch1";
}
Group image2 {
variables:
short data(13686, 409);
:_lastModified = "2014-10-29T13:55:05Z";
Group how {
how:sun_earth_distance_correction_applied = "TRUE";
how:sun_earth_distance_correction_factor = 0.9982412208987179; // double
}
Group what {
what:product = "SATCH";
what:quantity = "REFL";
what:dataset_name = "Channel 2 reflectance";
what:units = "%";
what:gain = 0.01f; // float
what:offset = 0.0f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
image2:channel = "2";
image2:description = "AVHRR ch2";
}
Group image3 {
variables:
short data(13686, 409);
:_lastModified = "2014-10-29T13:55:05Z";
Group how {
}
Group what {
what:product = "SATCH";
what:quantity = "TB";
what:dataset_name = "Channel 3b brightness temperature";
what:units = "K";
what:gain = 0.01f; // float
what:offset = 273.15f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
image3:description = "AVHRR ch3b";
image3:channel = "3b";
}
Group image4 {
variables:
short data(13686, 409);
:_lastModified = "2014-10-29T13:55:05Z";
Group how {
}
Group what {
what:product = "SATCH";
what:quantity = "TB";
what:dataset_name = "Channel 4 brightness temperature";
what:units = "K";
what:gain = 0.01f; // float
what:offset = 273.15f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
image4:channel = "4";
image4:description = "AVHRR ch4";
}
Group image5 {
variables:
short data(13686, 409);
:_lastModified = "2014-10-29T13:55:05Z";
Group how {
}
Group what {
what:product = "SATCH";
what:quantity = "TB";
what:dataset_name = "Channel 5 brightness temperature";
what:units = "K";
what:gain = 0.01f; // float
what:offset = 273.15f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
image5:channel = "5";
image5:description = "AVHRR ch5";
}
Group image6 {
variables:
short data(13686, 409);
:_lastModified = "2014-10-29T13:55:05Z";
Group how {
how:sun_earth_distance_correction_applied = "TRUE";
how:sun_earth_distance_correction_factor = 0.9982412208987179; // double
}
Group what {
what:product = "SATCH";
what:quantity = "REFL";
what:dataset_name = "Channel 3a reflectance";
what:units = "%";
what:gain = 0.01f; // float
what:offset = 0.0f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
image6:channel = "3a";
image6:description = "AVHRR ch3a";
}
Group what {
what:object = "SATP";
what:sets = 6; // int
what:version = "H5rad ?.?";
what:date = "20061006";
what:time = "180011";
}
Group where {
Group lat {
variables:
int data(13686, 409);
:_lastModified = "2014-10-29T13:55:05Z";
Group what {
what:dataset_name = "Latitude";
what:units = "Deg";
what:gain = 0.001f; // float
what:offset = 0.0f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
}
Group lon {
variables:
int data(13686, 409);
:_lastModified = "2014-10-29T13:55:05Z";
Group what {
what:dataset_name = "Longitude";
what:units = "Deg";
what:gain = 0.001f; // float
what:offset = 0.0f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
}
where:num_of_pixels = 409; // int
where:num_of_lines = 13686; // int
where:xscale = 0.0f; // float
where:yscale = 0.0f; // float
}
}
Supplement B: Structure of an output file containing Sun and satellite positions¶
Input: L1b file: NSS.GHRR.NN.D06279.S1800.E1955.B0711012.GC
Output:
Group how {
how:yaw_error = 0.0; // double
how:roll_error = 0.0; // double
how:pich_error = 0.0; // double
how:startepochs = 1160157611L; // long
how:endepochs = 1160164510L; // long
how:platform = "noaa18";
how:instrument = "avhrr";
how:orbit_number = 99999; // int
how:software = "pyGAC";
how:version = "1.0";
}
Group image1 {
variables:
short data(13686, 409);
:_lastModified = "2014-10-29T13:55:06Z";
Group what {
what:product = "SUNZ";
what:quantity = "DEG";
what:dataset_name = "Solar zenith angle";
what:units = "Deg";
what:gain = 0.01f; // float
what:offset = 0.0f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
image1:description = "Solar zenith angle";
}
Group image2 {
variables:
short data(13686, 409);
:_lastModified = "2014-10-29T13:55:06Z";
Group what {
what:product = "SATZ";
what:quantity = "DEG";
what:dataset_name = "Satellite zenith angle";
what:units = "Deg";
what:gain = 0.01f; // float
what:offset = 0.0f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
image2:description = "Satellite zenith angle";
}
Group image3 {
variables:
short data(13686, 409);
:_lastModified = "2014-10-29T13:55:06Z";
Group what {
what:product = "SSAZD";
what:quantity = "DEG";
what:dataset_name = "Relative satellite-sun azimuth angle";
what:units = "Deg";
what:gain = 0.01f; // float
what:offset = 0.0f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
image3:description = "Relative satellite-sun azimuth angle";
}
Group image4 {
variables:
short data(13686, 409);
:_lastModified = "2014-10-29T13:55:06Z";
Group what {
what:product = "SUNA";
what:quantity = "DEG";
what:dataset_name = "Solar azimuth angle";
what:units = "Deg";
what:gain = 0.01f; // float
what:offset = 180.0f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
image4:description = "Solar azimuth angle";
}
Group image5 {
variables:
short data(13686, 409);
:_lastModified = "2014-10-29T13:55:06Z";
Group what {
what:product = "SATA";
what:quantity = "DEG";
what:dataset_name = "Satellite azimuth angle";
what:units = "Deg";
what:gain = 0.01f; // float
what:offset = 180.0f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
image5:description = "Satellite azimuth angle";
}
Group what {
what:object = "SATP";
what:sets = 5; // int
what:version = "H5rad ?.?";
what:date = "20061006";
what:time = "180011";
}
Group where {
Group lat {
variables:
int data(13686, 409);
:_lastModified = "2014-10-29T13:55:06Z";
Group what {
what:dataset_name = "Latitude";
what:units = "Deg";
what:gain = 0.001f; // float
what:offset = 0.0f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
}
Group lon {
variables:
int data(13686, 409);
:_lastModified = "2014-10-29T13:55:06Z";
Group what {
what:dataset_name = "Longitude";
what:units = "Deg";
what:gain = 0.001f; // float
what:offset = 0.0f; // float
what:missingdata = -32001; // int
what:nodata = -32001; // int
what:starttime = "180011";
what:endtime = "195510";
what:startdate = "20061006";
what:enddate = "20061006";
}
}
where:num_of_pixels = 409; // int
where:num_of_lines = 13686; // int
where:xscale = 0.0f; // float
where:yscale = 0.0f; // float
}
}
Supplement C: Structure of an output file containing quality flags¶
The file that contains quality flags has following information.
1) There is a variable called qual_flags/data
. It will have a dimension of
(X,7), where X is the number of data records in the GAC orbit. The 7 columns
contain the following information.
Col 1 |
Scan line number |
Col 2 |
Fatal error flag (scan line should not be used for analysis). |
Col 3 |
Insufficient data for calibration (scan line should not be used for analysis). |
Col 4 |
Insufficient data for navigation (scan line should not be used for analysis). |
Col 5-7 |
whether solar contamination of blackbody occurred in in channels 3, 4, and 5 respectively. |
If the values for these flags are greater than zero, then the data should not be used. If everything is normal, then all values should be zero.
2) There are also two important attributes that provide “last scan line number” and “total number of data records”.
By combining information from column 1 and these two attributes, the user is able to figure out where the gap occurs and also exact time for each scan line.