sasze  0.0-0.dev0.dirty.el6
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Groups
sas_store_data.c
Go to the documentation of this file.
1 /*******************************************************************************
2 *
3 * COPYRIGHT (C) 2012 Battelle Memorial Institute. All Rights Reserved.
4 *
5 ********************************************************************************
6 *
7 * Authors:
8 *
9 * name: Yan Shi
10 * phone: (509) 375-6858
11 * email: yan.shi@pnnl.gov
12 *
13 * name: Brian Ermold
14 * phone: (509) 375-2277
15 * email: brian.ermold@pnnl.gov
16 *
17 *******************************************************************************/
18 
19 /** @file sas_store_data.c
20  * Functions used to store SASHE and SASZE a0 data.
21  */
22 
23 #include "dsproc3.h"
24 #include "sas_utils.h"
25 
26 /**
27  * Set the runtime attributes for an output a0 dataset.
28  *
29  * @param raw pointer to the SasRawData structure
30  * @param dataset pointer to the output dataset
31  *
32  * @retval 1 if successful
33  * @retval 0 if an error occurred
34  */
36 {
37  CDSVar *var;
38 
39  /* Set wavelength dimension length and coordinate variable values */
40 
41  if (!dsproc_set_dim_length(dataset, "wavelength", raw->nwavelens)) {
42  return(0);
43  }
44 
45  SET_DS_VAR_DATA(dataset, "wavelength",
46  CDS_DOUBLE, raw->nwavelens, raw->wavelens, var, 0);
47 
48  /* Set global attributes */
49 
50  SET_DS_ATT_IF_FOUND(dataset, 0,
51  "model_number", "%s", raw->model_number);
52 
53  SET_DS_ATT_IF_FOUND(dataset, 0,
54  "serial_number_spectrometer", "%s", raw->serial_number);
55 
56  SET_DS_ATT_IF_FOUND(dataset, 0,
57  "serial_number_collector", "%s", raw->collector_sn);
58 
59  SET_DS_ATT_IF_FOUND(dataset, 0,
60  "operation_mode", "%s", raw->op_mode);
61 
62  /* Old SASHE DODs have these */
63 
64  SET_DS_ATT_IF_FOUND(dataset, 0,
65  "serial_number", "%s", raw->serial_number);
66 
67  SET_DS_ATT_IF_FOUND(dataset, 0,
68  "op_mode", "%s", raw->op_mode);
69 
70  /* Set the default attribute values that have not already been
71  * defined in the dataset. */
72 
73  if (!sas_set_default_att_values(dataset)) {
74  return(0);
75  }
76 
77  return(1);
78 }
79 
80 /**
81  * Store data for a SASHE or SASZE a0 datastream.
82  *
83  * @param raw pointer to the SasRawData structure
84  * @param dsid output datastream ID
85  *
86  * @retval nstored number of samples stored
87  * @retval -1 if an error occurred
88  */
89 int sas_store_a0_data(SasRawData *raw, int dsid)
90 {
91  SasRecord *record;
92  CDSGroup *dataset;
93  size_t nwavelens;
94  float *specra;
95  int nstored;
96  int vi, ri;
97 
98  int nvars;
99  CDSVar **vars;
100  const char *var_names[] = {
101  "tag",
102  "earth_sun_distance",
103  "airmass",
104  "atmos_pressure",
105  "mio_temperature_mems",
106  "mio_temperature_mems_fahr",
107  "mio_temperature_trh",
108  "mio_rh",
109  "collector_temperature",
110  "collector_rh",
111  "collector_dewpoint",
112  "chiller_temperature",
113  "chiller_rh",
114  "chiller_dewpoint",
115  "collector_x_tilt",
116  "collector_y_tilt",
117  "collector_x_tilt_std",
118  "collector_y_tilt_std",
119  "band_az_raw",
120  "band_azimuth",
121  "solar_azimuth",
122  "solar_zenith",
123  "inner_band_angle_raw",
124  "inner_band_angle",
125  "inner_band_scattering_angle",
126  "outer_band_angle_raw",
127  "outer_band_angle",
128  "outer_band_scattering_angle",
129  "shutter_state",
130  "clock_ticks",
131  "bench_temperature",
132  "ad_temperature",
133  "integration_time",
134  "number_of_scans",
135  "spectra",
136  NULL
137  };
138 
139  /* Create the output dataset */
140 
141  record = &(raw->records[0]);
142 
143  dataset = dsproc_create_output_dataset(dsid, record->time, 1);
144  if (!dataset) {
145  return(-1);
146  }
147 
148  /* Set the metadata in the output dataset */
149 
150  if (!sas_set_a0_metadata(raw, dataset)) {
151  return(-1);
152  }
153 
154  /* Set sample times */
155 
156  if (!dsproc_set_sample_times(dataset, 0, raw->nrecs, raw->times)) {
157  return(-1);
158  }
159 
160  /* Get the list of variable pointers in the order we want them. */
161 
162  nvars = dsproc_get_dataset_vars(dataset, var_names, 1, &vars, NULL, NULL);
163  if (nvars < 0) {
164  return(-1);
165  }
166 
167  /* Allocate memory for all variable data */
168 
169  for (vi = 0; vi < nvars; vi++) {
170  if (vars[vi]) {
171  if (!dsproc_alloc_var_data(vars[vi], 0, raw->nrecs)) {
172  return(-1);
173  }
174  }
175  }
176 
177  /* Copy the data from the SasRawData records to the
178  * variables in the output dataset */
179 
180  nwavelens = raw->nwavelens;
181  specra = vars[34]->data.fp;
182 
183  for (ri = 0; ri < raw->nrecs; ++ri) {
184 
185  record = &(raw->records[ri]);
186 
187  /* Copy the data values
188  *
189  * Note: This is much more efficient than using dsproc_set_var_data()
190  * on a sample by sample basis, however, it does require that you use
191  * the correct var->data pointer corresponding to the data type of
192  * the variable in the output dataset. */
193 
194  vars[0]->data.ip[ri] = record->tag;
195  vars[1]->data.fp[ri] = record->earth_sun_dist;
196  vars[2]->data.fp[ri] = record->airmass;
197  vars[3]->data.fp[ri] = record->pressure_pa;
198  vars[4]->data.fp[ri] = record->temp_mio_p;
199  vars[5]->data.fp[ri] = record->temp_mio_p_f;
200  vars[6]->data.fp[ri] = record->temp_mio_trh;
201  vars[7]->data.fp[ri] = record->rh_mio;
202  vars[8]->data.fp[ri] = record->temp_collector;
203  vars[9]->data.fp[ri] = record->rh_collector;
204  vars[10]->data.fp[ri] = record->t_dewpt_collector;
205  vars[11]->data.fp[ri] = record->temp_chiller;
206  vars[12]->data.fp[ri] = record->rh_chiller;
207  vars[13]->data.fp[ri] = record->t_dewpt_chiller;
208  vars[14]->data.fp[ri] = record->x_tilt;
209  vars[15]->data.fp[ri] = record->y_tilt;
210  vars[16]->data.fp[ri] = record->x_tilt_stddev;
211  vars[17]->data.fp[ri] = record->y_tilt_stddev;
212  vars[18]->data.fp[ri] = record->band_az_raw;
213  vars[19]->data.fp[ri] = record->band_az_n;
214  vars[20]->data.fp[ri] = record->solar_azimuth;
215  vars[21]->data.fp[ri] = record->solar_zenith;
216  vars[22]->data.fp[ri] = record->inner_band_angle_raw;
217  vars[23]->data.fp[ri] = record->inner_band_angle;
218  vars[24]->data.fp[ri] = record->inner_band_scat_ang;
219  vars[25]->data.fp[ri] = record->outer_band_angle_raw;
220  vars[26]->data.fp[ri] = record->outer_band_angle;
221  vars[27]->data.fp[ri] = record->outer_band_scat_ang;
222  vars[28]->data.sp[ri] = record->shutter_open_tf;
223  vars[29]->data.fp[ri] = record->spectrometer_clock_ticks;
224  vars[30]->data.fp[ri] = record->t_avantes_bench;
225  vars[31]->data.fp[ri] = record->t_avantes_ad;
226  vars[32]->data.fp[ri] = record->t_int;
227  vars[33]->data.ip[ri] = record->n_avg;
228 
229  memcpy(specra, record->spec, nwavelens * sizeof(float));
230  specra += nwavelens;
231  }
232 
233  nstored = dsproc_store_dataset(dsid, 0);
234  return(nstored);
235 }