20 static int gVisWavelens[] = {
21 340, 355, 368, 387, 408, 415, 440, 500, 532,
22 615, 650, 673, 762, 870, 910, 935, 940, 975 };
25 static int gNumVisWavelens =
sizeof(gVisWavelens)/
sizeof(
int);
28 static int gNirWavelens[] = {
29 976, 1020, 1030, 1050, 1064, 1125, 1175,
30 1225, 1370, 1440, 1500, 1550, 1637 };
33 static int gNumNirWavelens =
sizeof(gNirWavelens)/
sizeof(
int);
50 const char *att_names[] = {
51 "serial_number_spectrometer_nir",
52 "serial_number_spectrometer_vis"
61 strcpy(var_name,
"earth_sun_distance");
69 att_name =
"spectrometer_pixel";
71 for (gwi = 0; gwi < gNumVisWavelens; ++gwi) {
73 wavelength = gVisWavelens[gwi];
75 sprintf(var_name,
"zenith_radiance_%dnm", (
int)wavelength);
80 sprintf(var_name,
"zenith_transmittance_%dnm", (
int)wavelength);
88 for (gwi = 0; gwi < gNumNirWavelens; ++gwi) {
90 wavelength = gNirWavelens[gwi];
92 sprintf(var_name,
"zenith_radiance_%dnm", (
int)wavelength);
97 sprintf(var_name,
"zenith_transmittance_%dnm", (
int)wavelength);
118 time_t data_time = raw->
records[0].time;
142 for (fi = nfiles - 1; fi > -1; --fi) {
145 if (data_time >= file_time) {
159 DSPROC_ERROR(
"Could Not Find Required Configuration File",
160 "Could not find required configuration file for: %s\n",
183 "Using response function file: %s\n", file_list[fi]);
205 int *ndarks = raw->
ndarks;
220 "Could not allocate memory for calibrated times array.\n");
235 memset(dark_avg, 0, raw->
nwavelens *
sizeof(
double));
236 memset(dark_sum2, 0, raw->
nwavelens *
sizeof(
double));
237 memset(dark_std, 0, raw->
nwavelens *
sizeof(
double));
238 memset(ndarks, 0, raw->
nwavelens *
sizeof(
int));
242 for (ri = 0; ri < raw->
nrecs; ++ri) {
244 if (raw->
records[ri].shutter_open_tf == 0) {
247 int_time = raw->
records[ri].t_int;
249 for (wi = 0; wi < raw->
nwavelens; ++wi) {
251 if (spec[wi] > -9998.0) {
252 dark = (double)spec[wi] / (
double)int_time;
253 dark_avg[wi] += dark;
254 dark_sum2[wi] += dark * dark;
267 for (wi = 0; wi < raw->
nwavelens; ++wi) {
269 if (ndarks[wi] == 0) {
270 dark_avg[wi] = -9999.0;
271 dark_std[wi] = -9999.0;
274 dark_avg[wi] /= ndarks[wi];
275 dark_std[wi] = (dark_sum2[wi] / ndarks[wi])
276 - (dark_avg[wi] * dark_avg[wi]);
282 for (ri = 0, ci = 0; ri < raw->
nrecs; ++ri) {
285 int_time = raw->
records[ri].t_int;
287 if (raw->
records[ri].shutter_open_tf) {
291 for (wi = 0; wi < raw->
nwavelens; ++wi) {
293 if ((resp_vals[wi] <= 0.0) ||
294 (dark_avg[wi] < -9998.0) ||
295 (spec[wi] < -9998.0)) {
300 spec[wi] /= int_time;
301 spec[wi] -= (float)dark_avg[wi];
302 spec[wi] /= (float)resp_vals[wi];
328 char serial_number[64];
348 "operation_mode",
"%s", raw->
op_mode);
361 strcpy(serial_number,
"Unknown");
364 chrp = strchr(chrp,
' ');
366 sscanf(chrp,
" %s", serial_number);
373 "spectrometer_serial_number",
"%s", serial_number);
410 const char *var_names[] = {
411 "mio_temperature_mems",
412 "mio_temperature_mems_fahr",
413 "mio_temperature_trh",
415 "collector_temperature",
417 "collector_dewpoint",
418 "chiller_temperature",
423 "collector_x_tilt_std",
424 "collector_y_tilt_std",
429 "inner_band_scattering_angle",
471 for (vi = 0; vi < nvars; vi++) {
485 specra = vars[24]->
data.
fp;
487 for (ri = 0, si = 0; ri < raw->
nrecs; ++ri) {
491 if (record->shutter_open_tf) {
493 vars[0]->
data.
fp[si] = record->temp_mio_p;
494 vars[1]->
data.
fp[si] = record->temp_mio_p_f;
495 vars[2]->
data.
fp[si] = record->temp_mio_trh;
496 vars[3]->
data.
fp[si] = record->rh_mio;
497 vars[4]->
data.
fp[si] = record->temp_collector;
498 vars[5]->
data.
fp[si] = record->rh_collector;
499 vars[6]->
data.
fp[si] = record->t_dewpt_collector;
500 vars[7]->
data.
fp[si] = record->temp_chiller;
501 vars[8]->
data.
fp[si] = record->rh_chiller;
502 vars[9]->
data.
fp[si] = record->t_dewpt_chiller;
503 vars[10]->
data.
fp[si] = record->x_tilt;
504 vars[11]->
data.
fp[si] = record->y_tilt;
505 vars[12]->
data.
fp[si] = record->x_tilt_stddev;
506 vars[13]->
data.
fp[si] = record->y_tilt_stddev;
507 vars[14]->
data.
fp[si] = record->band_az_n;
508 vars[15]->
data.
fp[si] = record->solar_azimuth;
509 vars[16]->
data.
fp[si] = record->solar_zenith;
510 vars[17]->
data.
fp[si] = record->inner_band_angle;
511 vars[18]->
data.
fp[si] = record->inner_band_scat_ang;
512 vars[19]->
data.
fp[si] = record->spectrometer_clock_ticks;
513 vars[20]->
data.
fp[si] = record->t_avantes_bench;
514 vars[21]->
data.
fp[si] = record->t_avantes_ad;
515 vars[22]->
data.
fp[si] = record->t_int;
516 vars[23]->
data.
ip[si] = record->n_avg;
518 memcpy(specra, record->spec, nwavelens *
sizeof(
float));
569 sun_distance = vis_raw->
records[0].earth_sun_dist;
572 sun_distance = nir_raw->
records[0].earth_sun_dist;
582 "model_number",
"%s", value);
586 "serial_number_collector",
"%s", value);
590 "serial_number_spectrometer_nir",
"%s", value);
594 "serial_number_spectrometer_vis",
"%s", value);
629 int nir_done, vis_done;
630 time_t nir_time, vis_time;
631 int nri, vri, ti, vi;
638 int vis_rad_wis[gNumVisWavelens];
639 int nir_rad_wis[gNumNirWavelens];
641 float *vis_rad_datap[gNumVisWavelens];
642 float *nir_rad_datap[gNumNirWavelens];
644 float *vis_trans_datap[gNumVisWavelens];
645 float *nir_trans_datap[gNumNirWavelens];
658 const char *var_names[] = {
659 "mio_temperature_mems",
660 "mio_temperature_mems_fahr",
661 "mio_temperature_trh",
663 "collector_temperature",
665 "collector_dewpoint",
666 "chiller_temperature",
671 "collector_x_tilt_std",
672 "collector_y_tilt_std",
676 "bench_temperature_nir",
677 "ad_temperature_nir",
679 "integration_time_nir",
680 "number_of_scans_nir",
682 "bench_temperature_vis",
683 "ad_temperature_vis",
685 "integration_time_vis",
686 "number_of_scans_vis",
693 max_ntimes = (nir_raw) ? nir_raw->
nrecs : 0;
694 max_ntimes += (vis_raw) ? vis_raw->
nrecs : 0;
695 if (max_ntimes == 0)
return(0);
700 data->
fb_times, max_ntimes *
sizeof(time_t));
713 "Could not allocate memory for filterband times array.\n");
727 nir_done = (nir_raw) ? 0 : 1;
728 vis_done = (vis_raw) ? 0 : 1;
731 while (!vis_done || !nir_done) {
736 if (nir_raw->
records[nri].shutter_open_tf)
break;
737 if (++nri == nir_raw->
nrecs) nir_done = 1;
743 if (vis_raw->
records[vri].shutter_open_tf)
break;
744 if (++vri == vis_raw->
nrecs) vis_done = 1;
752 if (!nir_done && !vis_done) {
754 nir_time = nir_raw->
records[nri].time;
755 vis_time = vis_raw->
records[vri].time;
757 if (nir_time < vis_time) {
758 times[ti] = nir_time;
759 nir_records[ti] = &(nir_raw->
records[nri++]);
761 else if (vis_time < nir_time) {
762 times[ti] = vis_time;
763 vis_records[ti] = &(vis_raw->
records[vri++]);
766 times[ti] = nir_time;
767 nir_records[ti] = &(nir_raw->
records[nri++]);
768 vis_records[ti] = &(vis_raw->
records[vri++]);
772 else if (!nir_done) {
773 times[ti] = nir_raw->
records[nri].time;
774 nir_records[ti] = &(nir_raw->
records[nri++]);
777 else if (!vis_done) {
778 times[ti] = vis_raw->
records[vri].time;
779 vis_records[ti] = &(vis_raw->
records[vri++]);
794 if (!nir_done && nri == nir_raw->
nrecs) nir_done = 1;
795 if (!vis_done && vri == vis_raw->
nrecs) vis_done = 1;
800 if (ntimes == 0)
return(0);
805 if (!dataset)
return(-1);
822 if (nvars < 0)
return(-1);
826 for (vi = 0; vi < nvars; vi++) {
837 for (i = 0; i < 2; ++i) {
842 nwavelens = gNumVisWavelens;
843 wavelens = gVisWavelens;
844 rad_wis = vis_rad_wis;
845 rad_datap = vis_rad_datap;
846 trans_datap = vis_trans_datap;
851 nwavelens = gNumNirWavelens;
852 wavelens = gNirWavelens;
853 rad_datap = nir_rad_datap;
854 rad_wis = nir_rad_wis;
855 trans_datap = nir_trans_datap;
868 for (gwi = 0; gwi < nwavelens; ++gwi) {
872 wavelen = wavelens[gwi];
887 sprintf(var_name,
"zenith_radiance_%dnm", wavelen);
889 ALLOC_DS_VAR(dataset, var_name, rad_datap[gwi], ntimes, var, -1);
896 sprintf(var_name,
"zenith_transmittance_%dnm", wavelen);
898 ALLOC_DS_VAR(dataset, var_name, trans_datap[gwi], ntimes, var, -1);
906 for (ti = 0; ti < ntimes; ++ti) {
908 record = (vis_records[ti]) ? vis_records[ti] : nir_records[ti];
910 vars[0]->
data.
fp[ti] = record->temp_mio_p;
911 vars[1]->
data.
fp[ti] = record->temp_mio_p_f;
912 vars[2]->
data.
fp[ti] = record->temp_mio_trh;
913 vars[3]->
data.
fp[ti] = record->rh_mio;
914 vars[4]->
data.
fp[ti] = record->temp_collector;
915 vars[5]->
data.
fp[ti] = record->rh_collector;
916 vars[6]->
data.
fp[ti] = record->t_dewpt_collector;
917 vars[7]->
data.
fp[ti] = record->temp_chiller;
918 vars[8]->
data.
fp[ti] = record->rh_chiller;
919 vars[9]->
data.
fp[ti] = record->t_dewpt_chiller;
920 vars[10]->
data.
fp[ti] = record->x_tilt;
921 vars[11]->
data.
fp[ti] = record->y_tilt;
922 vars[12]->
data.
fp[ti] = record->x_tilt_stddev;
923 vars[13]->
data.
fp[ti] = record->y_tilt_stddev;
924 vars[14]->
data.
fp[ti] = record->solar_azimuth;
925 vars[15]->
data.
fp[ti] = record->solar_zenith;
929 if (nir_records[ti]) {
930 record = nir_records[ti];
931 vars[16]->
data.
fp[ti] = record->t_avantes_bench;
932 vars[17]->
data.
fp[ti] = record->t_avantes_ad;
933 vars[18]->
data.
fp[ti] = record->spectrometer_clock_ticks;
934 vars[19]->
data.
fp[ti] = record->t_int;
935 vars[20]->
data.
ip[ti] = record->n_avg;
939 sdist2 = record->earth_sun_dist * record->earth_sun_dist;
940 cossza = cosf(
DEG_TO_RAD(record->solar_zenith));
942 for (gwi = 0; gwi < gNumNirWavelens; ++gwi) {
943 wi = nir_rad_wis[gwi];
945 record->spec[wi] == -9999.0 ||
946 record->solar_zenith > 89.0) {
948 nir_rad_datap[gwi][ti] =
MISSING;
949 nir_trans_datap[gwi][ti] =
MISSING;
952 rad = record->spec[wi];
953 toaIo = nir_raw->
toaIos[wi];
955 nir_rad_datap[gwi][ti] = rad;
956 nir_trans_datap[gwi][ti] = (
PI * rad * sdist2)
957 / (1000 * cossza * toaIo);
967 for (gwi = 0; gwi < gNumNirWavelens; ++gwi) {
968 nir_rad_datap[gwi][ti] =
MISSING;
969 nir_trans_datap[gwi][ti] =
MISSING;
975 if (vis_records[ti]) {
976 record = vis_records[ti];
977 vars[21]->
data.
fp[ti] = record->t_avantes_bench;
978 vars[22]->
data.
fp[ti] = record->t_avantes_ad;
979 vars[23]->
data.
fp[ti] = record->spectrometer_clock_ticks;
980 vars[24]->
data.
fp[ti] = record->t_int;
981 vars[25]->
data.
ip[ti] = record->n_avg;
985 sdist2 = record->earth_sun_dist * record->earth_sun_dist;
986 cossza = cosf(
DEG_TO_RAD(record->solar_zenith));
988 for (gwi = 0; gwi < gNumVisWavelens; ++gwi) {
989 wi = vis_rad_wis[gwi];
992 record->spec[wi] == -9999.0 ||
993 record->solar_zenith > 89.0) {
995 vis_rad_datap[gwi][ti] =
MISSING;
996 vis_trans_datap[gwi][ti] =
MISSING;
1000 rad = record->spec[wi];
1001 toaIo = vis_raw->
toaIos[wi];
1003 vis_rad_datap[gwi][ti] = rad;
1004 vis_trans_datap[gwi][ti] = (
PI * rad * sdist2)
1005 / (1000 * cossza * toaIo);
1015 for (gwi = 0; gwi < gNumVisWavelens; ++gwi) {
1016 vis_rad_datap[gwi][ti] =
MISSING;
1017 vis_trans_datap[gwi][ti] =
MISSING;
1046 if (status < 0)
return(-1);
1051 "No dark counts found in file: %s\n",
1059 "No data found to calibrate in file: %s\n",
1066 if (status < 0)
return(-1);
1073 if (status < 0)
return(-1);
1078 "No dark counts found in file: %s\n",
1086 "No data found to calibrate in file: %s\n",
1093 if (status < 0)
return(-1);
1097 if (nir_raw || vis_raw) {
1099 if (status < 0)
return(-1);