Go to the documentation of this file.
16 static short *tmpShort;
18 static size_t num_scans, num_pixels;
19 static size_t num_bands;
23 static double *scan_time;
24 static double file_start_day;
27 static int geolocationGrp;
28 static int lonId, latId, solzId;
29 static float latFillValue =
BAD_FLT;
30 static float lonFillValue =
BAD_FLT;
31 static float solzFillValue =
BAD_FLT;
49 printf(
"Opening SPEXOne L1B file\n");
50 status = nc_open(
file->name, NC_NOWRITE, &ncid_L1C);
52 fprintf(
stderr,
"-E- %s line %d: nc_open(%s) failed.\n",
53 __FILE__, __LINE__,
file->name);
58 status = nc_inq_dimid(ncid_L1C,
"bins_along_track", &dimid);
60 fprintf(
stderr,
"-E- Error reading sbins_along_track.\n");
63 nc_inq_dimlen(ncid_L1C, dimid, &num_scans);
66 status = nc_inq_dimid(ncid_L1C,
"spatial_samples_per_image", &dimid);
68 fprintf(
stderr,
"-E- Error reading spatial_samples_per_image.\n");
71 nc_inq_dimlen(ncid_L1C, dimid, &num_pixels);
74 status = nc_inq_dimid(ncid_L1C,
"intensity_bands_per_view", &dimid);
76 fprintf(
stderr,
"-E- Error reading intensity_bands_per_view.\n");
79 nc_inq_dimlen(ncid_L1C, dimid, &num_bands);
82 printf(
"L1C Npix :%d Nlines:%d\n", (
int)num_pixels, (
int)num_scans);
86 tmpShort = (
short*) malloc(num_pixels *
sizeof(
short));
87 scan_time = (
double*) malloc(num_scans *
sizeof(
double));
91 if ((nc_inq_grp_ncid(ncid_L1C,
"BIN_ATTRIBUTES", &groupid)) != NC_NOERR) {
92 fprintf(
stderr,
"-E- Error finding bin_attributes.\n");
96 double scan_timeFillValue =
BAD_FLT;
97 status = nc_inq_varid(groupid,
"image_time", &varid);
99 fprintf(
stderr,
"-E- Error finding nadir_view_time.\n");
102 status = nc_inq_var_fill(groupid, varid,
NULL, &scan_timeFillValue);
104 status = nc_get_var_double(groupid, varid, scan_time);
109 status = nc_inq_attlen(ncid_L1C, NC_GLOBAL,
"time_coverage_start", &att_len);
113 char*
time_str = (
char *) malloc(att_len + 1);
116 status = nc_get_att_text(ncid_L1C, NC_GLOBAL,
"time_coverage_start",
time_str);
128 for(
int i=0;
i<num_scans;
i++) {
129 if(scan_time[
i] == scan_timeFillValue)
134 status = nc_inq_grp_ncid(ncid_L1C,
"GEOLOCATION_DATA", &geolocationGrp);
136 status = nc_inq_varid(geolocationGrp,
"longitude", &lonId);
138 status = nc_inq_var_fill(geolocationGrp, lonId,
NULL, &lonFillValue);
140 status = nc_inq_varid(geolocationGrp,
"latitude", &latId);
142 status = nc_inq_var_fill(geolocationGrp, latId,
NULL, &latFillValue);
144 status = nc_inq_varid(geolocationGrp,
"solar_zenith", &solzId);
146 status = nc_inq_var_fill(geolocationGrp, solzId,
NULL, &solzFillValue);
149 file->sd_id = ncid_L1C;
150 file->nbands = num_bands;
151 file->npix = num_pixels;
152 file->nscan = num_scans;
154 file->terrain_corrected = 1;
158 printf(
"file->nbands = %d\n", (
int)
file->nbands);
179 size_t start[] = { 0, 0, 0 };
180 size_t count[] = { 1, 1, 1 };
182 for (
int ip = 0; ip < num_pixels; ip++) {
183 l1rec->pixnum[ip] = ip;
187 l1rec->scantime = file_start_day + scan_time[
line];
195 int32_t
msec = (int32_t) (secs * 1000.0);
204 count[1] = num_pixels;
213 for(
int i=0;
i<num_pixels;
i++) {
214 if(
l1rec->lat[
i] == latFillValue)
216 if(
l1rec->lon[
i] == lonFillValue)
218 if(
l1rec->solz[
i] == solzFillValue)
234 printf(
"Closing SPEXOne L1B file\n");
240 if (tmpShort) free(tmpShort);
241 if (scan_time) free(scan_time);
void check_err(const int stat, const int line, const char *file)
int readl1_spexone(filehandle *file, int32_t line, l1str *l1rec)
void unix2ymds(double usec, int16_t *year, int16_t *mon, int16_t *day, double *secs)
double esdist_(int32_t *year, int32_t *day, int32_t *msec)
no change in intended resolving MODur00064 Corrected handling of bad ephemeris attitude resolving resolving GSFcd00179 Corrected handling of fill values for[Sensor|Solar][Zenith|Azimuth] resolving MODxl01751 Changed to validate LUT version against a value retrieved from the resolving MODxl02056 Changed to calculate Solar Diffuser angles without adjustment for estimated post launch changes in the MODIS orientation relative to incidentally resolving defects MODxl01766 Also resolves MODxl01947 Changed to ignore fill values in SCI_ABNORM and SCI_STATE rather than treating them as resolving MODxl01780 Changed to use spacecraft ancillary data to recognise when the mirror encoder data is being set by side A or side B and to change calculations accordingly This removes the need for seperate LUTs for Side A and Side B data it makes the new LUTs incompatible with older versions of the and vice versa Also resolves MODxl01685 A more robust GRing algorithm is being which will create a non default GRing anytime there s even a single geolocated pixel in a granule Removed obsolete messages from seed file
int openl1_spexone(filehandle *file)
int time_str(short, short, int, char *)
void unix2yds(double usec, short *year, short *day, double *secs)
real *8 function esdist(iyr, iday, msec)
double ymds2unix(short year, short month, short day, double secs)
How many dimensions is the output array Default is Not sure if anything above will work correctly strcpy(l2prod->title, "no title yet")
int closel1_spexone(filehandle *file)
double isodate2unix(const char *isodate)