OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
VcstObc.h
Go to the documentation of this file.
1 /******************************************************************************
2  * NAME: VcstObc.h
3  *
4  * DESCRIPTION: Object class that generates an OBC file from a VIIRS L1A file.
5  *
6  * Created on: January 2, 2015
7  * Author: Sam Anderson, VCST
8  *
9  ******************************************************************************/
10 
11 #ifndef VcstObc_H_
12 #define VcstObc_H_
13 
14 #include <string>
15 #include <vector>
16 #include <map>
17 #include <sstream>
18 #include <iostream>
19 #include <netinet/in.h>
20 
21 #include <VcstCmnGeo.h>
22 #include <VcstViirsStructs.h>
23 #include <VcstCmnGeoStructs.h>
24 #include <VcstViirsThermal.h>
25 #include <netcdf>
26 
27 using namespace std;
28 using namespace netCDF;
29 using namespace netCDF::exceptions;
30 
31 
32 // Structure of LUT pointers used for temperatures
33 
34 struct obcLutPtrs {
41 };
42 
43 class ViirsThermal;
44 
45 class VcstObc {
46 public:
47 
51  string platform_;
53  string endDirection_;
58  string pge_end_time_;
59  string versionid_;
60  string history_;
61  string source_files_;
62 
63  // FIR filter configuration
64 
65  static constexpr int NUM_TAPS = 201;
66 
67  // constants
68 
69  static constexpr int RSB_BANDS = 14;
70  static constexpr int TEB_BANDS = 7;
71  static constexpr int MIRROR_SIDE = 2;
72 
73  static constexpr int SATURATED_DN = 4095;
74  static constexpr int MAX_NUM_HISTORY_ORBITS = 480;
75 
76  // Static constants and arrays
77 
78  static const int processAtNight[Viirs_Bands];
79 
80  static constexpr double DEGtoRAD = 0.017453292519943296e0;
81  static constexpr double RADtoDEG = 57.295779513082321e0;
82 
83  static constexpr int C_COEFFS = 4;
84  static constexpr int A_COEFFS = 3;
85  static constexpr int T_FP_LEVELS = 5;
86  static constexpr int T_ELEC_LEVELS = 5;
87 
88  static constexpr unsigned char NIGHT_GRAN = 0;
89  static constexpr unsigned char DAY_GRAN = 1;
90  static constexpr unsigned char MIXED_GRAN = 2;
91 
92  // global constants
93  static constexpr char SCE_A_SIDE_ON = 0;
94  static constexpr char SCE_B_SIDE_ON = 1;
95  static constexpr char SCE_INVALID = -1;
96 
97  static constexpr unsigned char L1B_SCAN_STATE_HA_MIRROR_B_SIDE = 0x01; //0000000x
98  static constexpr unsigned char L1B_SCAN_STATE_ELECTRONICS_SIDE = 0x02; //000000x0
99  static constexpr unsigned char L1B_SCAN_STATE_SENSOR_NIGHT_MODE = 0x04; //00000x00
100  static constexpr unsigned char L1B_SCAN_STATE_SENSOR_NOT_OPERATIONAL = 0x08; //0000x000
101  static constexpr unsigned char L1B_SCAN_STATE_NO_CALIBRATION = 0xff; //xxxxxxxx
102 
103  static constexpr unsigned char L1B_SCAN_QUALITY_MOON_IN_SPACE_VIEW = 0x01; //0000000x
104  static constexpr unsigned char L1B_SCAN_QUALITY_NO_EV_DATA = 0x02; //000000x0
105  static constexpr unsigned char L1B_SCAN_QUALITY_SENSOR_NOT_NOMINAL = 0x04; //00000x00
106  static constexpr unsigned char L1B_SCAN_QUALITY_SCAN_SYNC_FAILURE = 0x08; //0000x000
107  static constexpr unsigned char L1B_SCAN_QUALITY_TEL_START_NOT_NOMINAL = 0x10; //000x0000
108  static constexpr unsigned char L1B_SCAN_QUALITY_BB_TEMP_NOT_NOMINAL = 0x20; //00x00000
109  static constexpr unsigned char L1B_SCAN_QUALITY_LWIR_TEMP_NOT_NOMINAL = 0x40; //0x000000
110 
111  // numeric constants
112  static constexpr long long MSECPERDAY = 86400000000ll; //24*60*60=86400 million
113  static constexpr double TAI93_TAI58_SEC = 1104537627.0;
114  static constexpr double RAD_TO_DEG = 180.0 / M_PI;
115  static constexpr int RSR_SIZE = 1000;
116  static constexpr int SOLAR_IRAD_SIZE = 49951;
117 
118  // General Pixel quality Flags
119  static constexpr short NUM_PIXEL_QUALITY_FLAGS = 4;
120  static constexpr unsigned char L1B_PIXEL_QUALITY_GOOD = 0x00; //00000000
121  static constexpr unsigned char L1B_PIXEL_QUALITY_SUBSTITUTE_CAL = 0x01; //0000000x
122  static constexpr unsigned char L1B_PIXEL_QUALITY_OUTOFRANGE_RAD = 0x02; //000000x0
123  static constexpr unsigned char L1B_PIXEL_QUALITY_OUTOFRANGE_RFLBT = 0x02; //000000x0
124  static constexpr unsigned char L1B_PIXEL_QUALITY_ALLSATURATION = 0x04; //00000x00
125  static constexpr unsigned char L1B_PIXEL_QUALITY_TEMP_NOT_NOMINAL = 0x08; //0000x000
126  static constexpr unsigned char L1B_PIXEL_QUALITY_LOWER_MASK = 0x0f; //0000xxxx
127  static constexpr unsigned char L1B_PIXEL_QUALITY_UPPER_MASK = 0xf0; //xxxx0000
128  static constexpr unsigned char L1B_PIXEL_QUALITY_NOT_ALLSATURATION = 0xfb; //xxxxx0xx
129  static constexpr unsigned char L1B_PIXEL_QUALITY_NOT_OUTOFRANGE = 0xfd; //xxxxxx0x
130 
131  // DG Pixel quality Flags
132  static constexpr short NUM_DG_PIXEL_QUALITY_FLAGS = 8;
133  static constexpr short NUM_UADG_PIXEL_QUALITY_FLAGS = 6;
134  static constexpr unsigned char L1B_PIXEL_QUALITY_LOW_GAIN_STATE = 0x10; //000x0000
135  static constexpr unsigned char L1B_PIXEL_QUALITY_MIXED_GAIN_STATE = 0x20; //00x00000
136  static constexpr unsigned char L1B_PIXEL_QUALITY_DG_ANOMALY = 0x40; //0x000000
137  static constexpr unsigned char L1B_PIXEL_QUALITY_SOMESATURATION = 0x80; //00000x00
138 
139  // DNB Pixel quality Flags
140  static constexpr short NUM_DNB_PIXEL_QUALITY_FLAGS = 5;
141  static constexpr unsigned char L1B_PIXEL_QUALITY_DNB_STRAY_LIGHT = 0x10; //000x0000
142 
143  // Bad Pixel quality Flags
144  static constexpr short NUM_BAD_PIXEL_QUALITY_FLAGS = 5;
145  static constexpr short BAD_PIXEL_QUAL_SHIFT = 8;
146  static constexpr unsigned short L1B_PIXEL_QUALITY_BOWTIE = 0x0100; //0000000x00000000
147  static constexpr unsigned short L1B_PIXEL_QUALITY_MISSING = 0x0200; //000000x000000000
148  static constexpr unsigned short L1B_PIXEL_QUALITY_NOCALIBRATE = 0x0400; //00000x0000000000
149  static constexpr unsigned short L1B_PIXEL_QUALITY_DEAD_DETECTOR = 0x0800; //0000x00000000000
150  static constexpr unsigned short L1B_PIXEL_QUALITY_NOISY_DETECTOR = 0x1000; //000x000000000000
151 
152  static constexpr short TOTAL_SG_PIXEL_QUALITY_FLAGS = NUM_PIXEL_QUALITY_FLAGS + NUM_BAD_PIXEL_QUALITY_FLAGS;
153  static constexpr short TOTAL_DG_PIXEL_QUALITY_FLAGS = NUM_DG_PIXEL_QUALITY_FLAGS + NUM_BAD_PIXEL_QUALITY_FLAGS;
154  static constexpr short TOTAL_UADG_PIXEL_QUALITY_FLAGS = NUM_UADG_PIXEL_QUALITY_FLAGS + NUM_BAD_PIXEL_QUALITY_FLAGS;
155  static constexpr short TOTAL_DNB_PIXEL_QUALITY_FLAGS = NUM_DNB_PIXEL_QUALITY_FLAGS + NUM_BAD_PIXEL_QUALITY_FLAGS;
156 
157  // Row quality flags
158  static constexpr unsigned char L1B_ROW_QUALITY_SUBSTITUTE_CAL = 0x01; //00000000
159  static constexpr unsigned char L1B_ROW_QUALITY_NO_CALIBRATION = 0x02; //000000x0
160  static constexpr unsigned char L1B_ROW_QUALITY_MOON_IN_SPACE_VIEW = 0x04; //000000x0
161  static constexpr unsigned char L1B_ROW_QUALITY_DG_ANOMALY = 0x08; //0000x000
162  static constexpr unsigned char L1B_ROW_QUALITY_DEAD_DETECTOR = 0x10; //000x0000
163  static constexpr unsigned char L1B_ROW_QUALITY_BB_TEMP_NOT_NOMINAL = 0x20; //00x00000
164  static constexpr unsigned char L1B_ROW_QUALITY_LWIR_TEMP_NOT_NOMINAL = 0x40; //0x000000
165  static constexpr unsigned char L1B_ROW_QUALITY_DNB_STRAY_LIGHT = 0x80; //0x000000
166 
167  // Moon-in-SV processing parameters
168  static constexpr int MOON_IN_SV_SCANS_TO_SKIP_FORWARD = 6;
169  static constexpr int MOON_IN_SV_SCANS_TO_SKIP_BACK = 4;
170 
171  // Fill values
172  static constexpr float L1B_FILL_FLOAT = -999.9f;
173  static constexpr double L1B_FILL_DOUBLE = -999.9L;
174  static constexpr short L1B_FILL_SHORT = -999;
175  static constexpr unsigned short L1B_FILL_USHORT = 65535;
176  static constexpr char L1B_FILL_BYTE = -1;
177  static constexpr unsigned char L1B_FILL_UBYTE = 255;
178 
179  static constexpr float VDNE_FLOAT32_FILL = -999.9f;
180  static constexpr float ELLIPSOID_FLOAT32_FILL = -999.9f;
181  static constexpr float ERR_FLOAT32_FILL = -999.9f;
182  static constexpr float ONBOARD_PT_FLOAT32_FILL = -999.9f;
183  static constexpr float MISS_FLOAT32_FILL = -999.9f;
184  static constexpr float NA_FLOAT32_FILL = -999.9f;
185 
186  // Fill value test thresholds
187  static constexpr float FLOAT_FILL_TEST = -999.0f;
188  static constexpr short SHORT_FILL_TEST = -990;
189  static constexpr char BYTE_FILL_TEST = 0;
190  static constexpr unsigned char UBYTE_FILL_TEST = 247;
191 
192  // Operational constants
193  static constexpr short GRANULES = 3;
194  static const float var_limit_[Viirs_Bands - 1];
195  static const float asp_factor_[Viirs_Bands - 1];
196  static constexpr float sv_filter_bw_ = 0.01;
197  static constexpr float f_filter_bw_ = 0.005;
198 
199  // Trim Table and ranges
200  static const int TrimTable_I_[Iband_detectors][2];
201  static const int TrimTable_M_[Mband_detectors][2];
202 
203  static const float radOffset_[Viirs_Bands - 1];
204  static const float radRange_[Viirs_Bands - 1];
205  static const float reflOffset_[Viirs_Bands - 1];
206  static const float reflRange_[Viirs_Bands - 1];
207  static const unsigned short destRange_;
208  static const unsigned short out_of_range_dn_[Viirs_Bands - 1];
209  static const unsigned int destRange_M13_;
210 
211  // Radiance/reflectance scale factors
212  float refl_scale_factor_[Viirs_Bands - 1];
213  float refl_add_offset_[Viirs_Bands - 1];
214  float rad_scale_factor_[Viirs_Bands - 1];
215  float rad_add_offset_[Viirs_Bands - 1];
216 
217  // special processing
222 
223  static const string band_prefix_[Viirs_Bands];
224 
227 
232  VcstObc* obcSeq_[GRANULES];
233 
234  // Pointer to instance of ViirsCmnGeo object
236 
237  // Pointer to instance of ViirsThermal object
239 
240  // Pointer to structure of LUT pointer defined above
242 
243  // Granule data
245 
246  // Engineering Status Data
247  unsigned char mode_;
248 // double startTAI93sec_[VIIRS_SCANS]; /* TAI scan start time */
249 // double endTAI93sec_[VIIRS_SCANS]; /* TAI scan end time */
250 // double sv_midTAI93sec_[VIIRS_SCANS]; /* TAI scan ev mid time */
251 // double bb_midTAI93sec_[VIIRS_SCANS]; /* TAI scan ev mid time */
252 // double sd_midTAI93sec_[VIIRS_SCANS]; /* TAI scan ev mid time */
253 // int scan_number_[VIIRS_SCANS];
254 // unsigned char ham_side_[VIIRS_SCANS];
255 // unsigned char sensor_mode_[VIIRS_SCANS];
256  unsigned char cal_metadata_[VIIRS_SCANS][Cal_Metadata];
257 
258  // Derived status
259 
260 // int electronics_side_[VIIRS_SCANS];
261 // bool scan_sync_failure_[VIIRS_SCANS];
262 // char tel_start_not_nominal_[VIIRS_SCANS];
263 // int scan_sync_failure_cnt_;
264  bool scan_no_calibration_[VIIRS_SCANS];
265  unsigned char scan_state_[VIIRS_SCANS];
266  unsigned char scan_quality_[VIIRS_SCANS];
267 
268  // asp offset data
269 
274 
275  // Calibration data
276 
286  unsigned char GAIN_STATE_[Number_of_DG_bands][Number_of_Scans][Mband_detectors];
287  unsigned char DNB_sequence_[Number_of_Scans];
288  unsigned char DNB_sequence_valid_min_, DNB_sequence_valid_max_;
289 
290  unsigned char SDSM_active_[Number_of_Scans];
291  unsigned char SDSM_position_[Number_of_Scans];
293 
294  // Processed digital counts data
295 
302 
303  // Validated calibration data
304 
309 
310  // Granule averages
311 
316 
317  // Solar calibration
318 
321 
322  // Quality
323 
324  unsigned char rowQuality_M_[Number_of_Mbands][Number_of_Scans*Mband_detectors];
325  unsigned char rowQuality_I_[Number_of_Ibands][Number_of_Scans*Iband_detectors];
326 
327  // Diagnostics
328 
329  bool bLunar_;
330  bool bFilters_;
331  double fir_coeff_[NUM_TAPS];
332 
333  float diag_sv_I_[5][4][GRANULES * VIIRS_SCANS][32][3][2];
334  float diag_sv_M_[16][4][GRANULES * VIIRS_SCANS][16][2];
335  float diag_f_I_[2][2][GRANULES * VIIRS_SCANS][32][3][2];
336  float diag_f_M_[5][2][GRANULES * VIIRS_SCANS][16][2];
341  VcstObc();
342 
347  ~VcstObc();
348 
353  int initialize(GRAN_SEQ_ENUM gran_seq);
354 
360 
367  int process_bands();
368 
373  int write_obc_data();
374 
376  history_ = history;
377  }
378 
380  return history_;
381  }
382 
383  void setSource(std::string source) {
384  source_files_ = source;
385  }
386 
388  return source_files_;
389  }
390 
391  inline const bool doFilters() {
392  return bFilters_;
393  };
394 
395  inline const void setFilters(const bool bFilters) {
396  bFilters_ = bFilters;
397  };
398 
399 private:
400 
401  //Map to store LUT input item objects.
402 
403  std::map<std::string, VcstLutInputItem*> obcLutItems_;
404 
409  int initialize_L1A_data(GRAN_SEQ_ENUM sequence);
410 
415  int initialize_LUT_data();
416 
421  int initialize_L1B_data();
422 
429  int read_L1A_attributes(NcFile* nc_input);
430 
437  int read_L1A_cal_data_img(NcFile* nc_input);
438  int read_L1A_cal_data_mod(NcFile* nc_input);
439  int read_L1A_cal_data_dnb(NcFile* nc_input);
440 
447  int check_scan_state();
448 
455  int check_scan_quality();
456 
463  int compute_refl_scale_factor(VIIRS_BAND_ENUM band);
464 
471  int compute_cal_stats(VIIRS_BAND_ENUM band);
472 
479  int swap_even_odd(VIIRS_BAND_ENUM band);
480 
487  int validate_cal(VIIRS_BAND_ENUM band);
488 
495  int compute_Cprime(VIIRS_BAND_ENUM band);
496 
503  int filter_sv(VIIRS_BAND_ENUM band);
504 
511  int filter_F(VIIRS_BAND_ENUM band);
512 
519  int write_global_attributes(NcFile* nc_output);
520 
527  int write_obc_eng_data(NcFile* nc_output);
528 
535  int write_obc_nav_data(NcFile* nc_output);
536 
543  int write_obc_cal_data(NcFile* nc_output);
544 
551  int write_diagnostics(NcFile* nc_output);
552 
559  int generate_filt_coeff(float cutoff_frequency);
560 
568  bool isValidGranuleSequence();
569 
576  short convert14To16bit(short value14bit);
577 
584  bool isPlatformLittleEndian();
585 };
586 
587 #endif /* VcstObc_H_ */
ViirsThermal * pTherm_
Definition: VcstObc.h:238
const void setFilters(const bool bFilters)
Definition: VcstObc.h:395
#define Number_of_IRbands
SolarDiffRotationMatrixLutType * SdRotMatPtr_
Definition: VcstObc.h:35
const float VDNE_FLOAT32_FILL
Definition: RsViirs.h:57
string day_night_flag_
Definition: VcstObc.h:54
#define Number_of_DG_bands
bool bValidSeq_
Definition: VcstObc.h:226
#define Cal_Metadata
VIIRS_BAND_ENUM
#define RAD_TO_DEG
Definition: get_zenaz.c:7
const char SCE_A_SIDE_ON
Definition: VcstCmnConsts.h:40
GRAN_SEQ_ENUM granSeq_
Definition: VcstObc.h:225
std::string getSource()
Definition: VcstObc.h:387
int act_scans_
Definition: VcstObc.h:244
#define Iband_detectors
@ RSB_BANDS
const float ONBOARD_PT_FLOAT32_FILL
Definition: RsViirs.h:55
PARAM_TYPE_NONE Default value No parameter is buried in the product name name_prefix is case insensitive string compared to the product name PARAM_TYPE_VIS_WAVE The visible wavelength bands from the sensor are buried in the product name The product name is compared by appending and name_suffix ie aph_412_giop where prod_ix will be set to PARAM_TYPE_IR_WAVE same search method as PARAM_TYPE_VIS_WAVE except only wavelength above are looped through but prod_ix is still based ie aph_2_giop for the second band
void setSource(std::string source)
Definition: VcstObc.h:383
void initialize(int pixref_flag, int blkref_flag)
Definition: Usds.c:1371
const int SOLAR_IRAD_SIZE
static const unsigned short destRange_
Definition: VcstObc.h:207
#define Number_of_Ibands
const double TAI93_TAI58_SEC
int orbit_number_
Definition: VcstObc.h:48
#define DNB_Cal_Samples
string history_
Definition: VcstObc.h:60
@ string
#define Mband_detectors
#define Number_of_Scans
const signed char SCE_INVALID
Definition: VcstCmnConsts.h:39
ProSdrViirsCalSolarSpectralIradLUT * solarSpectralIradLUT
Definition: VcstObc.h:40
proSdrViirsCalFPredictedTableLUT * TableFPredicted
Definition: VcstObc.h:39
bool bLunar_
Definition: VcstObc.h:329
#define Parity
#define Number_of_MTbands
SolarDiffVoltLutType * SdsmVoltPtr_
Definition: VcstObc.h:36
const float ERR_FLOAT32_FILL
Definition: VcstCmnConsts.h:81
#define SATURATED_DN
Definition: Granule.h:511
int extract_pixel_stop_
Definition: VcstObc.h:221
unsigned char mode_
Definition: VcstObc.h:247
int scanToProcess_
Definition: VcstObc.h:219
int format_version_
Definition: VcstObc.h:49
const float MISS_FLOAT32_FILL
Definition: VcstCmnConsts.h:85
proSdrViirsCalRVSLUT * rvsLUT
Definition: VcstObc.h:37
bool processModByScan_
Definition: VcstObc.h:218
unsigned char DNB_sequence_valid_min_
Definition: VcstObc.h:288
GRAN_SEQ_ENUM
#define M_PI
Definition: pml_iop.h:15
VcstCmnGeo * pCmnGeo_
Definition: VcstObc.h:235
const int SDSM_SAMPLES
#define Number_of_Mbands
#define Iband_Cal_Samples
string versionid_
Definition: VcstObc.h:59
const int RSR_SIZE
#define Gain_States
#define Mband_Cal_Samples
string time_coverage_start_
Definition: VcstObc.h:55
int extract_pixel_start_
Definition: VcstObc.h:220
string history
Definition: ncattredit.py:30
#define Mirror_Sides
const float ELLIPSOID_FLOAT32_FILL
Definition: VcstCmnConsts.h:76
#define Agg_Zones
string endDirection_
Definition: VcstObc.h:53
bool bFilters_
Definition: VcstObc.h:330
#define Number_of_MRbands
#define Viirs_Bands
obcLutPtrs pLut_
Definition: VcstObc.h:241
@ TEB_BANDS
static const unsigned int destRange_M13_
Definition: VcstObc.h:209
string platform_
Definition: VcstObc.h:51
#define C_Coefs
const int VIIRS_SCANS
Definition: VcstCmnConsts.h:58
#define MIRROR_SIDE
Definition: L1a_data.h:117
string source_files_
Definition: VcstObc.h:61
const float NA_FLOAT32_FILL
Definition: RsViirs.h:54
void setHistory(std::string history)
Definition: VcstObc.h:375
string pge_start_time_
Definition: VcstObc.h:57
const bool doFilters()
Definition: VcstObc.h:391
std::string getHistory()
Definition: VcstObc.h:379
string time_coverage_end_
Definition: VcstObc.h:56
const char SCE_B_SIDE_ON
Definition: VcstCmnConsts.h:41
proSdrViirsCalDgAnDnLmtLUT * dgAnDnLimits
Definition: VcstObc.h:38
int instrument_number_
Definition: VcstObc.h:50
#define Number_of_ITbands
const int SDSM_DETECTORS
string pge_end_time_
Definition: VcstObc.h:58
string startDirection_
Definition: VcstObc.h:52