OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
VcstLutNetCDF4.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  * NAME: VcstLutNetCDF4.cpp
3  *
4  * DESCRIPTION: Object class that generates a netCDF4 LUT.
5  *
6  * Created on: June 5, 2015
7  * Author: Sam Anderson, VCST
8  *
9  * Modified: October 15, 2015, for generation and processing of time-dependent
10  * netCDF4 LUTs
11  *
12  ******************************************************************************/
13 
14 #include <cstdlib>
15 #include <map>
16 #include <string>
17 #include <ctime>
18 #include <math.h>
19 #include <memory>
20 #include <sys/stat.h>
21 #include <dirent.h>
22 #include <algorithm>
23 #include <limits> // std::numeric_limits
24 
25 #include "VcstLutNetCDF4.h"
26 #include <VcstParamsReader.h>
27 #include <VcstCmnConsts.h>
28 #include <VcstCalLutStructures.h>
29 #include <VcstTime.h>
30 
31 /**************************************************************************
32  * NAME: VcstLutNetCDF4()
33  *
34  * DESCRIPTION: Class Constructor
35  *
36  *************************************************************************/
37 
39 }
40 
41 /**************************************************************************
42  * NAME: ~VcstLutNetCDF4()
43  *
44  * DESCRIPTION: Class Destructor
45  *
46  *************************************************************************/
47 
49 }
50 
51 /**************************************************************************
52  * NAME: initialize()
53  *
54  * DESCRIPTION: Initializes data and object classes for granule
55  *
56  *************************************************************************/
57 
59 
60  if (platform == "Suomi-NPP" || platform == "npp") {
61  platform_ = NPP;
62  platform_str_ = "NPP";
63  } else if (platform == "JPSS-J1" || platform == "j1") {
64  platform_ = J1;
65  platform_str_ = "J1";
66  } else {
67  cerr << "VcstLutNetCDF4:: Invalid platform option --> "
68  + platform + "." << endl;
69  return VCST_FAIL;
70  }
71 
72  return VCST_SUCCESS;
73 }
74 
75 /**************************************************************************
76  * NAME: create_cmngeo_lut()
77  *
78  * DESCRIPTION: Create Common Geolocation netCDF4 LUT.
79  *
80  *************************************************************************/
81 
83  int status = VCST_SUCCESS;
84 
86  string filepath = path + "/VIIRS_" + platform_str_ + "_CMN_LUT_" +
87  "version_source.nc";
88 
89  NcFile* nc_output;
90 
91  try {
92  nc_output = new NcFile(filepath, NcFile::replace);
93  } catch (NcException& e) {
94  e.what();
95  cerr
96  << "VcstLutNetCDF4:: Failure creating CMN netCDF4 LUT file: "
97  + filepath + "." << endl;
98  return VCST_FAIL;
99  }
100 
101  nc_output->putAtt("title", "VIIRS Common Geolocation LUTs");
102 
103  write_global_attributes(nc_output);
104 
105  // Add dimensions to file
106 
107  scalar_dim_ = nc_output->addDim("Scalar", 1);
108  two_values_dim_ = nc_output->addDim("Number_of_Scan_Start_Values", 2);
109  num_jpl_ipt_rows_dim_ = nc_output->addDim("Number_of_JPL_IPT_Rows",
110  JPL_IPT_ROW);
111  num_jpl_ipt_cols_dim_ = nc_output->addDim("Number_of_JPL_IPT_Columns",
112  JPL_IPT_COL);
113  num_jpl_ephem_rows_dim_ = nc_output->addDim("Number_of_JPL_Ephemeris_Rows",
114  JPL_EPHEM_ROW);
115  num_jpl_ephem_cols_dim_ = nc_output->addDim(
116  "Number_of_JPL_Ephemeris_Columns", JPL_EPHEM_COL);
117  min_max_dim_ = nc_output->addDim("Minimum_Maximum_Values",
119  num_sdsm_samples_dim_ = nc_output->addDim("Number_of_SDSM_Samples",
120  SDSM_SAMPLES);
121  num_sdsm_det_dim_ = nc_output->addDim("Number_of_SDSM_Detectors",
123  num_sdsm_coef_dim_ = nc_output->addDim("Number_of_SDSM_Coeffs", SDSM_COEF);
124  matrix_rows_dim_ = nc_output->addDim("Matrix_Rows", 3);
125  matrix_cols_dim_ = nc_output->addDim("Matrix_Cols", 3);
126  num_viirs_bands_dim_ = nc_output->addDim("Number_of_VIIRS_Bands",
128  num_viirs_detectors_dim_ = nc_output->addDim("Number_of_Viirs_Detectors",
129  NUM_DETECTORS);
130  num_qual_flag_values_dim_ = nc_output->addDim(
131  "Number_of_Quality_Flag_Values", 8);
132  num_moon_offset_dim_ = nc_output->addDim("Number_of_Moon_Offset_limits",
134 
135  // Write spacecraft-specific parameters
136 
137  status = write_CMNGEO_PLATFORM_LUT(nc_output);
138 
139  if (status != VCST_SUCCESS) {
140  cerr
141  << "VcstLutNetCDF4:: Failure writing " + CMNGEO_PLATFORM_LUT
142  + " to netCDF4 LUT file " << endl;
143 
144  delete nc_output;
145  return VCST_FAIL;
146  }
147 
148  // Read and create LUTs in the form of groups
149 
150  std::string fileName = "";
151  VcstCmnLutInputItem* lut_item;
152 
153  lut_item = read_cmngeo_lut(CMNGEO_JPL_EPHEM, sizeof (JPLEphemLutType));
154 
155  if (lut_item != 0) {
156  jplEphemPtr_ = static_cast<JPLEphemLutType*> (lut_item->getDataPtr());
157  fileName = lut_item->getFileName();
158  } else {
159  delete nc_output;
160  return VCST_FAIL;
161  }
162 
163  status = write_CMNGEO_JPL_EPHEM(nc_output, jplEphemPtr_, fileName);
164 
165  delete lut_item;
166 
167  if (status != VCST_SUCCESS) {
168  cerr
169  << "VcstLutNetCDF4:: Failure writing " + CMNGEO_JPL_EPHEM
170  + " to netCDF4 LUT file " << endl;
171 
172  delete nc_output;
173  return VCST_FAIL;
174  }
175 
176  lut_item = read_cmngeo_lut(CMNGEO_SAA_COEFF, sizeof (SAALutType));
177 
178  if (lut_item != 0) {
179  saaCoeff_ = static_cast<SAALutType*> (lut_item->getDataPtr());
180  fileName = lut_item->getFileName();
181  } else {
182  delete nc_output;
183  return VCST_FAIL;
184  }
185 
186  status = write_CMNGEO_SAA_COEFF(nc_output, saaCoeff_, fileName);
187 
188  delete lut_item;
189 
190  if (status != VCST_SUCCESS) {
191  cerr
192  << "VcstLutNetCDF4:: Failure writing " + CMNGEO_SAA_COEFF
193  + " to netCDF4 LUT file " << endl;
194 
195  delete nc_output;
196  return VCST_FAIL;
197  }
198 
200 
201  if (lut_item != 0) {
202  paramLut_ = static_cast<CmnGeoParamLutType*> (lut_item->getDataPtr());
203  fileName = lut_item->getFileName();
204  } else {
205  delete nc_output;
206  return VCST_FAIL;
207  }
208 
209  status = write_CMNGEO_PARAM_LUT(nc_output, paramLut_, fileName);
210 
211  delete lut_item;
212 
213  if (status != VCST_SUCCESS) {
214  cerr
215  << "VcstLutNetCDF4:: Failure writing " + CMNGEO_PARAM_LUT
216  + " to netCDF4 LUT file " << endl;
217 
218  delete nc_output;
219  return VCST_FAIL;
220  }
221 
224 
225  if (lut_item != 0) {
226  SdRotMatPtr_ =
227  static_cast<SolarDiffRotationMatrixLutType*> (lut_item->getDataPtr());
228  fileName = lut_item->getFileName();
229  } else {
230  delete nc_output;
231  return VCST_FAIL;
232  }
233 
234  status = write_SOLAR_DIFF_ROT_MATRIX_LUT(nc_output, SdRotMatPtr_, fileName);
235 
236  delete lut_item;
237 
238  if (status != VCST_SUCCESS) {
239  cerr
240  << "VcstLutNetCDF4:: Failure writing "
242  + " to netCDF4 LUT file " << endl;
243 
244  delete nc_output;
245  return VCST_FAIL;
246  }
247 
249  sizeof (SolarDiffVoltLutType));
250 
251  if (lut_item != 0) {
252  SdsmVoltPtr_ =
253  static_cast<SolarDiffVoltLutType*> (lut_item->getDataPtr());
254  fileName = lut_item->getFileName();
255  } else {
256  delete nc_output;
257  return VCST_FAIL;
258  }
259 
260  status = write_SOLAR_DIFF_VOLT_LUT(nc_output, SdsmVoltPtr_, fileName);
261 
262  delete lut_item;
263 
264  if (status != VCST_SUCCESS) {
265  cerr
266  << "VcstLutNetCDF4:: Failure writing "
267  + VIIRS_SOLAR_DIFF_VOLT_LUT + " to netCDF4 LUT file "
268  << endl;
269 
270  delete nc_output;
271  return VCST_FAIL;
272  }
273 
275 
276  if (lut_item != 0) {
277  QALUT_ = static_cast<proSdrViirsCalQALUT*> (lut_item->getDataPtr());
278  fileName = lut_item->getFileName();
279  } else {
280  delete nc_output;
281  return VCST_FAIL;
282  }
283 
284  status = write_SDR_QA_LUT(nc_output, QALUT_, fileName);
285 
286  delete lut_item;
287 
288  if (status != VCST_SUCCESS) {
289  cerr
290  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_QA_LUT
291  + " to netCDF4 LUT file " << endl;
292 
293  delete nc_output;
294  return VCST_FAIL;
295  }
296 
297  delete nc_output;
298 
299  return VCST_SUCCESS;
300 }
301 
302 /**************************************************************************
303  * NAME: create_geo_lut()
304  *
305  * DESCRIPTION: Create Geolocation netCDF4 LUT.
306  *
307  *************************************************************************/
308 
310  int status = VCST_SUCCESS;
311 
313  string filepath = path + "/VIIRS_" + platform_str_ + "_GEO_LUT_" +
314  "version_source.nc";
315 
316  NcFile* nc_output;
317 
318  try {
319  nc_output = new NcFile(filepath, NcFile::replace);
320  } catch (NcException& e) {
321  e.what();
322  cerr
323  << "VcstLutNetCDF4:: Failure creating GEO netCDF4 LUT file: "
324  + filepath + "." << endl;
325 
326  return VCST_FAIL;
327  }
328 
329  nc_output->putAtt("title", "VIIRS Geolocation LUTs");
330 
331  write_global_attributes(nc_output);
332 
333  scalar_dim_ = nc_output->addDim("Scalar", 1);
334  revision_char_dim_ = nc_output->addDim("Number_of_Revision_Characters", 10);
335  max_band_num_plus_one_dim_ = nc_output->addDim("Max_Band_Number_Plus_One",
337  num_aggzones_dim_ = nc_output->addDim("Number_of_Agg_Zones", NUM_AGG_ZONES);
338  num_dnb_aggzone_dim_ = nc_output->addDim("Number_of_DNB_Agg_Zones", 32);
339  dnb_aggzone_bounds_dim_ = nc_output->addDim("Number_of_DNB_Agg_Zone_Bounds",
340  64);
341  dnb_aggzone_bound_cols_dim_ = nc_output->addDim(
342  "Number_of_DNB_Agg_Zone_Bound_Cols", 3);
343  num_mirror_sides_dim_ = nc_output->addDim("Mirror_Sides", 2);
344  max_limit_check_dim_ = nc_output->addDim("Max_Limit_Check", 2);
345  matrix_rows_dim_ = nc_output->addDim("Matrix_Rows", 3);
346  matrix_cols_dim_ = nc_output->addDim("Matrix_Cols", 3);
347  max_thermistor_id_dim_ = nc_output->addDim("Max_Thermistor_ID",
349  num_thermistors_dim_ = nc_output->addDim("Number_of_Thermistors",
351  num_thermistor_coeffs_dim_ = nc_output->addDim(
352  "Number_of_Thermistor_Coeffs", 6);
353  max_poly_degree_plus_one_dim_ = nc_output->addDim(
354  "Max_Polynomial_Deg_Plus_One", 5);
355  num_electronics_sides_dim_ = nc_output->addDim("Electronics_Sides", 2);
356 
357  VcstGeoLutInputItem* lut_item;
358  std::string fileName = "";
359 
360  lut_item = read_geo_lut(GEO_IMG_PARAM, sizeof (GEO_param_struct));
361 
362  if (lut_item != 0) {
363  geoImgParams_ = static_cast<GEO_param_struct*> (lut_item->getDataPtr());
364  fileName = lut_item->getFileName();
365  } else {
366  delete nc_output;
367  return VCST_FAIL;
368  }
369 
371  fileName);
372 
373  delete lut_item;
374 
375  if (status != VCST_SUCCESS) {
376  cerr
377  << "VcstLutNetCDF4:: Failure writing " + GEO_IMG_PARAM
378  + " to netCDF4 LUT file " << endl;
379 
380  delete nc_output;
381  return VCST_FAIL;
382  }
383 
384  lut_item = read_geo_lut(GEO_MOD_PARAM, sizeof (GEO_param_struct));
385 
386  if (lut_item != 0) {
387  geoModParams_ = static_cast<GEO_param_struct*> (lut_item->getDataPtr());
388  fileName = lut_item->getFileName();
389  } else {
390  delete nc_output;
391  return VCST_FAIL;
392  }
393 
395  fileName);
396 
397  delete lut_item;
398 
399  if (status != VCST_SUCCESS) {
400  cerr
401  << "VcstLutNetCDF4:: Failure writing " + GEO_MOD_PARAM
402  + " to netCDF4 LUT file " << endl;
403 
404  delete nc_output;
405  return VCST_FAIL;
406  }
407 
408  lut_item = read_geo_lut(GEO_DNB_PARAM, sizeof (GEO_param_struct));
409 
410  if (lut_item != 0) {
411  geoDnbParams_ = static_cast<GEO_param_struct*> (lut_item->getDataPtr());
412  fileName = lut_item->getFileName();
413  } else {
414  delete nc_output;
415  return VCST_FAIL;
416  }
417 
419  fileName);
420 
421  delete lut_item;
422 
423  if (status != VCST_SUCCESS) {
424  cerr
425  << "VcstLutNetCDF4:: Failure writing " + GEO_DNB_PARAM
426  + " to netCDF4 LUT file " << endl;
427 
428  delete nc_output;
429  return VCST_FAIL;
430  }
431 
432  delete nc_output;
433 
434  return VCST_SUCCESS;
435 }
436 
437 /**************************************************************************
438  * NAME: create_cal_static_lut()
439  *
440  * DESCRIPTION: Create Calibration netCDF4 LUT for static tables.
441  *
442  *************************************************************************/
443 
445  int status = VCST_SUCCESS;
446 
448  string filepath = path + "/VIIRS_" + platform_str_ + "_CAL_STATIC_LUT_" +
449  "version_source.nc";;
450 
451  NcFile* nc_output;
452 
453  try {
454  nc_output = new NcFile(filepath, NcFile::replace);
455  } catch (NcException& e) {
456  e.what();
457  cerr
458  << "VcstLutNetCDF4:: Failure creating CAL static netCDF4 LUT file: "
459  + filepath + "." << endl;
460 
461  return VCST_FAIL;
462  }
463 
464  nc_output->putAtt("title", "VIIRS Calibration Static LUTs");
465 
466  write_global_attributes(nc_output);
467 
468  scalar_dim_ = nc_output->addDim("Scalar", 1);
469  num_refl_750m_dg_bands_dim_ = nc_output->addDim(
470  "Number_of_Refl_750m_DG_Bands", NUM_REFL_750M_DG_BANDS);
471  num_750m_det_dim_ = nc_output->addDim("Number_of_750m_Detectors",
473  min_max_dim_ = nc_output->addDim("Minimum_Maximum_Values",
475  num_dnb_ev_frames_dim_ = nc_output->addDim("Number_of_DNB_EV_Frames",
476  EV_DNB_FRAMES);
477  num_dnb_detectors_dim_ = nc_output->addDim("Number_of_DNB_Detectors",
479  num_mirror_sides_dim_ = nc_output->addDim("Number_of_Mirror_Sides",
481  num_viirs_bands_dim_ = nc_output->addDim("Number_of_VIIRS_Bands",
483  max_num_detectors_dim_ = nc_output->addDim("Max_Number_of_Detectors",
485  num_rtaer_files_dim_ = nc_output->addDim("Number_of_RTAER_Files",
487  two_values_dim_ = nc_output->addDim("Two_Values", 2);
488  num_rtaer_values_dim_ = nc_output->addDim("Number_of_RTAER_Values",
490  num_hamer_files_dim_ = nc_output->addDim("Number_of_HAMER_Files",
492  num_hamer_values_dim_ = nc_output->addDim("Number_of_HAMER_Values",
494  num_obcer_files_dim_ = nc_output->addDim("Number_of_OBCER_Files",
496  num_obcer_values_dim_ = nc_output->addDim("Number_of_OBCER_Values",
498  num_obcrr_files_dim_ = nc_output->addDim("Number_of_OBCRR_Files",
500  num_obcrr_values_dim_ = nc_output->addDim("Number_of_OBCRR_Values",
502  num_ebbt_files_dim_ = nc_output->addDim("Number_of_EBBT_Files",
504  num_ebbt_values_dim_ = nc_output->addDim("Number_of_EBBT_Values",
506  num_thermistors_dim_ = nc_output->addDim("Number_of_Thermistors",
508  num_temp_coeffs_dim_ = nc_output->addDim("Number_of_Temp_Coeffs",
510  num_tref_mux_dim_ = nc_output->addDim("Number_of_EV_Tref_Mux_Coeffs",
512  num_solar_irad_values_dim_ = nc_output->addDim(
513  "Number_of_Solar_Irad_Values", X_Y_SIZE);
514  num_dg_ev_frames_dim_ = nc_output->addDim("Number_of_DG_EV_Frames",
516  num_telec_therm_dim_ = nc_output->addDim("Number_of_Telec_Thermistors",
518  num_therm_weights_dim_ = nc_output->addDim("Number_of_Thermistor_Weights",
519  2);
520  num_tomm_therm_dim_ = nc_output->addDim("Number_of_Tomm_Thermistors",
522  num_ttel_therm_dim_ = nc_output->addDim("Number_of_Ttel_Thermistors",
524  num_tm_therm_dim_ = nc_output->addDim("Number_of_T_Mirror_Thermistors",
526  num_bb_therm_dim_ = nc_output->addDim("Number_of_BB_Thermistors",
528  num_375m_bands_dim_ = nc_output->addDim("Number_of_375m_Bands",
530  num_375m_det_dim_ = nc_output->addDim("Number_of_375m_Detectors",
532  num_375m_frms_dim_ = nc_output->addDim("Number_of_375m_EV_Frames",
534  num_bb_coeff_dim_ = nc_output->addDim("Number_of_BB_Coeffs", 5);
535  num_electronics_sides_dim_ = nc_output->addDim(
536  "Number_of_Electronics_Sides", NUM_ELECTRONICS_SIDE);
537  num_dg_gain_states_dim_ = nc_output->addDim("Number_of_Gain_States",
539  num_c_coeffs_dim_ = nc_output->addDim("Number_of_C_Coefficients",
541  num_thermistor_dim_ = nc_output->addDim("Number_of_Values",
543  num_tele_levels_dim_ = nc_output->addDim("Number_of_Tele_Levels",
545  num_focal_planes_dim_ = nc_output->addDim("Number_of_Focal_Planes",
547  num_tdet_levels_dim_ = nc_output->addDim("Number_of_Tdet_Levels",
549  four_values_dim_ = nc_output->addDim("Four_Values", 4);
550  num_750m_sg_bands_dim_ = nc_output->addDim("Number_of_750m_SG_Bands",
552  num_sg_ev_frames_dim_ = nc_output->addDim("Number_of_750m_SG_EV_Frames",
554  num_750m_dg_bands_dim_ = nc_output->addDim("Number_of_750m_DG_Bands",
556  num_refl_dnb_bands_dim_ = nc_output->addDim( "Number_Reflective_Plus_DNB_Bands", NUM_REFL_PLUS_DNB_BANDS );
557  max_rsr_dim_ = nc_output->addDim( "Max_RSR_Values", MAX_RSR_VALUES );
558 
559  VcstCalLutInputItem* lut_item;
560  std::string fileName = "";
561 
563  sizeof (proSdrViirsCalTeleCoeffLUT));
564 
565  if (lut_item != 0) {
566  tCoeffs_ =
567  static_cast<proSdrViirsCalTeleCoeffLUT*> (lut_item->getDataPtr());
568  fileName = lut_item->getFileName();
569  } else {
570  delete nc_output;
571  return VCST_FAIL;
572  }
573 
574  status = write_SDR_TELE_COEFFS_LUT(nc_output, tCoeffs_, fileName);
575 
576  delete lut_item;
577 
578  if (status != VCST_SUCCESS) {
579  cerr
580  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_TELE_COEFFS
581  + " to netCDF4 LUT file " << endl;
582 
583  delete nc_output;
584  return VCST_FAIL;
585  }
586 
588  sizeof (proSdrViirsCalBBTempCoeffs));
589 
590  if (lut_item != 0) {
591  bBTempCoeffs_ =
592  static_cast<proSdrViirsCalBBTempCoeffs*> (lut_item->getDataPtr());
593  fileName = lut_item->getFileName();
594  } else {
595  delete nc_output;
596  return VCST_FAIL;
597  }
598 
599  status = write_SDR_BB_TEMP_COEFFS_LUT(nc_output, bBTempCoeffs_, fileName);
600 
601  delete lut_item;
602 
603  if (status != VCST_SUCCESS) {
604  cerr
605  << "VcstLutNetCDF4:: Failure writing "
606  + VIIRS_SDR_BB_TEMP_COEFFS + " to netCDF4 LUT file "
607  << endl;
608 
609  delete nc_output;
610  return VCST_FAIL;
611  }
612 
614  sizeof (proSdrViirsCalDgAnDnLmtLUT));
615 
616  if (lut_item != 0) {
617  dgAnDnLimits_ =
618  static_cast<proSdrViirsCalDgAnDnLmtLUT*> (lut_item->getDataPtr());
619  fileName = lut_item->getFileName();
620  } else {
621  delete nc_output;
622  return VCST_FAIL;
623  }
624 
626  fileName);
627 
628  delete lut_item;
629 
630  if (status != VCST_SUCCESS) {
631  cerr
632  << "VcstLutNetCDF4:: Failure writing "
634  + " to netCDF4 LUT file " << endl;
635 
636  delete nc_output;
637  return VCST_FAIL;
638  }
639 
642 
643  if (lut_item != 0) {
644  TableA_ =
645  static_cast<proSdrViirsCalDetectorResponseLUT*> (lut_item->getDataPtr());
646  fileName = lut_item->getFileName();
647  } else {
648  delete nc_output;
649  return VCST_FAIL;
650  }
651 
652  status = write_SDR_COEFF_A_LUT(nc_output, TableA_, fileName);
653 
654  delete lut_item;
655 
656  if (status != VCST_SUCCESS) {
657  cerr
658  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_COEFF_A_LUT
659  + " to netCDF4 LUT file " << endl;
660 
661  delete nc_output;
662  return VCST_FAIL;
663  }
664 
667 
668  if (lut_item != 0) {
669  TableB_ =
670  static_cast<proSdrViirsCalInstrumentResponseLUT*> (lut_item->getDataPtr());
671  fileName = lut_item->getFileName();
672  } else {
673  delete nc_output;
674  return VCST_FAIL;
675  }
676 
677  status = write_SDR_COEFF_B_LUT(nc_output, TableB_, fileName);
678 
679  delete lut_item;
680 
681  if (status != VCST_SUCCESS) {
682  cerr
683  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_COEFF_B_LUT
684  + " to netCDF4 LUT file " << endl;
685 
686  delete nc_output;
687  return VCST_FAIL;
688 
689  }
690 
691  lut_item = read_cal_lut(VIIRS_SDR_GAIN_LUT,
692  sizeof (proSdrViirsCalGainTableLUT));
693 
694  if (lut_item != 0) {
695  GainTable_ =
696  static_cast<proSdrViirsCalGainTableLUT*> (lut_item->getDataPtr());
697  fileName = lut_item->getFileName();
698  } else {
699  delete nc_output;
700  return VCST_FAIL;
701  }
702 
703  status = write_SDR_GAIN_LUT(nc_output, GainTable_, fileName);
704 
705  delete lut_item;
706 
707  if (status != VCST_SUCCESS) {
708  cerr
709  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_GAIN_LUT
710  + " to netCDF4 LUT file " << endl;
711 
712  delete nc_output;
713  return VCST_FAIL;
714  }
715 
717  sizeof (proSdrViirsCalDeltaCTempLUT));
718 
719  if (lut_item != 0) {
720  DeltaCTable_ =
721  static_cast<proSdrViirsCalDeltaCTempLUT*> (lut_item->getDataPtr());
722  fileName = lut_item->getFileName();
723  } else {
724  delete nc_output;
725  return VCST_FAIL;
726  }
727 
728  status = write_SDR_DELTA_C_LUT(nc_output, DeltaCTable_, fileName);
729 
730  delete lut_item;
731 
732  if (status != VCST_SUCCESS) {
733  cerr
734  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_DELTA_C_LUT
735  + " to netCDF4 LUT file " << endl;
736 
737  delete nc_output;
738  return VCST_FAIL;
739  }
740 
743 
744  if (lut_item != 0) {
745  ftz_ =
746  static_cast<proSdrViirsCalDnbFrameToZoneLUT*> (lut_item->getDataPtr());
747  fileName = lut_item->getFileName();
748  } else {
749  delete nc_output;
750  return VCST_FAIL;
751  }
752 
753  status = write_SDR_DNB_FRAME_TO_ZONE_LUT(nc_output, ftz_, fileName);
754 
755  delete lut_item;
756 
757  if (status != VCST_SUCCESS) {
758  cerr
759  << "VcstLutNetCDF4:: Failure writing "
760  + VIIRS_SDR_DNB_FRAME_TO_ZONE + " to netCDF4 LUT file "
761  << endl;
762 
763  delete nc_output;
764  return VCST_FAIL;
765  }
766 
768 
769  if (lut_item != 0) {
770  RVS_DNB_ =
771  static_cast<proSdrViirsCaldnbRVSLUT*> (lut_item->getDataPtr());
772  fileName = lut_item->getFileName();
773  } else {
774  delete nc_output;
775  return VCST_FAIL;
776  }
777 
778  status = write_SDR_DNB_RVS_LUT(nc_output, RVS_DNB_, fileName);
779 
780  delete lut_item;
781 
782  if (status != VCST_SUCCESS) {
783  cerr
784  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_DNB_RVS
785  + " to netCDF4 LUT file " << endl;
786 
787  delete nc_output;
788  return VCST_FAIL;
789  }
790 
792 
793  if (lut_item != 0) {
794  rvsLUT_ = static_cast<proSdrViirsCalRVSLUT*> (lut_item->getDataPtr());
795  fileName = lut_item->getFileName();
796  } else {
797  delete nc_output;
798  return VCST_FAIL;
799  }
800 
801  status = write_SDR_RVS_LUT(nc_output, rvsLUT_, fileName);
802 
803  delete lut_item;
804 
805  if (status != VCST_SUCCESS) {
806  cerr
807  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_RVS_LUT
808  + " to netCDF4 LUT file " << endl;
809 
810  delete nc_output;
811  return VCST_FAIL;
812  }
813 
815  sizeof (proSdrViirsCalReflectiveLUT));
816 
817  if (lut_item != 0) {
818  refLUT_ =
819  static_cast<proSdrViirsCalReflectiveLUT*> (lut_item->getDataPtr());
820  fileName = lut_item->getFileName();
821  } else {
822  delete nc_output;
823  return VCST_FAIL;
824  }
825 
826  status = write_SDR_REFLECTIVE_LUT(nc_output, refLUT_, fileName);
827 
828  delete lut_item;
829 
830  if (status != VCST_SUCCESS) {
831  cerr
832  << "VcstLutNetCDF4:: Failure writing "
833  + VIIRS_SDR_REFLECTIVE_LUT + " to netCDF4 LUT file "
834  << endl;
835 
836  delete nc_output;
837  return VCST_FAIL;
838  }
839 
841  sizeof (proSdrViirsCalEmissiveLUT));
842 
843  if (lut_item != 0) {
844  EmissiveLUT_ =
845  static_cast<proSdrViirsCalEmissiveLUT*> (lut_item->getDataPtr());
846  fileName = lut_item->getFileName();
847  } else {
848  delete nc_output;
849  return VCST_FAIL;
850  }
851 
852  status = write_SDR_EMISSIVE_LUT(nc_output, EmissiveLUT_, fileName);
853 
854  delete lut_item;
855 
856  if (status != VCST_SUCCESS) {
857  cerr
858  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_EMISSIVE_LUT
859  + " to netCDF4 LUT file " << endl;
860 
861  delete nc_output;
862  return VCST_FAIL;
863  }
864 
867 
868  if (lut_item != 0) {
869  rmParameters_ =
870  static_cast<proSdrViirsCalRMParametersLUT*> (lut_item->getDataPtr());
871  fileName = lut_item->getFileName();
872  } else {
873  delete nc_output;
874  return VCST_FAIL;
875  }
876 
878  fileName);
879 
880  delete lut_item;
881 
882  if (status != VCST_SUCCESS) {
883  cerr
884  << "VcstLutNetCDF4:: Failure writing "
886  + " to netCDF4 LUT file " << endl;
887 
888  delete nc_output;
889  return VCST_FAIL;
890  }
891 
894 
895  if (lut_item != 0) {
897  static_cast<proSdrViirsCalObsToPixelsLUT*> (lut_item->getDataPtr());
898  fileName = lut_item->getFileName();
899  } else {
900  delete nc_output;
901  return VCST_FAIL;
902  }
903 
904  status = write_SDR_OBS_TO_PIXELS_LUT(nc_output, obs_to_pixels_, fileName);
905 
906  delete lut_item;
907 
908  if (status != VCST_SUCCESS) {
909  cerr
910  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_OBS_TO_PIXELS
911  + " to netCDF4 LUT file " << endl;
912 
913  delete nc_output;
914  return VCST_FAIL;
915  }
916 
918  sizeof (proSdrViirsCalHAMERLUT));
919 
920  if (lut_item != 0) {
921  HAMERLUT_ =
922  static_cast<proSdrViirsCalHAMERLUT*> (lut_item->getDataPtr());
923  fileName = lut_item->getFileName();
924  } else {
925  delete nc_output;
926  return VCST_FAIL;
927  }
928 
929  status = write_SDR_HAM_ER_TABLE_LUT(nc_output, HAMERLUT_, fileName);
930 
931  delete lut_item;
932 
933  if (status != VCST_SUCCESS) {
934  cerr
935  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_HAM_ER_TABLE
936  + " to netCDF4 LUT file " << endl;
937 
938  delete nc_output;
939  return VCST_FAIL;
940  }
941 
943  sizeof (proSdrViirsCalRTAERLUT));
944 
945  if (lut_item != 0) {
946  RTAERLUT_ =
947  static_cast<proSdrViirsCalRTAERLUT*> (lut_item->getDataPtr());
948  fileName = lut_item->getFileName();
949  } else {
950  delete nc_output;
951  return VCST_FAIL;
952  }
953 
954  status = write_SDR_RTA_ER_TABLE_LUT(nc_output, RTAERLUT_, fileName);
955 
956  delete lut_item;
957 
958  if (status != VCST_SUCCESS) {
959  cerr
960  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_RTA_ER_TABLE
961  + " to netCDF4 LUT file " << endl;
962 
963  delete nc_output;
964  return VCST_FAIL;
965  }
966 
968  sizeof (proSdrViirsCalOBCERLUT));
969 
970  if (lut_item != 0) {
971  OBCERLUT_ =
972  static_cast<proSdrViirsCalOBCERLUT*> (lut_item->getDataPtr());
973  fileName = lut_item->getFileName();
974  } else {
975  delete nc_output;
976  return VCST_FAIL;
977  }
978 
979  status = write_SDR_OBC_ER_TABLE_LUT(nc_output, OBCERLUT_, fileName);
980 
981  delete lut_item;
982 
983  if (status != VCST_SUCCESS) {
984  cerr
985  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_OBC_ER_TABLE
986  + " to netCDF4 LUT file " << endl;
987 
988  delete nc_output;
989  return VCST_FAIL;
990  }
991 
993  sizeof (proSdrViirsCalOBCRRLUT));
994 
995  if (lut_item != 0) {
996  OBCRRLUT_ =
997  static_cast<proSdrViirsCalOBCRRLUT*> (lut_item->getDataPtr());
998  fileName = lut_item->getFileName();
999  } else {
1000  delete nc_output;
1001  return VCST_FAIL;
1002  }
1003 
1004  status = write_SDR_OBC_RR_TABLE_LUT(nc_output, OBCRRLUT_, fileName);
1005 
1006  delete lut_item;
1007 
1008  if (status != VCST_SUCCESS) {
1009  cerr
1010  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_OBC_RR_TABLE
1011  + " to netCDF4 LUT file " << endl;
1012 
1013  delete nc_output;
1014  return VCST_FAIL;
1015  }
1016 
1018  sizeof (proSdrViirsCalLtoEBBTLUT));
1019 
1020  if (lut_item != 0) {
1021  EBBTLUT_ =
1022  static_cast<proSdrViirsCalLtoEBBTLUT*> (lut_item->getDataPtr());
1023  fileName = lut_item->getFileName();
1024  } else {
1025  delete nc_output;
1026  return VCST_FAIL;
1027  }
1028 
1029  status = write_SDR_EBBT_TABLE_LUT(nc_output, EBBTLUT_, fileName);
1030 
1031  delete lut_item;
1032 
1033  if (status != VCST_SUCCESS) {
1034  cerr << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_EBBT_TABLE
1035  + " to netCDF4 LUT file " << endl;
1036 
1037  delete nc_output;
1038  return VCST_FAIL;
1039  }
1040 
1042  sizeof (proSdrViirsCalSolarIradLUT));
1043 
1044  if (lut_item != 0) {
1045  solarIradLUT_ =
1046  static_cast<proSdrViirsCalSolarIradLUT*> (lut_item->getDataPtr());
1047  fileName = lut_item->getFileName();
1048  } else {
1049  delete nc_output;
1050  return VCST_FAIL;
1051  }
1052 
1053  status = write_SDR_SOLAR_IRAD_LUT(nc_output, solarIradLUT_, fileName);
1054 
1055  delete lut_item;
1056 
1057  if (status != VCST_SUCCESS) {
1058  cerr
1059  << "VcstLutNetCDF4:: Failure writing "
1060  + VIIRS_SDR_SOLAR_IRAD_LUT + " to netCDF4 LUT file "
1061  << endl;
1062 
1063  delete nc_output;
1064  return VCST_FAIL;
1065  }
1066 
1068 
1069  if (lut_item != 0) {
1070  rsrLUT_ = static_cast<ProSdrViirsCalRelativeSpectralResponseLUT*> (lut_item->getDataPtr());
1071  fileName = lut_item->getFileName();
1072  } else {
1073  delete nc_output;
1074  return VCST_FAIL;
1075  }
1076 
1077  status = write_SDR_RELATIVE_SPECTRAL_RESPONSE_LUT( nc_output, rsrLUT_, fileName );
1078 
1079  delete lut_item;
1080 
1081  if ( status != VCST_SUCCESS )
1082  {
1083  cerr << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_RELATIVE_SPECTRAL_RESPONSE_LUT + " to netCDF4 LUT file " << endl;
1084 
1085  delete nc_output;
1086  return VCST_FAIL;
1087  }
1088 
1089  delete nc_output;
1090 
1091  return VCST_SUCCESS;
1092 }
1093 
1094 /**************************************************************************
1095  * NAME: create_rsb_dynamic_lut()
1096  *
1097  * DESCRIPTION: Create time-dependent Reflective Solar Band netCDF4 LUT used for
1098  * reprocessing.
1099  *
1100  *************************************************************************/
1101 
1103  int status = VCST_SUCCESS;
1104 
1105  string dirPath = VL1_get_group(VIIRS_SDR_F_PREDICTED_LUT);
1106 
1107  status = collect_lut_files("SDR-F-PREDICTED-LUT", dirPath);
1108 
1109  if (status != VCST_SUCCESS) {
1110  cerr
1111  << "VcstLutNetCDF4:: Failure collecting LUT files for "
1112  + VIIRS_SDR_F_PREDICTED_LUT + "." << endl;
1113  return VCST_FAIL;
1114  }
1115 
1117  string filepath = path;
1118 
1119  string startDate = lut_files_.begin()->first;
1120  string endDate = lut_files_.rbegin()->first;
1121 
1122  if (lut_files_.size() > 1) {
1123  filepath += "/VIIRS_" + platform_str_ + "_CAL_RSB_DYNAMIC_LUT_" +
1124  startDate + "_" + endDate + "_version_source.nc";
1125  } else {
1126  filepath += "/VIIRS_" + platform_str_ + "_CAL_RSB_LUT_" + startDate +
1127  + "_version_source.nc";
1128  }
1129 
1130  NcFile* nc_output;
1131 
1132  try {
1133  nc_output = new NcFile(filepath, NcFile::replace);
1134  } catch (NcException& e) {
1135  e.what();
1136  cerr
1137  << "VcstLutNetCDF4:: Failure creating RSB_DYNAMIC netCDF4 LUT file: "
1138  + filepath + "." << endl;
1139 
1140  return VCST_FAIL;
1141  }
1142 
1143  nc_output->putAtt("title",
1144  "VIIRS Reflective Solar Bands Time-Dependent LUTs");
1145 
1146  write_global_attributes(nc_output);
1147 
1148  // Add RSB LUT dimensions
1149  td_luts_dim_rsbf_ = nc_output->addDim("Time_Dependent_RSB_F_LUTs");
1150  td_luts_dim_rsbrsr_ = nc_output->addDim("Time_Dependent_RSB_RSR_LUTs");
1151  scalar_dim_ = nc_output->addDim("Scalar", 1);
1152  num_viirs_bands_dim_ = nc_output->addDim("Number_of_VIIRS_Bands",
1153  NUM_VIIRS_BAND);
1154  max_num_detectors_dim_ = nc_output->addDim("Max_Number_of_Detectors",
1156  max_num_gains_dim_ = nc_output->addDim("Max_Number_of_Gain_States",
1157  MAX_NUM_GAIN);
1158  num_mirror_sides_dim_ = nc_output->addDim("Number_of_Mirror_Sides",
1160  num_refl_dnb_bands_dim_ = nc_output->addDim(
1161  "Number_Reflective_Plus_DNB_Bands", NUM_REFL_PLUS_DNB_BANDS);
1162  max_rsr_dim_ = nc_output->addDim( "Max_RSR_Values", MAX_RSR_VALUES );
1163 
1164  VcstCalLutInputItem* lut_item;
1165  std::string fileName = "";
1166 
1167  // VIIRS_SDR_F_PREDICTED_LUT
1168 
1169  if (lut_files_.size() > 1) {
1171  } else {
1174 
1175  if (lut_item != 0) {
1177  static_cast<proSdrViirsCalFPredictedTableLUT*> (lut_item->getDataPtr());
1178  fileName = lut_item->getFileName();
1179 
1181  fileName);
1182  } else {
1183  status = VCST_FAIL;
1184  }
1185 
1186  delete lut_item;
1187  }
1188 
1189  if (status != VCST_SUCCESS) {
1190  cerr
1191  << "VcstLutNetCDF4:: Failure writing "
1192  + VIIRS_SDR_F_PREDICTED_LUT + " to netCDF4 LUT file "
1193  << endl;
1194  }
1195 
1196  // VIIRS_SDR_SOLAR_SPECTRAL_IRAD_LUT
1197 
1199 
1200  status = collect_lut_files("SDR-RELATIVE-SPECTRAL-RESPONSE-LUT", dirPath);
1201 
1202  if (status != VCST_SUCCESS) {
1203  cerr
1204  << "VcstLutNetCDF4:: Failure collecting LUT files for "
1206  << endl;
1207  delete nc_output;
1208  return VCST_FAIL;
1209  }
1210 
1211  if (lut_files_.size() > 1) {
1213  } else {
1216 
1217  if (lut_item != 0) {
1218  rsrLUT_ =
1219  static_cast<ProSdrViirsCalRelativeSpectralResponseLUT*> (lut_item->getDataPtr());
1220  fileName = lut_item->getFileName();
1221 
1223  fileName);
1224 
1225  delete lut_item;
1226  } else {
1227  status = VCST_FAIL;
1228  }
1229  }
1230 
1231  if (status != VCST_SUCCESS) {
1232  cerr
1233  << "VcstLutNetCDF4:: Failure writing "
1235  + " to netCDF4 LUT file " << endl;
1236  delete nc_output;
1237  return VCST_FAIL;
1238  }
1239 
1240  delete nc_output;
1241 
1242  return VCST_SUCCESS;
1243 }
1244 
1245 /**************************************************************************
1246  * NAME: create_dnb_dynamic_lut()
1247  *
1248  * DESCRIPTION: Create time-dependent Day-Night Band netCDF4 LUT used for
1249  * reprocessing.
1250  *
1251  *************************************************************************/
1252 
1254  int status = VCST_SUCCESS;
1255 
1256  string dirPath = VL1_get_group(VIIRS_SDR_DNB_LGS_GAINS_LUT);
1257 
1258  status = collect_lut_files("SDR-DNB-LGS-GAINS-LUT", dirPath);
1259 
1260  if (status != VCST_SUCCESS) {
1261  cerr
1262  << "VcstLutNetCDF4:: Failure collecting LUT files for "
1263  + VIIRS_SDR_DNB_LGS_GAINS_LUT + "." << endl;
1264  return VCST_FAIL;
1265  }
1266 
1269 
1270  std::string startDate = lut_files_.begin()->first;
1271  std::string endDate = lut_files_.rbegin()->first;
1272 
1273  if (lut_files_.size() > 1) {
1274  filepath += "/VIIRS_" + platform_str_ + "_CAL_DNB_DYNAMIC_LUT_" +
1275  startDate + "_" + endDate + "_version_source.nc";
1276  } else {
1277  filepath += "/VIIRS_" + platform_str_ + "_CAL_DNB_LUT_" + startDate +
1278  "_version_source.nc";
1279  }
1280 
1281  NcFile* nc_output;
1282 
1283  try {
1284  nc_output = new NcFile(filepath, NcFile::replace);
1285  } catch (NcException& e) {
1286  e.what();
1287  cerr << "VcstLutNetCDF4:: Failure creating DNB_DYNAMIC netCDF4 LUT file: "
1288  + filepath + "." << endl;
1289  return VCST_FAIL;
1290  }
1291 
1292  nc_output->putAtt("title", "VIIRS Day-Night Band Time-Dependent LUTs");
1293 
1294  write_global_attributes(nc_output);
1295 
1296  // Add DNB LUT dimensions
1297  scalar_dim_ = nc_output->addDim("Scalar", 1);
1298  td_luts_dim_dnbdn0_ = nc_output->addDim("Time_Dependent_DNB_DN0_LUTs");
1299  td_luts_dim_dnbgr_ = nc_output->addDim("Time_Dependent_DNB_GR_LUTs");
1300  td_luts_dim_dnblgs_ = nc_output->addDim("Time_Dependent_DNB_LGS_LUTs");
1301  num_dnb_agg_seq_dim_ = nc_output->addDim("Number_of_DNB_Agg_Sequences",
1302  NUM_AGG_SEQ);
1303  num_dnb_detectors_dim_ = nc_output->addDim("Number_of_DNB_Detectors",
1305  num_dnb_gain_ratios_dim_ = nc_output->addDim("Number_of_DNB_Gain_Ratios",
1306  NUM_GAIN_RATIOS);
1307  num_dnb_gain_ratio_coeff_dim_ = nc_output->addDim(
1308  "Number_of_DNB_Gain_Ratio_Coeffs", NUM_DNB_GAIN_RATIO_COEFFS);
1309  num_dnb_ev_frames_dim_ = nc_output->addDim("Number_of_DNB_EV_Frames",
1310  EV_DNB_FRAMES);
1311  num_dnb_gains_dim_ = nc_output->addDim("Number_of_DNB_Gain_States",
1312  MAX_NUM_GAIN);
1313  num_mirror_sides_dim_ = nc_output->addDim("Number_of_Mirror_Sides",
1315 
1316  VcstCalLutInputItem* lut_item;
1317  std::string fileName = "";
1318 
1319  // VIIRS_SDR_DNB_LGS_GAINS_LUT
1320 
1321  if (lut_files_.size() > 1) {
1323  } else {
1325  sizeof (ProSdrViirsCalDnbLgsGainsLUT));
1326 
1327  if (lut_item != 0) {
1329  static_cast<ProSdrViirsCalDnbLgsGainsLUT*> (lut_item->getDataPtr());
1330  fileName = lut_item->getFileName();
1331 
1333  fileName);
1334 
1335  delete lut_item;
1336  } else {
1337  status = VCST_FAIL;
1338  }
1339  }
1340 
1341  if (status != VCST_SUCCESS) {
1342  cerr
1343  << "VcstLutNetCDF4:: Failure writing "
1344  + VIIRS_SDR_DNB_LGS_GAINS_LUT + " to netCDF4 LUT file "
1345  << endl;
1346  delete nc_output;
1347  return VCST_FAIL;
1348  }
1349 
1350  // VIIRS_SDR_DNB_GAIN_RATIOS_LUT
1351 
1353 
1354  status = collect_lut_files("SDR-DNB-GAIN-RATIOS-LUT", dirPath);
1355 
1356  if (status != VCST_SUCCESS) {
1357  cerr
1358  << "VcstLutNetCDF4:: Failure collecting LUT files for "
1359  + VIIRS_SDR_DNB_GAIN_RATIOS_LUT + "." << endl;
1360  delete nc_output;
1361  return VCST_FAIL;
1362  }
1363 
1364  if (lut_files_.size() > 1) {
1366  } else {
1369 
1370  if (lut_item != 0) {
1372  static_cast<ProSdrViirsCalDnbGainRatiosLUT*> (lut_item->getDataPtr());
1373  fileName = lut_item->getFileName();
1374 
1376  TableDnbGainRatios_, fileName);
1377 
1378  delete lut_item;
1379  } else {
1380  status = VCST_FAIL;
1381  }
1382  }
1383 
1384  if (status != VCST_SUCCESS) {
1385  cerr
1386  << "VcstLutNetCDF4:: Failure writing "
1388  + " to netCDF4 LUT file " << endl;
1389  delete nc_output;
1390  return VCST_FAIL;
1391  }
1392 
1393  // VIIRS_SDR_DNB_DN0_LUT
1394 
1396 
1397  status = collect_lut_files("SDR-DNB-DN0-LUT", dirPath);
1398 
1399  if (status != VCST_SUCCESS) {
1400  cerr
1401  << "VcstLutNetCDF4:: Failure collecting LUT files for "
1402  + VIIRS_SDR_DNB_DN0_LUT + "." << endl;
1403  delete nc_output;
1404  return VCST_FAIL;
1405  }
1406 
1407  if (lut_files_.size() > 1) {
1408  status = write_all_SDR_DNB_DN0_LUT(nc_output);
1409  } else {
1411  sizeof (proSdrViirsDnbDn0Type));
1412 
1413  if (lut_item != 0) {
1414  dnbDn0_ =
1415  static_cast<proSdrViirsDnbDn0Type*> (lut_item->getDataPtr());
1416  fileName = lut_item->getFileName();
1417 
1418  status = write_SDR_DNB_DN0_LUT(nc_output, dnbDn0_, fileName);
1419 
1420  delete lut_item;
1421  } else {
1422  status = VCST_FAIL;
1423  }
1424  }
1425 
1426  if (status != VCST_SUCCESS) {
1427  cerr
1428  << "VcstLutNetCDF4:: Failure writing " + VIIRS_SDR_DNB_DN0_LUT
1429  + " to netCDF4 LUT file " << endl;
1430  delete nc_output;
1431  return VCST_FAIL;
1432  }
1433 
1434  delete nc_output;
1435 
1436  return VCST_SUCCESS;
1437 }
1438 
1439 /**************************************************************************
1440  * NAME: create_straylight_dynamic_lut()
1441  *
1442  * DESCRIPTION: Create DNB stray light time-dependent netCDF4 LUT used for
1443  * reprocessing.
1444  *
1445  *************************************************************************/
1446 
1448  int status = VCST_SUCCESS;
1449 
1451 
1452  status = collect_lut_files("VIIRS-SDR-DNB-STRAY-LIGHT-CORRECTION-LUT",
1453  dirPath);
1454 
1455  if (status != VCST_SUCCESS) {
1456  cerr
1457  << "VcstLutNetCDF4:: Failure collecting LUT files for "
1458  + VIIRS_DNB_STRAY_LIGHT_CORRECTION_LUT + "." << endl;
1459  return VCST_FAIL;
1460  }
1461 
1464 
1465  std::string startDate = lut_files_.begin()->first;
1466  std::string endDate = lut_files_.rbegin()->first;
1467 
1468  if (lut_files_.size() > 1) {
1469  filepath += "/VIIRS_" + platform_str_ + "_CAL_STRAYLIGHT_DYNAMIC_LUT_" +
1470  startDate + "_" + endDate + "_version_source.nc";
1471  } else {
1472  filepath += "/VIIRS_" + platform_str_ + "_CAL_STRAYLIGHT_LUT_" +
1473  startDate + "_version_source.nc";
1474  }
1475 
1476  NcFile* nc_output;
1477 
1478  try {
1479  nc_output = new NcFile(filepath, NcFile::replace);
1480  } catch (NcException& e) {
1481  e.what();
1482  cerr << "VcstLutNetCDF4:: Failure creating STRAYLIGHT netCDF4 LUT file: "
1483  + filepath + "." << endl;
1484  return VCST_FAIL;
1485  }
1486 
1487  nc_output->putAtt("title",
1488  "VIIRS Day-Night Band Stray Light Time-Dependent LUTs");
1489 
1490  write_global_attributes(nc_output);
1491 
1492  // Add Straylight LUT dimensions
1493  scalar_dim_ = nc_output->addDim("Scalar", 1);
1494  num_hemispheres_dim_ = nc_output->addDim("Number_of_Hemispheres",
1495  NUM_HEMISPHERES);
1496  num_sza_bins_dim_ = nc_output->addDim("Number_of_SZA_Bins", NUM_SZA_BINS);
1497  num_dnb_ev_frames_dim_ = nc_output->addDim(
1498  "Number_of_Decimated_DNB_EV_Frames", SHORT_DNB_FRAMES);
1499  num_dnb_detectors_dim_ = nc_output->addDim("Number_of_DNB_Detectors",
1501  num_mirror_sides_dim_ = nc_output->addDim("Number_of_Mirror_Sides",
1503 
1504  if (lut_files_.size() > 1) {
1505  td_luts_dim_slc_ = nc_output->addDim("Time_Dependent_SLC_LUTs");
1506 
1508  } else {
1509  VcstCalLutInputItem* lut_item;
1510  std::string fileName = "";
1511 
1514 
1515  if (lut_item != 0) {
1516  strayLight_ =
1517  static_cast<proSdrViirsCalDnbStrayLightLUT*> (lut_item->getDataPtr());
1518  fileName = lut_item->getFileName();
1519  } else {
1520  status = VCST_FAIL;
1521  }
1522 
1524  strayLight_, fileName);
1525 
1526  delete lut_item;
1527  }
1528 
1529  if (status != VCST_SUCCESS) {
1530  cerr
1531  << "VcstLutNetCDF4:: Failure writing "
1533  + " to netCDF4 LUT file " << endl;
1534  }
1535 
1536  delete nc_output;
1537 
1538  return VCST_SUCCESS;
1539 }
1540 
1541 /**************************************************************************
1542  * NAME: write_global_attributes()
1543  *
1544  * DESCRIPTION: Write global attributes to specified netCDF file ID
1545  *
1546  **************************************************************************/
1547 
1549  nc_output->putAtt("processing_version", processing_version_);
1550  nc_output->putAtt("Conventions", Conventions_);
1551  nc_output->putAtt("institution", institution_);
1552  nc_output->putAtt("license", license_);
1553  nc_output->putAtt("naming_authority", naming_authority_);
1554  nc_output->putAtt("date_created", date_created_);
1555  nc_output->putAtt("keywords_vocabulary", keywords_vocabulary_);
1556  nc_output->putAtt("stdname_vocabulary", stdname_vocabulary_);
1557  nc_output->putAtt("creator_name", creator_name_);
1558  nc_output->putAtt("creator_email", creator_email_);
1559  nc_output->putAtt("creator_url", creator_url_);
1560  nc_output->putAtt("project", project_);
1561  nc_output->putAtt("publisher_name", publisher_name_);
1562  nc_output->putAtt("publisher_url", publisher_url_);
1563  nc_output->putAtt("publisher_email", publisher_email_);
1564  nc_output->putAtt("processing_level", processing_level_);
1565  nc_output->putAtt("cdm_data_type", cdm_data_type_);
1566  nc_output->putAtt("orbit_number", ncInt, orbit_number_);
1567  nc_output->putAtt("history", history_);
1568  nc_output->putAtt("time_coverage_start", time_coverage_start_);
1569  nc_output->putAtt("time_coverage_end", time_coverage_end_);
1570 
1571  return VCST_SUCCESS;
1572 }
1573 
1574 /**************************************************************************
1575  * NAME: read_cmngeo_lut()
1576  *
1577  * DESCRIPTION: Read a single LUT and create data input item on map.
1578  * Return a pointer to the LUT item created.
1579  *
1580  *************************************************************************/
1581 
1583  int size) {
1584  int status;
1585 
1586  VcstCmnLutInputItem* lutItem = new VcstCmnLutInputItem(groupName, size);
1587 
1588  status = lutItem->getData();
1589 
1590  if (status != VCST_SUCCESS) {
1591  std::cerr
1592  << "VcstLutNetCDF4::read_cmngeo_lut() Error reading LUT data for group name "
1593  << groupName << std::endl;
1594 
1595  delete lutItem;
1596 
1597  return 0L;
1598  }
1599 
1600  return lutItem;
1601 }
1602 
1603 /**************************************************************************
1604  * NAME: read_cal_lut()
1605  *
1606  * DESCRIPTION: Read a single LUT and create data input item on map.
1607  * Return a pointer to the LUT item created.
1608  *
1609  *************************************************************************/
1610 
1612  int size) {
1613 
1614  VcstCalLutInputItem* lutItem = new VcstCalLutInputItem(groupName, size);
1615 
1616  int status = lutItem->getData();
1617 
1618  if (status != VCST_SUCCESS) {
1619  std::cerr
1620  << "VcstLutNetCDF4::read_cal_lut() Error reading LUT data for group name "
1621  << groupName << std::endl;
1622 
1623  delete lutItem;
1624 
1625  return 0L;
1626  }
1627 
1628  return lutItem;
1629 }
1630 
1631 /**************************************************************************
1632  * NAME: read_geo_lut()
1633  *
1634  * DESCRIPTION: Read a single LUT and create data input item on map.
1635  * Return a pointer to the LUT item created.
1636  *
1637  *************************************************************************/
1638 
1640  int size) {
1641  int status;
1642 
1643  VcstGeoLutInputItem* lutItem = new VcstGeoLutInputItem(groupName, size);
1644 
1645  status = lutItem->getData();
1646 
1647  if (status != VCST_SUCCESS) {
1648  std::cerr
1649  << "VcstLutNetCDF4::read_geo_lut() Error reading LUT data for group name "
1650  << groupName << std::endl;
1651 
1652  delete lutItem;
1653 
1654  return 0L;
1655  }
1656 
1657  return lutItem;
1658 }
1659 
1660 /**************************************************************************
1661  * NAME: isPlatformLittleEndian()
1662  *
1663  * DESCRIPTION: Determine if target platform is little endian. Return true if
1664  * platform is little endian.
1665  *
1666  *************************************************************************/
1667 
1669  unsigned short checkValue = 0xAABB;
1670  unsigned char* bytePtr = reinterpret_cast<unsigned char*> (&checkValue);
1671 
1672  if (bytePtr[0] == 0xAA) // big-endian
1673  {
1674  return false;
1675  } else // little-endian
1676  {
1677  return true;
1678  }
1679 }
1680 
1681 /******************************************************************************
1682  * NAME: write_***************_LUT()
1683  *
1684  * DESCRIPTION: Write LUT to netCDF4 file.
1685  *
1686  ******************************************************************************/
1687 
1689 
1690  int tel_start_enc_nominal = TEL_START_ENC_NOMINAL_NPP;
1691  int ham_start_enc_nominal[2] = {HAM_START_ENC_NOMINAL_0_NPP,
1693  int scan_encdr_start_max = SCAN_ENCDR_START_MAX_NPP;
1694 
1695  if (platform_ == NPP) {
1696  } else if (platform_ == J1) {
1697  tel_start_enc_nominal = TEL_START_ENC_NOMINAL_J1;
1698  ham_start_enc_nominal[0] = HAM_START_ENC_NOMINAL_0_J1;
1699  ham_start_enc_nominal[1] = HAM_START_ENC_NOMINAL_1_J1;
1700  scan_encdr_start_max = SCAN_ENCDR_START_MAX_J1;
1701  } else if (platform_ == J2) {
1702  tel_start_enc_nominal = TEL_START_ENC_NOMINAL_J2;
1703  ham_start_enc_nominal[0] = HAM_START_ENC_NOMINAL_0_J2,
1704  ham_start_enc_nominal[1] = HAM_START_ENC_NOMINAL_1_J2;
1705  scan_encdr_start_max = SCAN_ENCDR_START_MAX_J2;
1706  }
1707 
1708  NcGroup lut_grp = nc_output->addGroup(CMNGEO_PLATFORM_LUT);
1709 
1710  NcVar var = lut_grp.addVar("tel_start_enc_nominal", ncInt, scalar_dim_);
1711  var.putVar(&tel_start_enc_nominal);
1712 
1713  var = lut_grp.addVar("ham_start_enc_nominal", ncInt, two_values_dim_);
1714  var.putVar(ham_start_enc_nominal);
1715 
1716  var = lut_grp.addVar("scan_encdr_start_max", ncInt, scalar_dim_);
1717  var.putVar(&scan_encdr_start_max);
1718 
1719  return VCST_SUCCESS;
1720 }
1721 
1723  JPLEphemLutType* lut, std::string fileName) {
1724  NcGroup lut_grp;
1725  NcVar var;
1726 
1727  lut_grp = nc_output->addGroup(CMNGEO_JPL_EPHEM);
1728  lut_grp.putAtt("file_name", fileName);
1729 
1730  vector < NcDim > jpl_ipt_dims;
1731  jpl_ipt_dims.push_back(num_jpl_ipt_rows_dim_);
1732  jpl_ipt_dims.push_back(num_jpl_ipt_cols_dim_);
1733 
1734  vector < NcDim > jpl_ephem_dims;
1735  jpl_ephem_dims.push_back(num_jpl_ephem_rows_dim_);
1736  jpl_ephem_dims.push_back(num_jpl_ephem_cols_dim_);
1737 
1738  var = lut_grp.addVar("tjdStart", ncDouble, scalar_dim_);
1739  var.putAtt("long_name", "");
1740  var.putAtt("units", "none");
1741  var.putVar(&lut->tjdStart);
1742 
1743  var = lut_grp.addVar("tjdEnd", ncDouble, scalar_dim_);
1744  var.putAtt("long_name", "");
1745  var.putAtt("units", "none");
1746  var.putVar(&lut->tjdEnd);
1747 
1748  var = lut_grp.addVar("span", ncDouble, scalar_dim_);
1749  var.putAtt("long_name", "");
1750  var.putAtt("units", "none");
1751  var.putVar(&lut->span);
1752 
1753  var = lut_grp.addVar("au", ncDouble, scalar_dim_);
1754  var.putAtt("long_name", "");
1755  var.putAtt("units", "none");
1756  var.putVar(&lut->au);
1757 
1758  var = lut_grp.addVar("emrat", ncDouble, scalar_dim_);
1759  var.putAtt("long_name", "");
1760  var.putAtt("units", "none");
1761  var.putVar(&lut->emrat);
1762 
1763  var = lut_grp.addVar("ipt", ncInt, jpl_ipt_dims);
1764  var.putAtt("long_name", "");
1765  var.putAtt("units", "none");
1766  var.putVar(lut->ipt);
1767 
1768  var = lut_grp.addVar("coeffs", ncDouble, jpl_ephem_dims);
1769  var.putAtt("long_name", "");
1770  var.putAtt("units", "none");
1771  var.putVar(lut->coeffs);
1772 
1773  return VCST_SUCCESS;
1774 }
1775 
1777  std::string fileName) {
1778  NcGroup lut_grp;
1779  NcVar var;
1780 
1781  lut_grp = nc_output->addGroup(CMNGEO_SAA_COEFF);
1782  lut_grp.putAtt("file_name", fileName);
1783 
1784  var = lut_grp.addVar("centerLat", ncDouble, scalar_dim_);
1785  var.putVar(&lut->centerLat);
1786 
1787  var = lut_grp.addVar("centerLon", ncDouble, scalar_dim_);
1788  var.putVar(&lut->centerLon);
1789 
1790  var = lut_grp.addVar("maxIndex", ncDouble, scalar_dim_);
1791  var.putVar(&lut->maxIndex);
1792 
1793  var = lut_grp.addVar("latHeight", ncDouble, scalar_dim_);
1794  var.putVar(&lut->latHeight);
1795 
1796  var = lut_grp.addVar("lonWidth", ncDouble, scalar_dim_);
1797  var.putVar(&lut->lonWidth);
1798 
1799  return VCST_SUCCESS;
1800 }
1801 
1803  CmnGeoParamLutType* lut, std::string fileName) {
1804  NcGroup lut_grp;
1805  NcVar var;
1806 
1807  lut_grp = nc_output->addGroup(CMNGEO_PARAM_LUT);
1808  lut_grp.putAtt("file_name", fileName);
1809 
1810  var = lut_grp.addVar("OrbitConsistency", ncDouble, scalar_dim_);
1811  var.putVar(&lut->OrbitConsistency);
1812 
1813  var = lut_grp.addVar("AngularMomentumLimit", ncDouble, min_max_dim_);
1814  var.putVar(lut->AngularMomentumLimit);
1815 
1816  var = lut_grp.addVar("AngularMomentumZLimit", ncDouble, min_max_dim_);
1817  var.putVar(lut->AngularMomentumZLimit);
1818 
1819  var = lut_grp.addVar("PositionAbsLimit", ncDouble, min_max_dim_);
1820  var.putVar(lut->PositionAbsLimit);
1821 
1822  var = lut_grp.addVar("PositionMagLimit", ncDouble, min_max_dim_);
1823  var.putVar(lut->PositionMagLimit);
1824 
1825  var = lut_grp.addVar("VelocityAbsLimit", ncDouble, min_max_dim_);
1826  var.putVar(lut->VelocityAbsLimit);
1827 
1828  var = lut_grp.addVar("VelocityMagLimit", ncDouble, min_max_dim_);
1829  var.putVar(lut->VelocityMagLimit);
1830 
1831  var = lut_grp.addVar("AttitudeAbsLimit", ncDouble, min_max_dim_);
1832  var.putVar(lut->AttitudeAbsLimit);
1833 
1834  return VCST_SUCCESS;
1835 }
1836 
1838  SolarDiffVoltLutType* lut, std::string fileName) {
1839  NcGroup lut_grp;
1840  NcVar var;
1841 
1842  lut_grp = nc_output->addGroup(VIIRS_SOLAR_DIFF_VOLT_LUT);
1843  lut_grp.putAtt("file_name", fileName);
1844 
1845  vector < NcDim > sdsm_volt_dims;
1846  sdsm_volt_dims.push_back(num_sdsm_samples_dim_);
1847  sdsm_volt_dims.push_back(num_sdsm_det_dim_);
1848  sdsm_volt_dims.push_back(num_sdsm_coef_dim_);
1849 
1850  vector < NcDim > sdsm_limit_dims;
1851  sdsm_limit_dims.push_back(num_sdsm_samples_dim_);
1852  sdsm_limit_dims.push_back(num_sdsm_det_dim_);
1853 
1854  var = lut_grp.addVar("voltLowerLimit", ncInt, sdsm_limit_dims);
1855  var.putVar(lut->voltLowerLimit);
1856 
1857  var = lut_grp.addVar("voltUpperLimit", ncInt, sdsm_limit_dims);
1858  var.putVar(lut->voltUpperLimit);
1859 
1860  var = lut_grp.addVar("voltCoef", ncFloat, sdsm_volt_dims);
1861  var.putVar(lut->voltCoef);
1862 
1863  return VCST_SUCCESS;
1864 }
1865 
1868  NcGroup lut_grp;
1869  NcVar var;
1870 
1871  lut_grp = nc_output->addGroup(VIIRS_SOLAR_DIFF_ROT_MATRIX_LUT);
1872  lut_grp.putAtt("file_name", fileName);
1873 
1874  vector < NcDim > matrix_dims;
1875  matrix_dims.push_back(matrix_rows_dim_);
1876  matrix_dims.push_back(matrix_cols_dim_);
1877 
1878  var = lut_grp.addVar("sdMatrix", ncFloat, matrix_dims);
1879  var.putVar(lut->sdMatrix);
1880 
1881  var = lut_grp.addVar("sdsmMatrix", ncFloat, matrix_dims);
1882  var.putVar(lut->sdsmMatrix);
1883 
1884  return VCST_SUCCESS;
1885 }
1886 
1888  proSdrViirsCalDgAnDnLmtLUT* lut, std::string fileName) {
1889  NcGroup lut_grp;
1890  NcVar var;
1891 
1892  lut_grp = nc_output->addGroup(VIIRS_DG_ANOMALY_DN_LIMITS_LUT);
1893  lut_grp.putAtt("file_name", fileName);
1894 
1895  vector < NcDim > dg_anom_dims;
1896  dg_anom_dims.push_back(num_refl_750m_dg_bands_dim_);
1897  dg_anom_dims.push_back(num_750m_det_dim_);
1898  dg_anom_dims.push_back(min_max_dim_);
1899 
1900  var = lut_grp.addVar("data", ncFloat, dg_anom_dims);
1901  var.putVar(lut->data);
1902 
1903  return VCST_SUCCESS;
1904 }
1905 
1907  proSdrViirsCaldnbRVSLUT* lut, std::string fileName) {
1908  NcGroup lut_grp;
1909  NcVar var;
1910 
1911  lut_grp = nc_output->addGroup(VIIRS_SDR_DNB_RVS);
1912  lut_grp.putAtt("file_name", fileName);
1913 
1914  vector < NcDim > dnb_rvs_dims;
1915  dnb_rvs_dims.push_back(num_dnb_ev_frames_dim_);
1916  dnb_rvs_dims.push_back(num_dnb_detectors_dim_);
1917  dnb_rvs_dims.push_back(num_mirror_sides_dim_);
1918 
1919  var = lut_grp.addVar("dnbrvs", ncFloat, dnb_rvs_dims);
1920  var.putVar(lut->dnbrvs);
1921 
1922  return VCST_SUCCESS;
1923 }
1924 
1927  NcGroup lut_grp;
1928  NcVar var;
1929 
1930  lut_grp = nc_output->addGroup(VIIRS_SDR_DNB_FRAME_TO_ZONE);
1931  lut_grp.putAtt("file_name", fileName);
1932 
1933  var = lut_grp.addVar("FrameToZone", ncInt, num_dnb_ev_frames_dim_);
1934  var.putVar(lut->FrameToZone);
1935 
1936  return VCST_SUCCESS;
1937 }
1938 
1940  proSdrViirsCalGainTableLUT* lut, std::string fileName) {
1941  NcGroup lut_grp;
1942  NcVar var;
1943 
1944  lut_grp = nc_output->addGroup(VIIRS_SDR_GAIN_LUT);
1945  lut_grp.putAtt("file_name", fileName);
1946 
1947  var = lut_grp.addVar("data", ncDouble, num_viirs_bands_dim_);
1948  var.putVar(lut->data);
1949 
1950  return VCST_SUCCESS;
1951 }
1952 
1954  proSdrViirsCalHAMERLUT* lut, std::string fileName) {
1955  NcGroup lut_grp;
1956  NcVar var;
1957 
1958  lut_grp = nc_output->addGroup(VIIRS_SDR_HAM_ER_TABLE);
1959  lut_grp.putAtt("file_name", fileName);
1960 
1961  vector < NcDim > hamer_file_dims;
1962  hamer_file_dims.push_back(num_hamer_files_dim_);
1963  hamer_file_dims.push_back(two_values_dim_);
1964 
1965  var = lut_grp.addVar("HAM_ER_indices", ncInt, hamer_file_dims);
1966  var.putVar(lut->HAM_ER_indices);
1967 
1968  var = lut_grp.addVar("HAM_ER_tp", ncDouble, num_hamer_values_dim_);
1969  var.putVar(lut->HAM_ER_tp);
1970 
1971  var = lut_grp.addVar("HAM_ER_rad", ncDouble, num_hamer_values_dim_);
1972  var.putVar(lut->HAM_ER_rad);
1973 
1974  return VCST_SUCCESS;
1975 }
1976 
1978  proSdrViirsCalRTAERLUT* lut, std::string fileName) {
1979  NcGroup lut_grp;
1980  NcVar var;
1981 
1982  lut_grp = nc_output->addGroup(VIIRS_SDR_RTA_ER_TABLE);
1983  lut_grp.putAtt("file_name", fileName);
1984 
1985  vector < NcDim > rtaer_file_dims;
1986  rtaer_file_dims.push_back(num_rtaer_files_dim_);
1987  rtaer_file_dims.push_back(two_values_dim_);
1988 
1989  var = lut_grp.addVar("RTA_ER_indices", ncInt, rtaer_file_dims);
1990  var.putVar(lut->RTA_ER_indices);
1991 
1992  var = lut_grp.addVar("RTA_ER_tp", ncDouble, num_rtaer_values_dim_);
1993  var.putVar(lut->RTA_ER_tp);
1994 
1995  var = lut_grp.addVar("RTA_ER_rad", ncDouble, num_rtaer_values_dim_);
1996  var.putVar(lut->RTA_ER_rad);
1997 
1998  return VCST_SUCCESS;
1999 }
2000 
2002  proSdrViirsCalOBCERLUT* lut, std::string fileName) {
2003  NcGroup lut_grp;
2004  NcVar var;
2005 
2006  lut_grp = nc_output->addGroup(VIIRS_SDR_OBC_ER_TABLE);
2007  lut_grp.putAtt("file_name", fileName);
2008 
2009  vector < NcDim > obcer_file_dims;
2010  obcer_file_dims.push_back(num_obcer_files_dim_);
2011  obcer_file_dims.push_back(two_values_dim_);
2012 
2013  var = lut_grp.addVar("OBC_ER_indices", ncInt, obcer_file_dims);
2014  var.putVar(lut->OBC_ER_indices);
2015 
2016  var = lut_grp.addVar("OBC_ER_tp", ncDouble, num_obcer_values_dim_);
2017  var.putVar(lut->OBC_ER_tp);
2018 
2019  var = lut_grp.addVar("OBC_ER_rad", ncDouble, num_obcer_values_dim_);
2020  var.putVar(lut->OBC_ER_rad);
2021 
2022  return VCST_SUCCESS;
2023 }
2024 
2026  proSdrViirsCalOBCRRLUT* lut, std::string fileName) {
2027  NcGroup lut_grp;
2028  NcVar var;
2029 
2030  lut_grp = nc_output->addGroup(VIIRS_SDR_OBC_RR_TABLE);
2031  lut_grp.putAtt("file_name", fileName);
2032 
2033  vector < NcDim > obcrr_file_dims;
2034  obcrr_file_dims.push_back(num_obcrr_files_dim_);
2035  obcrr_file_dims.push_back(two_values_dim_);
2036 
2037  var = lut_grp.addVar("OBC_RR_indices", ncInt, obcrr_file_dims);
2038  var.putVar(lut->OBC_RR_indices);
2039 
2040  var = lut_grp.addVar("OBC_RR_tp", ncDouble, num_obcrr_values_dim_);
2041  var.putVar(lut->OBC_RR_tp);
2042 
2043  var = lut_grp.addVar("OBC_RR_rad", ncDouble, num_obcrr_values_dim_);
2044  var.putVar(lut->OBC_RR_rad);
2045 
2046  return VCST_SUCCESS;
2047 }
2048 
2050  proSdrViirsCalLtoEBBTLUT* lut, std::string fileName) {
2051  NcGroup lut_grp;
2052  NcVar var;
2053 
2054  lut_grp = nc_output->addGroup(VIIRS_SDR_EBBT_TABLE);
2055  lut_grp.putAtt("file_name", fileName);
2056 
2057  vector < NcDim > ebbt_file_dims;
2058  ebbt_file_dims.push_back(num_ebbt_files_dim_);
2059  ebbt_file_dims.push_back(two_values_dim_);
2060 
2061  var = lut_grp.addVar("EBBT_indices", ncInt, ebbt_file_dims);
2062  var.putVar(lut->EBBT_indices);
2063 
2064  var = lut_grp.addVar("L_to_EBBT_tp", ncDouble, num_ebbt_values_dim_);
2065  var.putVar(lut->L_to_EBBT_tp);
2066 
2067  var = lut_grp.addVar("L_to_EBBT_rad", ncDouble, num_ebbt_values_dim_);
2068  var.putVar(lut->L_to_EBBT_rad);
2069 
2070  return VCST_SUCCESS;
2071 }
2072 
2074  proSdrViirsCalTeleCoeffLUT* lut, std::string fileName) {
2075  NcGroup lut_grp;
2076  NcVar var;
2077 
2078  lut_grp = nc_output->addGroup(VIIRS_SDR_TELE_COEFFS);
2079  lut_grp.putAtt("file_name", fileName);
2080 
2081  vector < NcDim > therm_dims;
2082  therm_dims.push_back(num_thermistors_dim_);
2083  therm_dims.push_back(num_temp_coeffs_dim_);
2084 
2085  var = lut_grp.addVar("teleCoeffs", ncFloat, therm_dims);
2086  var.putVar(lut->teleCoeffs);
2087 
2088  var = lut_grp.addVar("filterThreshold", ncFloat, num_thermistors_dim_);
2089  var.putVar(lut->filterThreshold);
2090 
2091  var = lut_grp.addVar("defaultValue", ncFloat, num_thermistors_dim_);
2092  var.putVar(lut->defaultValue);
2093 
2094  var = lut_grp.addVar("bbTempOffsetDef", ncFloat, scalar_dim_);
2095  var.putVar(&lut->bbTempOffsetDef);
2096 
2097  var = lut_grp.addVar("bbTempGainDef", ncFloat, scalar_dim_);
2098  var.putVar(&lut->bbTempGainDef);
2099 
2100  var = lut_grp.addVar("bbTempAdditive", ncFloat, scalar_dim_);
2101  var.putVar(&lut->bbTempAdditive);
2102 
2103  var = lut_grp.addVar("bbTempSpare", ncFloat, num_tref_mux_dim_);
2104  var.putVar(lut->bbTempSpare);
2105 
2106  var = lut_grp.addVar("evCtPrecTrefMux1Ca", ncFloat, num_tref_mux_dim_);
2107  var.putVar(lut->evCtPrecTrefMux1Ca);
2108 
2109  return VCST_SUCCESS;
2110 }
2111 
2113  proSdrViirsCalSolarIradLUT* lut, std::string fileName) {
2114  NcGroup lut_grp;
2115  NcVar var;
2116 
2117  lut_grp = nc_output->addGroup(VIIRS_SDR_SOLAR_IRAD_LUT);
2118  lut_grp.putAtt("file_name", fileName);
2119 
2120  var = lut_grp.addVar("x", ncDouble, num_solar_irad_values_dim_);
2121  var.putVar(lut->x);
2122 
2123  var = lut_grp.addVar("y", ncDouble, num_solar_irad_values_dim_);
2124  var.putVar(lut->y);
2125 
2126  return VCST_SUCCESS;
2127 }
2128 
2130  proSdrViirsCalObsToPixelsLUT* lut, std::string fileName) {
2131  NcGroup lut_grp;
2132  NcVar var;
2133 
2134  lut_grp = nc_output->addGroup(VIIRS_SDR_OBS_TO_PIXELS);
2135  lut_grp.putAtt("file_name", fileName);
2136 
2137  var = lut_grp.addVar("pixels", ncInt, num_dg_ev_frames_dim_);
2138  var.putVar(lut->pixels);
2139 
2140  return VCST_SUCCESS;
2141 }
2142 
2144  proSdrViirsCalRMParametersLUT* lut, std::string fileName) {
2145  NcGroup lut_grp;
2146  NcVar var;
2147 
2148  lut_grp = nc_output->addGroup(VIIRS_SDR_RADIOMETRIC_PARAMETERS);
2149  lut_grp.putAtt("file_name", fileName);
2150 
2151  var = lut_grp.addVar("Telec_Therm_Indexes", ncInt, num_telec_therm_dim_);
2152  var.putVar(lut->Telec_Therm_Indexes);
2153  var = lut_grp.addVar("Telec_Therm_Weights", ncFloat, num_telec_therm_dim_);
2154  var.putVar(lut->Telec_Therm_Weights);
2155 
2156  var = lut_grp.addVar("Tsh_Indexes", ncInt, num_therm_weights_dim_);
2157  var.putVar(lut->Tsh_Indexes);
2158  var = lut_grp.addVar("Tsh_Weights", ncFloat, num_therm_weights_dim_);
2159  var.putVar(lut->Tsh_Weights);
2160 
2161  var = lut_grp.addVar("Ttele_Indexes", ncInt, num_therm_weights_dim_);
2162  var.putVar(lut->Ttele_Indexes);
2163  var = lut_grp.addVar("Ttele_Weights", ncFloat, num_therm_weights_dim_);
2164  var.putVar(lut->Ttele_Weights);
2165 
2166  var = lut_grp.addVar("Ttele_Offset", ncFloat, scalar_dim_);
2167  var.putVar(&lut->Ttele_Offset);
2168 
2169  var = lut_grp.addVar("Trta_Indexes", ncInt, num_therm_weights_dim_);
2170  var.putVar(lut->Trta_Indexes);
2171  var = lut_grp.addVar("Trta_Weights", ncFloat, num_therm_weights_dim_);
2172  var.putVar(lut->Trta_Weights);
2173 
2174  var = lut_grp.addVar("Trta_Offset", ncFloat, scalar_dim_);
2175  var.putVar(&lut->Trta_Offset);
2176 
2177  var = lut_grp.addVar("Tcav_Indexes", ncInt, num_therm_weights_dim_);
2178  var.putVar(lut->Tcav_Indexes);
2179  var = lut_grp.addVar("Tcav_Weights", ncFloat, num_therm_weights_dim_);
2180  var.putVar(lut->Tcav_Weights);
2181 
2182  var = lut_grp.addVar("Tmir_Indexes", ncInt, num_therm_weights_dim_);
2183  var.putVar(lut->Tmir_Indexes);
2184  var = lut_grp.addVar("Tmir_Weights", ncFloat, num_therm_weights_dim_);
2185  var.putVar(lut->Tmir_Weights);
2186 
2187  var = lut_grp.addVar("Tfpsm_Indexes", ncInt, num_therm_weights_dim_);
2188  var.putVar(lut->Tfpsm_Indexes);
2189  var = lut_grp.addVar("Tfpsm_Weights", ncFloat, num_therm_weights_dim_);
2190  var.putVar(lut->Tfpsm_Weights);
2191 
2192  var = lut_grp.addVar("Tfplw_Indexes", ncInt, num_therm_weights_dim_);
2193  var.putVar(lut->Tfplw_Indexes);
2194  var = lut_grp.addVar("Tfplw_Weights", ncFloat, num_therm_weights_dim_);
2195  var.putVar(lut->Tfplw_Weights);
2196 
2197  var = lut_grp.addVar("Tomm_Thermister_Indexes", ncInt, num_tomm_therm_dim_);
2198  var.putVar(lut->Tomm_Thermister_Indexes);
2199  var = lut_grp.addVar("Tomm_Thermister_Weights", ncFloat,
2201  var.putVar(lut->Tomm_Thermister_Weights);
2202 
2203  var = lut_grp.addVar("Ttel_Tsh_Tcav_Weights", ncFloat, num_ttel_therm_dim_);
2204  var.putVar(lut->Ttel_Tsh_Tcav_Weights);
2205 
2206  var = lut_grp.addVar("Tmax", ncFloat, scalar_dim_);
2207  var.putVar(&lut->Tmax);
2208  var = lut_grp.addVar("Tmin", ncFloat, scalar_dim_);
2209  var.putVar(&lut->Tmin);
2210  var = lut_grp.addVar("Tomm_for_Tfpsm_Switch", ncInt, scalar_dim_);
2211  var.putVar(&lut->Tomm_for_Tfpsm_Switch);
2212  var = lut_grp.addVar("Tomm_for_Tfplw_Switch", ncInt, scalar_dim_);
2213  var.putVar(&lut->Tomm_for_Tfplw_Switch);
2214 
2215  var = lut_grp.addVar("bbNominalTemp_Tolerances", ncFloat,
2217  var.putVar(lut->bbNominalTemp_Tolerances);
2218 
2219  var = lut_grp.addVar("lwirNominalTolerance", ncFloat, scalar_dim_);
2220  var.putVar(&lut->lwirNominalTolerance);
2221 
2222  return VCST_SUCCESS;
2223 }
2224 
2225 int VcstLutNetCDF4::write_SDR_QA_LUT(NcFile* nc_output,
2226  proSdrViirsCalQALUT* lut, std::string fileName) {
2227  NcGroup lut_grp;
2228  NcVar var;
2229 
2230  lut_grp = nc_output->addGroup(VIIRS_SDR_QA_LUT);
2231  lut_grp.putAtt("file_name", fileName);
2232 
2233  vector < NcDim > quality_flag_dims;
2234  quality_flag_dims.push_back(num_viirs_detectors_dim_);
2235  quality_flag_dims.push_back(num_qual_flag_values_dim_);
2236 
2237  vector < NcDim > moon_dims;
2238  moon_dims.push_back(num_viirs_bands_dim_);
2239  moon_dims.push_back(num_moon_offset_dim_);
2240 
2241  var = lut_grp.addVar("Detector_Quality_Flag_Values", ncByte,
2242  quality_flag_dims);
2243  var.putVar(lut->Detector_Quality_Flag_Values);
2244 
2245  var = lut_grp.addVar("moon_offset_limits", ncFloat, moon_dims);
2246  var.putVar(lut->moon_offset_limits);
2247 
2248  var = lut_grp.addVar("saa_threshold", ncFloat, scalar_dim_);
2249  var.putVar(&lut->saa_threshold);
2250 
2251  return VCST_SUCCESS;
2252 }
2253 
2255  proSdrViirsCalEmissiveLUT* lut, std::string fileName) {
2256  NcGroup lut_grp;
2257  NcVar var;
2258 
2259  lut_grp = nc_output->addGroup(VIIRS_SDR_EMISSIVE_LUT);
2260  lut_grp.putAtt("file_name", fileName);
2261 
2262  var = lut_grp.addVar("SV_DN_first_frame_to_use", ncShort, scalar_dim_);
2263  var.putVar(&lut->SV_DN_first_frame_to_use);
2264 
2265  var = lut_grp.addVar("SV_DN_number_of_frames_to_use", ncShort, scalar_dim_);
2266  var.putVar(&lut->SV_DN_number_of_frames_to_use);
2267 
2268  var = lut_grp.addVar("SV_DN_moon_include_frames", ncShort, scalar_dim_);
2269  var.putVar(&lut->SV_DN_moon_include_frames);
2270 
2271  var = lut_grp.addVar("BB_DN_first_frame_to_use", ncShort, scalar_dim_);
2272  var.putVar(&lut->BB_DN_first_frame_to_use);
2273 
2274  var = lut_grp.addVar("BB_DN_number_of_frames_to_use", ncShort, scalar_dim_);
2275  var.putVar(&lut->BB_DN_number_of_frames_to_use);
2276 
2277  var = lut_grp.addVar("T_mir_function_flag", ncInt, num_tm_therm_dim_);
2278  var.putVar(lut->T_mir_function_flag);
2279 
2280  var = lut_grp.addVar("t_mir_default", ncFloat, scalar_dim_);
2281  var.putVar(&lut->t_mir_default);
2282 
2283  var = lut_grp.addVar("BB_Weight", ncFloat, num_bb_therm_dim_);
2284  var.putVar(lut->BB_Weight);
2285 
2286  return VCST_SUCCESS;
2287 }
2288 
2290  proSdrViirsCalReflectiveLUT* lut, std::string fileName) {
2291  NcGroup lut_grp;
2292  NcVar var;
2293 
2294  lut_grp = nc_output->addGroup(VIIRS_SDR_REFLECTIVE_LUT);
2295  lut_grp.putAtt("file_name", fileName);
2296 
2297  var = lut_grp.addVar("DN_obc_avg_first_frame", ncShort, scalar_dim_);
2298  var.putVar(&lut->DN_obc_avg_first_frame);
2299 
2300  var = lut_grp.addVar("DN_obc_avg_num_frames", ncShort, scalar_dim_);
2301  var.putVar(&lut->DN_obc_avg_num_frames);
2302 
2303  var = lut_grp.addVar("RSB_SV_DN_moon_include_frames", ncShort, scalar_dim_);
2304  var.putVar(&lut->RSB_SV_DN_moon_include_frames);
2305 
2306  return VCST_SUCCESS;
2307 }
2308 
2310  proSdrViirsCalRVSLUT* lut, std::string fileName) {
2311  NcGroup lut_grp;
2312  NcVar var;
2313 
2314  lut_grp = nc_output->addGroup(VIIRS_SDR_RVS_LUT);
2315  lut_grp.putAtt("file_name", fileName);
2316 
2317  vector < NcDim > img_dims;
2318  img_dims.push_back(num_375m_bands_dim_);
2319  img_dims.push_back(num_375m_det_dim_);
2320  img_dims.push_back(num_375m_frms_dim_);
2321  img_dims.push_back(num_mirror_sides_dim_);
2322 
2323  vector < NcDim > mod_sg_dims;
2324  mod_sg_dims.push_back(num_750m_sg_bands_dim_);
2325  mod_sg_dims.push_back(num_750m_det_dim_);
2326  mod_sg_dims.push_back(num_sg_ev_frames_dim_);
2327  mod_sg_dims.push_back(num_mirror_sides_dim_);
2328 
2329  vector < NcDim > mod_dg_dims;
2330  mod_dg_dims.push_back(num_750m_dg_bands_dim_);
2331  mod_dg_dims.push_back(num_750m_det_dim_);
2332  mod_dg_dims.push_back(num_dg_ev_frames_dim_);
2333  mod_dg_dims.push_back(num_mirror_sides_dim_);
2334 
2335  vector < NcDim > img_sv_dims;
2336  img_sv_dims.push_back(num_375m_bands_dim_);
2337  img_sv_dims.push_back(num_375m_det_dim_);
2338  img_sv_dims.push_back(num_mirror_sides_dim_);
2339 
2340  vector < NcDim > mod_sg_sv_dims;
2341  mod_sg_sv_dims.push_back(num_750m_sg_bands_dim_);
2342  mod_sg_sv_dims.push_back(num_750m_det_dim_);
2343  mod_sg_sv_dims.push_back(num_mirror_sides_dim_);
2344 
2345  vector < NcDim > mod_dg_sv_dims;
2346  mod_dg_sv_dims.push_back(num_750m_dg_bands_dim_);
2347  mod_dg_sv_dims.push_back(num_750m_det_dim_);
2348  mod_dg_sv_dims.push_back(num_mirror_sides_dim_);
2349 
2350  var = lut_grp.addVar("RVS_375m", ncFloat, img_dims);
2351  var.putVar(lut->RVS_375m);
2352 
2353  var = lut_grp.addVar("RVS_750m_SG", ncFloat, mod_sg_dims);
2354  var.putVar(lut->RVS_750m_SG);
2355 
2356  var = lut_grp.addVar("RVS_750m_DG", ncFloat, mod_dg_dims);
2357  var.putVar(lut->RVS_750m_DG);
2358 
2359  var = lut_grp.addVar("RVS_375m_SV", ncFloat, img_sv_dims);
2360  var.putVar(lut->RVS_375m_SV);
2361 
2362  var = lut_grp.addVar("RVS_750m_SV_SG", ncFloat, mod_sg_sv_dims);
2363  var.putVar(lut->RVS_750m_SV_SG);
2364 
2365  var = lut_grp.addVar("RVS_750m_SV_DG", ncFloat, mod_dg_sv_dims);
2366  var.putVar(lut->RVS_750m_SV_DG);
2367 
2368  var = lut_grp.addVar("RVS_375m_BB", ncFloat, img_sv_dims);
2369  var.putVar(lut->RVS_375m_BB);
2370 
2371  var = lut_grp.addVar("RVS_750m_BB_SG", ncFloat, mod_sg_sv_dims);
2372  var.putVar(lut->RVS_750m_BB_SG);
2373 
2374  var = lut_grp.addVar("RVS_750m_BB_DG", ncFloat, mod_dg_sv_dims);
2375  var.putVar(lut->RVS_750m_BB_DG);
2376 
2377  return VCST_SUCCESS;
2378 }
2379 
2381  proSdrViirsCalBBTempCoeffs* lut, std::string fileName) {
2382  NcGroup lut_grp;
2383  NcVar var;
2384 
2385  lut_grp = nc_output->addGroup(VIIRS_SDR_BB_TEMP_COEFFS);
2386  lut_grp.putAtt("file_name", fileName);
2387 
2388  vector < NcDim > bb_dims;
2389  bb_dims.push_back(num_bb_therm_dim_);
2390  bb_dims.push_back(num_bb_coeff_dim_);
2391 
2392  var = lut_grp.addVar("Thermistor", ncDouble, bb_dims);
2393  var.putVar(lut->thermister);
2394 
2395  return VCST_SUCCESS;
2396 }
2397 
2399  proSdrViirsCalDeltaCTempLUT* lut, std::string fileName) {
2400  NcGroup lut_grp;
2401  NcVar var;
2402 
2403  lut_grp = nc_output->addGroup(VIIRS_SDR_DELTA_C_LUT);
2404  lut_grp.putAtt("file_name", fileName);
2405 
2406  vector < NcDim > array_dims;
2407  array_dims.push_back(num_electronics_sides_dim_);
2408  array_dims.push_back(num_viirs_bands_dim_);
2409  array_dims.push_back(max_num_detectors_dim_);
2410  array_dims.push_back(num_dg_gain_states_dim_);
2411  array_dims.push_back(num_mirror_sides_dim_);
2412  array_dims.push_back(num_c_coeffs_dim_);
2413  array_dims.push_back(num_thermistor_dim_);
2414 
2415  vector < NcDim > tele_dims;
2416  tele_dims.push_back(num_electronics_sides_dim_);
2417  tele_dims.push_back(num_tele_levels_dim_);
2418 
2419  vector < NcDim > tdet_dims;
2420  tdet_dims.push_back(num_electronics_sides_dim_);
2421  tdet_dims.push_back(num_focal_planes_dim_);
2422  tdet_dims.push_back(num_tdet_levels_dim_);
2423 
2424  var = lut_grp.addVar("DeltaC", ncDouble, array_dims);
2425  var.putVar(lut->DeltaC);
2426 
2427  var = lut_grp.addVar("Tele", ncDouble, tele_dims);
2428  var.putVar(lut->Tele);
2429 
2430  var = lut_grp.addVar("Tdet", ncDouble, tdet_dims);
2431  var.putVar(lut->Tdet);
2432 
2433  return VCST_SUCCESS;
2434 }
2435 
2438  NcGroup lut_grp;
2439  NcVar var;
2440 
2441  lut_grp = nc_output->addGroup(VIIRS_SDR_COEFF_A_LUT);
2442  lut_grp.putAtt("file_name", fileName);
2443 
2444  vector < NcDim > array_dims;
2445  array_dims.push_back(num_electronics_sides_dim_);
2446  array_dims.push_back(num_viirs_bands_dim_);
2447  array_dims.push_back(max_num_detectors_dim_);
2448  array_dims.push_back(num_dg_gain_states_dim_);
2449  array_dims.push_back(num_mirror_sides_dim_);
2450  array_dims.push_back(num_tdet_levels_dim_);
2451  array_dims.push_back(four_values_dim_);
2452 
2453  var = lut_grp.addVar("data", ncDouble, array_dims);
2454  var.putVar(lut->data);
2455 
2456  return VCST_SUCCESS;
2457 }
2458 
2461  NcGroup lut_grp;
2462  NcVar var;
2463 
2464  lut_grp = nc_output->addGroup(VIIRS_SDR_COEFF_B_LUT);
2465  lut_grp.putAtt("file_name", fileName);
2466 
2467  vector < NcDim > array_dims;
2468  array_dims.push_back(num_electronics_sides_dim_);
2469  array_dims.push_back(num_viirs_bands_dim_);
2470  array_dims.push_back(max_num_detectors_dim_);
2471  array_dims.push_back(num_mirror_sides_dim_);
2472  array_dims.push_back(num_tele_levels_dim_);
2473  array_dims.push_back(four_values_dim_);
2474 
2475  var = lut_grp.addVar("data", ncDouble, array_dims);
2476  var.putVar(lut->data);
2477 
2478  return VCST_SUCCESS;
2479 }
2480 
2483  NcGroup lut_grp;
2484  NcVar var;
2485 
2486  lut_grp = nc_output->addGroup(VIIRS_SDR_RELATIVE_SPECTRAL_RESPONSE_LUT);
2487  lut_grp.putAtt("file_name", fileName);
2488 
2489  vector < NcDim > array_dims;
2490  array_dims.push_back(num_refl_dnb_bands_dim_);
2491  array_dims.push_back(max_rsr_dim_);
2492 
2493  var = lut_grp.addVar("wavelength", ncDouble, array_dims);
2494  var.putVar(lut->wavelength);
2495 
2496  var = lut_grp.addVar("rsr", ncDouble, array_dims);
2497  var.putVar(lut->rsr);
2498 
2499  var = lut_grp.addVar("numRsr", ncDouble, num_refl_dnb_bands_dim_);
2500  var.putVar(lut->numRsr);
2501 
2502  return VCST_SUCCESS;
2503 }
2504 
2507  std::string fileName) {
2508  NcGroup lut_grp;
2509  NcVar var;
2510 
2511  lut_grp = nc_output->addGroup(VIIRS_SDR_SOLAR_SPECTRAL_IRAD_LUT);
2512  lut_grp.putAtt("file_name", fileName);
2513 
2514  vector < NcDim > array_dims;
2515  array_dims.push_back(num_refl_dnb_bands_dim_);
2516 
2517  compute_solar_irradiance(rsrLUT);
2518 
2519  var = lut_grp.addVar("solar_spectral_irad", ncDouble, array_dims);
2520  var.putVar(solar_irad_);
2521 
2522  return VCST_SUCCESS;
2523 }
2524 
2526  GEO_param_struct* lut, std::string str_geo_params_name,
2527  std::string fileName) {
2528  NcGroup lut_grp;
2529 
2530  lut_grp = nc_output->addGroup(str_geo_params_name);
2531  lut_grp.putAtt("file_name", fileName);
2532 
2533  vector < NcDim > det_pos_dims;
2534  det_pos_dims.push_back(max_band_num_plus_one_dim_);
2535  det_pos_dims.push_back(num_mirror_sides_dim_);
2536 
2537  vector < NcDim > dnb_agg_dims;
2538  dnb_agg_dims.push_back(num_dnb_aggzone_dim_);
2539  dnb_agg_dims.push_back(num_mirror_sides_dim_);
2540 
2541  vector < NcDim > dnb_aggzone_dims;
2542  dnb_aggzone_dims.push_back(dnb_aggzone_bounds_dim_);
2543  dnb_aggzone_dims.push_back(dnb_aggzone_bound_cols_dim_);
2544 
2545  vector < NcDim > matrix_dims;
2546  matrix_dims.push_back(matrix_rows_dim_);
2547  matrix_dims.push_back(matrix_cols_dim_);
2548 
2549  vector < NcDim > thermistor_id_dims;
2550  thermistor_id_dims.push_back(max_thermistor_id_dim_);
2551  thermistor_id_dims.push_back(num_thermistors_dim_);
2552 
2553  vector < NcDim > thermistor_coef_dims;
2554  thermistor_coef_dims.push_back(num_thermistors_dim_);
2555  thermistor_coef_dims.push_back(num_thermistor_coeffs_dim_);
2556 
2557  vector < NcDim > poly_coef_dims;
2558  poly_coef_dims.push_back(num_electronics_sides_dim_);
2559  poly_coef_dims.push_back(max_poly_degree_plus_one_dim_);
2560 
2561  NcGroup sub_grp;
2562  NcVar var;
2563 
2564  var = lut_grp.addVar("revision", ncUbyte, revision_char_dim_);
2565  var.putVar(lut->revision);
2566 
2567  // focal_plane_geometry_struct geometry_params;
2568 
2569  sub_grp = lut_grp.addGroup("focal_plane_geometry");
2570 
2571  var = sub_grp.addVar("band_number", ncInt, scalar_dim_);
2572  var.putVar(&lut->geometry_params.band_number);
2573 
2574  var = sub_grp.addVar("latch_to_center", ncDouble, scalar_dim_);
2575  var.putVar(&lut->geometry_params.latch_to_center);
2576 
2577  var = sub_grp.addVar("t_reset", ncDouble, scalar_dim_);
2578  var.putVar(&lut->geometry_params.t_reset);
2579 
2580  var = sub_grp.addVar("N_samp", ncUshort, max_band_num_plus_one_dim_);
2581  var.putVar(lut->geometry_params.N_samp);
2582 
2583  var = sub_grp.addVar("focal_length", ncDouble, max_band_num_plus_one_dim_);
2584  var.putVar(lut->geometry_params.focal_length);
2585 
2586  var = sub_grp.addVar("det_space_track", ncDouble,
2588  var.putVar(lut->geometry_params.det_space_track);
2589 
2590  var = sub_grp.addVar("det_space_scan", ncDouble,
2592  var.putVar(lut->geometry_params.det_space_scan);
2593 
2594  var = sub_grp.addVar("DNB_space_track", ncDouble, num_dnb_aggzone_dim_);
2595  var.putVar(lut->geometry_params.DNB_space_track);
2596 
2597  var = sub_grp.addVar("DNB_space_scan", ncDouble, num_dnb_aggzone_dim_);
2598  var.putVar(lut->geometry_params.DNB_space_scan);
2599 
2600  var = sub_grp.addVar("det_position", ncDouble, det_pos_dims);
2601  var.putVar(lut->geometry_params.det_position);
2602 
2603  var = sub_grp.addVar("band_position", ncDouble, max_band_num_plus_one_dim_);
2604  var.putVar(lut->geometry_params.band_position);
2605 
2606  var = sub_grp.addVar("earth_view_delay", ncDouble, scalar_dim_);
2607  var.putVar(&lut->geometry_params.earth_view_delay);
2608 
2609  var = sub_grp.addVar("detector_sampling_rate", ncDouble, scalar_dim_);
2610  var.putVar(&lut->geometry_params.detector_sampling_rate);
2611 
2612  var = sub_grp.addVar("scan_length", ncDouble, scalar_dim_);
2613  var.putVar(&lut->geometry_params.scan_length);
2614 
2615  var = sub_grp.addVar("agg_zone_bounds", ncInt, num_aggzones_dim_);
2616  var.putVar(lut->geometry_params.agg_zone_bounds);
2617 
2618  var = sub_grp.addVar("DNB_aggregation", ncInt, dnb_agg_dims);
2619  var.putVar(lut->geometry_params.DNB_aggregation);
2620 
2621  var = sub_grp.addVar("DNB_ag_zone_bounds", ncInt, dnb_aggzone_dims);
2622  var.putVar(lut->geometry_params.DNB_ag_zone_bounds);
2623 
2624  var = sub_grp.addVar("scan_ang_coef_tel", ncDouble, scalar_dim_);
2625  var.putVar(&lut->geometry_params.scan_ang_coef_tel);
2626 
2627  var = sub_grp.addVar("scan_ang_coef_mirr", ncDouble, scalar_dim_);
2628  var.putVar(&lut->geometry_params.scan_ang_coef_mirr);
2629 
2630  var = sub_grp.addVar("scan_ang_offsets", ncDouble, num_mirror_sides_dim_);
2631  var.putVar(lut->geometry_params.scan_ang_offsets);
2632 
2633  // mirror_preparation_struct
2634 
2635  sub_grp = lut_grp.addGroup("mirror_preparation");
2636 
2637  var = sub_grp.addVar("enc_scale", ncDouble, scalar_dim_);
2638  var.putVar(&lut->mirror_prep_params.enc_scale);
2639 
2640  var = sub_grp.addVar("mirr_abs_limit", ncDouble, max_limit_check_dim_);
2641  var.putVar(lut->mirror_prep_params.mirr_abs_limit);
2642 
2643  var = sub_grp.addVar("mirr_del_limit", ncDouble, scalar_dim_);
2644  var.putVar(&lut->mirror_prep_params.mirr_del_limit);
2645 
2646  var = sub_grp.addVar("tel_abs_limit", ncDouble, max_limit_check_dim_);
2647  var.putVar(lut->mirror_prep_params.tel_abs_limit);
2648 
2649  var = sub_grp.addVar("tel_del_limit", ncDouble, scalar_dim_);
2650  var.putVar(&lut->mirror_prep_params.tel_del_limit);
2651 
2652  var = sub_grp.addVar("sample_impulse_mirr", ncInt, scalar_dim_);
2653  var.putVar(&lut->mirror_prep_params.sample_impulse_mirr);
2654 
2655  var = sub_grp.addVar("sample_impulse_tel", ncInt, scalar_dim_);
2656  var.putVar(&lut->mirror_prep_params.sample_impulse_tel);
2657 
2658  var = sub_grp.addVar("A_bit_adj", ncInt, max_limit_check_dim_);
2659  var.putVar(lut->mirror_prep_params.A_bit_adj);
2660 
2661  var = sub_grp.addVar("B_HAM_adj", ncInt, num_mirror_sides_dim_);
2662  var.putVar(lut->mirror_prep_params.B_HAM_adj);
2663 
2664  var = sub_grp.addVar("t_encoder", ncDouble, scalar_dim_);
2665  var.putVar(&lut->mirror_prep_params.t_encoder);
2666 
2667  // mirror_model_struct
2668 
2669  sub_grp = lut_grp.addGroup("mirror_model");
2670 
2671  var = sub_grp.addVar("mirr_side1_range", ncDouble, num_mirror_sides_dim_);
2672  var.putVar(lut->mirror_model.mirr_side1_range);
2673 
2674  var = sub_grp.addVar("alpha", ncDouble, scalar_dim_);
2675  var.putVar(&lut->mirror_model.alpha);
2676 
2677  var = sub_grp.addVar("beta", ncDouble, scalar_dim_);
2678  var.putVar(&lut->mirror_model.beta);
2679 
2680  var = sub_grp.addVar("gammaa", ncDouble, scalar_dim_);
2681  var.putVar(&lut->mirror_model.gammaa);
2682 
2683  // internal_coord_trans_struct
2684 
2685  sub_grp = lut_grp.addGroup("internal_coord_transforms");
2686 
2687  var = sub_grp.addVar("T_inst2sc", ncDouble, matrix_dims);
2688  var.putVar(lut->coord_trans.T_inst2sc);
2689 
2690  var = sub_grp.addVar("T_mirr2inst", ncDouble, matrix_dims);
2691  var.putVar(lut->coord_trans.T_mirr2inst);
2692 
2693  var = sub_grp.addVar("T_aft2inst", ncDouble, matrix_dims);
2694  var.putVar(lut->coord_trans.T_aft2inst);
2695 
2696  var = sub_grp.addVar("T_inst2SD", ncDouble, matrix_dims);
2697  var.putVar(lut->coord_trans.T_inst2SD);
2698 
2699  var = sub_grp.addVar("T_tel2inst", ncDouble, matrix_dims);
2700  var.putVar(lut->coord_trans.T_tel2inst);
2701 
2702  // thermistor_parameter_struct
2703 
2704  sub_grp = lut_grp.addGroup("thermistor_parameters");
2705 
2706  var = sub_grp.addVar("num_thermistor", ncInt, scalar_dim_);
2707  var.putVar(&lut->thermistor_params.num_thermistor);
2708 
2709  var = sub_grp.addVar("thermistor_id", ncUbyte, thermistor_id_dims);
2710  var.putVar(lut->thermistor_params.thermistor_id);
2711 
2712  var = sub_grp.addVar("thermistor_coeffs", ncDouble, thermistor_coef_dims);
2713  var.putVar(lut->thermistor_params.thermistor_coeffs);
2714 
2715  // other
2716 
2717  var = lut_grp.addVar("Mag", ncDouble, matrix_dims);
2718  var.putVar(lut->Mag);
2719 
2720  var = lut_grp.addVar("basis_in", ncDouble, matrix_dims);
2721  var.putVar(lut->basis_in);
2722 
2723  var = lut_grp.addVar("basis_out", ncDouble, matrix_dims);
2724  var.putVar(lut->basis_out);
2725 
2726  var = lut_grp.addVar("poly_coef_mirr", ncDouble,
2728  var.putVar(lut->poly_coef_mirr);
2729 
2730  var = lut_grp.addVar("poly_coef_tel", ncDouble, poly_coef_dims);
2731  var.putVar(lut->poly_coef_tel);
2732 
2733  var = lut_grp.addVar("tel_ref", ncDouble, scalar_dim_);
2734  var.putVar(&lut->tel_ref);
2735 
2736  var = lut_grp.addVar("min_cos_view", ncDouble, scalar_dim_);
2737  var.putVar(&lut->min_cos_view);
2738 
2739  var = lut_grp.addVar("band_type", ncInt, scalar_dim_);
2740  var.putVar(&lut->band_type);
2741 
2742  var = lut_grp.addVar("num_detectors", ncInt, scalar_dim_);
2743  var.putVar(&lut->num_detectors);
2744 
2745  var = lut_grp.addVar("poly_degree", ncInt, scalar_dim_);
2746  var.putVar(&lut->poly_degree);
2747 
2748  var = lut_grp.addVar("N_frame", ncUshort, scalar_dim_);
2749  var.putVar(&lut->N_frame);
2750 
2751  return VCST_SUCCESS;
2752 }
2753 
2756  NcGroup lut_grp;
2757  NcVar var;
2758 
2760 
2761  compress_StrayLight_LUT(lut, lut_short);
2762 
2763  lut_grp = nc_output->addGroup(VIIRS_DNB_STRAY_LIGHT_CORRECTION_LUT);
2764  lut_grp.putAtt("file_name", fileName);
2765 
2766  vector < NcDim > dnb_straylight_offset_dims;
2767  dnb_straylight_offset_dims.push_back(num_hemispheres_dim_);
2768  dnb_straylight_offset_dims.push_back(num_sza_bins_dim_);
2769  dnb_straylight_offset_dims.push_back(num_dnb_ev_frames_dim_);
2770  dnb_straylight_offset_dims.push_back(num_dnb_detectors_dim_);
2771  dnb_straylight_offset_dims.push_back(num_mirror_sides_dim_);
2772 
2773  vector < NcDim > dnb_straylight_grid_dims;
2774  dnb_straylight_grid_dims.push_back(num_hemispheres_dim_);
2775  dnb_straylight_grid_dims.push_back(num_sza_bins_dim_);
2776 
2777  var = lut_grp.addVar("MAX_RADIANCE_STRAY", ncFloat, scalar_dim_);
2778  var.putVar(&lut_short->MAX_RADIANCE_STRAY);
2779 
2780  var = lut_grp.addVar("VIIRS_DNB_SDR_STRAY_OFFSET", ncFloat,
2781  dnb_straylight_offset_dims);
2782  var.putVar(lut_short->VIIRS_DNB_SDR_STRAY_OFFSET);
2783 
2784  var = lut_grp.addVar("VIIRS_STRAY_SZA_GRID", ncFloat,
2785  dnb_straylight_grid_dims);
2786  var.putVar(lut_short->VIIRS_STRAY_SZA_GRID);
2787 
2788  delete lut_short;
2789 
2790  return VCST_SUCCESS;
2791 }
2792 
2795  NcGroup lut_grp;
2796  NcVar var;
2797 
2798  lut_grp = nc_output->addGroup(VIIRS_SDR_F_PREDICTED_LUT);
2799  lut_grp.putAtt("file_name", fileName);
2800 
2801  vector < NcDim > f_factor_dims;
2802  f_factor_dims.push_back(num_viirs_bands_dim_);
2803  f_factor_dims.push_back(max_num_detectors_dim_);
2804  f_factor_dims.push_back(max_num_gains_dim_);
2805  f_factor_dims.push_back(num_mirror_sides_dim_);
2806 
2807  var = lut_grp.addVar("Fit_type", ncByte, num_viirs_bands_dim_);
2808  var.putVar(lut->Fit_type);
2809 
2810  var = lut_grp.addVar("T_ref", ncInt64, scalar_dim_);
2811  var.putVar(&lut->T_ref);
2812 
2813  var = lut_grp.addVar("F_ref", ncDouble, f_factor_dims);
2814  var.putVar(lut->F_ref);
2815 
2816  var = lut_grp.addVar("F_param_1", ncDouble, f_factor_dims);
2817  var.putVar(lut->F_param_1);
2818 
2819  var = lut_grp.addVar("F_param_2", ncDouble, f_factor_dims);
2820  var.putVar(lut->F_param_2);
2821 
2822  return VCST_SUCCESS;
2823 }
2824 
2826  ProSdrViirsCalDnbLgsGainsLUT* lut, std::string fileName) {
2827  NcGroup lut_grp;
2828  NcVar var;
2829 
2830  lut_grp = nc_output->addGroup(VIIRS_SDR_DNB_LGS_GAINS_LUT);
2831  lut_grp.putAtt("file_name", fileName);
2832 
2833  vector < NcDim > lgs_gains_dims;
2834  lgs_gains_dims.push_back(num_dnb_agg_seq_dim_);
2835  lgs_gains_dims.push_back(num_dnb_detectors_dim_);
2836  lgs_gains_dims.push_back(num_mirror_sides_dim_);
2837 
2838  lut->Fit_type = 1;
2839  var = lut_grp.addVar("Fit_type", ncByte, scalar_dim_);
2840  var.putVar(&lut->Fit_type);
2841 
2842  var = lut_grp.addVar("T_ref", ncInt64, scalar_dim_);
2843  var.putVar(&lut->T_ref);
2844 
2845  var = lut_grp.addVar("F_ref", ncDouble, lgs_gains_dims);
2846  var.putVar(lut->F_ref);
2847 
2848  var = lut_grp.addVar("F_param_1", ncDouble, lgs_gains_dims);
2849  var.putVar(lut->F_param_1);
2850 
2851  var = lut_grp.addVar("F_param_2", ncDouble, lgs_gains_dims);
2852  var.putVar(lut->F_param_2);
2853 
2854  return VCST_SUCCESS;
2855 }
2856 
2859  NcGroup lut_grp;
2860  NcVar var;
2861 
2862  lut_grp = nc_output->addGroup(VIIRS_SDR_DNB_GAIN_RATIOS_LUT);
2863  lut_grp.putAtt("file_name", fileName);
2864 
2865  vector < NcDim > dnb_gain_ratio_dims;
2866  dnb_gain_ratio_dims.push_back(num_dnb_agg_seq_dim_);
2867  dnb_gain_ratio_dims.push_back(num_dnb_detectors_dim_);
2868  dnb_gain_ratio_dims.push_back(num_dnb_gain_ratios_dim_);
2869  dnb_gain_ratio_dims.push_back(num_dnb_gain_ratio_coeff_dim_);
2870 
2871  var = lut_grp.addVar("DnbGainRatios", ncDouble, dnb_gain_ratio_dims);
2872  var.putVar(lut->DnbGainRatios);
2873 
2874  return VCST_SUCCESS;
2875 }
2876 
2878  proSdrViirsDnbDn0Type* lut, std::string fileName) {
2879  NcGroup lut_grp;
2880  NcVar var;
2881 
2882  lut_grp = nc_output->addGroup(VIIRS_SDR_DNB_DN0_LUT);
2883  lut_grp.putAtt("file_name", fileName);
2884 
2885  vector < NcDim > dnb_dn0_dims;
2886  dnb_dn0_dims.push_back(num_dnb_ev_frames_dim_);
2887  dnb_dn0_dims.push_back(num_dnb_detectors_dim_);
2888  dnb_dn0_dims.push_back(num_dnb_gains_dim_);
2889  dnb_dn0_dims.push_back(num_mirror_sides_dim_);
2890 
2891  var = lut_grp.addVar("data", ncFloat, dnb_dn0_dims);
2892  var.putVar(lut->data);
2893 
2894  return VCST_SUCCESS;
2895 }
2896 
2897 /**************************************************************************
2898  * NAME: compress_StrayLight_LUT()
2899  *
2900  * DESCRIPTION: Compress DNB Stray Light LUT by removing linearly-interpolated values.
2901  *
2902  *************************************************************************/
2903 
2906  shortViirsCalDnbStrayLightLUT* short_lut) {
2907  memset(short_lut, 0.0, sizeof (shortViirsCalDnbStrayLightLUT));
2908 
2909  short_lut->MAX_RADIANCE_STRAY = long_lut->MAX_RADIANCE_STRAY;
2910 
2911  for (int iHem = 0; iHem < NUM_HEMISPHERES; iHem++) {
2912  for (int iSza = 0; iSza < NUM_SZA_BINS; iSza++) {
2913  short_lut->VIIRS_STRAY_SZA_GRID[iHem][iSza] =
2914  long_lut->VIIRS_STRAY_SZA_GRID[iHem][iSza];
2915 
2916  for (int iDet = 0; iDet < NUM_DETECTORS_DNB; iDet++) {
2917  for (int iMS = 0; iMS < NUM_MIRROR_SIDES; iMS++) {
2918  short_lut->VIIRS_DNB_SDR_STRAY_OFFSET[iHem][iSza][0][iDet][iMS] =
2919  long_lut->VIIRS_DNB_SDR_STRAY_OFFSET[iHem][iSza][0][iDet][iMS];
2920 
2921  for (int i = 0; i < (SHORT_DNB_FRAMES - 2); i++) {
2922  short_lut->VIIRS_DNB_SDR_STRAY_OFFSET[iHem][iSza][1 + i][iDet][iMS] =
2923  long_lut->VIIRS_DNB_SDR_STRAY_OFFSET[iHem][iSza][47
2924  + i * 32][iDet][iMS];
2925  }
2926 
2927  short_lut->VIIRS_DNB_SDR_STRAY_OFFSET[iHem][iSza][SHORT_DNB_FRAMES
2928  - 1][iDet][iMS] =
2929  long_lut->VIIRS_DNB_SDR_STRAY_OFFSET[iHem][iSza][EV_DNB_FRAMES
2930  - 1][iDet][iMS];
2931  }
2932  }
2933  }
2934  }
2935 
2936  return VCST_SUCCESS;
2937 }
2938 
2939 /**************************************************************************
2940  * NAME: write_all_xxxx()
2941  *
2942  * DESCRIPTION: Write time-dependent netCDF4 LUT.
2943  *
2944  *************************************************************************/
2945 
2947  NcFile* nc_output) {
2948  int status = VCST_SUCCESS;
2949 
2950  NcGroup lut_grp = nc_output->addGroup(VIIRS_DNB_STRAY_LIGHT_CORRECTION_LUT);
2951 
2952  vector < NcDim > dnb_straylight_grid_dims;
2953  dnb_straylight_grid_dims.push_back(num_hemispheres_dim_);
2954  dnb_straylight_grid_dims.push_back(num_sza_bins_dim_);
2955 
2956  vector < NcDim > dnb_straylight_offset_dims;
2957  dnb_straylight_offset_dims.push_back(td_luts_dim_slc_);
2958  dnb_straylight_offset_dims.push_back(num_hemispheres_dim_);
2959  dnb_straylight_offset_dims.push_back(num_sza_bins_dim_);
2960  dnb_straylight_offset_dims.push_back(num_dnb_ev_frames_dim_);
2961  dnb_straylight_offset_dims.push_back(num_dnb_detectors_dim_);
2962  dnb_straylight_offset_dims.push_back(num_mirror_sides_dim_);
2963 
2964  vector < NcDim > t_ref_dims;
2965  t_ref_dims.push_back(td_luts_dim_slc_);
2966  t_ref_dims.push_back(scalar_dim_);
2967 
2968  NcVar tref_var = lut_grp.addVar("T_ref", ncInt64, t_ref_dims);
2969  NcVar max_var = lut_grp.addVar("MAX_RADIANCE_STRAY", ncFloat, scalar_dim_);
2970  NcVar grid_var = lut_grp.addVar("VIIRS_STRAY_SZA_GRID", ncFloat,
2971  dnb_straylight_grid_dims);
2972  NcVar stray_var = lut_grp.addVar("VIIRS_DNB_SDR_STRAY_OFFSET", ncFloat,
2973  dnb_straylight_offset_dims);
2974 
2975  vector<size_t> tstartp, tcountp;
2976  tstartp.push_back(0);
2977  tstartp.push_back(0);
2978  tcountp.push_back(1);
2979  tcountp.push_back(1);
2980 
2981  vector<size_t> fstartp, fcountp;
2982  fstartp.push_back(0);
2983  fstartp.push_back(0);
2984  fstartp.push_back(0);
2985  fstartp.push_back(0);
2986  fstartp.push_back(0);
2987  fstartp.push_back(0);
2988  fcountp.push_back(1);
2989  fcountp.push_back(NUM_HEMISPHERES);
2990  fcountp.push_back(NUM_SZA_BINS);
2991  fcountp.push_back(SHORT_DNB_FRAMES);
2992  fcountp.push_back(NUM_DETECTORS_DNB);
2993  fcountp.push_back(NUM_MIRROR_SIDES);
2994 
2995  VcstCalLutInputItem* lut_item;
2999 
3001 
3002  std::map<std::string, std::string>::iterator lut_iter;
3003  int i = 0;
3004 
3005  for (lut_iter = lut_files_.begin(); lut_iter != lut_files_.end();
3006  lut_iter++, i++) {
3007  std::string filePath = lut_iter->second;
3008  size_t pos = filePath.rfind("/");
3009  std::string fileName = filePath.substr(pos);
3010 
3011  long long iet = compute_iet_from_filename(fileName);
3012 
3013  if (iet < 0) {
3014  continue;
3015  }
3016 
3017  lut_item->setFilePath(filePath);
3018  lut_item->getData();
3019  lut =
3020  static_cast<proSdrViirsCalDnbStrayLightLUT*> (lut_item->getDataPtr());
3021 
3022  compress_StrayLight_LUT(lut, short_lut);
3023 
3024  tstartp[0] = i;
3025  fstartp[0] = i;
3026  tref_var.putVar(tstartp, tcountp, &iet);
3027  stray_var.putVar(fstartp, fcountp,
3028  short_lut->VIIRS_DNB_SDR_STRAY_OFFSET);
3029  }
3030 
3031  max_var.putVar(&short_lut->MAX_RADIANCE_STRAY);
3032  grid_var.putVar(short_lut->VIIRS_STRAY_SZA_GRID);
3033 
3034  delete short_lut;
3035  delete lut_item;
3036 
3037  return VCST_SUCCESS;
3038 }
3039 
3041  int status = VCST_SUCCESS;
3042 
3043  NcGroup lut_grp;
3044  lut_grp = nc_output->addGroup(VIIRS_SDR_F_PREDICTED_LUT);
3045 
3046  vector < NcDim > f_factor_dims;
3047  f_factor_dims.push_back(td_luts_dim_rsbf_);
3048  f_factor_dims.push_back(num_viirs_bands_dim_);
3049  f_factor_dims.push_back(max_num_detectors_dim_);
3050  f_factor_dims.push_back(max_num_gains_dim_);
3051  f_factor_dims.push_back(num_mirror_sides_dim_);
3052 
3053  vector < NcDim > t_ref_dims;
3054  t_ref_dims.push_back(td_luts_dim_rsbf_);
3055  t_ref_dims.push_back(scalar_dim_);
3056 
3057  NcVar tref_var = lut_grp.addVar("T_ref", ncInt64, t_ref_dims);
3058  NcVar fref_var = lut_grp.addVar("F_ref", ncDouble, f_factor_dims);
3059  NcVar fparam1_var = lut_grp.addVar("F_param_1", ncDouble, f_factor_dims);
3060  NcVar fparam2_var = lut_grp.addVar("F_param_2", ncDouble, f_factor_dims);
3061 
3062  vector<size_t> tstartp, tcountp;
3063  tstartp.push_back(0);
3064  tstartp.push_back(0);
3065  tcountp.push_back(1);
3066  tcountp.push_back(1);
3067 
3068  vector<size_t> fstartp, fcountp;
3069  fstartp.push_back(0);
3070  fstartp.push_back(0);
3071  fstartp.push_back(0);
3072  fstartp.push_back(0);
3073  fstartp.push_back(0);
3074  fcountp.push_back(1);
3075  fcountp.push_back(NUM_VIIRS_BAND);
3076  fcountp.push_back(MAX_NUM_DETECTOR);
3077  fcountp.push_back(MAX_NUM_GAIN);
3078  fcountp.push_back(NUM_MIRROR_SIDES);
3079 
3080  VcstCalLutInputItem* lut_item;
3084 
3085  std::map<std::string, std::string>::iterator lut_iter;
3086  int i = 0;
3087 
3088  for (lut_iter = lut_files_.begin(); lut_iter != lut_files_.end();
3089  lut_iter++, i++) {
3090  lut_item->setFilePath(lut_iter->second);
3091  lut_item->getData();
3092  lut =
3093  static_cast<proSdrViirsCalFPredictedTableLUT*> (lut_item->getDataPtr());
3094 
3095  tstartp[0] = i;
3096  fstartp[0] = i;
3097  tref_var.putVar(tstartp, tcountp, &lut->T_ref);
3098  fref_var.putVar(fstartp, fcountp, lut->F_ref);
3099  fparam1_var.putVar(fstartp, fcountp, lut->F_param_1);
3100  fparam2_var.putVar(fstartp, fcountp, lut->F_param_2);
3101  }
3102 
3103  delete lut_item;
3104 
3105  return VCST_SUCCESS;
3106 }
3107 
3109  NcFile* nc_output) {
3110  int status = VCST_SUCCESS;
3111 
3112  NcGroup lut_grp;
3113  lut_grp = nc_output->addGroup(VIIRS_SDR_RELATIVE_SPECTRAL_RESPONSE_LUT);
3114 
3115  vector < NcDim > td_array_dims;
3116  td_array_dims.push_back(td_luts_dim_rsbrsr_);
3117  td_array_dims.push_back(num_refl_dnb_bands_dim_);
3118  td_array_dims.push_back(max_rsr_dim_);
3119 
3120  vector < NcDim > array_dims;
3121  array_dims.push_back(num_refl_dnb_bands_dim_);
3122  array_dims.push_back(max_rsr_dim_);
3123 
3124  vector < NcDim > t_ref_dims;
3125  t_ref_dims.push_back(td_luts_dim_rsbrsr_);
3126  t_ref_dims.push_back(scalar_dim_);
3127 
3128  NcVar tref_var = lut_grp.addVar("T_ref", ncInt64, t_ref_dims);
3129  NcVar rsr_var = lut_grp.addVar("rsr", ncDouble, td_array_dims);
3130  NcVar wl_var = lut_grp.addVar("wavelength", ncDouble, array_dims);
3131  NcVar numrsr_var = lut_grp.addVar("numRsr", ncInt, num_refl_dnb_bands_dim_);
3132 
3133  vector<size_t> tstartp, tcountp;
3134  tstartp.push_back(0);
3135  tstartp.push_back(0);
3136  tcountp.push_back(1);
3137  tcountp.push_back(1);
3138 
3139  vector<size_t> fstartp, fcountp;
3140  fstartp.push_back(0);
3141  fstartp.push_back(0);
3142  fstartp.push_back(0);
3143  fcountp.push_back(1);
3144  fcountp.push_back(NUM_REFL_PLUS_DNB_BANDS);
3145  fcountp.push_back(MAX_RSR_VALUES);
3146 
3147  VcstCalLutInputItem* lut_item;
3151 
3152  std::map<std::string, std::string>::iterator lut_iter;
3153  int i = 0;
3154 
3155  for (lut_iter = lut_files_.begin(); lut_iter != lut_files_.end();
3156  lut_iter++, i++) {
3157  std::string filePath = lut_iter->second;
3158  size_t pos = filePath.rfind("/");
3159  std::string fileName = filePath.substr(pos);
3160 
3161  long long iet = compute_iet_from_filename(fileName);
3162 
3163  if (iet < 0) {
3164  continue;
3165  }
3166 
3167  lut_item->setFilePath(lut_iter->second);
3168  lut_item->getData();
3169  lut =
3170  static_cast<ProSdrViirsCalRelativeSpectralResponseLUT*> (lut_item->getDataPtr());
3171 
3172  tstartp[0] = i;
3173  fstartp[0] = i;
3174  tref_var.putVar(tstartp, tcountp, &iet);
3175  rsr_var.putVar(fstartp, fcountp, lut->rsr);
3176  }
3177 
3178  wl_var.putVar(lut->wavelength);
3179  numrsr_var.putVar(lut->numRsr);
3180 
3181  delete lut_item;
3182 
3183  return VCST_SUCCESS;
3184 }
3185 
3187  int status = VCST_SUCCESS;
3188 
3189  NcGroup lut_grp;
3190  lut_grp = nc_output->addGroup(VIIRS_SDR_SOLAR_SPECTRAL_IRAD_LUT);
3191 
3192  vector < NcDim > td_array_dims;
3193  td_array_dims.push_back(td_luts_dim_rsbrsr_);
3194  td_array_dims.push_back(num_refl_dnb_bands_dim_);
3195 
3196  vector < NcDim > t_ref_dims;
3197  t_ref_dims.push_back(td_luts_dim_rsbrsr_);
3198  t_ref_dims.push_back(scalar_dim_);
3199 
3200  NcVar tref_var = lut_grp.addVar("T_ref", ncInt64, t_ref_dims);
3201  NcVar sol_spectral_irad_var = lut_grp.addVar("solar_spectral_irad",
3202  ncDouble, td_array_dims);
3203 
3204  vector<size_t> tstartp, tcountp;
3205  tstartp.push_back(0);
3206  tstartp.push_back(0);
3207  tcountp.push_back(1);
3208  tcountp.push_back(1);
3209 
3210  vector<size_t> fstartp, fcountp;
3211  fstartp.push_back(0);
3212  fstartp.push_back(0);
3213  fcountp.push_back(1);
3214  fcountp.push_back(NUM_REFL_PLUS_DNB_BANDS);
3215 
3216  VcstCalLutInputItem* lut_item;
3220 
3221  std::map<std::string, std::string>::iterator lut_iter;
3222  int i = 0;
3223 
3224  for (lut_iter = lut_files_.begin(); lut_iter != lut_files_.end();
3225  lut_iter++, i++) {
3226  std::string filePath = lut_iter->second;
3227  size_t pos = filePath.rfind("/");
3228  std::string fileName = filePath.substr(pos);
3229 
3230  long long iet = compute_iet_from_filename(fileName);
3231 
3232  if (iet < 0) {
3233  continue;
3234  }
3235 
3236  lut_item->setFilePath(lut_iter->second);
3237  lut_item->getData();
3238  rsrLUT =
3239  static_cast<ProSdrViirsCalRelativeSpectralResponseLUT*> (lut_item->getDataPtr());
3240 
3241  compute_solar_irradiance(rsrLUT);
3242 
3243  tstartp[0] = i;
3244  fstartp[0] = i;
3245  tref_var.putVar(tstartp, tcountp, &iet);
3246  sol_spectral_irad_var.putVar(fstartp, fcountp, solar_irad_);
3247  }
3248 
3249  delete lut_item;
3250 
3251  return VCST_SUCCESS;
3252 }
3253 
3255  int status = VCST_SUCCESS;
3256 
3257  NcGroup lut_grp;
3258  lut_grp = nc_output->addGroup(VIIRS_SDR_DNB_LGS_GAINS_LUT);
3259 
3260  vector < NcDim > lgs_gains_dims;
3261  lgs_gains_dims.push_back(td_luts_dim_dnblgs_);
3262  lgs_gains_dims.push_back(num_dnb_agg_seq_dim_);
3263  lgs_gains_dims.push_back(num_dnb_detectors_dim_);
3264  lgs_gains_dims.push_back(num_mirror_sides_dim_);
3265 
3266  vector < NcDim > t_ref_dims;
3267  t_ref_dims.push_back(td_luts_dim_dnblgs_);
3268  t_ref_dims.push_back(scalar_dim_);
3269 
3270  NcVar tref_var = lut_grp.addVar("T_ref", ncInt64, t_ref_dims);
3271  NcVar fref_var = lut_grp.addVar("F_ref", ncDouble, lgs_gains_dims);
3272  NcVar fparam1_var = lut_grp.addVar("F_param_1", ncDouble, lgs_gains_dims);
3273  NcVar fparam2_var = lut_grp.addVar("F_param_2", ncDouble, lgs_gains_dims);
3274 
3275  vector<size_t> tstartp, tcountp;
3276  tstartp.push_back(0);
3277  tstartp.push_back(0);
3278  tcountp.push_back(1);
3279  tcountp.push_back(1);
3280 
3281  vector<size_t> fstartp, fcountp;
3282  fstartp.push_back(0);
3283  fstartp.push_back(0);
3284  fstartp.push_back(0);
3285  fstartp.push_back(0);
3286  fcountp.push_back(1);
3287  fcountp.push_back(NUM_AGG_SEQ);
3288  fcountp.push_back(NUM_DETECTORS_DNB);
3289  fcountp.push_back(NUM_MIRROR_SIDES);
3290 
3291  VcstCalLutInputItem* lut_item;
3293  sizeof (ProSdrViirsCalDnbLgsGainsLUT));
3295 
3296  std::map<std::string, std::string>::iterator lut_iter;
3297  int i = 0;
3298 
3299  for (lut_iter = lut_files_.begin(); lut_iter != lut_files_.end();
3300  lut_iter++, i++) {
3301  lut_item->setFilePath(lut_iter->second);
3302  lut_item->getData();
3303  lut =
3304  static_cast<ProSdrViirsCalDnbLgsGainsLUT*> (lut_item->getDataPtr());
3305 
3306  tstartp[0] = i;
3307  fstartp[0] = i;
3308  tref_var.putVar(tstartp, tcountp, &lut->T_ref);
3309  fref_var.putVar(fstartp, fcountp, lut->F_ref);
3310  fparam1_var.putVar(fstartp, fcountp, lut->F_param_1);
3311  fparam2_var.putVar(fstartp, fcountp, lut->F_param_2);
3312  }
3313 
3314  delete lut_item;
3315 
3316  return VCST_SUCCESS;
3317 }
3318 
3320  int status = VCST_SUCCESS;
3321 
3322  NcGroup lut_grp;
3323  lut_grp = nc_output->addGroup(VIIRS_SDR_DNB_GAIN_RATIOS_LUT);
3324 
3325  vector < NcDim > dnb_gain_ratio_dims;
3326  dnb_gain_ratio_dims.push_back(td_luts_dim_dnbgr_);
3327  dnb_gain_ratio_dims.push_back(num_dnb_agg_seq_dim_);
3328  dnb_gain_ratio_dims.push_back(num_dnb_detectors_dim_);
3329  dnb_gain_ratio_dims.push_back(num_dnb_gain_ratios_dim_);
3330  dnb_gain_ratio_dims.push_back(num_dnb_gain_ratio_coeff_dim_);
3331 
3332  vector < NcDim > t_ref_dims;
3333  t_ref_dims.push_back(td_luts_dim_dnbgr_);
3334  t_ref_dims.push_back(scalar_dim_);
3335 
3336  NcVar tref_var = lut_grp.addVar("T_ref", ncInt64, t_ref_dims);
3337  NcVar dgr_var = lut_grp.addVar("DnbGainRatios", ncDouble,
3338  dnb_gain_ratio_dims);
3339 
3340  vector<size_t> tstartp, tcountp;
3341  tstartp.push_back(0);
3342  tstartp.push_back(0);
3343  tcountp.push_back(1);
3344  tcountp.push_back(1);
3345 
3346  vector<size_t> fstartp, fcountp;
3347  fstartp.push_back(0);
3348  fstartp.push_back(0);
3349  fstartp.push_back(0);
3350  fstartp.push_back(0);
3351  fstartp.push_back(0);
3352  fcountp.push_back(1);
3353  fcountp.push_back(NUM_AGG_SEQ);
3354  fcountp.push_back(NUM_DETECTORS_DNB);
3355  fcountp.push_back(NUM_GAIN_RATIOS);
3356  fcountp.push_back(NUM_DNB_GAIN_RATIO_COEFFS);
3357 
3358  VcstCalLutInputItem* lut_item;
3362 
3363  std::map<std::string, std::string>::iterator lut_iter;
3364  int i = 0;
3365 
3366  for (lut_iter = lut_files_.begin(); lut_iter != lut_files_.end();
3367  lut_iter++, i++) {
3368  std::string filePath = lut_iter->second;
3369  size_t pos = filePath.rfind("/");
3370  std::string fileName = filePath.substr(pos);
3371 
3372  long long iet = compute_iet_from_filename(fileName);
3373 
3374  if (iet < 0) {
3375  continue;
3376  }
3377 
3378  lut_item->setFilePath(filePath);
3379  lut_item->getData();
3380  lut =
3381  static_cast<ProSdrViirsCalDnbGainRatiosLUT*> (lut_item->getDataPtr());
3382 
3383  tstartp[0] = i;
3384  fstartp[0] = i;
3385  tref_var.putVar(tstartp, tcountp, &iet);
3386  dgr_var.putVar(fstartp, fcountp, lut->DnbGainRatios);
3387  }
3388 
3389  delete lut_item;
3390 
3391  return VCST_SUCCESS;
3392 }
3393 
3395  int status = VCST_SUCCESS;
3396 
3397  NcGroup lut_grp;
3398  lut_grp = nc_output->addGroup(VIIRS_SDR_DNB_DN0_LUT);
3399 
3400  vector < NcDim > dnb_dn0_dims;
3401  dnb_dn0_dims.push_back(td_luts_dim_dnbdn0_);
3402  dnb_dn0_dims.push_back(num_dnb_ev_frames_dim_);
3403  dnb_dn0_dims.push_back(num_dnb_detectors_dim_);
3404  dnb_dn0_dims.push_back(num_dnb_gains_dim_);
3405  dnb_dn0_dims.push_back(num_mirror_sides_dim_);
3406 
3407  vector < NcDim > t_ref_dims;
3408  t_ref_dims.push_back(td_luts_dim_dnbdn0_);
3409  t_ref_dims.push_back(scalar_dim_);
3410 
3411  NcVar tref_var = lut_grp.addVar("T_ref", ncInt64, t_ref_dims);
3412  NcVar dn0_var = lut_grp.addVar("data", ncFloat, dnb_dn0_dims);
3413 
3414  vector<size_t> tstartp, tcountp;
3415  tstartp.push_back(0);
3416  tstartp.push_back(0);
3417  tcountp.push_back(1);
3418  tcountp.push_back(1);
3419 
3420  vector<size_t> fstartp, fcountp;
3421  fstartp.push_back(0);
3422  fstartp.push_back(0);
3423  fstartp.push_back(0);
3424  fstartp.push_back(0);
3425  fstartp.push_back(0);
3426  fcountp.push_back(1);
3427  fcountp.push_back(EV_DNB_FRAMES);
3428  fcountp.push_back(NUM_DETECTORS_DNB);
3429  fcountp.push_back(MAX_NUM_GAIN);
3430  fcountp.push_back(NUM_MIRROR_SIDES);
3431 
3432  VcstCalLutInputItem* lut_item;
3434  sizeof (proSdrViirsDnbDn0Type));
3435  proSdrViirsDnbDn0Type* lut;
3436 
3437  std::map<std::string, std::string>::iterator lut_iter;
3438  int i = 0;
3439 
3440  for (lut_iter = lut_files_.begin(); lut_iter != lut_files_.end();
3441  lut_iter++, i++) {
3442  std::string filePath = lut_iter->second;
3443  size_t pos = filePath.rfind("/");
3444  std::string fileName = filePath.substr(pos);
3445 
3446  long long iet = compute_iet_from_filename(fileName);
3447 
3448  if (iet < 0) {
3449  continue;
3450  }
3451 
3452  lut_item->setFilePath(filePath);
3453  lut_item->getData();
3454  lut = static_cast<proSdrViirsDnbDn0Type*> (lut_item->getDataPtr());
3455 
3456  tstartp[0] = i;
3457  fstartp[0] = i;
3458  tref_var.putVar(tstartp, tcountp, &iet);
3459  dn0_var.putVar(fstartp, fcountp, lut->data);
3460  }
3461 
3462  delete lut_item;
3463 
3464  return VCST_SUCCESS;
3465 }
3466 
3474  int status = VCST_SUCCESS;
3475 
3476  struct stat st;
3477 
3478  // Check to determine whether input path is valid
3479  if (stat(path.c_str(), &st) != 0) {
3480  cerr
3481  << "VcstLutNetCDF4::collect_lut_files() PCF path string " + path
3482  + " is invalid. " << endl;
3483  return VCST_FAIL;
3484  }
3485 
3486  if (S_ISREG(st.st_mode)) {
3487  size_t pos = path.rfind("/");
3488  path = path.substr(0, pos);
3489  }
3490 
3491  if (!((stat(path.c_str(), &st) == 0) && S_ISDIR(st.st_mode))) {
3492  cerr
3493  << "VcstLutNetCDF4::collect_lut_files() PCF path string " + path
3494  + " is not a valid directory. " << endl;
3495  return VCST_FAIL;
3496  }
3497 
3498  DIR* directory = 0;
3499  struct dirent* ent = 0;
3500 
3501  directory = opendir(path.c_str());
3502 
3503  if (directory != 0) {
3504  lut_files_.clear();
3505 
3506  while ((ent = readdir(directory)) != 0) {
3507  std::string filename = string(ent->d_name);
3508  std::string filepath = path + "/" + filename;
3509 
3510  if (stat(filepath.c_str(), &st) != 0) {
3511  continue;
3512  }
3513  if (!S_ISREG(st.st_mode)) {
3514  continue;
3515  }
3516  size_t pos = filename.find(lutString);
3517 
3518  if (pos == std::string::npos) {
3519  continue;
3520  }
3521 
3522  pos = filename.find("_20");
3523 
3524  if (pos == std::string::npos) {
3525  continue;
3526  }
3527 
3528  std::string dateString = filename.substr(pos + 1, 8);
3529 
3530  lut_files_.insert(make_pair(dateString, filepath));
3531  }
3532 
3533  closedir(directory);
3534  } else {
3535  cerr
3536  << "VcstLutNetCDF4::collect_lut_files() Unable to open directory "
3537  + path + ". " << endl;
3538  return VCST_FAIL;
3539  }
3540 
3541  if (lut_files_.empty()) {
3542  cerr
3543  << "VcstLutNetCDF4::collect_lut_files() No LUT files for "
3544  + lutString + " in directory " + path + ". " << endl;
3545  return VCST_FAIL;
3546  }
3547  return VCST_SUCCESS;
3548 }
3549 
3557 
3558  double tai = 0.0;
3559 
3560  VcstTime* timeAPI = VcstTime::getInstance();
3561  timeAPI->initialize();
3562 
3563  size_t pos = fileName.find("_20");
3564 
3565  if (pos == std::string::npos) {
3566  return -1l;
3567  }
3568 
3569  std::string str_year = fileName.substr(pos + 1, 4);
3570  std::string str_month = fileName.substr(pos + 5, 2);
3571  std::string str_day = fileName.substr(pos + 7, 2);
3572 
3573  TimGdtStruct gdt;
3574 
3575  gdt.year = atoi(str_year.c_str());
3576  gdt.month = atoi(str_month.c_str());
3577  gdt.day = atoi(str_day.c_str());
3578  gdt.hour = 0;
3579  gdt.min = 0;
3580  gdt.sec = 0;
3581  gdt.mill = 0;
3582  gdt.msec = 0;
3583  gdt.wkday = 0;
3584  gdt.numday = 0;
3585 
3586  timeAPI->gdt2Tai(&gdt, &tai);
3587 
3588  return tai * TAI2IET;
3589 }
3590 
3591 /**************************************************************************
3592  * NAME: compute_solar_irradiance()
3593  *
3594  * DESCRIPTION: Compute solar spectral irradiance for all RSB bands
3595  *
3596  *************************************************************************/
3597 
3600  int x_low;
3601  int x_high;
3602  int rsr_pts;
3603  int solar_irad_pts;
3604 
3605  double rsr_interp[SOLAR_IRAD_SIZE];
3606  double product[SOLAR_IRAD_SIZE];
3607  double wl_sol_diff;
3608  double rsr_step_diff;
3609  double wl_step_diff;
3610  double resultnum;
3611  double resultdenom;
3612 
3613  VcstCalLutInputItem* lut_solar;
3614  proSdrViirsCalSolarIradLUT* solarIradLUT;
3615 
3617  sizeof (proSdrViirsCalSolarIradLUT));
3618 
3619  if (lut_solar != 0) {
3620  solarIradLUT =
3621  static_cast<proSdrViirsCalSolarIradLUT*> (lut_solar->getDataPtr());
3622  } else {
3623  return VCST_FAIL;
3624  }
3625 
3626  for (int iRefB = 0; iRefB < 14; iRefB++) {
3627  rsr_pts = rsrLUT->numRsr[iRefB];
3628 
3629  x_low = 0;
3630 
3631  while (solarIradLUT->x[x_low] < rsrLUT->wavelength[iRefB][0]) {
3632  ++x_low;
3633  }
3634 
3635  x_high = 0;
3636 
3637  while (solarIradLUT->x[x_high] < rsrLUT->wavelength[iRefB][rsr_pts - 1]) {
3638  ++x_high;
3639  }
3640 
3641  --x_high;
3642 
3643  solar_irad_pts = x_high - x_low;
3644 
3645  // interpolate the esun-RSR values
3646 
3647  for (int iSol = 0; iSol < solar_irad_pts; iSol++) {
3648  for (int iRsr = 0; iRsr < rsr_pts; iRsr++) {
3649  if (rsrLUT->wavelength[iRefB][iRsr]
3650  >= solarIradLUT->x[x_low + iSol]) {
3651 
3652  wl_step_diff = rsrLUT->wavelength[iRefB][iRsr]
3653  - rsrLUT->wavelength[iRefB][iRsr - 1];
3654 
3655  // test for division by epsilon
3656  if (fabs(wl_step_diff)
3658  return VCST_FAIL;
3659  }
3660 
3661  wl_sol_diff = rsrLUT->wavelength[iRefB][iRsr]
3662  - solarIradLUT->x[x_low + iSol];
3663  rsr_step_diff = (rsrLUT->rsr[iRefB][iRsr]
3664  - rsrLUT->rsr[iRefB][iRsr - 1]);
3665 
3666  rsr_interp[iSol] = rsrLUT->rsr[iRefB][iRsr]
3667  - wl_sol_diff * rsr_step_diff / wl_step_diff;
3668 
3669  break; // go to next element
3670  }
3671  }
3672  }
3673 
3674  // multiply interpolated RSR values by those solar irradiance values
3675  // that have the same wavelength
3676 
3677  for (int iSol = 0; iSol < solar_irad_pts; iSol++) {
3678  product[iSol] = rsr_interp[iSol] * solarIradLUT->y[x_low + iSol];
3679  }
3680 
3681  // integrate numerator
3682 
3683  resultnum = 0.0;
3684 
3685  for (int iSol = 0; iSol <= (solar_irad_pts - 2); iSol++) {
3686  resultnum += (product[iSol + 1] + product[iSol])
3687  * (solarIradLUT->x[x_low + iSol + 1]
3688  - solarIradLUT->x[x_low + iSol]) * .5;
3689  }
3690 
3691  // integrate denominator
3692 
3693  resultdenom = 0.0;
3694 
3695  for (int iSol = 0; iSol <= (solar_irad_pts - 2); iSol++) {
3696  resultdenom += (rsr_interp[iSol + 1] + rsr_interp[iSol])
3697  * (solarIradLUT->x[x_low + iSol + 1]
3698  - solarIradLUT->x[x_low + iSol]) * .5;
3699  }
3700 
3701  if (fabs(resultdenom) < std::numeric_limits<double>::epsilon()) {
3702  return VCST_FAIL;
3703  }
3704 
3705  solar_irad_[iRefB] = resultnum / resultdenom / AU_TO_METERS
3706  / AU_TO_METERS;
3707 
3708  }
3709 
3710  delete lut_solar;
3711 
3712  return VCST_SUCCESS;
3713 }
3714 
const int EV_FRAMES_750m_DG
const std::string VIIRS_SDR_F_PREDICTED_LUT
const int JPL_EPHEM_COL
NcDim num_obcer_files_dim_
double AttitudeAbsLimit[CMNGEO_MIN_MAX_DIM]
double F_ref[NUM_VIIRS_BAND][MAX_NUM_DETECTOR][MAX_NUM_GAIN][NUM_MIRROR_SIDES]
float RVS_750m_SV_DG[NUM_750M_DG_BANDS][NUM_DETECTORS_750M][NUM_MIRROR_SIDES]
proSdrViirsCalDeltaCTempLUT * DeltaCTable_
proSdrViirsCalFPredictedTableLUT * TableFPredicted_
unsigned short N_frame
double DeltaC[NUM_ELECTRONICS_SIDE][NUM_VIIRS_BAND][MAX_NUM_DETECTOR][NUM_M_I_GAIN_STATES][NUM_MIRROR_SIDES][MAX_NUM_C_COEF][telecThermistorNum]
const int VCST_SUCCESS
Definition: VcstCmnConsts.h:46
const int VCST_FAIL
Definition: VcstCmnConsts.h:47
NcDim num_electronics_sides_dim_
@ J2
const int NUM_OF_OBCER_FILES
const int NUM_OF_EBBT_FILES
const std::string VIIRS_SDR_EMISSIVE_LUT
double poly_coef_tel[NUM_ELECTRONICS_SIDE][MAX_POLY_DEGREE_PLUS_ONE]
const int HAM_START_ENC_NOMINAL_1_J2
Definition: VcstCmnConsts.h:36
const std::string VIIRS_SDR_COEFF_A_LUT
signed char Fit_type[NUM_VIIRS_BAND]
double tel_abs_limit[MAX_LIMIT_CHECK]
double OBC_ER_rad[MAX_OBC_ER_INDEX]
float BB_Weight[NUM_BB_THERMISTORS]
float data[NUM_REFL_750M_DG_BANDS][NUM_DETECTORS_750M][PRO_VIIRS_MIN_MAX_DIM]
const int NUM_OF_HAMER_FILES
NcDim num_viirs_detectors_dim_
const int X_Y_SIZE
const std::string VIIRS_SDR_RELATIVE_SPECTRAL_RESPONSE_LUT
std::map< std::string, std::string > lut_files_
const int NUM_DETECTORS_DNB
string date_created_
int write_SDR_F_PREDICTED_LUT(NcFile *nc_output, proSdrViirsCalFPredictedTableLUT *lut, std::string fileName)
int status
Definition: l1_czcs_hdf.c:32
#define L(lambda, T)
Definition: PreprocessP.h:185
const int MAX_EBBT_INDEX
NcDim num_sdsm_samples_dim_
int write_SDR_DNB_DN0_LUT(NcFile *nc_output, proSdrViirsDnbDn0Type *lut, std::string fileName)
double solar_irad_[14]
int Tomm_Thermister_Indexes[NUM_TOMM_THERM]
int write_SDR_HAM_ER_TABLE_LUT(NcFile *nc_output, proSdrViirsCalHAMERLUT *lut, std::string fileName)
int write_SDR_COEFF_A_LUT(NcFile *nc_output, proSdrViirsCalDetectorResponseLUT *lut, std::string fileName)
NcDim num_obcer_values_dim_
NcDim num_dg_gain_states_dim_
const std::string CMNGEO_PARAM_LUT
const int NUM_M_I_GAIN_STATES
NcDim td_luts_dim_dnblgs_
int write_SDR_RVS_LUT(NcFile *nc_output, proSdrViirsCalRVSLUT *lut, std::string fileName)
const int NUM_750M_DG_BANDS
int write_all_SDR_DNB_GAIN_RATIOS_LUT(NcFile *nc_output)
string creator_name_
proSdrViirsCalBBTempCoeffs * bBTempCoeffs_
double coeffs[JPL_EPHEM_ROW][JPL_EPHEM_COL]
const std::string VIIRS_SOLAR_DIFF_ROT_MATRIX_LUT
int write_SDR_DNB_GAIN_RATIOS_LUT(NcFile *nc_output, ProSdrViirsCalDnbGainRatiosLUT *lut, std::string fileName)
string naming_authority_
int write_SDR_DNB_STRAY_LIGHT_CORRECTION_LUT(NcFile *nc_output, proSdrViirsCalDnbStrayLightLUT *lut, std::string fileName)
NcDim num_dnb_gains_dim_
double rsr[NUM_REFL_PLUS_DNB_BANDS][MAX_RSR_VALUES]
const std::string GEO_MOD_PARAM
NcDim max_poly_degree_plus_one_dim_
NcDim num_mirror_sides_dim_
double data[NUM_ELECTRONICS_SIDE][NUM_VIIRS_BAND][MAX_NUM_DETECTOR][NUM_MIRROR_SIDES][NUM_TELE_LEVEL][DIM_NUM4]
NcDim num_dnb_detectors_dim_
double basis_out[3][3]
proSdrViirsCalInstrumentResponseLUT * TableB_
GEO_param_struct * geoDnbParams_
const int NUM_TEMP_COEFFS
NcDim num_hamer_files_dim_
const int PRO_VIIRS_MIN_MAX_DIM
VcstCalLutInputItem * read_cal_lut(std::string groupName, int size)
int numday
Definition: VcstTime.h:72
const int NUM_ELECTRONICS_SIDE
double PositionMagLimit[CMNGEO_MIN_MAX_DIM]
int RTA_ER_indices[NUM_OF_RTAER_FILES][2]
NcDim num_375m_bands_dim_
SolarDiffRotationMatrixLutType * SdRotMatPtr_
double VelocityMagLimit[CMNGEO_MIN_MAX_DIM]
double OBC_ER_tp[MAX_OBC_ER_INDEX]
const std::string getFileName() const
double L_to_EBBT_tp[MAX_EBBT_INDEX]
NcDim dnb_aggzone_bound_cols_dim_
const std::string VIIRS_SDR_OBC_RR_TABLE
int write_SDR_RADIOMETRIC_PARAMETERS_LUT(NcFile *nc_output, proSdrViirsCalRMParametersLUT *lut, std::string fileName)
internal_coord_trans_struct coord_trans
void setFilePath(const std::string &filePath)
double F_param_1[NUM_AGG_SEQ][NUM_DETECTORS_DNB][NUM_MIRROR_SIDES]
proSdrViirsCaldnbRVSLUT * RVS_DNB_
const int HAM_START_ENC_NOMINAL_1_NPP
Definition: VcstCmnConsts.h:26
const std::string VIIRS_SDR_OBC_ER_TABLE
proSdrViirsCalRMParametersLUT * rmParameters_
int write_SDR_COEFF_B_LUT(NcFile *nc_output, proSdrViirsCalInstrumentResponseLUT *lut, std::string fileName)
int write_global_attributes(NcFile *nc_output)
const int MAX_OBC_ER_INDEX
int Telec_Therm_Indexes[NUM_TELEC_THERM]
double wavelength[NUM_REFL_PLUS_DNB_BANDS][MAX_RSR_VALUES]
float VIIRS_DNB_SDR_STRAY_OFFSET[NUM_HEMISPHERES][NUM_SZA_BINS][EV_DNB_FRAMES][NUM_DETECTORS_DNB][NUM_MIRROR_SIDES]
const std::string CMNGEO_JPL_EPHEM
double poly_coef_mirr[MAX_POLY_DEGREE_PLUS_ONE]
void * getDataPtr() const
NcDim max_limit_check_dim_
int OBC_ER_indices[NUM_OF_OBCER_FILES][2]
NcDim num_sdsm_coef_dim_
proSdrViirsCalLtoEBBTLUT * EBBTLUT_
NcDim td_luts_dim_dnbdn0_
int write_SDR_TELE_COEFFS_LUT(NcFile *nc_output, proSdrViirsCalTeleCoeffLUT *lut, std::string fileName)
int HAM_ER_indices[NUM_OF_HAMER_FILES][2]
const int SOLAR_IRAD_SIZE
float voltCoef[SDSM_SAMPLES][SDSM_DETECTORS][SDSM_COEF]
const std::string VIIRS_SDR_DNB_LGS_GAINS_LUT
const int NUM_VIIRS_BAND
proSdrViirsCalBBTempCoeffStruct thermister[NUM_BB_THERMISTORS]
float32 * pos
Definition: l1_czcs_hdf.c:35
double L_to_EBBT_rad[MAX_EBBT_INDEX]
proSdrViirsCalDnbFrameToZoneLUT * ftz_
proSdrViirsCalObsToPixelsLUT * obs_to_pixels_
VcstGeoLutInputItem * read_geo_lut(std::string groupName, int size)
double Tdet[NUM_ELECTRONICS_SIDE][NUM_FOCAL_PLANES][NUM_TDET_LEVEL]
proSdrViirsCalDnbStrayLightLUT * strayLight_
NcDim num_qual_flag_values_dim_
NcDim max_num_gains_dim_
int write_SDR_EMISSIVE_LUT(NcFile *nc_output, proSdrViirsCalEmissiveLUT *lut, std::string fileName)
float VIIRS_STRAY_SZA_GRID[NUM_HEMISPHERES][NUM_SZA_BINS]
const int NUM_MIRROR_SIDES
SAALutType * saaCoeff_
const std::string VIIRS_SDR_DNB_RVS
const int telecThermistorNum
proSdrViirsCalDgAnDnLmtLUT * dgAnDnLimits_
double band_position[MAX_BAND_NUMBER_PLUS_ONE]
int write_SDR_EBBT_TABLE_LUT(NcFile *nc_output, proSdrViirsCalLtoEBBTLUT *lut, std::string fileName)
const std::string VIIRS_SDR_SOLAR_IRAD_LUT
const int HAM_START_ENC_NOMINAL_0_J1
Definition: VcstCmnConsts.h:30
const int NUM_TELE_LEVEL
NcDim num_jpl_ephem_cols_dim_
NcDim num_dnb_gain_ratio_coeff_dim_
const int JPL_EPHEM_ROW
float VIIRS_STRAY_SZA_GRID[NUM_HEMISPHERES][NUM_SZA_BINS]
const int HAM_START_ENC_NOMINAL_0_J2
Definition: VcstCmnConsts.h:35
int write_all_SDR_F_PREDICTED_LUT(NcFile *nc_output)
const int NUM_AGG_ZONES
const int NUM_DETECTORS_375M
@ string
float RVS_375m_SV[NUM_375M_BANDS][NUM_DETECTORS_375M][NUM_MIRROR_SIDES]
const std::string VIIRS_SDR_REFLECTIVE_LUT
NcDim num_obcrr_files_dim_
NcDim num_ebbt_values_dim_
proSdrViirsCalReflectiveLUT * refLUT_
float sdsmMatrix[SD_MATRIX_ROW][SD_MATRIX_COL]
@ J1
const std::string VIIRS_SDR_COEFF_B_LUT
proSdrViirsCalSolarIradLUT * solarIradLUT_
const std::string GEO_DNB_PARAM
float Telec_Therm_Weights[NUM_TELEC_THERM]
int initialize(void)
int write_GEO_PARAM_LUT(NcFile *nc_output, GEO_param_struct *lut, std::string str_geo_params_name, std::string fileName)
NcDim num_focal_planes_dim_
const int EV_375M_FRAMES
NcDim num_refl_750m_dg_bands_dim_
bool isPlatformLittleEndian()
NcDim num_moon_offset_dim_
string publisher_url_
string creator_email_
long long compute_iet_from_filename(std::string fileName)
const int HAM_START_ENC_NOMINAL_1_J1
Definition: VcstCmnConsts.h:31
int write_all_SDR_DNB_STRAY_LIGHT_CORRECTION_LUT(NcFile *nc_output)
const int EV_DNB_FRAMES
NcDim max_num_detectors_dim_
proSdrViirsCalRVSLUT * rvsLUT_
const int NUM_DETECTORS
float RVS_375m_BB[NUM_375M_BANDS][NUM_DETECTORS_375M][NUM_MIRROR_SIDES]
double HAM_ER_tp[MAX_HAM_ER_INDEX]
const int NUM_TOMM_THERM
const std::string VIIRS_SDR_DNB_GAIN_RATIOS_LUT
double AngularMomentumLimit[CMNGEO_MIN_MAX_DIM]
int write_all_SDR_DNB_DN0_LUT(NcFile *nc_output)
float evCtPrecTrefMux1Ca[NUM_MAX_EV_CT_PREC_TREF_MUX1CA]
int write_SDR_QA_LUT(NcFile *nc_output, proSdrViirsCalQALUT *lut, std::string fileName)
int write_CMNGEO_PARAM_LUT(NcFile *nc_output, CmnGeoParamLutType *lut, std::string fileName)
NcDim num_hemispheres_dim_
const int NUM_GAIN_RATIOS
NcDim num_rtaer_files_dim_
const std::string VIIRS_SDR_OBS_TO_PIXELS
NcDim num_refl_dnb_bands_dim_
static VcstTime * getInstance(void)
NcDim max_thermistor_id_dim_
float Tomm_Thermister_Weights[NUM_TOMM_THERM]
const int NUM_MAX_EV_CT_PREC_TREF_MUX1CA
const std::string VIIRS_SDR_RVS_LUT
const int MAX_OBC_RR_INDEX
int EBBT_indices[NUM_OF_EBBT_FILES][2]
const int MAX_THERMISTOR_ID_LEN
int write_all_SDR_SOLAR_SPECTRAL_IRAD_LUT(NcFile *nc_output)
const int EV_750M_SG_FRAMES
ProSdrViirsCalRelativeSpectralResponseLUT * rsrLUT_
float defaultValue[NUM_MAX_THERMISTORS]
double RTA_ER_rad[MAX_RTA_ER_INDEX]
NcDim num_tomm_therm_dim_
int voltLowerLimit[SDSM_SAMPLES][SDSM_DETECTORS]
int write_SOLAR_DIFF_ROT_MATRIX_LUT(NcFile *nc_output, SolarDiffRotationMatrixLutType *lut, std::string fileName)
const std::string VIIRS_DG_ANOMALY_DN_LIMITS_LUT
unsigned short N_samp[MAX_BAND_NUMBER_PLUS_ONE]
double AngularMomentumZLimit[CMNGEO_MIN_MAX_DIM]
const int HAM_START_ENC_NOMINAL_0_NPP
Definition: VcstCmnConsts.h:25
NcDim td_luts_dim_dnbgr_
const int NUM_OF_OBCRR_FILES
unsigned char revision[10]
string path
Definition: color_dtdb.py:221
int write_SDR_OBC_RR_TABLE_LUT(NcFile *nc_output, proSdrViirsCalOBCRRLUT *lut, std::string fileName)
focal_plane_geometry_struct geometry_params
NcDim num_dnb_ev_frames_dim_
const std::string VIIRS_SDR_EBBT_TABLE
string keywords_vocabulary_
int write_CMNGEO_SAA_COEFF(NcFile *nc_output, SAALutType *lut, std::string fileName)
int OBC_RR_indices[NUM_OF_OBCRR_FILES][2]
NcDim num_jpl_ipt_cols_dim_
int write_SDR_OBS_TO_PIXELS_LUT(NcFile *nc_output, proSdrViirsCalObsToPixelsLUT *lut, std::string fileName)
const int TEL_START_ENC_NOMINAL_NPP
Definition: VcstCmnConsts.h:24
double F_ref[NUM_AGG_SEQ][NUM_DETECTORS_DNB][NUM_MIRROR_SIDES]
const int NUM_375M_BANDS
const std::string VIIRS_SDR_QA_LUT
NcDim num_ebbt_files_dim_
const int JPL_IPT_COL
double OBC_RR_tp[MAX_OBC_RR_INDEX]
ProSdrViirsCalDnbGainRatiosLUT * TableDnbGainRatios_
const int MAX_NUM_C_COEF
double F_param_2[NUM_VIIRS_BAND][MAX_NUM_DETECTOR][MAX_NUM_GAIN][NUM_MIRROR_SIDES]
GEO_param_struct * geoImgParams_
const int NUM_THERMISTORS
JPLEphemLutType * jplEphemPtr_
NcDim num_hamer_values_dim_
const int JPL_IPT_ROW
double PositionAbsLimit[CMNGEO_MIN_MAX_DIM]
double thermistor_coeffs[NUM_THERMISTORS][6]
float filterThreshold[NUM_MAX_THERMISTORS]
NcDim num_telec_therm_dim_
NcDim max_band_num_plus_one_dim_
int write_SDR_DNB_LGS_GAINS_LUT(NcFile *nc_output, ProSdrViirsCalDnbLgsGainsLUT *lut, std::string fileName)
NcDim num_temp_coeffs_dim_
const int MAX_RSR_VALUES
NcDim num_dnb_agg_seq_dim_
const std::string VIIRS_SDR_RTA_ER_TABLE
double det_space_track[MAX_BAND_NUMBER_PLUS_ONE]
float RVS_750m_DG[NUM_750M_DG_BANDS][NUM_DETECTORS_750M][EV_750M_DG_FRAMES][NUM_MIRROR_SIDES]
NcDim num_jpl_ephem_rows_dim_
int compute_solar_irradiance(const ProSdrViirsCalRelativeSpectralResponseLUT *rsrLUT)
const int SCAN_ENCDR_START_MAX_J1
Definition: VcstCmnConsts.h:32
double focal_length[MAX_BAND_NUMBER_PLUS_ONE]
NcDim td_luts_dim_rsbrsr_
double RTA_ER_tp[MAX_RTA_ER_INDEX]
const int SDSM_SAMPLES
GEO_param_struct * geoModParams_
const std::string VIIRS_SDR_HAM_ER_TABLE
NcDim num_solar_irad_values_dim_
ProSdrViirsCalDnbLgsGainsLUT * TableDnbLgsGains_
proSdrViirsCalOBCERLUT * OBCERLUT_
float Ttel_Tsh_Tcav_Weights[NUM_TTEL_TSH_TCAV]
proSdrViirsCalRTAERLUT * RTAERLUT_
char filename[FILENAME_MAX]
Definition: atrem_corl1.h:122
const std::string VIIRS_SDR_SOLAR_SPECTRAL_IRAD_LUT
double det_position[MAX_BAND_NUMBER_PLUS_ONE][2]
int write_SDR_DG_ANOMALY_DN_LIMITS_LUT(NcFile *nc_output, proSdrViirsCalDgAnDnLmtLUT *lut, std::string fileName)
float moon_offset_limits[NUM_BANDS][NUM_MOON_OFFSET_LIMITS]
int ipt[JPL_IPT_ROW][JPL_IPT_COL]
NcDim num_tdet_levels_dim_
NcDim num_750m_dg_bands_dim_
const int NUM_SZA_BINS
int write_SDR_GAIN_LUT(NcFile *nc_output, proSdrViirsCalGainTableLUT *lut, std::string fileName)
const int MAX_NUM_DETECTOR
float VIIRS_DNB_SDR_STRAY_OFFSET[NUM_HEMISPHERES][NUM_SZA_BINS][SHORT_DNB_FRAMES][NUM_DETECTORS_DNB][NUM_MIRROR_SIDES]
const std::string VIIRS_SDR_GAIN_LUT
std::string VL1_get_group(const std::string &group)
string publisher_name_
const std::string VIIRS_SDR_DNB_FRAME_TO_ZONE
NcDim num_obcrr_values_dim_
string time_coverage_end_
int collect_lut_files(std::string lutName, std::string path)
double det_space_scan[MAX_BAND_NUMBER_PLUS_ONE]
const int MAX_NUM_GAIN
double HAM_ER_rad[MAX_HAM_ER_INDEX]
NcDim num_dnb_aggzone_dim_
int create_straylight_dynamic_lut()
int write_CMNGEO_PLATFORM_LUT(NcFile *nc_output)
proSdrViirsCalQALUT * QALUT_
const int TEL_START_ENC_NOMINAL_J1
Definition: VcstCmnConsts.h:29
double VelocityAbsLimit[CMNGEO_MIN_MAX_DIM]
thermistor_parameter_struct thermistor_params
const int NUM_TELEC_THERM
double data[NUM_ELECTRONICS_SIDE][NUM_VIIRS_BAND][MAX_NUM_DETECTOR][NUM_M_I_GAIN_STATES][NUM_MIRROR_SIDES][NUM_TDET_LEVEL][DIM_NUM4]
const int NUM_AGG_SEQ
float sdMatrix[SD_MATRIX_ROW][SD_MATRIX_COL]
string filepath
Definition: color_dtdb.py:207
NcDim num_viirs_bands_dim_
const int SCAN_ENCDR_START_MAX_J2
Definition: VcstCmnConsts.h:37
NcDim num_750m_sg_bands_dim_
const int SHORT_DNB_FRAMES
proSdrViirsCalHAMERLUT * HAMERLUT_
NcDim num_dg_ev_frames_dim_
double DnbGainRatios[NUM_AGG_SEQ][NUM_DETECTORS_DNB][NUM_GAIN_RATIOS][NUM_DNB_GAIN_RATIO_COEFFS]
NcDim num_thermistor_dim_
float dnbrvs[EV_DNB_FRAMES][NUM_DETECTORS_DNB][NUM_MIRROR_SIDES]
mirror_model_struct mirror_model
const std::string GEO_IMG_PARAM
NcDim num_thermistors_dim_
const std::string VIIRS_SDR_DELTA_C_LUT
const std::string VIIRS_SOLAR_DIFF_VOLT_LUT
NcDim num_rtaer_values_dim_
const int TEL_START_ENC_NOMINAL_J2
Definition: VcstCmnConsts.h:34
string processing_level_
const int CMNGEO_MIN_MAX_DIM
float teleCoeffs[NUM_MAX_THERMISTORS][NUM_TEMP_COEFFS]
const int SDSM_COEF
double F_param_2[NUM_AGG_SEQ][NUM_DETECTORS_DNB][NUM_MIRROR_SIDES]
int write_CMNGEO_JPL_EPHEM(NcFile *nc_output, JPLEphemLutType *lut, std::string fileName)
int write_all_SDR_DNB_LGS_GAINS_LUT(NcFile *nc_output)
proSdrViirsCalGainTableLUT * GainTable_
float bbNominalTemp_Tolerances[OneTempTwoTolerances]
string publisher_email_
const int MAX_HAM_ER_INDEX
const int NUM_DNB_GAIN_RATIO_COEFFS
double mirr_abs_limit[MAX_LIMIT_CHECK]
NcDim num_ttel_therm_dim_
int write_SDR_BB_TEMP_COEFFS_LUT(NcFile *nc_output, proSdrViirsCalBBTempCoeffs *lut, std::string fileName)
#define fabs(a)
Definition: misc.h:93
const std::string VIIRS_NETCDF_LUT_PATH
const int NUM_REFL_PLUS_DNB_BANDS
unsigned char Detector_Quality_Flag_Values[NUM_DETECTORS][8]
string time_coverage_start_
NcDim num_therm_weights_dim_
const int NUM_T_MIR_THERMISTORS
mirror_preparation_struct mirror_prep_params
float RVS_750m_SV_SG[NUM_750M_SG_BANDS][NUM_DETECTORS_750M][NUM_MIRROR_SIDES]
double data[NUM_VIIRS_BAND]
proSdrViirsCalEmissiveLUT * EmissiveLUT_
virtual int getData()
int write_SDR_SOLAR_SPECTRAL_IRAD_LUT(NcFile *nc_output, ProSdrViirsCalRelativeSpectralResponseLUT *lut, std::string fileName)
const int NUM_TTEL_TSH_TCAV
const int MAX_BAND_NUMBER_PLUS_ONE
double Tele[NUM_ELECTRONICS_SIDE][NUM_TELE_LEVEL]
const std::string CMNGEO_SAA_COEFF
proSdrViirsCalDetectorResponseLUT * TableA_
const int NUM_TDET_LEVEL
int write_SDR_SOLAR_IRAD_LUT(NcFile *nc_output, proSdrViirsCalSolarIradLUT *lut, std::string fileName)
NcDim num_375m_frms_dim_
CmnGeoParamLutType * paramLut_
const int NUM_FOCAL_PLANES
int agg_zone_bounds[NUM_AGG_ZONES]
const std::string VIIRS_SDR_TELE_COEFFS
int voltUpperLimit[SDSM_SAMPLES][SDSM_DETECTORS]
const std::string CMNGEO_PLATFORM_LUT
int write_SDR_REFLECTIVE_LUT(NcFile *nc_output, proSdrViirsCalReflectiveLUT *lut, std::string fileName)
proSdrViirsCalTeleCoeffLUT * tCoeffs_
int write_SDR_DELTA_C_LUT(NcFile *nc_output, proSdrViirsCalDeltaCTempLUT *lut, std::string fileName)
double OBC_RR_rad[MAX_OBC_RR_INDEX]
int gdt2Tai(TimGdtStruct *inGdt, double *outTai)
const std::string VIIRS_DNB_STRAY_LIGHT_CORRECTION_LUT
VcstCmnLutInputItem * read_cmngeo_lut(std::string groupName, int size)
int write_SDR_DNB_FRAME_TO_ZONE_LUT(NcFile *nc_output, proSdrViirsCalDnbFrameToZoneLUT *lut, std::string fileName)
const int NUM_OF_RTAER_FILES
float RVS_750m_BB_DG[NUM_750M_DG_BANDS][NUM_DETECTORS_750M][NUM_MIRROR_SIDES]
const int NUM_DETECTORS_750M
int write_all_SDR_RELATIVE_SPECTRAL_RESPONSE_LUT(NcFile *nc_output)
VIIRS_PLATFORM_ENUM platform_
SolarDiffVoltLutType * SdsmVoltPtr_
const std::string VIIRS_SDR_RADIOMETRIC_PARAMETERS
const int NUM_MOON_OFFSET_LIMITS
proSdrViirsCalOBCRRLUT * OBCRRLUT_
const double AU_TO_METERS
proSdrViirsDnbDn0Type * dnbDn0_
double basis_in[3][3]
NcDim num_jpl_ipt_rows_dim_
int i
Definition: decode_rs.h:71
float RVS_375m[NUM_375M_BANDS][NUM_DETECTORS_375M][EV_375M_FRAMES][NUM_MIRROR_SIDES]
const int SCAN_ENCDR_START_MAX_NPP
Definition: VcstCmnConsts.h:27
float data[EV_DNB_FRAMES][NUM_DETECTORS_DNB][MAX_NUM_GAIN][NUM_MIRROR_SIDES]
const int NUM_BB_THERMISTORS
int initialize(string platform)
NcDim num_tele_levels_dim_
string processing_version_
const int NUM_REFL_750M_DG_BANDS
NcDim num_dnb_gain_ratios_dim_
string cdm_data_type_
HISTORY txt for MOD_PR01(step one of PGE01) History follows the following convention needed due to new Aqua ReprocessingActual and the expected LUT revision number from PCF Changed to use PGE version for ProductionHistory Added Archive including ProcessingEnvironment Corrected handling of bad to resovle GSFcd02514 Changed to check staged LUT revision number versus the expected LUT revision number from thereby resolving defect report MODxl02056 This change also avoids the memory access violation reported in MODur00039 Changed the way output arrays were initialized with fill to be more but placed into the L1A output product and thought of as valid packets These packets had an invalid frame count in them and since only the last valid packet of any specific type gets it frame count data written to the output product
Definition: HISTORY.txt:176
int write_SDR_OBC_ER_TABLE_LUT(NcFile *nc_output, proSdrViirsCalOBCERLUT *lut, std::string fileName)
unsigned char thermistor_id[MAX_THERMISTOR_ID_LEN][NUM_THERMISTORS]
const int NUM_750M_SG_BANDS
@ NPP
int compress_StrayLight_LUT(proSdrViirsCalDnbStrayLightLUT *long_lut, shortViirsCalDnbStrayLightLUT *short_lut)
const int NUM_HEMISPHERES
const int MAX_RTA_ER_INDEX
int write_SOLAR_DIFF_VOLT_LUT(NcFile *nc_output, SolarDiffVoltLutType *lut, std::string fileName)
const int SDSM_DETECTORS
NcDim revision_char_dim_
const double TAI2IET
int write_SDR_DNB_RVS_LUT(NcFile *nc_output, proSdrViirsCaldnbRVSLUT *lut, std::string fileName)
double F_param_1[NUM_VIIRS_BAND][MAX_NUM_DETECTOR][MAX_NUM_GAIN][NUM_MIRROR_SIDES]
int write_SDR_RELATIVE_SPECTRAL_RESPONSE_LUT(NcFile *nc_output, ProSdrViirsCalRelativeSpectralResponseLUT *lut, std::string fileName)
NcDim num_sg_ev_frames_dim_
float RVS_750m_SG[NUM_750M_SG_BANDS][NUM_DETECTORS_750M][EV_750M_SG_FRAMES][NUM_MIRROR_SIDES]
NcDim dnb_aggzone_bounds_dim_
string stdname_vocabulary_
const std::string VIIRS_SDR_DNB_DN0_LUT
int write_SDR_RTA_ER_TABLE_LUT(NcFile *nc_output, proSdrViirsCalRTAERLUT *lut, std::string fileName)
int T_mir_function_flag[NUM_T_MIR_THERMISTORS]
float RVS_750m_BB_SG[NUM_750M_SG_BANDS][NUM_DETECTORS_750M][NUM_MIRROR_SIDES]
NcDim num_thermistor_coeffs_dim_
const std::string VIIRS_SDR_BB_TEMP_COEFFS