NASA Logo
Ocean Color Science Software

ocssw V2022
l1agen_oci.h
Go to the documentation of this file.
1 #ifndef _L1AGEN_OCI_H_
2 #define _L1AGEN_OCI_H_
3 
4 #include <stdint.h>
5 #include <fstream>
6 #include <timeutils.h>
7 #include <netcdf>
8 
9 #include "common.h"
10 
11 #define PBUFFER_SIZE 32768
12 #define ANCSIZE 104
13 #define TLMSIZE 3200
14 // Chunking the arrays
15 #define CHUNK_CACHE_SIZE 96 * 1024 * 1024 // 32MiB of cache memory.
16 #define CHUNK_CACHE_NELEMS 251
17 #define CHUNK_CACHE_PREEMPTION 1
18 #define CHUNKBANDS 36
19 #define CHUNKPIXELS 256
20 #define CHUNKLINES 128
21 // Do something like this
22 // vector<size_t> chunkVec{CHUNKBANDS,CHUNKPIXELS,CHUNKLINES};
23 // for dimensions less than these defaults, fix it to the dimension, e.g.:
24 // if (dimBands < CHUNKBANDS)
25 // chunkVec[0] = dimBands;
26 
27 const int16_t SWIR_LOFF_DEFAULT[9] = {-16, 80, 64, 0, -16, 64, 0, 80, 96};
28 const int16_t SWIR_LOFF_ETU[9] = {80, 88, 72, 64, 80, 72, 0, 0, 0};
29 
30 // From: https://stackoverflow.com/questions/2782725/
31 // converting-float-values-from-big-endian-to-little-endian
32 float ReverseFloat(const float inFloat) {
33  float retVal;
34  char *floatToConvert = (char *)&inFloat;
35  char *returnFloat = (char *)&retVal;
36 
37  // swap the bytes into a temporary buffer
38  returnFloat[0] = floatToConvert[3];
39  returnFloat[1] = floatToConvert[2];
40  returnFloat[2] = floatToConvert[1];
41  returnFloat[3] = floatToConvert[0];
42 
43  return retVal;
44 }
45 
46 typedef struct {
47  int32_t iyear;
48  int32_t iday;
49  double sec;
50 } time_struct;
51 
52 class l1aFile {
53  netCDF::NcFile *l1afile;
54 
55  std::string fileName;
56 
57  int ngrps;
58  int ndims;
59 
60  netCDF::NcDim ncDims[1000];
61  netCDF::NcGroup ncGrps[10];
62 
63  public:
64  l1aFile();
65  ~l1aFile();
66 
67  netCDF::NcFile *ncfile() {
68  return l1afile;
69  }
70 
72  int apktsize;
73  int bpktsize;
74  int EV_APIDs;
75 
76  int createl1(char *l1_filename, uint16_t maxsc, uint16_t ncps, uint16_t nbbs, uint16_t nrbs,
77  uint16_t nsps, uint16_t ndcs);
78 
79  int parseDims(std::string dimString, std::vector<netCDF::NcDim> &varDims);
80 
81  int write_oci_science_data(uint32_t isc, uint16_t nbbs, uint16_t nrbs, uint16_t nswb, uint16_t ncps,
82  uint16_t nsps, uint16_t **bsci, uint16_t **rsci, uint32_t **ssci,
83  int8_t *sfrms);
84 
86  std::string swir_loff_set, std::string outlist, std::string outfile, std::string doi,
87  std::string pversion, std::string isSPW);
88 
89  int write_oci_cal_data(uint32_t isc, uint16_t nbbs, uint16_t nrbs, uint16_t nswb, uint16_t ndcs,
90  uint16_t ndss, uint16_t *dark_b, uint16_t *dark_r, uint32_t *dark_s,
91  int8_t *sdfrms);
92 
93  int write_oci_scan_metadata(uint32_t isc, uint8_t *ancdata, uint8_t *seqerr, int8_t *linerr,
94  int32_t *spinID, time_struct &starttime);
95 
97  std::string sdir, std::string edir, uint32_t isc, short dtype,
98  uint16_t smode, uint16_t cdsmode, std::ofstream &fout);
99 
100  int write_oci_ancil_data(uint32_t isc, uint8_t *ancdata);
101 
102  int write_oci_tlm_data(itab *itable, uint32_t ntlm, uint8_t (*tlmdata)[TLMSIZE], int32_t *spinID,
103  uint16_t &cdsmode, uint32_t isc, const time_struct &starttime);
105  int close();
106 };
107 
108 int make_oci_line_index(itab *itable, int16_t *cindex, int16_t *sindex, int16_t *cdindex, int16_t *sdindex,
109  int16_t *swir_loff);
110 
111 int unpack_oci_sci(uint32_t npkts, int32_t spin, uint16_t ncps, uint16_t nsps, uint16_t msps,
112  uint16_t &nbands, uint16_t btaps[16], uint16_t rtaps[16], uint8_t (*pbuffer)[PKTSIZE],
113  uint16_t **bbands, uint16_t **rbands, uint32_t **sbands, int16_t *blines, int16_t *rlines,
114  int16_t *slines, uint16_t &btype, uint16_t bagg[16], uint16_t &rtype, uint16_t ragg[16],
115  int8_t *sfrm, int &iret);
116 
117 int unpack_ccd_packet(uint8_t *packet, uint16_t btaps[16], uint16_t rtaps[16], uint16_t &ccdid,
118  uint32_t &line, uint16_t &dtype, uint16_t &iagg, uint16_t jagg[16], uint16_t &nbands,
119  uint16_t **ccddata, uint16_t ossdata[16]);
120 
121 int check_load_oci_data(short dtype, uint16_t ncps, uint16_t nsps, uint16_t ndcs, uint16_t ndss,
122  uint16_t nbbs, uint16_t nrbs, uint16_t nswb, int16_t *cindex, int16_t *sindex,
123  int16_t *cdindex, int16_t *sdindex, uint16_t **bbands, uint16_t **rbands,
124  uint32_t **sbands, int16_t *blines, int16_t *rlines, int16_t *slines, uint16_t **bsci,
125  uint16_t **rsci, uint32_t **ssci, uint16_t **bdark, uint16_t **rdark,
126  uint32_t **sdark, int8_t &linerr, int &icheck);
127 
128 int unpack_swir_packet(uint8_t *packet, int16_t *slines, uint8_t *swirfrm, uint32_t *swirdata);
129 
130 uint8_t check_sum(int32_t nc, uint8_t *dat, uint8_t *chk);
131 
132 int eight20(uint8_t *inbytes, uint32_t *outsamples);
133 
134 int createNCDF(netCDF::NcGroup &ncGrp, const char *sname, const char *lname, const char *standard_name,
135  const char *units, void *fill_value, const char *flag_values, const char *flag_meanings,
136  const char *reference, double low, double high, int nt, std::vector<netCDF::NcDim> &varVec);
137 
138 int find_nav_index(char *hkt_t_start, double usec_l1a_start, double usec_l1a_end, double *nav_t, size_t n_nav,
139  int &ind_start, int &ind_end);
140 
141 inline int expandEnvVar(std::string *sValue) {
142  if ((*sValue).find_first_of("$") == std::string::npos)
143  return 0;
144  std::string::size_type posEndIdx = (*sValue).find_first_of("/");
145  if (posEndIdx == std::string::npos)
146  return 0;
147  const std::string envVar = sValue->substr(1, posEndIdx - 1);
148  char *envVar_str = getenv(envVar.c_str());
149  if (envVar_str == 0x0) {
150  printf("Environment variable: %s not defined.\n", sValue->c_str());
151  exit(1);
152  }
153  *sValue = envVar_str + (*sValue).substr(posEndIdx);
154 
155  return 0;
156 }
157 
159 }
160 
162  delete(l1afile);
163 }
164 
165 #endif // _L1AGEN_OCI_H_
int createNCDF(netCDF::NcGroup &ncGrp, const char *sname, const char *lname, const char *standard_name, const char *units, void *fill_value, const char *flag_values, const char *flag_meanings, const char *reference, double low, double high, int nt, std::vector< netCDF::NcDim > &varVec)
netCDF::NcFile * ncfile()
Definition: l1agen_oci.h:67
int write_navigation(std::string hktlist, time_struct &starttime, time_struct &endtime)
float ReverseFloat(const float inFloat)
Definition: l1agen_oci.h:32
int createl1(char *l1_filename, uint32_t nSC, uint32_t imgWidth, uint32_t imgHeight, uint32_t fndWidth, uint32_t fndHeight)
uint8_t check_sum(int32_t nc, uint8_t *dat, uint8_t *chk)
void spin(double st, double *pos1, double *pos2)
int bpktsize
Definition: l1agen_oci.h:73
int check_load_oci_data(short dtype, uint16_t ncps, uint16_t nsps, uint16_t ndcs, uint16_t ndss, uint16_t nbbs, uint16_t nrbs, uint16_t nswb, int16_t *cindex, int16_t *sindex, int16_t *cdindex, int16_t *sdindex, uint16_t **bbands, uint16_t **rbands, uint32_t **sbands, int16_t *blines, int16_t *rlines, int16_t *slines, uint16_t **bsci, uint16_t **rsci, uint32_t **ssci, uint16_t **bdark, uint16_t **rdark, uint32_t **sdark, int8_t &linerr, int &icheck)
int unpack_oci_sci(uint32_t npkts, int32_t spin, uint16_t ncps, uint16_t nsps, uint16_t msps, uint16_t &nbands, uint16_t btaps[16], uint16_t rtaps[16], uint8_t(*pbuffer)[PKTSIZE], uint16_t **bbands, uint16_t **rbands, uint32_t **sbands, int16_t *blines, int16_t *rlines, int16_t *slines, uint16_t &btype, uint16_t bagg[16], uint16_t &rtype, uint16_t ragg[16], int8_t *sfrm, int &iret)
#define TLMSIZE
Definition: l1agen_oci.h:13
int write_oci_tlm_data(itab *itable, uint32_t ntlm, uint8_t(*tlmdata)[TLMSIZE], int32_t *spinID, uint16_t &cdsmode, uint32_t isc, const time_struct &starttime)
int expandEnvVar(std::string *sValue)
Definition: l1agen_oci.h:141
@ string
const int16_t SWIR_LOFF_DEFAULT[9]
Definition: l1agen_oci.h:27
int write_oci_cal_data(uint32_t isc, uint16_t nbbs, uint16_t nrbs, uint16_t nswb, uint16_t ndcs, uint16_t ndss, uint16_t *dark_b, uint16_t *dark_r, uint32_t *dark_s, int8_t *sdfrms)
int write_oci_scan_metadata(uint32_t isc, uint8_t *ancdata, uint8_t *seqerr, int8_t *linerr, int32_t *spinID, time_struct &starttime)
int find_nav_index(char *hkt_t_start, double usec_l1a_start, double usec_l1a_end, double *nav_t, size_t n_nav, int &ind_start, int &ind_end)
int parseDims(string dimString, int *numDims, int *varDims)
int make_oci_line_index(itab *itable, int16_t *cindex, int16_t *sindex, int16_t *cdindex, int16_t *sdindex, int16_t *swir_loff)
const int16_t SWIR_LOFF_ETU[9]
Definition: l1agen_oci.h:28
int eight20(uint8_t *inbytes, uint32_t *outsamples)
int32_t nbands
dtype
Definition: DDataset.hpp:31
Definition: common.h:10
int EV_APIDs
Definition: l1agen_oci.h:74
int write_processing_control(std::string hktList, std::string l0List, std::string time_start, std::string maxgap, std::string nametag, std::string swir_loff_set, std::string outlist, std::string outfile, std::string doi, std::string pversion, std::string isSPW)
int write_oci_science_data(uint32_t isc, uint16_t nbbs, uint16_t nrbs, uint16_t nswb, uint16_t ncps, uint16_t nsps, uint16_t **bsci, uint16_t **rsci, uint32_t **ssci, int8_t *sfrms)
int write_oci_global_metadata(time_struct &starttime, time_struct &endtime, std::string l1a_name, std::string sdir, std::string edir, uint32_t isc, short dtype, uint16_t smode, uint16_t cdsmode, std::ofstream &fout)
int apktsize
Definition: l1agen_oci.h:72
int unpack_ccd_packet(uint8_t *packet, uint16_t btaps[16], uint16_t rtaps[16], uint16_t &ccdid, uint32_t &line, uint16_t &dtype, uint16_t &iagg, uint16_t jagg[16], uint16_t &nbands, uint16_t **ccddata, uint16_t ossdata[16])
These two strings are used for the product XML output If product_id is not set then prefix is used If the last char of the name_prefix is _ then it is removed If algorithm_id is not set then name_suffix is used If the first char is _ then it is removed l2prod standard_name[0]
#define PKTSIZE
Definition: common.h:8
int unpack_swir_packet(uint8_t *packet, int16_t *slines, uint8_t *swirfrm, uint32_t *swirdata)
std::string platform
Definition: l1agen_oci.h:71
int write_oci_ancil_data(uint32_t isc, uint8_t *ancdata)