25 #include <boost/foreach.hpp>
26 #include <boost/algorithm/string.hpp>
28 static short *tmpShort;
31 static size_t expected_number_of_bands = 239;
33 static size_t num_scans, num_pixels, number_of_bands;
37 static double *scan_time;
38 static int32_t scan_time_year, scan_time_month, scan_time_day;
43 static int geolocationGrp;
44 static int tiltId, lonId, latId, prodims[345];
45 static float latFillValue = -999.0;
46 static float lonFillValue = -999.0;
48 static float tiltmin = 0.0, tiltmax = 0.0;
49 static float tiltFillValue = -999.0;
52 static int observationGrp;
62 :
att_ang{-999.0, -999.0, -999.0}, orb_pos{-999.0, -999.0, -999.0}, orb_vel{-999.0, -999.0, -999.0} {
69 ev_mid_time =
nullptr;
70 scan_quality_flag =
nullptr;
115 string delim1 =
":, ";
116 string l2prod_str = l1cinput->
l2prod;
117 boost::trim_if(l2prod_str, boost::is_any_of(delim1));
118 vector<string> prodparam;
119 boost::algorithm::split(prodparam, l2prod_str, boost::is_any_of(delim1));
120 if(l1cinput->
verbose) cout <<
"number of L2 products to be processed...................#:..." << prodparam.size() << endl;
121 for (
size_t iprod = 0; iprod < prodparam.size(); iprod++) {
122 if(l1cinput->
verbose) cout <<
"selected L2 ----------- prodparam...." << prodparam[iprod] << endl;
130 printf(
"Opening OCIS L2 file\n");
133 status = nc_open(ptstr, NC_NOWRITE, &ncid_L1B);
135 fprintf(
stderr,
"-E- %s line %d: nc_open(%s) failed.\n", __FILE__, __LINE__, ptstr);
140 status = nc_inq_dimid(ncid_L1B,
"number_of_lines", &dimid);
142 fprintf(
stderr,
"-E- Error reading number_of_scans.\n");
145 nc_inq_dimlen(ncid_L1B, dimid, &num_scans);
146 l2str->
nscan = num_scans;
149 status = nc_inq_dimid(ncid_L1B,
"pixels_per_line", &dimid);
151 fprintf(
stderr,
"-E- Error reading num_pixels.\n");
154 nc_inq_dimlen(ncid_L1B, dimid, &num_pixels);
155 l2str->
npix = num_pixels;
158 status = nc_inq_dimid(ncid_L1B,
"number_of_bands", &dimid);
160 fprintf(
stderr,
"-E- Error reading number of_bands.\n");
163 nc_inq_dimlen(ncid_L1B, dimid, &number_of_bands);
164 if (number_of_bands < expected_number_of_bands) {
165 fprintf(
stderr,
"-E- Not enough bands, expecting %d, found %d.\n", (
int)expected_number_of_bands,
166 (
int)number_of_bands);
171 printf(
"OCI L2 Npix :%d Nlines:%d\n", (
int)num_pixels, (
int)num_scans);
175 tmpShort = (
short *)calloc(num_pixels,
sizeof(
short));
176 scan_time = (
double *)calloc(num_scans,
sizeof(
double));
177 l2str->
tilt = (
float *)calloc(num_scans,
sizeof(
float));
178 l2str->
latpix = (
float *)calloc(num_pixels,
sizeof(
float));
179 l2str->
lonpix = (
float *)calloc(num_pixels,
sizeof(
float));
184 if ((nc_inq_grp_ncid(ncid_L1B,
"scan_line_attributes", &groupid)) == NC_NOERR) {
186 fprintf(
stderr,
"-E- Error finding scan_line_attributes.\n");
190 double scan_timeFillValue = -999.9;
191 status = nc_inq_varid(groupid,
"time", &varid);
193 status = nc_inq_var_fill(groupid, varid,
NULL, &scan_timeFillValue);
195 status = nc_get_var_double(groupid, varid, scan_time);
197 status = nc_get_att_int(groupid, varid,
"year", &scan_time_year);
199 status = nc_get_att_int(groupid, varid,
"month", &scan_time_month);
201 status = nc_get_att_int(groupid, varid,
"day", &scan_time_day);
204 status = nc_inq_varid(groupid,
"msec", &varid);
206 status = nc_inq_var_fill(groupid, varid,
NULL, &scan_timeFillValue);
208 status = nc_get_var_double(groupid, varid, scan_time);
213 status = nc_inq_attlen(ncid_L1B, NC_GLOBAL,
"time_coverage_start", &att_len);
217 char *
time_str = (
char *)malloc(att_len + 1);
220 status = nc_get_att_text(ncid_L1B, NC_GLOBAL,
"time_coverage_start",
time_str);
228 scan_time_year =
syear;
229 scan_time_month = smon;
230 scan_time_day =
sday;
233 for (
size_t i = 0;
i < num_scans;
i++) {
234 if (scan_time[
i] == scan_timeFillValue)
240 status = nc_get_att_int(ncid_L1B, NC_GLOBAL,
"orbit_number", &orbit_number);
244 status = nc_inq_grp_ncid(ncid_L1B,
"navigation_data", &geolocationGrp);
246 status = nc_inq_varid(geolocationGrp,
"longitude", &lonId);
249 status = nc_inq_var_fill(geolocationGrp, lonId,
NULL, &lonFillValue);
251 status = nc_inq_varid(geolocationGrp,
"latitude", &latId);
253 status = nc_inq_var_fill(geolocationGrp, latId,
NULL, &latFillValue);
256 status = nc_inq_varid(geolocationGrp,
"tilt", &tiltId);
258 status = nc_inq_var_fill(geolocationGrp, tiltId,
NULL, &tiltFillValue);
260 status = nc_get_att_float(geolocationGrp, tiltId,
"valid_min", &tiltmin);
262 status = nc_get_att_float(geolocationGrp, tiltId,
"valid_max", &tiltmax);
266 status = nc_inq_grp_ncid(ncid_L1B,
"geophysical_data", &observationGrp);
269 for (
size_t iprod = 0; iprod <
nl2prod; iprod++) {
270 if(l1cinput->
verbose) cout <<
"getting sds id for product.." << prodparam[iprod].c_str() << endl;
271 status = nc_inq_varid(observationGrp, prodparam[iprod].c_str(), &prodims[iprod]);
279 string ATT_NAME1 =
"scale_factor", ATT_NAME2 =
"add_offset";
280 for (
size_t iprod = 0; iprod <
nl2prod; iprod++) {
281 if (nc_get_att_float(observationGrp, prodims[iprod], ATT_NAME1.c_str(), &l2str->
slopeprod[iprod]))
283 if (nc_get_att_float(observationGrp, prodims[iprod], ATT_NAME2.c_str(), &l2str->
offsetprod[iprod]))
288 status = nc_get_var_float(geolocationGrp, tiltId, l2str->
tilt);
310 size_t start[] = {0, 0};
311 size_t count[] = {1, 1};
315 printf(
"Reading OCIS L2 file\n");
321 l2str->
iscan = sline;
325 count[1] = num_pixels;
333 for (
size_t iprod = 0; iprod <
nl2prod; iprod++) {
345 printf(
"Closing ocis L2 file\n");
351 if (l2str->
latpix !=
nullptr)
353 if (l2str->
lonpix !=
nullptr)
359 if (l2str->
tilt !=
nullptr)
361 if (l2str->
l2prod !=
nullptr)
373 l2str->
tilt =
nullptr;