OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
set_czcs_ctl_data.c
Go to the documentation of this file.
1 #include "l1czcs.h"
2 #include "hdf.h"
3 #include "mfhdf.h"
4 
5 #define csds_fail( prog, sds ) \
6  { \
7  fprintf(stderr, "%s: create_sds failed on %s\n", prog, sds ); \
8  return FAIL; \
9  }
10 #define setdim_fail( prog, sds ) \
11  { \
12  fprintf(stderr, "%s: set_dim_names failed on %s\n", prog, sds ); \
13  return FAIL; \
14  }
15 #define setatt_fail( prog, sds, atr_name ) \
16  { \
17  fprintf(stderr, "%s: SDsetattr failed on SDS %s, attrib name %s\n", prog, sds, atr_name ); \
18  return FAIL; \
19  }
20 
21 int32 set_czcs_ctl_data(int32 sdfid, int32 vid, gattr_struc gattr,
22  l1_data_struc l1_data)
23 /*-----------------------------------------------------------------------------
24  Function: set_czcs_ctl_data
25 
26  Returns: int32 (status)
27  The return code is a negative value if any error occurs, otherwise,
28  returns 0.
29 
30  Description:
31  Write the nav and control points data to CZCS HDF file.
32 
33  Parameters: (in calling order)
34  Type Name I/O Description
35  ---- ---- --- -----------
36  int32 sdfid I SD interface ID of the output file
37  int32 vid I group ID the SD belongs to
38  gattr_struc gattr I attribute structure
39  l1_data_struc l1_data I L1 data structure with sds data
40 
41  Modification history:
42  Programmer Organization Date Description of change
43  -------------- ------------ -------- ---------------------
44  Gary Fu SAIC GSC 05/13/98 Original development
45  W. Robinson, SAIC 26May04 add other data for output and
46  modify call structure
47 ----------------------------------------------------------------------------*/ {
48  int32 create_sds(int32, char *, int32, int32, int32 *, int32, VOIDP *);
49  int32 set_dim_names(int32, char *, char *, char *);
50  int32 dims[3] = {0, 0, 0};
51  int sdsid;
52  int rank, iret;
53  char *pname = "set_czcs_ctl_data";
54  char sds_name[128], sds_attr[128];
55  char *num_scn_ln = "Number of Scan Lines";
56  char *num_pix_ctl = "Number of Pixel Control Points";
57  char *attr_nm_long = "long_name";
58  char *attr_nm_valid = "valid range";
59  char *attr_nm_units = "units";
60 
61  rank = 2;
62  dims[0] = gattr.scan_lines;
63  dims[1] = gattr.n_ctl_pt;
64  strcpy(sds_name, "latitude");
65  if ((sdsid = create_sds(sdfid, sds_name, DFNT_FLOAT32, rank, dims, vid,
66  (VOIDP) l1_data.ctl_pt_lat)) < 0)
67  csds_fail(pname, sds_name);
68 
69  if ((iret = set_dim_names(sdsid, num_scn_ln, num_pix_ctl, NULL)) < 0)
70  setdim_fail(pname, sds_name);
71 
72  strcpy(sds_attr, "Latitude");
73  if ((iret = SDsetattr(sdsid, attr_nm_long, DFNT_CHAR, strlen(sds_attr) + 1,
74  (VOIDP) sds_attr)) < 0)
75  setatt_fail(pname, sds_name, attr_nm_long);
76 
77  strcpy(sds_attr, "(-90.,90.)");
78  if ((iret = SDsetattr(sdsid, attr_nm_valid, DFNT_CHAR, strlen(sds_attr) + 1,
79  (VOIDP) sds_attr)) < 0)
80  setatt_fail(pname, sds_name, attr_nm_valid);
81 
82  strcpy(sds_attr, "degrees");
83  if ((iret = SDsetattr(sdsid, attr_nm_units, DFNT_CHAR, strlen(sds_attr) + 1,
84  (VOIDP) sds_attr)) < 0)
85  setatt_fail(pname, sds_name, attr_nm_units);
86 
87  /*****************************************/
88  strcpy(sds_name, "longitude");
89  if ((sdsid = create_sds(sdfid, sds_name, DFNT_FLOAT32, rank, dims, vid,
90  (VOIDP) l1_data.ctl_pt_lon)) < 0)
91  csds_fail(pname, sds_name);
92 
93  if ((iret = set_dim_names(sdsid, num_scn_ln, num_pix_ctl, NULL)) < 0)
94  setdim_fail(pname, sds_name);
95 
96  strcpy(sds_attr, "Longitude");
97  if ((iret = SDsetattr(sdsid, attr_nm_long, DFNT_CHAR, strlen(sds_attr) + 1,
98  (VOIDP) sds_attr)) < 0)
99  setatt_fail(pname, sds_name, attr_nm_long);
100 
101  strcpy(sds_attr, "(-180.,180.)");
102  if ((iret = SDsetattr(sdsid, attr_nm_valid, DFNT_CHAR, strlen(sds_attr) + 1,
103  (VOIDP) sds_attr)) < 0)
104  setatt_fail(pname, sds_name, attr_nm_valid);
105 
106  strcpy(sds_attr, "degrees");
107  if ((iret = SDsetattr(sdsid, attr_nm_units, DFNT_CHAR, strlen(sds_attr) + 1,
108  (VOIDP) sds_attr)) < 0)
109  setatt_fail(pname, sds_name, attr_nm_units);
110 
111  /*****************************************/
112  rank = 1;
113  dims[0] = gattr.scan_lines;
114 
115  strcpy(sds_name, "cntl_pt_rows");
116  if ((sdsid = create_sds(sdfid, sds_name, DFNT_INT32, rank, dims, vid,
117  (VOIDP) l1_data.ctl_pt_rows)) < 0)
118  csds_fail(pname, sds_name);
119 
120  if ((iret = set_dim_names(sdsid, num_scn_ln, NULL, NULL)) < 0)
121  setdim_fail(pname, sds_name);
122 
123  strcpy(sds_attr, "Scan Control Points");
124  if ((iret = SDsetattr(sdsid, attr_nm_long, DFNT_CHAR, strlen(sds_attr) + 1,
125  (VOIDP) sds_attr)) < 0)
126  setatt_fail(pname, sds_name, attr_nm_long);
127 
128  strcpy(sds_attr, "none");
129  if ((iret = SDsetattr(sdsid, attr_nm_units, DFNT_CHAR, strlen(sds_attr) + 1,
130  (VOIDP) sds_attr)) < 0)
131  setatt_fail(pname, sds_name, attr_nm_units);
132 
133  /*****************************************/
134  dims[0] = gattr.n_ctl_pt;
135 
136  strcpy(sds_name, "cntl_pt_cols");
137  if ((sdsid = create_sds(sdfid, sds_name, DFNT_INT32, rank, dims, vid,
138  (VOIDP) l1_data.ctl_pt_cols)) < 0)
139  csds_fail(pname, sds_name);
140 
141  if ((iret = set_dim_names(sdsid, num_pix_ctl, NULL, NULL)) < 0)
142  setdim_fail(pname, sds_name);
143 
144  strcpy(sds_attr, "Control Points for Columns");
145  if ((iret = SDsetattr(sdsid, attr_nm_long, DFNT_CHAR, strlen(sds_attr) + 1,
146  (VOIDP) sds_attr)) < 0)
147  setatt_fail(pname, sds_name, attr_nm_long);
148 
149  strcpy(sds_attr, "none");
150  if ((iret = SDsetattr(sdsid, attr_nm_units, DFNT_CHAR, strlen(sds_attr) + 1,
151  (VOIDP) sds_attr)) < 0)
152  setatt_fail(pname, sds_name, attr_nm_units);
153  /*
154  * orb_vec
155  */
156  rank = 2;
157  dims[0] = gattr.scan_lines;
158  dims[1] = 3;
159 
160  strcpy(sds_name, "orb_vec");
161  if ((sdsid = create_sds(sdfid, sds_name, DFNT_FLOAT32, rank, dims, vid,
162  (VOIDP) l1_data.orb_vec)) < 0)
163  csds_fail(pname, sds_name);
164 
165  if ((iret = set_dim_names(sdsid, num_scn_ln, "3", NULL)) < 0)
166  setdim_fail(pname, sds_name);
167 
168  strcpy(sds_attr, "Orbit position vector at scan line time");
169  if ((iret = SDsetattr(sdsid, attr_nm_long, DFNT_CHAR, strlen(sds_attr) + 1,
170  (VOIDP) sds_attr)) < 0)
171  setatt_fail(pname, sds_name, attr_nm_long);
172 
173  strcpy(sds_attr, "(-7200.,7200.)");
174  if ((iret = SDsetattr(sdsid, attr_nm_valid, DFNT_CHAR, strlen(sds_attr) + 1,
175  (VOIDP) sds_attr)) < 0)
176  setatt_fail(pname, sds_name, attr_nm_valid);
177 
178  strcpy(sds_attr, "kilometers");
179  if ((iret = SDsetattr(sdsid, attr_nm_units, DFNT_CHAR, strlen(sds_attr) + 1,
180  (VOIDP) sds_attr)) < 0)
181  setatt_fail(pname, sds_name, attr_nm_units);
182  /*
183  * gain
184  */
185  rank = 1;
186  dims[0] = gattr.scan_lines;
187 
188  strcpy(sds_name, "gain");
189  if ((sdsid = create_sds(sdfid, sds_name, DFNT_INT16, rank, dims, vid,
190  (VOIDP) l1_data.gain)) < 0)
191  csds_fail(pname, sds_name);
192 
193  if ((iret = set_dim_names(sdsid, num_scn_ln, NULL, NULL)) < 0)
194  setdim_fail(pname, sds_name);
195 
196  strcpy(sds_attr, "Gain setting at scan line time");
197  if ((iret = SDsetattr(sdsid, attr_nm_long, DFNT_CHAR, strlen(sds_attr) + 1,
198  (VOIDP) sds_attr)) < 0)
199  setatt_fail(pname, sds_name, attr_nm_long);
200 
201  strcpy(sds_attr, "( 1, 4 )");
202  if ((iret = SDsetattr(sdsid, attr_nm_valid, DFNT_CHAR, strlen(sds_attr) + 1,
203  (VOIDP) sds_attr)) < 0)
204  setatt_fail(pname, sds_name, attr_nm_valid);
205 
206  strcpy(sds_attr, "none");
207  if ((iret = SDsetattr(sdsid, attr_nm_units, DFNT_CHAR, strlen(sds_attr) + 1,
208  (VOIDP) sds_attr)) < 0)
209  setatt_fail(pname, sds_name, attr_nm_units);
210  /*
211  * slope and intercept
212  */
213  rank = 2;
214  dims[0] = gattr.scan_lines;
215  dims[1] = 6;
216 
217  strcpy(sds_name, "slope");
218  if ((sdsid = create_sds(sdfid, sds_name, DFNT_FLOAT32, rank, dims, vid,
219  (VOIDP) l1_data.slope)) < 0)
220  csds_fail(pname, sds_name);
221 
222  if ((iret = set_dim_names(sdsid, num_scn_ln, "6", NULL)) < 0)
223  setdim_fail(pname, sds_name);
224 
225  strcpy(sds_attr, "Calibration slope at scan line time");
226  if ((iret = SDsetattr(sdsid, attr_nm_long, DFNT_CHAR, strlen(sds_attr) + 1,
227  (VOIDP) sds_attr)) < 0)
228  setatt_fail(pname, sds_name, attr_nm_long);
229 
230  strcpy(sds_attr, "( -20., 20. )");
231  if ((iret = SDsetattr(sdsid, attr_nm_valid, DFNT_CHAR, strlen(sds_attr) + 1,
232  (VOIDP) sds_attr)) < 0)
233  setatt_fail(pname, sds_name, attr_nm_valid);
234 
235  strcpy(sds_attr, "mW cm^-2 um^-1 sr^-1 count^-1");
236  if ((iret = SDsetattr(sdsid, attr_nm_units, DFNT_CHAR, strlen(sds_attr) + 1,
237  (VOIDP) sds_attr)) < 0)
238  setatt_fail(pname, sds_name, attr_nm_units);
239  /* */
240  strcpy(sds_name, "intercept");
241  if ((sdsid = create_sds(sdfid, sds_name, DFNT_FLOAT32, rank, dims, vid,
242  (VOIDP) l1_data.intercept)) < 0)
243  csds_fail(pname, sds_name);
244 
245  if ((iret = set_dim_names(sdsid, num_scn_ln, "6", NULL)) < 0)
246  setdim_fail(pname, sds_name);
247 
248  strcpy(sds_attr, "Calibration intercept at scan line time");
249  if ((iret = SDsetattr(sdsid, attr_nm_long, DFNT_CHAR, strlen(sds_attr) + 1,
250  (VOIDP) sds_attr)) < 0)
251  setatt_fail(pname, sds_name, attr_nm_long);
252 
253  strcpy(sds_attr, "( -20., 20. )");
254  if ((iret = SDsetattr(sdsid, attr_nm_valid, DFNT_CHAR, strlen(sds_attr) + 1,
255  (VOIDP) sds_attr)) < 0)
256  setatt_fail(pname, sds_name, attr_nm_valid);
257 
258  strcpy(sds_attr, "mW cm^-2 um^-1 sr^-1");
259  if ((iret = SDsetattr(sdsid, attr_nm_units, DFNT_CHAR, strlen(sds_attr) + 1,
260  (VOIDP) sds_attr)) < 0)
261  setatt_fail(pname, sds_name, attr_nm_units);
262  /*
263  * att_ang - attitude (yaw, roll, pitch )
264  */
265  dims[1] = 3;
266 
267  strcpy(sds_name, "att_ang");
268  if ((sdsid = create_sds(sdfid, sds_name, DFNT_FLOAT32, rank, dims, vid,
269  (VOIDP) l1_data.att_ang)) < 0)
270  csds_fail(pname, sds_name);
271 
272  if ((iret = set_dim_names(sdsid, num_scn_ln, "3", NULL)) < 0)
273  setdim_fail(pname, sds_name);
274 
275  strcpy(sds_attr, "Computed yaw, roll, pitch at scan line time");
276  if ((iret = SDsetattr(sdsid, attr_nm_long, DFNT_CHAR, strlen(sds_attr) + 1,
277  (VOIDP) sds_attr)) < 0)
278  setatt_fail(pname, sds_name, attr_nm_long);
279 
280  strcpy(sds_attr, "( -180., 180. )");
281  if ((iret = SDsetattr(sdsid, attr_nm_valid, DFNT_CHAR, strlen(sds_attr) + 1,
282  (VOIDP) sds_attr)) < 0)
283  setatt_fail(pname, sds_name, attr_nm_valid);
284 
285  strcpy(sds_attr, "degrees");
286  if ((iret = SDsetattr(sdsid, attr_nm_units, DFNT_CHAR, strlen(sds_attr) + 1,
287  (VOIDP) sds_attr)) < 0)
288  setatt_fail(pname, sds_name, attr_nm_units);
289 
290  /*
291  * pos_err - position error in orb_vec orbit, due to interpolation error
292  */
293  rank = 1;
294 
295  strcpy(sds_name, "pos_err");
296  if ((sdsid = create_sds(sdfid, sds_name, DFNT_FLOAT32, rank, dims, vid,
297  (VOIDP) l1_data.pos_err)) < 0)
298  csds_fail(pname, sds_name);
299 
300  if ((iret = set_dim_names(sdsid, num_scn_ln, NULL, NULL)) < 0)
301  setdim_fail(pname, sds_name);
302 
303  strcpy(sds_attr, "Orbit position error");
304  if ((iret = SDsetattr(sdsid, attr_nm_long, DFNT_CHAR, strlen(sds_attr) + 1,
305  (VOIDP) sds_attr)) < 0)
306  setatt_fail(pname, sds_name, attr_nm_long);
307 
308  strcpy(sds_attr, "( -10., 7200.)");
309  if ((iret = SDsetattr(sdsid, attr_nm_valid, DFNT_CHAR, strlen(sds_attr) + 1,
310  (VOIDP) sds_attr)) < 0)
311  setatt_fail(pname, sds_name, attr_nm_valid);
312 
313  strcpy(sds_attr, "meters");
314  if ((iret = SDsetattr(sdsid, attr_nm_units, DFNT_CHAR, strlen(sds_attr) + 1,
315  (VOIDP) sds_attr)) < 0)
316  setatt_fail(pname, sds_name, attr_nm_units);
317 
318  return SUCCEED;
319 }
320 
#define NULL
Definition: decode_rs.h:63
int32 set_czcs_ctl_data(int32 sdfid, int32 vid, gattr_struc gattr, l1_data_struc l1_data)
#define setatt_fail(prog, sds, atr_name)
HDF4 data type of the output SDS Default is DFNT_FLOAT32 Common types used DFNT_INT32
int32 set_dim_names(int32 sds_id, char *d0, char *d1, char *d2)
Definition: set_dim_names.c:29
#define csds_fail(prog, sds)
int32 create_sds(int32 sdfid, char *sdsname, int32 nt, int32 rank, int32 *dims, int32 vid, VOIDP *data)
Definition: create_sds.c:10
HDF4 data type of the output SDS Default is DFNT_FLOAT32 Common types used DFNT_INT16
#define setdim_fail(prog, sds)
Extra metadata that will be written to the HDF4 file l2prod rank
HDF4 data type of the output SDS Default is DFNT_FLOAT32 Common types used DFNT_FLOAT32
How many dimensions is the output array Default is Not sure if anything above will work correctly strcpy(l2prod->title, "no title yet")