OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
temporal_anomaly.c
Go to the documentation of this file.
1 /* ============================================================== */
2 /* Module: timetable.c */
3 /* Purpose: generate and search temporal anomaly table */
4 /* Author: B.A. Franz, General Scences Corp., 9/2001 */
5 /* ============================================================== */
6 
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <sys/types.h>
11 #include <time.h>
12 #include <math.h>
13 
14 #include "swl0_proto.h"
15 #include <timeutils.h>
16 
17 #define MAXTTABLE 10000
18 
19 static timeTab timeTable[MAXTTABLE];
20 static int32_t nTab = 0;
21 
22 int compTimeTable(timeTab *rec1, timeTab *rec2) {
23  int retval = strcmp(rec1->time1, rec2->time1);
24 
25  if (retval == 0)
26  retval = (int) rec1->type - rec2->type;
27 
28  return (retval);
29 }
30 
32  FILE *fp = NULL;
33  char *filename;
34  int status = 1;
35 
36  /* */
37  /* Open file for reading */
38  /* */
39  if ((filename = getenv("TEMPORAL_ANOMALY")) == NULL) {
40  printf("-W- %s: TEMPORAL_ANOMALY env variable undefined.\n", __FILE__);
41  return (FATAL_ERROR);
42  }
43 
44  if ((fp = fopen(filename, "r")) == NULL) {
45  fprintf(stderr,
46  "-W- %s line %d: unable to open %s for reading\n",
47  __FILE__, __LINE__, filename);
48  return (FATAL_ERROR);
49  }
50 
51  while (status != EOF && nTab < MAXTTABLE) {
52 
53  status = fscanf(fp, "%16s %6d %16s %6d %6d\n",
54  timeTable[nTab].time1,
55  &timeTable[nTab].type,
56  timeTable[nTab].time2,
57  &timeTable[nTab].action,
58  &timeTable[nTab].delmsec);
59 
60  if (status != EOF) nTab++;
61 
62  }
63 
64  fclose(fp);
65  return (0);
66 }
67 
68 INT32 update_timetable(FILE *fp, timeTab timeTable) {
69  if (fp != NULL)
70  fprintf(fp, "%16s %6d %16s %6d %6d\n",
71  timeTable.time1,
72  timeTable.type,
73  timeTable.time2,
74  timeTable.action,
75  timeTable.delmsec);
76 
77  return (0);
78 }
79 
81  FILE *fp = NULL;
82  INT32 itab = 0;
83 
84  /* */
85  /* Open file for writing */
86  /* */
87  if ((fp = fopen(filename, "w")) == NULL) {
88  fprintf(stderr,
89  "-E- %s line %d: unable to open %s for writing\n",
90  __FILE__, __LINE__, filename);
91  return (FATAL_ERROR);
92  }
93 
94 
95  for (itab = 0; itab < nTab; itab++)
96  update_timetable(fp, timeTable[itab]);
97 
98 
99  fclose(fp);
100  return (0);
101 }
102 
103 INT32 locate_temporal_anomalies(swl0indx *indx, char *updfile) {
104  INT32 srec = indx->srec;
105  INT32 erec = indx->erec;
106  INT32 irec = srec - 1;
107  INT32 i1, i2;
108  INT32 uniq[MAXTTABLE];
109  INT32 delmsec;
110  FLOAT64 delsec;
111  FILE *fp = NULL;
112 
113  /* Load any previously defined timing anomaly records */
114  read_timetable();
115 
116  /* If no update file specified, skip search for new anomalies */
117  if (updfile == NULL || indx->type != GAC)
118  return (0);
119 
120  /* Open update file for writing */
121  if ((fp = fopen(updfile, "w")) == NULL) {
122  fprintf(stderr,
123  "-E- %s line %d: unable to open %s for writing\n",
124  __FILE__, __LINE__, updfile);
125  exit(FATAL_ERROR);
126  }
127 
128  /* Search for the common 1-sec by 30-sec time shift */
129  while (irec < erec - 10) {
130 
131  irec++;
132 
133  if (indx->rec[irec].mnftype != GACTYPE)
134  continue;
135 
136  /* Check for the 1-sec shift with 9-frame interval */
137  /* ----------------------------------------------- */
138 
139  i1 = irec;
140  for (i2 = irec + 8; i2 <= irec + 10; i2++) {
141 
142  if (indx->rec[i1].tShfError && indx->rec[i2].tShfError &&
143  fabs(fabs(indx->rec[i1].timeShift) - 1.0) < CLOCKVAR &&
144  fabs(indx->rec[i1].timeShift + indx->rec[i2].timeShift) < 2 * CLOCKVAR) {
145 
146  delsec = indx->rec[i1].timeShift;
147  delmsec = (int32_t) (delsec * 1000);
148 
149  printf("Correctable timeshift located at frame %d of %d msecs\n",
150  i1, delmsec);
151 
152  /* set GAC frames to correct time shift */
153  strcpy(timeTable[nTab].time1, unix2ydhmsf(indx->rec[i1].time, 'G'));
154  strcpy(timeTable[nTab].time2, unix2ydhmsf(indx->rec[i2].time, 'G'));
155  timeTable[nTab].delmsec = delmsec;
156  timeTable[nTab].type = GACTYPE;
157  timeTable[nTab].action = 1; /* fix time */
158  nTab++;
159  if (nTab >= MAXTTABLE) {
160  fprintf(stderr,
161  "-E- %s line %d: temporal anomaly table size exceeded: %d\n",
162  __FILE__, __LINE__, nTab);
163  exit(FATAL_ERROR);
164  }
165  update_timetable(fp, timeTable[nTab - 1]);
166 
167 
168  /* Set LAC frames for nav failure at leading boundary of time shift */
169  strcpy(timeTable[nTab].time1, unix2ydhmsf(indx->rec[i1].time - delsec - 19.5 * DTLAC, 'G'));
170  strcpy(timeTable[nTab].time2, unix2ydhmsf(indx->rec[i1].time, 'G'));
171  timeTable[nTab].delmsec = (int32_t) 0;
172  timeTable[nTab].type = LACTYPE;
173  timeTable[nTab].action = 2; /* nav fail */
174  nTab++;
175  if (nTab >= MAXTTABLE) {
176  fprintf(stderr,
177  "-E- %s line %d: temporal anomaly table size exceeded: %d\n",
178  __FILE__, __LINE__, nTab);
179  exit(FATAL_ERROR);
180  }
181  update_timetable(fp, timeTable[nTab - 1]);
182 
183  /* Set LAC frames for time correction for n-1 GAC frames of time shift */
184  /* Note: we can't predict where in the last frame the shift occurred. */
185  strcpy(timeTable[nTab].time1, unix2ydhmsf(indx->rec[i1].time, 'G'));
186  strcpy(timeTable[nTab].time2, unix2ydhmsf(indx->rec[i2].time - delsec - 19.5 * DTLAC, 'G'));
187  timeTable[nTab].delmsec = delmsec;
188  timeTable[nTab].type = LACTYPE;
189  timeTable[nTab].action = 1; /* fix time */
190  nTab++;
191  if (nTab >= MAXTTABLE) {
192  fprintf(stderr,
193  "-E- %s line %d: temporal anomaly table size exceeded: %d\n",
194  __FILE__, __LINE__, nTab);
195  exit(FATAL_ERROR);
196  }
197  update_timetable(fp, timeTable[nTab - 1]);
198 
199  /* Set LAC frames for nav failure within last GAC frame of time shift */
200  strcpy(timeTable[nTab].time1, unix2ydhmsf(indx->rec[i2].time - delsec - 19.5 * DTLAC, 'G'));
201  strcpy(timeTable[nTab].time2, unix2ydhmsf(indx->rec[i2].time, 'G'));
202  timeTable[nTab].delmsec = (int32_t) 0;
203  timeTable[nTab].type = LACTYPE;
204  timeTable[nTab].action = 2; /* nav fail */
205  nTab++;
206  if (nTab >= MAXTTABLE) {
207  fprintf(stderr,
208  "-E- %s line %d: temporal anomaly table size exceeded: %d\n",
209  __FILE__, __LINE__, nTab);
210  exit(FATAL_ERROR);
211  }
212  update_timetable(fp, timeTable[nTab - 1]);
213 
214  /* Advance irec beyond shift and exit shift-match search */
215  irec = i2 + 1;
216  break;
217 
218  }
219  } /* end for over shift pairs */
220 
221  } /* end while over irec */
222 
223  /* Ensure the time table array is sorted and unique */
224  if (nTab > 0) {
225 
226  qsort(timeTable, nTab, sizeof (timeTab),
227  (int (*)(const void *, const void *)) compTimeTable);
228 
229  i1 = 0;
230  i2 = 0;
231  uniq[i2] = i1;
232  for (i1 = 1; i1 < nTab; i1++)
233  if (strcmp(timeTable[i1].time1, timeTable[i1 - 1].time1) != 0 ||
234  timeTable[i1].type != timeTable[i1 - 1].type) {
235  i2++;
236  uniq[i2] = i1;
237  }
238 
239  nTab = i2 + 1;
240  for (i1 = 1; i1 < nTab; i1++)
241  if (uniq[i1] != i1)
242  memcpy(&timeTable[i1], &timeTable[uniq[i1]], sizeof (timeTab));
243  }
244 
245  /*
246  write_timetable(timefile);
247  */
248 
249  if (fp != NULL) fclose(fp);
250 
251  return (0);
252 }
253 
255  timeTab *trec = NULL;
256  int32_t itab = 0;
257  FLOAT64 sec = ((double) msec + 0.5) / 1000.0;
258  char ztime[17];
259 
260  strcpy(ztime, unix2ydhmsf(yds2unix(year, day, sec), 'G'));
261 
262  for (itab = 0; itab < nTab; itab++) {
263 
264  if (timeTable[itab].type != mnftype)
265  continue;
266 
267  if (strcmp(ztime, timeTable[itab].time2) < 0) {
268  if (strcmp(ztime, timeTable[itab].time1) >= 0) {
269  trec = &timeTable[itab];
270  }
271  break;
272  }
273  }
274 
275  return (trec);
276 }
#define DTLAC
Definition: swl0_parms.h:47
double FLOAT64
Definition: elements.h:8
int32_t day
int status
Definition: l1_czcs_hdf.c:32
double yds2unix(int16_t year, int16_t day, double secs)
Definition: yds2unix.c:7
#define NULL
Definition: decode_rs.h:63
char * unix2ydhmsf(double usec, char zone)
Definition: unix2ydhmsf.c:8
INT32 read_timetable()
int32_t INT32
Definition: elements.h:6
int32 * msec
Definition: l1_czcs_hdf.c:31
#define LACTYPE
Definition: swl0_parms.h:20
#define MAXTTABLE
#define GAC
Definition: l1stat.h:33
short int INT16
Definition: elements.h:5
int compTimeTable(timeTab *rec1, timeTab *rec2)
#define FATAL_ERROR
Definition: swl0_parms.h:5
char filename[FILENAME_MAX]
Definition: atrem_corl1.h:122
integer, parameter double
action
Definition: __init__.py:2
#define GACTYPE
Definition: swl0_parms.h:19
INT32 write_timetable(char *filename)
INT32 update_timetable(FILE *fp, timeTab timeTable)
Definition: common.h:9
#define fabs(a)
Definition: misc.h:93
INT32 locate_temporal_anomalies(swl0indx *indx, char *updfile)
timeTab * temporal_anomaly(INT16 mnftype, INT16 year, INT16 day, INT32 msec)
#define CLOCKVAR
Definition: swl0_parms.h:48
How many dimensions is the output array Default is Not sure if anything above will work correctly strcpy(l2prod->title, "no title yet")