17 using namespace netCDF;
18 using namespace netCDF::exceptions;
25 static int32 numScans, numPixels;
26 static int16 tdi_global[8];
27 static char *netcdfFile;
28 static int firstCallThisFile;
29 static char dataTypeString[5];
30 static int16 startYear, startDay, endDay;
31 static int32 startMillisec;
32 static int calibrationAppended = 0;
33 static NcFile *dataFile;
35 #define SENSOR "Sea-viewing Wide Field-of-view Sensor (SeaWiFS)"
36 #define MISSIONCHAR "Nominal orbit: inclination = 98.2 (Sun-synchronous); node = 12 noon local (descending); eccentricity = <0.002; altitude = 705 km; ground speed = 6.75 km/sec"
37 #define SENSORCHAR "Number of bands = 8; number of active bands = 8; wavelengths per band (nm) = 412, 443, 490, 510, 555, 670, 765, 865; bits per pixel = 10; instantaneous field-of-view = 1.5835 mrad; pixels per scan = 1285; scan rate = 6/sec; sample rate = 7710/sec"
63 NcType validMinMaxType
66 variable.putAtt(
"long_name", longName);
69 variable.putAtt(
"unit", unit);
73 variable.putAtt(
"valid_min", validMinMaxType, validMin);
74 variable.putAtt(
"valid_max", validMinMaxType, validMax);
95 NcType validMinMaxType
98 variable.putAtt(
"long name", longName);
101 variable.putAtt(
"unit", unit);
105 variable.putAtt(
"valid_min", validMinMaxType, validMin);
106 variable.putAtt(
"valid_max", validMinMaxType, validMax);
124 unsigned char dataType;
128 int32 startpix, subsamp;
132 if (scene->type ==
HRPT)
135 dataType = scene->mnftype;
151 numScans = scene->nscan;
167 dataFile =
new NcFile(netcdfFile, NcFile::replace);
172 NcDim dim_numTilts = dataFile->addDim(
"tilts", 20);
173 NcDim dim_tiltRange = dataFile->addDim(
"tilt_ranges", 2);
174 NcDim dim_numScans = dataFile->addDim(
"scans", numScans);
175 NcDim dim_qualFlag = dataFile->addDim(
"quality_flags", 4);
176 NcDim dim_numBands = dataFile->addDim(
"bands", 8);
177 NcDim dim_scIds = dataFile->addDim(
"sc_ids", 2);
178 NcDim dim_scTimeTags = dataFile->addDim(
"sc_time_tags", 4);
179 NcDim dim_scSohs = dataFile->addDim(
"sc_sohs", 775);
180 NcDim dim_instTeleme = dataFile->addDim(
"inst_telemetries", 44);
181 NcDim dim_pixlePerLine = dataFile->addDim(
"pixels", numPixels);
182 NcDim dim_instAnaTeleme = dataFile->addDim(
"inst_analog_telemetries", 40);
183 NcDim dim_instDiscTeleme = dataFile->addDim(
"inst_discrete_telemetries", 32);
184 NcDim dim_scAnaTele = dataFile->addDim(
"sc_analog_telemetries", 40);
185 NcDim dim_scDiscTele = dataFile->addDim(
"sc_discrete_telemetries", 40);
186 NcDim dim_vectorEle = dataFile->addDim(
"vector_elements", 3);
187 NcDim dim_scanTrackCoeff = dataFile->addDim(
"scan_track_coefficients", 6);
188 NcDim dim_navFlags = dataFile->addDim(
"navigation_flags", 8);
189 NcDim dim_numSides = dataFile->addDim(
"mirror_sides", 2);
190 NcDim dim_numGains = dataFile->addDim(
"gains", 4);
191 NcDim dim_numKnees = dataFile->addDim(
"knees", 5);
203 vector<NcDim> para_numTilt_tiltRange_tiltRange{dim_numTilts, dim_tiltRange, dim_tiltRange};
204 vector<NcDim> para_numScan_numBands{dim_numScans, dim_numBands};
205 vector<NcDim> para_numScan_qualFlag{dim_numScans, dim_qualFlag};
206 vector<NcDim> para_numScans_vectorElements{dim_numScans, dim_vectorEle};
207 vector<NcDim> para_numBands_numGains_numKnees{dim_numBands, dim_numGains, dim_numKnees};
212 NcVar tiltFlag = dataFile->addVar(
"tilt_flags", NC_SHORT, dim_numTilts);
222 tiltFlag.putVar(scene->tilt_flags);
226 vector<NcDim> tiltRangeParameters{dim_numTilts, dim_tiltRange};
227 NcVar tiltRange = dataFile->addVar(
"tilt_ranges", NC_SHORT, tiltRangeParameters);
230 "Scan-line number ranges of scene tilt states",
237 tiltRange.putVar(scene->tilt_ranges);
242 NcVar tiltLats = dataFile->addVar(
"tilt_lats", NC_FLOAT, para_numTilt_tiltRange_tiltRange);
245 "Latitudes of tilt-range scan line end points",
252 tiltLats.putVar(scene->tilt_lats);
257 NcVar tiltLons = dataFile->addVar(
"tilt_lons", NC_FLOAT, para_numTilt_tiltRange_tiltRange);
260 "Longitudes of tilt-range scan line end points",
267 tiltLons.putVar(scene->tilt_lons);
271 NcVar scanTime = dataFile->addVar(
"scan_time", NC_INT, dim_numScans);
278 "Scan start time, milliseconds of day",
279 "milliseconds since " + starttime_str.substr(0,10),
289 NcVar engQual = dataFile->addVar(
"eng_qual", NC_UBYTE, para_numScan_qualFlag);
292 "Engineering data-out-of-range flags",
301 NcVar sFlag = dataFile->addVar(
"s_flag", NC_UBYTE, para_numScan_qualFlag);
304 "Scan-line quality flags",
313 NcVar s_satP= dataFile->addVar(
"s_satp", NC_SHORT, para_numScan_numBands);
316 "Number of saturated pixels per band",
325 NcVar s_zerop= dataFile->addVar(
"s_zerop", NC_SHORT, para_numScan_numBands);
328 "Number of zero pixels per band",
337 NcVar slat = dataFile->addVar(
"slat", NC_FLOAT, dim_numScans);
340 "Scan start-pixel latitude",
349 NcVar slon = dataFile->addVar(
"slon", NC_FLOAT, dim_numScans);
352 "Scan start-pixel longitude",
361 NcVar clat = dataFile->addVar(
"clat", NC_FLOAT, dim_numScans);
364 "Scan center-pixel longitude",
373 NcVar clon = dataFile->addVar(
"clon", NC_FLOAT, dim_numScans);
376 "Scan center-pixel longitude",
385 NcVar elat = dataFile->addVar(
"elat", NC_FLOAT, dim_numScans);
388 "Scan end-pixel longitude",
397 NcVar elon = dataFile->addVar(
"elon", NC_FLOAT, dim_numScans);
400 "Scan end-pixel longitude",
409 NcVar csol_z = dataFile->addVar(
"csol_z", NC_FLOAT, dim_numScans);
412 "Scan center-pixel solar zenith angle",
421 NcVar
tilt = dataFile->addVar(
"tilt", NC_FLOAT, dim_numScans);
424 "Tilt angle for scan line",
433 vector<NcDim> scIdParameter{dim_numScans, dim_scIds};
434 NcVar sc_id = dataFile->addVar(
"sc_id", NC_SHORT, scIdParameter);
446 vector<NcDim> scTtagParameter{dim_numScans, dim_scTimeTags};
447 NcVar sc_ttag = dataFile->addVar(
"sc_ttag", NC_SHORT, scTtagParameter);
450 "Spacecraft time tag",
459 vector<NcDim> scSohParameter{dim_numScans, dim_scSohs};
460 NcVar sc_soh = dataFile->addVar(
"sc_soh", NC_UBYTE, scSohParameter);
463 "Spacecraft state-of-health data",
472 vector<NcDim> instTlmParameter{dim_numScans, dim_instTeleme};
473 NcVar sc_tlm = dataFile->addVar(
"inst_tlm", NC_SHORT, instTlmParameter);
476 "SeaWiFS instrument telemetry",
485 vector<NcDim> l1aDataParameter{dim_numScans, dim_pixlePerLine, dim_numBands};
486 NcVar
l1a_data = dataFile->addVar(
"l1a_data", NC_SHORT, l1aDataParameter);
498 NcVar startSyn = dataFile->addVar(
"start_syn", NC_SHORT, para_numScan_numBands);
510 NcVar stopSyn = dataFile->addVar(
"stop_syn", NC_SHORT, para_numScan_numBands);
522 NcVar darkRest = dataFile->addVar(
"dark_rest", NC_SHORT, para_numScan_numBands);
525 "Dark-restore pixel",
534 NcVar
gain = dataFile->addVar(
"gain", NC_SHORT, para_numScan_numBands);
537 "Band gain settings",
546 NcVar
tdi = dataFile->addVar(
"tdi", NC_SHORT, para_numScan_numBands);
549 "Band time-delay and integration settings",
558 vector<NcDim> instAnaParameter{dim_numScans, dim_instAnaTeleme};
559 NcVar instAna = dataFile->addVar(
"inst_ana", NC_FLOAT, instAnaParameter);
562 "Instrument analog telemetry",
571 vector<NcDim> instDisParameter{dim_numScans, dim_instDiscTeleme};
572 NcVar instDis = dataFile->addVar(
"inst_dis", NC_UBYTE, instDisParameter);
575 "Instrument discrete telemetry",
584 vector<NcDim> scAnaParameter{dim_numScans, dim_scAnaTele};
585 NcVar scAna = dataFile->addVar(
"sc_ana", NC_FLOAT, scAnaParameter);
588 "Spacecraft analog telemetry",
597 vector<NcDim> scDisParameter{dim_numScans, dim_scDiscTele};
598 NcVar scDis = dataFile->addVar(
"sc_dis", NC_UBYTE, scDisParameter);
601 "Spacecraft discrete telemetry",
610 NcVar scanTemp = dataFile->addVar(
"scan_temp", NC_SHORT, para_numScan_numBands);
613 "Detector temperature counts",
622 NcVar
side = dataFile->addVar(
"side", NC_SHORT, dim_numScans);
625 "Mirror side for scan line",
634 NcVar orbVec = dataFile->addVar(
"orb_vec", NC_FLOAT, para_numScans_vectorElements);
637 "Orbit position vector at scan line time",
646 NcVar l_vert = dataFile->addVar(
"l_vert", NC_FLOAT,para_numScans_vectorElements);
649 "Local vertical vector in ECEF frame",
658 NcVar sun_ref = dataFile->addVar(
"sun_ref", NC_FLOAT, para_numScans_vectorElements);
661 "Reference Sun vector in ECEF frame",
670 NcVar
att_ang = dataFile->addVar(
"att_ang", NC_FLOAT, para_numScans_vectorElements);
673 "Computed yaw, roll, pitch",
682 vector<NcDim> sen_mat_Parameter{dim_numScans, dim_vectorEle, dim_vectorEle};
683 NcVar sen_mat = dataFile->addVar(
"sen_mat", NC_FLOAT, sen_mat_Parameter);
686 "ECEF-to-sensor-frame matrix",
695 vector<NcDim> scan_ell_Parameter{dim_numScans, dim_scanTrackCoeff};
696 NcVar
scan_ell = dataFile->addVar(
"scan_ell", NC_FLOAT, scan_ell_Parameter);
699 "Scan-track ellipse coefficients",
708 vector<NcDim> nFlagParameter{dim_numScans, dim_navFlags};
709 NcVar nFlag = dataFile->addVar(
"nflag", NC_INT, nFlagParameter);
721 vector<NcDim> mirrorParameter{dim_numSides, dim_numBands};
722 NcVar mirror = dataFile->addVar(
"mirror", NC_FLOAT, mirrorParameter);
725 "Mirror-side correction factors",
734 NcVar
t_const = dataFile->addVar(
"t_const", NC_DOUBLE, dim_numBands);
737 "Time-dependent correction constant terms",
746 NcVar t_linear = dataFile->addVar(
"t_linear", NC_DOUBLE, dim_numBands);
749 "Time-dependent correction linear coefficients",
758 NcVar t_quadratic = dataFile->addVar(
"t_quadratic", NC_DOUBLE, dim_numBands);
761 "Time-dependent correction quadratic coefficients",
770 NcVar
cal_offs = dataFile->addVar(
"cal_offs", NC_FLOAT, dim_numBands);
773 "Calibration system offsets",
782 NcVar
counts = dataFile->addVar(
"counts", NC_FLOAT, para_numBands_numGains_numKnees);
785 "Digital counts of calibration knees",
795 NcVar
rads = dataFile->addVar(
"rads", NC_FLOAT, para_numBands_numGains_numKnees);
798 "Radiances of calibration knees",
810 dataFile->putAtt(
"title",
"SeaWiFS Level-1A Data");
811 dataFile->putAtt(
"instrument",
"SeaWiFS");
812 dataFile->putAtt(
"platform",
"Orbview-2");
813 dataFile->putAtt(
"product_name",
basename(netcdfFile));
814 dataFile->putAtt(
"processing_version",
"V2");
815 dataFile->putAtt(
"processing_level",
"L1A");
816 dataFile->putAtt(
"cdm_data_type",
"swath");
817 dataFile->putAtt(
"orbit_number", NC_INT, scene->orbnum);
819 dataFile->putAtt(
"time_coverage_start",
unix2isodate(scene->stime,
'G'));
820 dataFile->putAtt(
"time_coverage_end",
unix2isodate(scene->etime,
'G'));
821 dataFile->putAtt(
"startDirection", scene->start_node);
822 dataFile->putAtt(
"endDirection", scene->end_node);
824 dataFile->putAtt(
"data_type",
DTypeString(dataType));
826 dataFile->putAtt(
"LAC_pixel_start_number", NC_INT, startpix);
827 dataFile->putAtt(
"LAC_pixel_subsampling", NC_INT, subsamp);
828 dataFile->putAtt(
"pixel_offset", NC_INT, pixelOffset);
829 dataFile->putAtt(
"data_center", stationInfo.
data_center);
830 dataFile->putAtt(
"station_name", stationInfo.
station_name);
831 dataFile->putAtt(
"station_latitude",NC_FLOAT, stationInfo.
station_latitude);
833 dataFile->putAtt(
"mission",
"SeaStar SeaWiFS");
834 dataFile->putAtt(
"mission_characteristics",
MISSIONCHAR);
835 dataFile->putAtt(
"sensor",
SENSOR);
836 dataFile->putAtt(
"sensor_characteristics",
SENSORCHAR);
837 dataFile->putAtt(
"input_files", scene->l0file);
838 dataFile->putAtt(
"scene_center_time",
unix2isodate(scene->ctime,
'G'));
839 dataFile->putAtt(
"node_crossing_time",
unix2isodate(scene->node_time,
'G'));
842 dataFile->putAtt(
"orbit_node_longitude", NC_FLOAT, scene->node_lon);
849 }
catch(NcException& e) {
850 cerr <<
"-E- Error with creating NetCDF File: " << e.what() << endl;
859 DecomposeTime(scene->stime, &startYear, &startDay, &startMillisec);
861 firstCallThisFile = 0;
888 NcVar variable = dataFile->getVar(ncVarName);
889 vector<size_t> writeToLocation = {rowIndex, colIndex};
890 variable.putVar(writeToLocation,
data);
892 }
catch (NcException& e) {
893 cout <<
"-E- Error writing data to the NcVar " << ncVarName <<
". Err: " << e.what() << e.errorCode() << endl;
916 size_t subsetArrRowSize,
917 size_t subsetArrColSize,
923 NcVar variable = dataFile->getVar(ncVarName);
924 vector<size_t> writeToLocation = {rowIndex, colIndex};
925 vector<size_t> newDataSize = {subsetArrRowSize, subsetArrColSize};
926 variable.putVar(writeToLocation, newDataSize,
data);
928 }
catch (NcException& e) {
929 cout <<
"-E- Error writing data to the NcVar " << ncVarName <<
". Err: " << e.what() << e.errorCode() << endl;
954 size_t subsetArrBlockSize,
955 size_t subsetArrRowSize,
956 size_t subsetArrColSize,
962 NcVar variable = dataFile->getVar(ncVarName);
963 vector<size_t> writeToLocation = {blockIndex, rowIndex, colIndex};
964 variable.putVar(writeToLocation, vector<size_t>{subsetArrBlockSize, subsetArrRowSize, subsetArrColSize},
data);
966 }
catch (NcException& e) {
967 cout <<
"-E- Error writing data to the NcVar " << ncVarName <<
". Err: " << e.what() << e.errorCode() << endl;
987 uint8 *s_flags =
l1rec->s_flags;
990 float32 slat =
l1rec->slat;
991 float32 slon =
l1rec->slon;
992 float32 clat =
l1rec->clat;
993 float32 clon =
l1rec->clon;
994 float32 elat =
l1rec->elat;
995 float32 elon =
l1rec->elon;
996 float32 csol_z =
l1rec->csol_z;
1000 uint8 *sc_soh =
l1rec->soh;
1008 float32 *inst_ana =
l1rec->inst_ana;
1009 uint8 *inst_dis =
l1rec->inst_dis;
1010 float32 *sc_ana =
l1rec->sc_ana;
1011 uint8 *sc_dis =
l1rec->sc_dis;
1014 float32 *orb_vec =
l1rec->orb_vec;
1015 float32 *l_vert =
l1rec->l_vert;
1016 float32 *sun_ref =
l1rec->sun_ref;
1018 float32 *sen_mat = &
l1rec->sen_mat[0][0];
1020 int32 *nflag = (int32 *)
l1rec->nflag;
1024 fprintf(
stderr,
"-W- %s line %d: ", __FILE__, __LINE__);
1025 fprintf(
stderr,
"WriteScanData() called with scanline number (%d) ",
scan);
1026 fprintf(
stderr,
"that is inappropriate to the number of scanlines (%d) ",
1028 fprintf(
stderr,
"in the current HDF file, %s . Call ignored.\n", netcdfFile);
1071 }
catch(NcException& e) {
1072 cout <<
"Error in WriteScanData_netcdf. Error: " << e.what() << endl;
1081 if (firstCallThisFile)
1082 for (
i = 0;
i < 8;
i++)
1083 tdi_global[
i] =
tdi[
i];
1335 calibrationAppended = 1;
1349 double rint(
double);
1356 "S%4d%03d%02d%02d%02d.L1A_%.4s",
1376 case 0:
return (
"LAC");
1377 case 1:
return (
"LUN");
1378 case 2:
return (
"SOL");
1379 case 3:
return (
"IGC");
1380 case 4:
return (
"TDI");
1381 case 15:
return (
"GAC");
1382 case 16:
return (
"HRPT");
1383 default:
return (
"");
1395 static char type[5];
1400 if (strcmp(
t,
"HRPT") == 0) {
1405 sprintf(
type,
"Hxxx");
1406 fprintf(
stderr,
"-W- %s line %d: ", __FILE__, __LINE__);
1407 fprintf(
stderr,
"Station code not found; using \"xxx\".\n");
1409 if (strlen(stationInfo.
code) == 3)
1410 sprintf(
type,
"H%.3s", stationInfo.
code);
1412 sprintf(
type,
"%.4s", stationInfo.
code);
1415 }
else if (*
t == 0) {
1416 sprintf(
type,
"%03u", dataType);
1417 fprintf(
stderr,
"-W- %s line %d: ", __FILE__, __LINE__);
1418 fprintf(
stderr,
"Unknown data type. ");
1419 fprintf(
stderr,
"Setting data-type string to \"%s\".\n",
type);
1436 time_t itime = (time_t) dtime;
1438 double rint(
double);
1440 ts = gmtime(&itime);
1441 *year = (
int16) (ts->tm_year + 1900);
1442 *dayofyear = (
int16) (ts->tm_yday + 1);
1443 *millisec = (int32) (floor(1000 * (ts->tm_hour * 3600 +