OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
get_chl.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <math.h>
3 #include "l12_proto.h"
4 #include "chl.h"
5 
6 
7 float get_chl_ocx(l2str *l2rec, float Rrs[]);
8 
9 float chl_oc2(l2str *l2rec, float Rrs[]) {
10  static int32_t *w = NULL;
11  static float *a = NULL;
12  static int ib1 = -1;
13  static int ib2 = -1;
14 
15  float rat;
16  float Rrs1, Rrs2;
17  float chl = chlbad;
18 
19  if (w == NULL) {
20  w = input->chloc2w;
21  a = input->chloc2c;
22  if (w[0] < 0 || w[1] < 0) {
23  printf("chl_oc2: algorithm coefficients not provided for this sensor.\n");
24  exit(1);
25  }
26  ib1 = bindex_get(w[0]);
27  ib2 = bindex_get(w[1]);
28  if (ib1 < 0 || ib2 < 0) {
29  printf("chl_oc2: incompatible sensor wavelengths for this algorithm\n");
30  exit(1);
31  }
32  }
33 
34  Rrs1 = Rrs[ib1];
35  Rrs2 = Rrs[ib2];
36 
37  if (Rrs1 > 0.0 && Rrs2 > 0.0 && Rrs1 / Rrs2 <= 10.0) {
38  rat = Rrs1 / Rrs2;
39  if (rat > minrat && rat < maxrat) {
40  rat = log10(rat);
41  chl = (float)
42  pow(10.0, (a[0] + rat * (a[1] + rat * (a[2] + rat * (a[3] + rat * a[4])))));
43  chl = (chl > chlmin ? chl : chlmin);
44  chl = (chl < chlmax ? chl : chlmax);
45  }
46  }
47 
48  return (chl);
49 }
50 
51 float chl_oc3(l2str *l2rec, float Rrs[]) {
52  static int32_t *w = NULL;
53  static float *a = NULL;
54  static int ib1 = -1;
55  static int ib2 = -1;
56  static int ib3 = -1;
57 
58  float rat, minRrs;
59  float Rrs1, Rrs2, Rrs3;
60  float chl = chlbad;
61 
62  if (w == NULL) {
63  w = input->chloc3w;
64  a = input->chloc3c;
65  if (w[0] < 0 || w[1] < 0 || w[2] < 0) {
66  printf("chl_oc3: algorithm coefficients not provided for this sensor.\n");
67  exit(1);
68  }
69  ib1 = bindex_get(w[0]);
70  ib2 = bindex_get(w[1]);
71  ib3 = bindex_get(w[2]);
72  if (ib1 < 0 || ib2 < 0 || ib3 < 0) {
73  printf("chl_oc3: incompatible sensor wavelengths for this algorithm\n");
74  exit(1);
75  }
76  }
77 
78  Rrs1 = Rrs[ib1];
79  Rrs2 = Rrs[ib2];
80  Rrs3 = Rrs[ib3];
81 
82  minRrs = MIN(Rrs1, Rrs2);
83 
84  if (Rrs3 > 0.0 && Rrs2 > 0.0 && minRrs > -0.001) {
85  rat = MAX(Rrs1, Rrs2) / Rrs3;
86  if (rat > minrat && rat < maxrat) {
87  rat = log10(rat);
88  chl = (float)
89  pow(10.0, (a[0] + rat * (a[1] + rat * (a[2] + rat * (a[3] + rat * a[4])))));
90  chl = (chl > chlmin ? chl : chlmin);
91  chl = (chl < chlmax ? chl : chlmax);
92  }
93  }
94 
95  return (chl);
96 }
97 
98 float chl_oc3c(l2str *l2rec, float Rrs[]) {
99  static float a[] = {0.2515, -2.3798, 1.5823, -0.6372, -0.5692};
100  static int ib1 = -1;
101  static int ib2 = -1;
102  static int ib3 = -1;
103 
104  float rat, minRrs;
105  float Rrs1, Rrs2, Rrs3;
106  float chl = chlbad;
107 
108  if (ib1 < 0) {
109  ib1 = bindex_get(443);
110  ib2 = bindex_get(490);
111  ib3 = bindex_get_555();
112 
113  if (ib1 < 0 || ib2 < 0 || ib3 < 0) {
114  printf("chl_oc3: incompatible sensor wavelengths for this algorithm\n");
115  exit(1);
116  }
117  }
118 
119  Rrs1 = Rrs[ib1];
120  Rrs2 = Rrs[ib2];
121  Rrs3 = Rrs[ib3];
122 
123  minRrs = MIN(Rrs1, Rrs2);
124 
125  if (Rrs3 > 0.0 && Rrs2 > 0.0 && minRrs > -0.001) {
126  Rrs3 = conv_rrs_to_555(Rrs3, l2rec->l1rec->l1file->fwave[ib3]);
127  rat = MAX(Rrs1, Rrs2) / Rrs3;
128  if (rat > minrat && rat < maxrat) {
129  rat = log10(rat);
130  chl = (float)
131  pow(10.0, (a[0] + rat * (a[1] + rat * (a[2] + rat * (a[3] + rat * a[4])))));
132  chl = (chl > chlmin ? chl : chlmin);
133  chl = (chl < chlmax ? chl : chlmax);
134  }
135  }
136 
137  return (chl);
138 }
139 
140 float chl_oc4(l2str *l2rec, float Rrs[]) {
141  static int32_t *w = NULL;
142  static float *a = NULL;
143  static int ib1 = -1;
144  static int ib2 = -1;
145  static int ib3 = -1;
146  static int ib4 = -1;
147 
148  float rat, minRrs;
149  float Rrs1, Rrs2, Rrs3, Rrs4;
150  float chl = chlbad;
151 
152  if (w == NULL) {
153  w = input->chloc4w;
154  a = input->chloc4c;
155  if (w[0] < 0 || w[1] < 0 || w[2] < 0 || w[3] < 0) {
156  printf("chl_oc4: algorithm coefficients not provided for this sensor.\n");
157  exit(1);
158  }
159  ib1 = bindex_get(w[0]);
160  ib2 = bindex_get(w[1]);
161  ib3 = bindex_get(w[2]);
162  ib4 = bindex_get(w[3]);
163  if (ib1 < 0 || ib2 < 0 || ib3 < 0 || ib4 < 0) {
164  printf("chl_oc4: incompatible sensor wavelengths for this algorithm\n");
165  exit(1);
166  }
167  }
168 
169  Rrs1 = Rrs[ib1];
170  Rrs2 = Rrs[ib2];
171  Rrs3 = Rrs[ib3];
172  Rrs4 = Rrs[ib4];
173 
174  minRrs = MIN(Rrs1, Rrs2);
175 
176  if (Rrs4 > 0.0 && Rrs3 > 0.0 && (Rrs2 > 0.0 || Rrs1 * Rrs2 > 0.0) && minRrs > -0.001) {
177  rat = MAX(MAX(Rrs1, Rrs2), Rrs3) / Rrs4;
178  if (rat > minrat && rat < maxrat) {
179  rat = log10(rat);
180  chl = (float)
181  pow(10.0, (a[0] + rat * (a[1] + rat * (a[2] + rat * (a[3] + rat * a[4])))));
182  chl = (chl > chlmin ? chl : chlmin);
183  chl = (chl < chlmax ? chl : chlmax);
184  }
185  }
186 
187  return (chl);
188 }
189 
190 float chl_hu(l2str *l2rec, float Rrs[]) {
191  static float w[] = {443, 555, 670};
192  static float a[] = {-0.4287, 230.47};
193  static int ib1 = -1;
194  static int ib2 = -1;
195  static int ib3 = -1;
196 
197  float ci;
198  float Rrs1, Rrs2, Rrs3;
199  float chl = chlbad;
200 
201  if (ib1 == -1) {
202 
203  ib1 = bindex_get(443);
204  ib2 = bindex_get_555();
205  ib3 = bindex_get(670);
206  if (ib3 < 0) ib3 = bindex_get(665);
207  if (ib3 < 0) ib3 = bindex_get(655);
208  if (ib3 < 0) ib3 = bindex_get(620); // for OCM2: need to add band correction
209  if (ib1 < 0 || ib2 < 0 || ib3 < 0) {
210  printf("chl_hu: incompatible sensor wavelengths for this algorithm\n");
211  printf("chl_hu: %d %d %d\n", ib1, ib2, ib3);
212  exit(1);
213  } else {
214  printf("chl_hu: using %7.2f %7.2f %7.2f\n", l2rec->l1rec->l1file->fwave[ib1], l2rec->l1rec->l1file->fwave[ib2], l2rec->l1rec->l1file->fwave[ib3]);
215  }
216  }
217 
218  Rrs1 = Rrs[ib1];
219  Rrs2 = Rrs[ib2];
220  Rrs3 = Rrs[ib3];
221 
222  // If all Rrs are bad then the pixel is masked, so return badval. For
223  // any other case, we want to return a valid value so that OCI can decide.
224 
225  if (Rrs3 > BAD_FLT + 1 && Rrs2 > BAD_FLT + 1 && Rrs1 > BAD_FLT + 1) {
226 
227  // The chl index (ci) is negative line height; ci=0 will yield chl > 0.3,
228  // where the algorithm is not considered valid, and not used in the
229  // merged algorithm.
230 
231  ci = 0;
232 
233  // We require that the red channel Rrs is valid (may be slightly negative
234  // in clear water due to noise), and that Rrs in blue and green be positive.
235  // Cases of negative blue radiance are likely high chl anyway.
236 
237  if (Rrs3 > BAD_FLT + 1 && Rrs2 > 0.0 && Rrs1 > 0.0) {
238  // shift Rrs2 to 555
239  Rrs2 = conv_rrs_to_555(Rrs2, l2rec->l1rec->l1file->fwave[ib2]);
240  // compute index
241  ci = MIN(Rrs2 - (Rrs1 + (w[1] - w[0]) / (w[2] - w[0])*(Rrs3 - Rrs1)), 0.0);
242  // index should be negative in algorithm-validity range
243  }
244  chl = (float) pow(10.0, a[0] + a[1] * ci);
245  chl = (chl > chlmin ? chl : chlmin);
246  chl = (chl < chlmax ? chl : chlmax);
247  }
248 
249  return (chl);
250 }
251 
252 float chl_oci(l2str *l2rec, float Rrs[]) {
253  static float t1 = 0.25;
254  static float t2 = 0.35;
255 
256  float chl1 = chlbad;
257  float chl2 = chlbad;
258  float chl = chlbad;
259 
260  chl1 = chl_hu(l2rec, Rrs);
261  if (chl1 <= t1)
262  chl = chl1;
263  else {
264  chl2 = get_chl_ocx(l2rec, Rrs);
265  if (chl2 > 0.0) {
266  if (chl1 >= t2)
267  chl = chl2;
268  else {
269  chl = chl1 * (t2 - chl1) / (t2 - t1)
270  + chl2 * (chl1 - t1) / (t2 - t1);
271  }
272  }
273  }
274 
275  return (chl);
276 }
277 
278 float chl_cdr(l2str *l2rec, float Rrs[]) {
279  static float chl_lo = 0.35;
280  static float chl_hi = 20.0;
281 
282  static float c_modisa[6] = {1.030e+00, 7.668e-02, 4.152e-01, 5.335e-01, -5.040e-01, 1.265e-01};
283  static float c_meris [6] = {1.0, 0.0, 0.0, 0.0, 0.0};
284  static float c_null [6] = {1.0, 0.0, 0.0, 0.0, 0.0};
285 
286  float chl1 = chlbad;
287  float chl2 = chlbad;
288  float lchl = chlbad;
289  float chl = chlbad;
290  float *c;
291  float rat;
292 
293  chl1 = get_default_chl(l2rec, Rrs);
294 
295  if (chl1 > 0.0) {
296  switch (l2rec->l1rec->l1file->sensorID) {
297  case MODISA:
298  c = c_modisa;
299  break;
300  case MERIS:
301  c = c_meris;
302  break;
303  case SEAWIFS:
304  case OCTS:
305  case OCM1:
306  case OCM2:
307  case MOS:
308  case HICO:
309  case MODIST:
310  case CZCS:
311  case OSMI:
312  case VIIRSN:
313  case VIIRSJ1:
314  case VIIRSJ2:
315  case OCRVC:
316  case GOCI:
317  c = c_null;
318  break;
319  default:
320  printf("%s Line %d: need a default chlorophyll algorithm for this sensor\n",
321  __FILE__, __LINE__);
322  exit(1);
323  break;
324  }
325 
326  chl = MAX(MIN(chl_hi, chl1), chl_lo);
327  lchl = log10(chl);
328  rat = c[0] + lchl * (c[1] + lchl * c[2] + lchl * (c[3] + lchl * (c[4] + lchl * c[5])));
329 
330  chl2 = chl1 / rat;
331  }
332 
333  return (chl2);
334 }
335 
336 /*======================================================================*
337  * *
338  * Implementation of ABI Chlorophyll (Shanmugam, 2011) *
339  * A new bio-optical algorithm for the remote sensing of algal blooms *
340  * in complex ocean waters *
341  * *
342  * Journal of Geophysical Research, 116(C4), C04016. *
343  * doi:10.1029/2010JC006796 *
344  *======================================================================*/
345 
346 float chl_abi(l2str *l2rec, float nLw[]) {
347  float chl1, chl2, chl3, chl4, chl5, chl6, chl7, Z;
348  float nLw1, nLw2, nLw3;
349  float chl = chlbad;
350  static int ib1 = -1, ib2 = -1, ib3 = -1;
351 
352  if (ib1 == -1) {
353  ib1 = bindex_get(443);
354 
355  ib2 = bindex_get(488);
356  if (ib2 < 0) ib2 = bindex_get(490);
357 
358  ib3 = bindex_get(547);
359  if (ib3 < 0) ib3 = bindex_get(555);
360 
361  if (ib1 < 0 || ib2 < 0 || ib3 < 0) {
362  printf("chl_abi is not compatible with this sensor\n");
363  exit(1);
364  } else {
365  printf("Calculating chl_abi using %7.2f %7.2f %7.2f\n",
366  l2rec->l1rec->l1file->fwave[ib1],
367  l2rec->l1rec->l1file->fwave[ib2],
368  l2rec->l1rec->l1file->fwave[ib3]);
369  }
370  }
371 
372 
373 
374 
375  nLw1 = nLw[ib1]; //443nm
376  nLw2 = nLw[ib2]; //488nm
377  nLw3 = nLw[ib3]; //547nm
378  if (nLw1 >-10.0) { //condition to avoid negative nLw
379  chl1 = ((nLw2 / nLw3) - nLw1) / ((nLw2 / nLw3) + nLw1);
380  chl2 = pow(10.0, chl1);
381  chl3 = (((nLw1 * nLw2) / 47.0)*((nLw1 * nLw2) / (nLw3 * nLw3)));
382  chl4 = chl2*chl3;
383  chl5 = 0.1403 * (pow(chl4, (-0.572)));
384  chl6 = pow(chl5, 1.056);
385  Z = pow(98, 1.056);
386  chl7 = chl6 / (chl6 + Z);
387  chl = 125.0 * chl7;
388  }
389  return (chl);
390 }
391 
392 float get_default_chl(l2str *l2rec, float Rrs[]) {
393 
394  switch (l2rec->l1rec->l1file->sensorID) {
395  case MOS:
396  return (chl_oc4(l2rec, Rrs));
397  case OSMI:
398  return (chl_oc3(l2rec, Rrs));
399  case L5TM:
400  case L7ETMP:
401  case MISR:
402  return (chl_oc2(l2rec, Rrs));
403  default:
404  return (chl_oci(l2rec, Rrs));
405  }
406 }
407 
408 float get_chl_ocx(l2str *l2rec, float Rrs[]) {
409  float chl;
410 
411  chl = chlbad;
412 
413  switch (l2rec->l1rec->l1file->sensorID) {
414  case SEAWIFS:
415  case OCTS:
416  case OCM1:
417  case OCM2:
418  case MOS:
419  case MERIS:
420  case HICO:
421  case OCIA:
422  case OCI:
423  case OCIS:
424  case HAWKEYE:
425  case AVIRIS:
426  case OLCIS3A:
427  case OLCIS3B:
428  chl = chl_oc4(l2rec, Rrs);
429  break;
430  case MODIST:
431  case MODISA:
432  case CZCS:
433  case OSMI:
434  case VIIRSN:
435  case VIIRSJ1:
436  case VIIRSJ2:
437  case OCRVC:
438  case GOCI:
439  case OLIL8:
440  case OLIL9:
441  case PRISM:
442  case SGLI:
443  case MSIS2A:
444  case MSIS2B:
445  chl = chl_oc3(l2rec,Rrs);
446  break;
447  case L5TM:
448  case L7ETMP:
449  case MISR:
450  chl = chl_oc2(l2rec,Rrs);
451  break;
452  default:
453  printf("%s Line %d: need a default chlorophyll algorithm for this sensor\n",
454  __FILE__,__LINE__);
455  exit(1);
456  break;
457  }
458 
459  return (chl);
460 }
461 
462 void get_chl(l2str *l2rec, int prodnum, float prod[]) {
463  int32_t ip;
464  int32_t ipb;
465 
466  int32_t nbands = l2rec->l1rec->l1file->nbands;
467  int32_t npix = l2rec->l1rec->npix;
468 
469  /* */
470  /* Compute desired products at each pixel */
471  /* */
472  for (ip = 0; ip < npix; ip++) {
473 
474  ipb = ip*nbands;
475 
476  switch (prodnum) {
477 
478  case DEFAULT_CHL:
479  prod[ip] = get_default_chl(l2rec, &l2rec->Rrs[ipb]);
480  break;
481  case CAT_chl_oc2:
482  prod[ip] = chl_oc2(l2rec, &l2rec->Rrs[ipb]);
483  break;
484  case CAT_chl_oc3:
485  prod[ip] = chl_oc3(l2rec, &l2rec->Rrs[ipb]);
486  break;
487  case CAT_chl_oc3c:
488  prod[ip] = chl_oc3c(l2rec, &l2rec->Rrs[ipb]);
489  break;
490  case CAT_chl_oc4:
491  prod[ip] = chl_oc4(l2rec, &l2rec->Rrs[ipb]);
492  break;
493  case CAT_chl_hu:
494  prod[ip] = chl_hu(l2rec, &l2rec->Rrs[ipb]);
495  break;
496  case CAT_chl_oci:
497  prod[ip] = chl_oci(l2rec, &l2rec->Rrs[ipb]);
498  break;
499  case CAT_chl_cdr:
500  prod[ip] = chl_cdr(l2rec, &l2rec->Rrs[ipb]);
501  break;
502  case CAT_chl_abi:
503  prod[ip] = chl_abi(l2rec, &l2rec->nLw[ipb]);
504  break;
505  default:
506  printf("Error: %s : Unknown product specifier: %d\n", __FILE__, prodnum);
507  exit(FATAL_ERROR);
508  break;
509  }
510 
511  if (prod[ip] == chlbad)
512  l2rec->l1rec->flags[ip] |= PRODFAIL;
513  }
514 }
515 
#define MAX(A, B)
Definition: swl0_utils.h:26
#define MIN(x, y)
Definition: rice.h:169
#define OLCIS3A
Definition: sensorDefs.h:32
float chl_oc3c(l2str *l2rec, float Rrs[])
Definition: get_chl.c:98
#define DEFAULT_CHL
Definition: l12_parms.h:41
#define SGLI
Definition: sensorDefs.h:33
#define OCI
Definition: sensorDefs.h:42
#define MSIS2B
Definition: sensorDefs.h:38
#define CAT_chl_oc3c
Definition: l2prod.h:256
#define OSMI
Definition: sensorDefs.h:16
#define NULL
Definition: decode_rs.h:63
#define OLIL9
Definition: sensorDefs.h:45
#define CAT_chl_hu
Definition: l2prod.h:250
#define VIIRSN
Definition: sensorDefs.h:23
#define CAT_chl_cdr
Definition: l2prod.h:284
#define L5TM
Definition: sensorDefs.h:35
#define MERIS
Definition: sensorDefs.h:22
float chl_hu(l2str *l2rec, float Rrs[])
Definition: get_chl.c:190
#define MODIST
Definition: sensorDefs.h:18
#define CAT_chl_oc2
Definition: l2prod.h:32
#define OCIA
Definition: sensorDefs.h:29
#define OLIL8
Definition: sensorDefs.h:27
float chl_oc4(l2str *l2rec, float Rrs[])
Definition: get_chl.c:140
float chl_abi(l2str *l2rec, float nLw[])
Definition: get_chl.c:346
instr * input
float chl_cdr(l2str *l2rec, float Rrs[])
Definition: get_chl.c:278
int bindex_get(int32_t wave)
Definition: windex.c:45
#define HAWKEYE
Definition: sensorDefs.h:39
void get_chl(l2str *l2rec, int prodnum, float prod[])
Definition: get_chl.c:462
#define CAT_chl_oc4
Definition: l2prod.h:49
float chl_oc2(l2str *l2rec, float Rrs[])
Definition: get_chl.c:9
#define OCIS
Definition: sensorDefs.h:43
#define FATAL_ERROR
Definition: swl0_parms.h:5
#define PRISM
Definition: sensorDefs.h:31
float chl_oci(l2str *l2rec, float Rrs[])
Definition: get_chl.c:252
#define CAT_chl_oc3
Definition: l2prod.h:72
#define AVIRIS
Definition: sensorDefs.h:30
float get_chl_ocx(l2str *l2rec, float Rrs[])
Definition: get_chl.c:408
#define MOS
Definition: sensorDefs.h:13
#define MISR
Definition: sensorDefs.h:40
#define L7ETMP
Definition: sensorDefs.h:36
#define BAD_FLT
Definition: jplaeriallib.h:19
#define OCTS
Definition: sensorDefs.h:14
float get_default_chl(l2str *l2rec, float Rrs[])
Definition: get_chl.c:392
#define MSIS2A
Definition: sensorDefs.h:34
#define CAT_chl_abi
Definition: l2prod.h:320
int32_t nbands
#define OCM1
Definition: sensorDefs.h:20
float chl_oc3(l2str *l2rec, float Rrs[])
Definition: get_chl.c:51
#define CZCS
Definition: sensorDefs.h:17
#define CAT_chl_oci
Definition: l2prod.h:254
#define VIIRSJ2
Definition: sensorDefs.h:44
#define OLCIS3B
Definition: sensorDefs.h:41
no change in intended resolving MODur00064 Corrected handling of bad ephemeris attitude resolving resolving GSFcd00179 Corrected handling of fill values for[Sensor|Solar][Zenith|Azimuth] resolving MODxl01751 Changed to validate LUT version against a value retrieved from the resolving MODxl02056 Changed to calculate Solar Diffuser angles without adjustment for estimated post launch changes in the MODIS orientation relative to incidentally resolving defects MODxl01766 Also resolves MODxl01947 Changed to ignore fill values in SCI_ABNORM and SCI_STATE rather than treating them as resolving MODxl01780 Changed to use spacecraft ancillary data to recognise when the mirror encoder data is being set by side A or side B and to change calculations accordingly This removes the need for seperate LUTs for Side A and Side B data it makes the new LUTs incompatible with older versions of the and vice versa Also resolves MODxl01685 A more robust GRing algorithm is being which will create a non default GRing anytime there s even a single geolocated pixel in a granule Removed obsolete messages from seed as required for compatibility with version of the SDP toolkit Corrected test output file names to end in per delivery and then split off a new MYD_PR03 pcf file for Aqua Added AssociatedPlatformInstrumentSensor to the inventory metadata in MOD01 mcf and MOD03 mcf Created new versions named MYD01 mcf and MYD03 where AssociatedPlatformShortName is rather than Terra The program itself has been changed to read the Satellite Instrument validate it against the input L1A and LUT and to use it determine the correct files to retrieve the ephemeris and attitude data from Changed to produce a LocalGranuleID starting with MYD03 if run on Aqua data Added the Scan Type file attribute to the Geolocation copied from the L1A and attitude_angels to radians rather than degrees The accumulation of Cumulated gflags was moved from GEO_validate_earth_location c to GEO_locate_one_scan c
Definition: HISTORY.txt:464
#define HICO
Definition: sensorDefs.h:25
#define OCRVC
Definition: sensorDefs.h:24
@ PRODFAIL
#define SEAWIFS
Definition: sensorDefs.h:12
PGE01 indicating that PGE02 PGE01 V6 for and PGE01 V2 for MOD03 were used to produce the granule By convention adopted in all MODIS Terra PGE02 code versions are The fourth digit of the PGE02 version denotes the LUT version used to produce the granule The source of the metadata environment variable ProcessingCenter was changed from a QA LUT value to the Process Configuration A sign used in error in the second order term was changed to a
Definition: HISTORY.txt:424
#define MODISA
Definition: sensorDefs.h:19
#define VIIRSJ1
Definition: sensorDefs.h:37
int npix
Definition: get_cmp.c:27
#define OCM2
Definition: sensorDefs.h:21
int bindex_get_555(void)
Definition: windex.c:57
#define GOCI
Definition: sensorDefs.h:26
float conv_rrs_to_555(float Rrs, float wave)
Definition: convert_band.c:17