NASA Logo
Ocean Color Science Software

ocssw V2022
main_l1agen.c
Go to the documentation of this file.
1 /* ==================================================================== */
2 /* */
3 /* SWl01 - converts seawifs level-0 data to level-1 */
4 /* */
5 /* Synopsis: */
6 /* */
7 /* SWl01 input-L0-filename [output-L1-directory] */
8 /* */
9 /* Description: */
10 /* */
11 /* The program reads the input level-0 file and generates one or */
12 /* more level-1a hdf-formatted output files. One file will be */
13 /* generated for each contiguous scene, and for HRPT data there is */
14 /* only one scene. For stored GAC, there is one scene for each */
15 /* orbit, and stored LAC scenes are broken when the data type */
16 /* changes or the time between frames is greater than n seconds. */
17 /* */
18 /* The output file(s) will be named Syyyydddhhmmss.L1A_*, where the */
19 /* trailing suffix will indicate the HRPT station ID, or the stored */
20 /* data type. Each output L1A file will be accompanied by a meta */
21 /* data file with the same name and a ".meta" extension. */
22 /* */
23 /* The processing steps are as follows: */
24 /* */
25 /* 1 Read through input file and generate index of frame content */
26 /* and quality, as well as scene break points. */
27 /* */
28 /* 2 Read selected frames to accumulate raw GPS telemetry, and */
29 /* fit GPS to orbit model to produce filtered orbit vectors for */
30 /* the time period over which the input data extends. */
31 /* */
32 /* 3 For each scene, read the state-of-health and instrument tlm */
33 /* from the "good" quality frames, and generate navigation for */
34 /* every scan. */
35 /* */
36 /* 4 For each scene, read image data from the "good" quality frames,*/
37 /* combine with the navigation information, and write to L1A file.*/
38 /* */
39 /* Written By: */
40 /* */
41 /* Bryan A. Franz */
42 /* General Sciences Corp. */
43 /* 27 September 1997 */
44 /* */
45 /* =====================================================================*/
46 
47 #include <stdio.h>
48 #include <stdlib.h>
49 #include <fcntl.h>
50 #include <string.h>
51 #include <errno.h>
52 #include <unistd.h>
53 #include <libgen.h>
54 #include <sys/types.h>
55 #include <sys/stat.h>
56 
57 #include "swl0_proto.h"
58 #include "swl1_hdf.h"
59 #include "swl1_netcdf.h"
60 
61 #define CMD_ARGS "mhgt:b:s:e:d:n:f:c"
62 
63 void usage(char *file) {
64  printf("%s %s (%s %s)\n",
65  file, L01VERSION, __DATE__, __TIME__);
66  if (endianess() == 1)
67  printf(" (byte-swapping on)\n");
68  printf("\nUsage: %s [-%s] level0_filename [output-file-name or dir]\n",
69  file, CMD_ARGS);
70  printf(" -m : turn-off metadata file generation.\n");
71  printf(" -h : force hrpt processing.\n");
72  printf(" -g : force GAC processing.\n");
73  printf(" -t n : limit timetags to +/- n-days around data start time.\n");
74  printf(" -b n : maximum number of bit errors allowed per frame (def=50).\n");
75  printf(" -s n : fix gain setting for HRPT (def=0, -1 to determine from telemetry).\n");
76  printf(" -d n : stop-time delta (seconds).\n");
77  printf(" -e file : timing anomaly update filename, GAC only. (def=NULL)\n");
78  printf(" If not provided, no timing error search will be done.\n");
79  printf(" -n environment : runtime environment: seadas or sdps (def=seadas).\n");
80  printf(" -f file : station info file (def=$HRPT_STATION_IDENTIFICATION_FILE).\n");
81  printf(" -c : generate a NetCDF file instead of HDF4.\n");
82 
83  exit(FATAL_ERROR);
84 }
85 
86 
87 /* -------------------------------------------------------------------- */
88 /* main */
89 
90 /* -------------------------------------------------------------------- */
91 int main(int argc, char* argv[]) {
92  swl0indx indx; /* L0 file content and quality */
93  INT16 nscenes = 0; /* Number of scenes in L0 file */
94  swl1rec l1rec[5]; /* Array of L1 records */
95  INT16 nl1rec; /* Number of L1 recs (1 or 5) */
96  INT16 is; /* Scene number */
97  INT16 iframe; /* Minor frame number */
98  INT16 irec; /* Record number */
99  INT32 sceneScanNum; /* Scan number within scene */
100 
101  INT32 norb; /* Number of orbit input recs */
102  orbit_sType orbit; /* Processed orbit data */
103  INT32 nframes; /* Number of input recs for nav*/
104  navctl_sType navctl; /* Navigation control info */
105  navqc_sType navqc; /* Navigation quality info */
106  INT32 nlines; /* Number of navblk recs */
107  tilt_states_sType tiltblk; /* Tilt states per scene */
108  FLOAT32 xnodel; /* Longitude of dscending node */
109  INT32 tnode; /* Time of node crossing */
110 
111  swl0ctl l0ctl; /* Control str for L0 indexing */
112  char *l0file = NULL; /* Input L0 file path */
113  char l1file[FILENAME_MAX]; /* Output L1A file path */
114  char *outpath = "."; /* Output file dir or path */
115  char *metadir; /* Output metafile directory */
116  char metafile[FILENAME_MAX]; /* Output metafile path */
117  char *outdir; /* Output file dir */
118  char *filename; /* Output L1A filename */
119  unsigned char dataType; /* Flag for file naming */
120  struct stat file_stat; /* File status buffer */
121  char *tmppath; /* Temporary file path */
122  int haveFilename = 0; /* If set, don't create fileame*/
123  int wantMeta = 1; /* Generate meta data by def */
124  char proccon[1024] = ""; /* Store command-line sequence */
125  char proclog[1024] = ""; /* Store processing log */
126  char timefile[FILENAME_MAX]; /* time shift filename */
127  char *updfile = NULL;
128  char stationInfoFile[FILENAME_MAX]; /* station filename */
129  int wantNetCDF = 0;
130 
131  int i;
132  INT32 status = 0;
133 
134  /* These are declared static to force solaris to allocate the full */
135  /* space at load time. Otherwise, the code core dumps at startup */
136 
137  static input_sType orbinp[MAXFRAMES]; /* Input for orbit filtering */
138  static input_sType navinp[MAXFRAMES]; /* Input for navigation */
139  static navblk_sType navblk[MAXFRAMES]; /* Processed navigation data */
140  static swl0scene scene[MAXSCENES]; /* Scene index structure */
141 
142  /* Parameters for getopt() */
143  extern int opterr;
144  extern int optind;
145  extern char *optarg;
146  int c;
147 
148  if (argc > 1 && !strcmp(argv[1], "--version")) {
149  printf("%s %s (compiled %s, %s)\n",
150  argv[0], L01VERSION, __DATE__, __TIME__);
151  if (endianess() == 1)
152  printf(" (byte-swapping on)\n");
153  exit(0);
154  }
155 
156  /* */
157  /* Load telemetry decomm commons used by swfnav library */
158  /* */
159 
160  /* MDM Oct. 15, 2004 */
161  /* due to the linker not including these block data routines, I've put
162  them inline in the one place each of them is used.. therefore they
163  are now completely eliminated and Bryan's calls are no longer req'd */
164  /* acs_block_(); */
165  /* ins_block_(); */
166 
167  /* */
168  /* Enable line buffering for better log-file monitoring */
169  /* */
170  setvbuf(stdout, NULL, _IOLBF, 0);
171 
172  /* */
173  /* Log command-line sequence to process-control string */
174  /* */
175  strcpy(proccon, argv[0]);
176  for (i = 1; i < argc; i++) {
177  strcat(proccon, " ");
178  strcat(proccon, argv[i]);
179  }
180 
181 
182  /* */
183  /* Initialize control structure */
184  /* */
185  l0ctl.fileType = -1; /* Get filetype from header */
186  l0ctl.timerangeFactor = 0; /* Get timerange limits from header */
187  l0ctl.maxBitErrors = 50; /* Max bit errors before tossing frame*/
188  l0ctl.gainSetting = 0; /* Forced gain setting, for HRPT only */
189  l0ctl.stopTimeDelta = 1800; /* Stop-time delta (seconds) */
190  l0ctl.env = SEADAS; /* Environment flag */
191  l0ctl.progname = argv[0]; /* Program name for meta */
192  l0ctl.stationInfoFile = NULL; /* File containing station meta info */
193 
194 
195  /* */
196  /* Process command-line arguments */
197  /* */
198  while ((c = getopt(argc, argv, CMD_ARGS)) != EOF) {
199  switch (c) {
200  case 'm':
201  wantMeta = 0;
202  break;
203  case 'b':
204  l0ctl.maxBitErrors = atoi(optarg);
205  break;
206  case 's':
207  l0ctl.gainSetting = atoi(optarg);
208  break;
209  case 't':
210  l0ctl.timerangeFactor = atoi(optarg);
211  break;
212  case 'd':
213  l0ctl.stopTimeDelta = atoi(optarg);
214  break;
215  case 'h':
216  l0ctl.fileType = HRPT;
217  break;
218  case 'g':
219  l0ctl.fileType = GAC;
220  break;
221  case 'e':
222  strncpy(timefile, optarg, FILENAME_MAX);
223  updfile = timefile;
224  break;
225  case 'n':
226  if (strcmp(optarg, "sdps") == 0)
227  l0ctl.env = SDPS;
228  else
229  l0ctl.env = SEADAS;
230  break;
231  case 'f':
232  strncpy(stationInfoFile, optarg, FILENAME_MAX);
233  l0ctl.stationInfoFile = stationInfoFile;
234  break;
235  case 'c':
236  wantNetCDF = 1;
237  break;
238  default:
239  usage(argv[0]);
240  break;
241  }
242  }
243  switch (argc - optind + 1) {
244  case 3:
245  l0file = argv[optind + 0];
246  outpath = argv[optind + 1];
247  break;
248  case 2:
249  l0file = argv[optind + 0];
250  break;
251  default:
252  usage(argv[0]);
253  break;
254  }
255 
256 
257  printf("\nBegin %s Version %s Processing for %s using the ",
258  l0ctl.progname, L01VERSION, l0file);
259  if (l0ctl.env == SEADAS)
260  printf("SeaDAS environment\n\n");
261  else
262  printf("SDPS environment\n\n");
263 
264 
265  /* */
266  /* Extract output directory from full (or partial) path. */
267  /* */
268  if (stat(outpath, &file_stat) == 0 && S_ISDIR(file_stat.st_mode)) {
269  /* output path contains output directory */
270  outdir = strdup(outpath);
271  } else {
272  /* output path contains full directory and filename */
273  haveFilename = 1;
274  tmppath = strdup(outpath);
275  outdir = strdup(dirname(tmppath));
276  free(tmppath);
277  }
278 
279  /* Set metadata output dir */
280  if ((metadir = getenv("L1A_META_DIR")) == NULL) {
281  metadir = strdup(outdir);
282  }
283 
284  /* */
285  /* Get L0 content and quality index */
286  /* */
287  printf("\nGenerating Level-0 file index ...\n");
288  nframes = getl0indx(l0file, &l0ctl, &indx);
289  if (nframes <= 0) {
290  printf("-E- %s: no frames found in %s\n", argv[0], l0file);
291  exit(FATAL_ERROR);
292  }
293  locate_temporal_anomalies(&indx, updfile);
294  printindx(&indx);
295 
296 
297  /* */
298  /* Create scene index */
299  /* */
300  printf("\nGenerating Level-0 scene index ...\n");
301  nscenes = getl0scene(&indx, scene);
302  if (nscenes < 1) {
303  printf("-E- %s: no valid scenes found in %s\n", argv[0], l0file);
304  exit(FATAL_ERROR);
305  }
306  printscene(nscenes, scene);
307 
308 
309  /* */
310  /* Gather telemetry for orbit determination and compute filtered */
311  /* orbit vectors. */
312  /* */
313  printf("\nGathering raw GPS orbit data ...\n");
314  norb = getorbdata(&indx, orbinp);
315  printf("Found %d frames with valid GPS data.\n", norb);
316  if (norb < MINORBVEC) {
317  printf("-E- %s: insufficient GPS telemetry.\n", argv[0]);
318  exit(FATAL_ERROR);
319  }
320  printf("\nGenerating filtered GPS orbit vectors ...\n");
321  initnav_(orbinp, &norb, &navctl, &navqc, &orbit, &status);
322  if (status != 0) {
323  printf("-E- %s: unable to process orbit vectors.\n", argv[0]);
324  exit(FATAL_ERROR);
325  }
326 
327  /* */
328  /* Process each scene */
329  /* */
330  for (is = 0; is < nscenes; is++) {
331 
332  printf("\nProcessing scene %d ...\n", is);
333 
334  /* */
335  /* Construct output filename, or extract from output path. */
336  /* */
337  if (!haveFilename) {
338  if (scene[is].type == HRPT)
339  dataType = 16;
340  else
341  dataType = scene[is].mnftype;
342  filename = L1aFilename_netcdf(&l0ctl, scene[is].stime, dataType);
343  sprintf(l1file, "%s/%s", outpath, filename);
344  } else {
347  }
348  printf("\nOutput filename is %s\n", filename);
349  printf("Output file dir: %s\n", outdir);
350  printf("Metafile dir: %s\n\n", metadir);
351 
352  /* */
353  /* Load navigation input structure, skip scene if error occurs */
354  /* */
355  printf("Loading navigation data\n");
356  nframes = getnavdata(&scene[is], navinp);
357  if (nframes != scene[is].nrec) {
358  printf("-E- %s: error reading nav data for scene %d\n",
359  argv[0], is);
360  status++;
361  continue;
362  }
363 
364  /* */
365  /* Compute scene navigation. */
366  /* */
367  printf("Navigating scene\n");
368 
369  swfnav_(&navqc, &navctl, navinp, &nframes, &orbit, &nlines,
370  navblk, &tiltblk, &xnodel, &tnode);
371 
372  if (getl0scene_nav(xnodel, tnode, navblk, &tiltblk, &scene[is]) != 0) {
373  printf("-E- %s: no valid navigation for scene %d\n",
374  argv[0], is);
375  status++;
376  continue;
377  }
378  printnav(&scene[is]);
379 
380 
381  /* */
382  /* Write L1A file for this scene */
383  /* */
384 
385  if (wantNetCDF) {
386  if (CreateL1aFile_netcdf(l1file, &scene[is], proccon, proclog, &l0ctl) != 0) {
387  printf("-E- %s: error creating L1A file for scene %d\n",
388  argv[0], is);
389  status++;
390  continue;
391  }
392  } else {
393  if (CreateL1aFile(l1file, &scene[is], proccon, proclog, &l0ctl) != 0) {
394  printf("-E- %s: error creating L1A file for scene %d\n",
395  argv[0], is);
396  status++;
397  continue;
398  }
399  }
400 
401 
402  sceneScanNum = 0;
403  for (iframe = 0; iframe < scene[is].nrec; iframe++) {
404 
405  if ((iframe % 500) == 0)
406  printf("Writing frame %5d of scene %2d\n", iframe, is);
407 
408  nl1rec = getl1rec(iframe, &scene[is], &l0ctl,
409  navinp, navblk, &tiltblk, l1rec);
410 
411  for (irec = 0; irec < nl1rec; irec++) {
412  addL1Metrics(sceneScanNum, &l1rec[irec]);
413 
414  // toggle which scan data to use, netcdf or hdf4
415  if (wantNetCDF) {
416  if (WriteScanData_netcdf(sceneScanNum, &l1rec[irec]) != 0) {
417  printf("-E- %s: error writing to L1A file for scene %d\n",
418  argv[0], is);
419  break;
420  }
421  } else {
422  if (WriteScanData(sceneScanNum, &l1rec[irec]) != 0) {
423  printf("-E- %s: error writing to L1A file for scene %d\n",
424  argv[0], is);
425  break;
426  }
427  }
428 
429  sceneScanNum++;
430  }
431 
432  /* If an error occurs, end processing for this scene */
433  if (irec != nl1rec) {
434  status++;
435  break;
436  }
437  }
438  if (wantNetCDF)
440  else
442 
443  /* Write associated metadata file */
444  if (wantMeta) {
445  sprintf(metafile, "%s/%s.meta", metadir, filename);
446  mkmeta(metafile, l1file, &scene[is], &l0ctl);
447  }
448  }
449 
450  printf("\nNumber of scenes processed = %d\n", nscenes);
451  printf("Number of scenes failed = %d\n\n", status);
452 
453  exit(status);
454 
455 }
456 
457 
458 
459 
460 
INT32 getl0indx(char *filename, swl0ctl *l0ctl, swl0indx *indx)
Definition: getl0indx.c:15
int32 l1file(int32 sdfid, int32 *nsamp, int32 *nscans, int16 *dtynum)
Definition: l1stat_chk.c:586
int initnav_(input_sType input[], INT32 *nframes, navctl_sType *navctl, navqc_sType *navqc, orbit_sType *orbit, INT32 *status)
int status
Definition: l1_czcs_hdf.c:32
int mkmeta(const char *metaFile, const char *l1aFile, swl0scene *scene, swl0ctl *l0ctl)
Definition: mkmeta.c:37
*********************************************HISTORY FILE for MOD_PR02AQUA **Version ****Point of no algorithm change is made in this so the and when the blackbody temperature is above a threshold Since the LWIR FPA temperature oscillates on orbit
Definition: HISTORY.txt:106
INT32 getnavdata(swl0scene *scene, input_sType navinp[])
Definition: getnavdata.c:8
int WriteScanData(int32 scan, swl1rec *l1rec)
Definition: swl1_hdf.c:672
#define NULL
Definition: decode_rs.h:63
l1met * getL1Metrics(void)
Definition: getmetrics.c:60
read l1rec
int32_t INT32
Definition: elements.h:6
#define MAXFRAMES
Definition: swl0_parms.h:9
#define SEADAS
Definition: swl0_parms.h:53
int swfnav_(navqc_sType *navqc, navctl_sType *navctl, input_sType input[], INT32 *nframes, orbit_sType *orbit, INT32 *nlines, navblk_sType navblk[], tilt_states_sType *tiltblk, FLOAT32 *xnodel, INT32 *tnode)
this program makes no use of any feature of the SDP Toolkit that could generate such a then geolocation is calculated at that and then aggregated up to Resolved feature request Bug by adding three new int8 SDSs for each high resolution offsets between the high resolution geolocation and a bi linear interpolation extrapolation of the positions This can be used to reconstruct the high resolution geolocation Resolved Bug by delaying cumulation of gflags until after validation of derived products Resolved Bug by setting Latitude and Longitude to the correct fill resolving to support Near Real Time because they may be unnecessary if use of entrained ephemeris and attitude data is turned resolving bug report Corrected to filter out Aqua attitude records with missing status helping resolve bug MOD_PR03 will still correctly write scan and pixel data that does not depend upon the start thereby resolving MODur00108 Changed header guard macro names to avoid reserved name resolving MODur00104 Maneuver list file for Terra satellite was updated to include data from Jecue DuChateu Maneuver list files for both Terra and Aqua were updated to include two maneuvers from recent IOT weekly reports The limits for Z component of angular momentum was and to set the fourth GEO scan quality flag for a scan depending upon whether or not it occurred during one of them Added _FillValue attributes to many and changed the fill value for the sector start times from resolving MODur00072 Writes boundingcoordinate metadata to L1A archived metadata For PERCENT *ECS change to treat rather resolving GSFcd01518 Added a LogReport Changed to create the Average Temperatures vdata even if the number of scans is
Definition: HISTORY.txt:301
#define GAC
Definition: l1stat.h:33
int CreateL1aFile_netcdf(char *path, swl0scene *scene, char *proccon, char *proclog, swl0ctl *l0ctl)
void addL1Metrics(INT32 scanNum, swl1rec *l1rec)
Definition: getmetrics.c:16
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 file
Definition: HISTORY.txt:413
int endianess(void)
determine endianess
Definition: endianess.c:10
short int INT16
Definition: elements.h:5
void printnav(swl0scene *scene)
Definition: printnav.c:10
char * L1aFilename_netcdf(swl0ctl *l0ctl, double time, unsigned char dataType)
#define MINORBVEC
Definition: swl0_parms.h:12
#define HRPT
Definition: l1stat.h:35
char * strdup(const char *)
int CloseL1aFile(l1met *metrics)
Definition: swl1_hdf.c:777
#define CMD_ARGS
Definition: main_l1agen.c:61
void printindx(swl0indx *indx)
Definition: printindx.c:29
#define FATAL_ERROR
Definition: swl0_parms.h:5
INT32 getl1rec(INT16 sceneFrameNum, swl0scene *scene, swl0ctl *l0ctl, input_sType navinp[], navblk_sType navblk[], tilt_states_sType *tiltblk, swl1rec l1rec[])
Definition: getl1rec.c:45
char filename[FILENAME_MAX]
Definition: atrem_corl1.h:122
float FLOAT32
Definition: elements.h:7
int main(int argc, char *argv[])
Definition: main_l1agen.c:91
#define L01VERSION
Definition: swl0_parms.h:4
int getl0scene_nav(FLOAT32 xnodel, INT32 tnode, navblk_sType navblk[], tilt_states_sType *tiltblk, swl0scene *scene)
void printscene(int nscenes, swl0scene scene[])
Definition: printscene.c:14
#define basename(s)
Definition: l0chunk_modis.c:29
void usage(char *file)
Definition: main_l1agen.c:63
string outpath
Definition: color_dtdb.py:224
int CloseL1aFile_netcdf(l1met *metrics)
PARAM_TYPE_NONE Default value No parameter is buried in the product name name_prefix is case insensitive string compared to the product name PARAM_TYPE_VIS_WAVE The visible wavelength bands from the sensor are buried in the product name The product name is compared by appending and name_suffix ie aph_412_giop where prod_ix will be set to PARAM_TYPE_IR_WAVE same search method as PARAM_TYPE_VIS_WAVE except only wavelength above are looped through but prod_ix is still based ie aph_2_giop for the second and prod_ix set to PARAM_TYPE_INT name_prefix is compared with the beginning of the product name If name_suffix is not empty the it must match the end of the product name The characters right after the prefix are read as an integer and prod_ix is set to that number strncpy(l2prod->name_prefix, "myprod", UNITLEN)
int16_t * nscenes
Definition: l2bin.cpp:80
#define MAXSCENES
Definition: swl0_parms.h:10
#define SDPS
Definition: swl0_parms.h:54
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
INT16 getl0scene(swl0indx *indx, swl0scene scene[])
Definition: getl0scene.c:14
int i
Definition: decode_rs.h:71
How many dimensions is the output array Default is Not sure if anything above will work correctly strcpy(l2prod->title, "no title yet")
INT32 getorbdata(swl0indx *indx, input_sType gps[])
Definition: getorbdata.c:9
int WriteScanData_netcdf(int32 scan, swl1rec *l1rec)
int CreateL1aFile(char *path, swl0scene *scene, char *proccon, char *proclog, swl0ctl *l0ctl)
Definition: swl1_hdf.c:39
INT32 locate_temporal_anomalies(swl0indx *indx, char *timefile)