1 |
char *cvsinfo_jretile_manytofew = "cvsinfo: $Header: /home/cvsuser/cvsroot/JSOC/proj/globalhs/apps/jretile_manytofew.c,v 1.9 2017/03/31 19:43:36 tplarson Exp $"; |
2 |
|
3 |
int jretile_manytofew(void) |
4 |
{ |
5 |
int newstat = 0; |
6 |
int status = DRMS_SUCCESS; |
7 |
int fetchstat = DRMS_SUCCESS; |
8 |
DRMS_RecChunking_t chunkstat = kRecChunking_None; |
9 |
|
10 |
char *inrecquery = NULL; |
11 |
char *outseries = NULL; |
12 |
char *segnamein = NULL; |
13 |
char *segnameout = NULL; |
14 |
DRMS_RecordSet_t *inrecset = NULL; |
15 |
DRMS_RecordSet_t *outrecset = NULL; |
16 |
int irecin, irecout, nrecsin=0, nrecsout=0, nlchunks; |
17 |
DRMS_Record_t *inrec = NULL; |
18 |
DRMS_Record_t *outrec = NULL; |
19 |
DRMS_Segment_t *segin = NULL; |
20 |
DRMS_Segment_t *segout = NULL; |
21 |
DRMS_Array_t *inarr = NULL; |
22 |
DRMS_Array_t *outarr = NULL; |
23 |
DRMS_RecLifetime_t lifetime; |
24 |
DRMS_Type_t usetype = DRMS_TYPE_FLOAT; |
25 |
int length[2], startind[2], endind[2], totallength[2]; |
26 |
float *inptr, *outptr; |
27 |
long long histrecnum=-1; |
28 |
int quality; |
29 |
int mapmmax=-1; |
30 |
int sinbdivs=-1; |
31 |
double cadence=0; |
32 |
int i; |
33 |
|
34 |
TIME tnow, UNIX_epoch = -220924792.000; /* 1970.01.01_00:00:00_UTC */ |
35 |
char tstartstr[100], tscrstr[100]; |
36 |
|
37 |
double tstart, tepoch, tstep, tround, tstop, tstartin, tstopin, tstepin, tstartuse, tstopuse, nseconds, chunksecs; |
38 |
char *ttotal, *tchunk; |
39 |
int ndt; |
40 |
int lmin, lmax, lminin, lmaxin, lminuse, lmaxuse, lchunk, lchunksize, lchunkfirst, lchunklast; |
41 |
int ntimechunks, nmodes, npts, imode, itime; |
42 |
int out_time_offset, out_modes_offset, out_offset, in_time_offset, in_modes_offset, in_offset, out_index, in_index; |
43 |
int iset, lminout, lmaxout; |
44 |
double tstartout, tstopout; |
45 |
float *arrptr; |
46 |
|
47 |
int errbufstat=setvbuf(stderr, NULL, _IONBF, BUFSIZ); |
48 |
int outbufstat=setvbuf(stdout, NULL, _IONBF, BUFSIZ); |
49 |
|
50 |
double wt0, wt1, wt2, wt3, wt; |
51 |
double ut0, ut1, ut2, ut3, ut; |
52 |
double st0, st1, st2, st3, st; |
53 |
double ct0, ct1, ct2, ct3, ct; |
54 |
|
55 |
wt0=getwalltime(); |
56 |
ct0=getcputime(&ut0, &st0); |
57 |
|
58 |
inrecquery = (char *)cmdparams_save_str(&cmdparams, "in", &newstat); |
59 |
outseries = (char *)cmdparams_save_str(&cmdparams, "out", &newstat); |
60 |
segnamein = (char *)cmdparams_save_str(&cmdparams, "segin", &newstat); |
61 |
segnameout = (char *)cmdparams_save_str(&cmdparams, "segout", &newstat); |
62 |
int seginflag = strcmp(kNOTSPECIFIED, segnamein); |
63 |
int segoutflag = strcmp(kNOTSPECIFIED, segnameout); |
64 |
int verbflag = cmdparams_save_int(&cmdparams, "VERB", &newstat); |
65 |
int permflag = cmdparams_save_int(&cmdparams, "PERM", &newstat); |
66 |
if (permflag) |
67 |
lifetime = DRMS_PERMANENT; |
68 |
else |
69 |
lifetime = DRMS_TRANSIENT; |
70 |
unsigned short calverkey = (unsigned short)cmdparams_save_int(&cmdparams, "CALVERKEY", &newstat); |
71 |
|
72 |
char *histlinkname = (char *)cmdparams_save_str(&cmdparams, "histlink", &newstat); |
73 |
|
74 |
tstart=cmdparams_save_time(&cmdparams, "TSTART", &newstat); |
75 |
sprint_time(tstartstr, tstart, "TAI", 0); |
76 |
ttotal=(char *)cmdparams_save_str(&cmdparams, "TTOTAL", &newstat); |
77 |
status=drms_names_parseduration(&ttotal, &nseconds, 1); |
78 |
if (status != DRMS_SUCCESS) |
79 |
{ |
80 |
// newstat = newstat | CPSAVE_UNKNOWN_ERROR; |
81 |
fprintf(stderr, "ERROR: problem parsing TTOTAL, = %s\n", ttotal); |
82 |
return 1; |
83 |
} |
84 |
tchunk=(char *)cmdparams_save_str(&cmdparams, "TCHUNK", &newstat); |
85 |
if (strcmp(kNOTSPECIFIED, tchunk)) |
86 |
{ |
87 |
status=drms_names_parseduration(&tchunk, &chunksecs, 1); |
88 |
if (status != DRMS_SUCCESS) |
89 |
newstat = newstat | CPSAVE_UNKNOWN_ERROR; |
90 |
} |
91 |
else |
92 |
chunksecs=0; |
93 |
|
94 |
lmin=cmdparams_save_int(&cmdparams, "LMIN", &newstat); |
95 |
lmax=cmdparams_save_int(&cmdparams, "LMAX", &newstat); |
96 |
lchunksize=cmdparams_save_int(&cmdparams, "LCHUNK", &newstat); |
97 |
if (lchunksize == 0) |
98 |
lchunksize=lmax+1; |
99 |
|
100 |
if (newstat) |
101 |
{ |
102 |
fprintf(stderr, "ERROR: problem with input arguments, status = %d, diagnosis follows\n", newstat); |
103 |
cpsave_decode_error(newstat); |
104 |
return 1; |
105 |
} |
106 |
else if (savestrlen != strlen(savestr)) |
107 |
{ |
108 |
fprintf(stderr, "ERROR: problem with savestr, savestrlen = %d, strlen(savestr) = %d\n", savestrlen, (int)strlen(savestr)); |
109 |
return 1; |
110 |
} |
111 |
|
112 |
DRMS_Record_t *tempoutrec = drms_create_record(drms_env, |
113 |
outseries, |
114 |
DRMS_TRANSIENT, |
115 |
&status); |
116 |
|
117 |
if (status != DRMS_SUCCESS) |
118 |
{ |
119 |
fprintf(stderr,"ERROR: couldn't open a record in output dataseries %s, status = %d\n", outseries, status); |
120 |
return 1; |
121 |
} |
122 |
|
123 |
// set up ancillary dataseries for processing metadata |
124 |
// char *cvsinfo = strdup("$Header: /home/cvsuser/cvsroot/JSOC/proj/globalhs/apps/jretile_manytofew.c,v 1.9 2017/03/31 19:43:36 tplarson Exp $"); |
125 |
DRMS_Link_t *histlink = hcon_lookup_lower(&tempoutrec->links, histlinkname); |
126 |
if (histlink != NULL) |
127 |
{ |
128 |
histrecnum=set_history(histlink); |
129 |
if (histrecnum < 0) |
130 |
{ |
131 |
drms_close_record(tempoutrec, DRMS_FREE_RECORD); |
132 |
return 1; |
133 |
} |
134 |
} |
135 |
else |
136 |
{ |
137 |
fprintf(stderr,"WARNING: could not find history link in output dataseries\n"); |
138 |
} |
139 |
|
140 |
// these must be present in the output dataseries and variable, not links or constants |
141 |
// now done in DoIt() that calls this function |
142 |
/* |
143 |
char *outchecklist[] = {"T_START", "QUALITY", "LMIN", "LMAX", "NDT"}; |
144 |
DRMS_Keyword_t *outkeytest; |
145 |
int itest; |
146 |
for (itest=0; itest < ARRLENGTH(outchecklist); itest++) |
147 |
{ |
148 |
outkeytest = hcon_lookup_lower(&tempoutrec->keywords, outchecklist[itest]); |
149 |
if (outkeytest == NULL || outkeytest->info->islink || outkeytest->info->recscope == 1) |
150 |
{ |
151 |
fprintf(stderr, "ERROR: output keyword %s is either missing, constant, or a link\n", outchecklist[itest]); |
152 |
drms_close_record(tempoutrec, DRMS_FREE_RECORD); |
153 |
return 1; |
154 |
} |
155 |
} |
156 |
*/ |
157 |
|
158 |
tepoch=drms_getkey_time(tempoutrec, "T_START_epoch", &status); |
159 |
tstep=drms_getkey_float(tempoutrec, "T_START_step", &status); |
160 |
tround=drms_getkey_float(tempoutrec, "T_START_round", &status); |
161 |
cadence=drms_getkey_float(tempoutrec, "T_STEP", &status); |
162 |
if (fmod(tstart-tepoch,tstep) > tround/2) |
163 |
{ |
164 |
sprint_time(tscrstr, tepoch, "TAI", 0); |
165 |
fprintf(stderr, "ERROR: output dataseries seems incompatible with input parameters (tstep must divide tstart-tepoch): TSTART = %s, T_START_epoch = %s, tstep = %f\n", |
166 |
tstartstr, tscrstr, tstep); |
167 |
drms_close_record(tempoutrec, DRMS_FREE_RECORD); |
168 |
return 1; |
169 |
} |
170 |
if (chunksecs == 0.0) |
171 |
chunksecs = tstep; |
172 |
else if (fmod(chunksecs,tstep)) |
173 |
{ |
174 |
fprintf(stderr, "ERROR: output dataseries seems incompatible with input parameters (tstep must divide chunksecs): chunksecs = %f, tstep = %f\n", chunksecs, tstep); |
175 |
drms_close_record(tempoutrec, DRMS_FREE_RECORD); |
176 |
return 1; |
177 |
} |
178 |
if (fmod(nseconds,chunksecs) != 0.0) |
179 |
{ |
180 |
fprintf(stderr, "ERROR: input parameters seem incompatible (chunksecs must divide totalsecs): totalsecs = %f, chunksecs = %f\n", nseconds, chunksecs); |
181 |
drms_close_record(tempoutrec, DRMS_FREE_RECORD); |
182 |
return 1; |
183 |
} |
184 |
ntimechunks=nseconds/chunksecs; |
185 |
ndt=chunksecs/cadence; |
186 |
if (verbflag) |
187 |
{ |
188 |
printf("%d timechunks, %.1f seconds per chunk\n", ntimechunks, chunksecs); |
189 |
} |
190 |
|
191 |
int mapmmaxout=-1; |
192 |
int sinbdivsout=-1; |
193 |
DRMS_Keyword_t *outkeytest = hcon_lookup_lower(&tempoutrec->keywords, "MAPMMAX"); |
194 |
if (outkeytest != NULL && outkeytest->info->recscope == 1) |
195 |
mapmmaxout=drms_getkey_int(tempoutrec, "MAPMMAX", &status); |
196 |
outkeytest = hcon_lookup_lower(&tempoutrec->keywords, "SINBDIVS"); |
197 |
if (outkeytest != NULL && outkeytest->info->recscope == 1) |
198 |
sinbdivsout=drms_getkey_int(tempoutrec, "SINBDIVS", &status); |
199 |
|
200 |
float apinnerout=0.0; |
201 |
float apwidthout=0.0; |
202 |
float apinner=0.0; |
203 |
float apwidth=0.0; |
204 |
outkeytest = hcon_lookup_lower(&tempoutrec->keywords, "APINNER"); |
205 |
if (outkeytest != NULL && outkeytest->info->recscope == 1) |
206 |
apinnerout=drms_getkey_float(tempoutrec, "APINNER", &status); |
207 |
outkeytest = hcon_lookup_lower(&tempoutrec->keywords, "APWIDTH"); |
208 |
if (outkeytest != NULL && outkeytest->info->recscope == 1) |
209 |
apwidthout=drms_getkey_float(tempoutrec, "APWIDTH", &status); |
210 |
|
211 |
drms_close_record(tempoutrec, DRMS_FREE_RECORD); |
212 |
|
213 |
char *inchecklist[] = {"T_START", "QUALITY", "LMIN", "LMAX", "T_STEP"}; |
214 |
DRMS_Keyword_t *inkeytest; |
215 |
int itest; |
216 |
inrecset = drms_open_recordset(drms_env, inrecquery, &status); |
217 |
// inrecset = drms_open_records(drms_env, inrecquery, &status); |
218 |
|
219 |
if (status != DRMS_SUCCESS || inrecset == NULL) |
220 |
{ |
221 |
fprintf(stderr, "ERROR: problem opening input recordset: status = %d\n", status); |
222 |
return 1; |
223 |
} |
224 |
// nrecsin = inrecset->n; |
225 |
nrecsin = drms_count_records(drms_env, inrecquery, &status); |
226 |
if (status != DRMS_SUCCESS) |
227 |
{ |
228 |
fprintf(stderr, "ERROR: problem counting input records: status = %d, nrecs = %d\n", status, nrecsin); |
229 |
return 1; |
230 |
} |
231 |
|
232 |
if (verbflag) |
233 |
printf("input recordset opened, nrecs = %d\n", nrecsin); |
234 |
|
235 |
int noinput=0; |
236 |
if (nrecsin == 0) |
237 |
{ |
238 |
printf("WARNING: input recordset contains no records\n"); |
239 |
noinput=1; |
240 |
goto skip1; |
241 |
// return 1; |
242 |
} |
243 |
|
244 |
inrec = drms_recordset_fetchnext(drms_env, inrecset, &fetchstat, &chunkstat, NULL); |
245 |
// inrec = inrecset->records[0]; |
246 |
|
247 |
for (itest=0; itest < ARRLENGTH(inchecklist); itest++) |
248 |
{ |
249 |
inkeytest = hcon_lookup_lower(&inrec->keywords, inchecklist[itest]); |
250 |
if (inkeytest == NULL) |
251 |
{ |
252 |
fprintf(stderr, "ERROR: required input keyword %s is missing\n", inchecklist[itest]); |
253 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
254 |
return 1; |
255 |
} |
256 |
} |
257 |
|
258 |
if (cadence != drms_getkey_float(inrec, "T_STEP", &status)) |
259 |
{ |
260 |
fprintf(stderr, "ERROR: input T_STEP does not equal output T_STEP\n"); |
261 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
262 |
return 1; |
263 |
} |
264 |
|
265 |
inkeytest = hcon_lookup_lower(&inrec->keywords, "MAPMMAX"); |
266 |
if (inkeytest != NULL) |
267 |
mapmmax=drms_getkey_int(inrec, "MAPMMAX", &status); |
268 |
if (mapmmaxout != -1 && mapmmaxout != mapmmax) |
269 |
{ |
270 |
fprintf(stderr, "ERROR: input MAPMMAX does not equal output MAPMMAX, in=%d, out=%d\n", mapmmax, mapmmaxout); |
271 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
272 |
return 1; |
273 |
} |
274 |
|
275 |
inkeytest = hcon_lookup_lower(&inrec->keywords, "SINBDIVS"); |
276 |
if (inkeytest != NULL) |
277 |
sinbdivs=drms_getkey_int(inrec, "SINBDIVS", &status); |
278 |
if (sinbdivsout != -1 && sinbdivsout != sinbdivs) |
279 |
{ |
280 |
fprintf(stderr, "ERROR: input SINBDIVS does not equal output SINBDIVS, in=%d, out=%d\n", sinbdivs, sinbdivsout); |
281 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
282 |
return 1; |
283 |
} |
284 |
|
285 |
inkeytest = hcon_lookup_lower(&inrec->keywords, "APINNER"); |
286 |
if (inkeytest != NULL) |
287 |
apinner=drms_getkey_float(inrec, "APINNER", &status); |
288 |
if (apinnerout != 0.0 && (int)(10000*apinnerout) != (int)(10000*apinner)) |
289 |
{ |
290 |
fprintf(stderr, "ERROR: input APINNER does not equal output APINNER, in=%f, out=%f\n",apinner, apinnerout); |
291 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
292 |
return 1; |
293 |
} |
294 |
|
295 |
inkeytest = hcon_lookup_lower(&inrec->keywords, "APWIDTH"); |
296 |
if (inkeytest != NULL) |
297 |
apwidth=drms_getkey_float(inrec, "APWIDTH", &status); |
298 |
if (apinnerout != 0.0 && (int)(10000*apwidthout) != (int)(10000*apwidth)) |
299 |
{ |
300 |
fprintf(stderr, "ERROR: input APWIDTH does not equal output APWIDTH, in=%f, out=%f\n", apwidth, apwidth); |
301 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
302 |
return 1; |
303 |
} |
304 |
|
305 |
status=drms_stage_records(inrecset, 1, 0); |
306 |
if (status != DRMS_SUCCESS) |
307 |
{ |
308 |
fprintf(stderr, "ERROR: drms_stage_records returned status = %d\n", status); |
309 |
return 1; |
310 |
} |
311 |
|
312 |
skip1: |
313 |
|
314 |
lchunkfirst = lmin/lchunksize; |
315 |
lchunklast = lmax/lchunksize; |
316 |
|
317 |
nlchunks = (lchunklast - lchunkfirst) + 1; |
318 |
nrecsout = nlchunks*ntimechunks; |
319 |
outrecset = drms_create_records(drms_env, nrecsout, outseries, lifetime, &status); |
320 |
if (status != DRMS_SUCCESS || outrecset == NULL) |
321 |
{ |
322 |
fprintf(stderr,"ERROR: unable to create records record in output dataseries %s, status = %d\n", outseries, status); |
323 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
324 |
return 1; |
325 |
} |
326 |
|
327 |
unsigned long long calversout, calvers; |
328 |
int fixflagarr[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; |
329 |
for (i=0;i<16;i++) |
330 |
{ |
331 |
if (getbits(calverkey,i,1)) |
332 |
fixflagarr[i]=1; |
333 |
} |
334 |
|
335 |
unsigned int *nybblearrout = (unsigned int *)malloc(16*nrecsout*sizeof(unsigned int)); |
336 |
int *mixflagarr = (int *)calloc(16*nrecsout,sizeof(int)); |
337 |
int *calverssetarr = (int *)calloc(16*nrecsout,sizeof(int)); |
338 |
unsigned long long *calversoutarr = (unsigned long long *)malloc(nrecsout*sizeof(unsigned long long)); |
339 |
|
340 |
int firsttimethrough=1; |
341 |
int *nskiparr=(int *)calloc(nrecsout,sizeof(int)); |
342 |
for (irecin=0; irecin < nrecsin; irecin++) |
343 |
{ |
344 |
// move to end of loop when using drms_recordset_fetchnext(drms_env, inrecset, &fetchstat, &chunkstat, NULL); |
345 |
// inrec = inrecset->records[irecin]; |
346 |
tstartin=drms_getkey_time(inrec, "T_START", &status); |
347 |
tstopin=drms_getkey_time(inrec, "T_STOP", &status); |
348 |
lminin=drms_getkey_int(inrec, "LMIN", &status); |
349 |
lmaxin=drms_getkey_int(inrec, "LMAX", &status); |
350 |
tstepin=tstopin-tstartin; |
351 |
|
352 |
if (verbflag > 1) |
353 |
{ |
354 |
sprint_time(tscrstr, tstartin, "TAI", 0); |
355 |
printf("processing input %d, tstart = %s, lmin = %d, lmax = %d\n", irecin, tscrstr, lminin, lmaxin); |
356 |
} |
357 |
|
358 |
quality=drms_getkey_int(inrec, "QUALITY", &status); |
359 |
if (status != DRMS_SUCCESS || (quality & QUAL_NODATA)) //may want stricter test on quality here |
360 |
{ |
361 |
if (verbflag > 2) |
362 |
{ |
363 |
// sprint_time(tscrstr, tstartin, "TAI", 0); |
364 |
printf("SKIP: input data not used due to quality: T_START = %s, LMIN = %d, LMAX = %d, recnum = %lld, irec = %d, status = %d, quality = %08x\n", |
365 |
tscrstr, lminin, lmaxin, inrec->recnum, irecin, status, quality); |
366 |
} |
367 |
for (irecout=0; irecout < nrecsout; irecout++) |
368 |
nskiparr[irecout]++; |
369 |
goto continue_outer_loop; |
370 |
// continue; |
371 |
} |
372 |
|
373 |
if (seginflag) |
374 |
segin = drms_segment_lookup(inrec, segnamein); |
375 |
else |
376 |
segin = drms_segment_lookupnum(inrec, 0); |
377 |
if (segin != NULL) |
378 |
inarr = drms_segment_read(segin, usetype, &status); |
379 |
// inarr = drms_segment_readslice(segin, usetype, startind, endind, &status); |
380 |
if (status != DRMS_SUCCESS || inarr == NULL || segin == NULL) |
381 |
{ |
382 |
sprint_time(tscrstr, tstartin, "TAI", 0); |
383 |
fprintf(stderr, "ERROR: problem reading input segment, T_START = %s, LMIN = %d, LMAX = %d, recnum = %lld, irec = %d, status = %d\n", |
384 |
tscrstr, lminin, lmaxin, inrec->recnum, irecin, status); |
385 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
386 |
drms_close_records(outrecset, DRMS_FREE_RECORD); |
387 |
return 0; |
388 |
} |
389 |
else |
390 |
{ |
391 |
inptr=(float *)(inarr->data); |
392 |
} |
393 |
|
394 |
|
395 |
calvers=drms_getkey_longlong(inrec, "CALVER64", &status); |
396 |
if (status != DRMS_SUCCESS) |
397 |
calvers = 0; |
398 |
|
399 |
irecout=0; |
400 |
for (iset=0; iset < ntimechunks; iset++) |
401 |
{ |
402 |
tstartout=tstart + iset * chunksecs; |
403 |
tstopout=tstartout+chunksecs; |
404 |
sprint_time(tstartstr, tstartout, "TAI", 0); |
405 |
|
406 |
for (lchunk = lchunkfirst; lchunk <= lchunklast; lchunk++) |
407 |
{ |
408 |
lminout = lchunk * lchunksize; |
409 |
lmaxout = lminout + lchunksize - 1; |
410 |
lminout = MAXIMUM(lminout,lmin); |
411 |
lmaxout = MINIMUM(lmaxout,lmax); |
412 |
outrec = outrecset->records[irecout]; |
413 |
|
414 |
if (firsttimethrough) |
415 |
{ |
416 |
if (histlink != NULL) |
417 |
drms_setlink_static(outrec, histlinkname, histrecnum); |
418 |
drms_copykeys(outrec, inrec, 0, kDRMS_KeyClass_Explicit); |
419 |
// copykeys takes care of MAPMMAX, SINBDIVS, etc. that should be constant across the input |
420 |
drms_setkey_int(outrec, "LMIN", lminout); |
421 |
drms_setkey_int(outrec, "LMAX", lmaxout); |
422 |
drms_setkey_time(outrec, "T_START", tstartout); |
423 |
drms_setkey_time(outrec, "T_STOP", tstopout); |
424 |
drms_setkey_time(outrec, "T_OBS", tstartout+chunksecs/2); |
425 |
drms_setkey_int(outrec, "NDT", ndt); |
426 |
} |
427 |
|
428 |
if (tstartin >= tstopout || tstopin <= tstartout || lminin > lmaxout || lmaxin < lminout) |
429 |
{ |
430 |
nskiparr[irecout++]++; |
431 |
continue; |
432 |
} |
433 |
|
434 |
int index0 = 16*irecout; |
435 |
|
436 |
if (!calverssetarr[irecout]) |
437 |
{ |
438 |
calversoutarr[irecout]=calvers; |
439 |
calverssetarr[irecout]=1; |
440 |
for (i=0;i<16;i++) |
441 |
nybblearrout[index0 + i]=getbits(calvers,4*i+3,4); |
442 |
} |
443 |
|
444 |
for (i=0;i<16;i++) |
445 |
{ |
446 |
int nybble=getbits(calvers,4*i+3,4); |
447 |
if (fixflagarr[i]) |
448 |
{ |
449 |
if (nybble != nybblearrout[index0 + i]) |
450 |
{ |
451 |
fprintf(stderr, "ERROR: input data has mixed values for field %d of CALVER64: %d and %d, recnum = %lld, histrecnum = %lld\n", i, nybblearrout[i], nybble, inrec->recnum, histrecnum); |
452 |
return 0; |
453 |
} |
454 |
} |
455 |
else |
456 |
{ |
457 |
if (nybble < nybblearrout[index0 + i]) |
458 |
nybblearrout[index0 + i]=nybble; |
459 |
} |
460 |
} |
461 |
|
462 |
if (!mixflagarr[irecout] && (quality & QUAL_MIXEDCALVER || calvers != calversoutarr[irecout])) |
463 |
mixflagarr[irecout]=1; |
464 |
|
465 |
if (segoutflag) |
466 |
segout = drms_segment_lookup(outrec, segnameout); |
467 |
else |
468 |
segout = drms_segment_lookupnum(outrec, 0); |
469 |
tstartuse=MAXIMUM(tstartout, tstartin); |
470 |
tstopuse= MINIMUM(tstopout, tstopin); |
471 |
lminuse=MAXIMUM(lminout, lminin); |
472 |
lmaxuse=MINIMUM(lmaxout, lmaxin); |
473 |
nmodes=MODES(lmaxuse+1)-MODES(lminuse); |
474 |
npts=(tstopuse - tstartuse)/cadence; |
475 |
|
476 |
out_time_offset = (tstartuse - tstartout)/cadence; |
477 |
out_modes_offset = MODES(lminuse) - MODES(lminout); |
478 |
// out_offset = 2 * (out_modes_offset * ndt + out_time_offset); |
479 |
out_offset = 0; // 2 * (out_modes_offset * npts + out_time_offset); |
480 |
in_time_offset = (tstartuse - tstartin)/cadence; |
481 |
in_modes_offset = MODES(lminuse) - MODES(lminin); |
482 |
in_offset = 2 * (in_modes_offset * tstepin / cadence + in_time_offset); |
483 |
|
484 |
startind[0]=2*out_time_offset; |
485 |
startind[1]=out_modes_offset; |
486 |
endind[0]=2*(out_time_offset + npts) - 1; |
487 |
endind[1]=out_modes_offset + nmodes - 1; |
488 |
totallength[0]=2*ndt; |
489 |
totallength[1]=lmaxout*(lmaxout+1)/2+lmaxout - lminout*(lminout+1)/2 + 1; |
490 |
|
491 |
length[0]=2*npts; |
492 |
length[1]=nmodes; |
493 |
arrptr=(float *)(calloc(length[0]*length[1],sizeof(float))); |
494 |
outarr = drms_array_create(usetype, 2, length, arrptr, &status); |
495 |
if (status != DRMS_SUCCESS || outarr == NULL || arrptr == NULL) |
496 |
{ |
497 |
fprintf(stderr,"ERROR: problem creating output array: T_START = %s, LMIN = %d, LMAX = %d, length = [%d, %d], status = %d, histrecnum = %lld\n", |
498 |
tstartstr, lminout, lmaxout, length[0], length[1], status, histrecnum); |
499 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
500 |
drms_close_records(outrecset, DRMS_FREE_RECORD); |
501 |
return 0; |
502 |
} |
503 |
outptr = (float *)(outarr->data); |
504 |
|
505 |
for (imode=0; imode<nmodes; imode++) |
506 |
{ |
507 |
for (itime=0; itime<npts; itime++) |
508 |
{ |
509 |
in_index=in_offset + 2*itime; |
510 |
out_index=out_offset + 2*itime; |
511 |
outptr[out_index] = inptr[in_index]; |
512 |
outptr[out_index+1] = inptr[in_index+1]; |
513 |
} |
514 |
out_offset+=2*npts; // 2*ndt; |
515 |
in_offset+=2*tstepin/cadence; |
516 |
} |
517 |
|
518 |
outarr->bzero=segout->bzero; |
519 |
outarr->bscale=segout->bscale; |
520 |
status=drms_segment_writeslice_ext(segout, outarr, startind, endind, totallength, 0); |
521 |
if (status != DRMS_SUCCESS) |
522 |
{ |
523 |
fprintf(stderr, "ERROR: problem writing output segment: status = %d, T_START = %s, LMIN = %d, LMAX = %d, histrecnum = %lld\n", |
524 |
status, tstartstr, lminout, lmaxout, histrecnum); |
525 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
526 |
drms_close_records(outrecset, DRMS_FREE_RECORD); |
527 |
return 0; |
528 |
} |
529 |
|
530 |
drms_free_array(outarr); |
531 |
|
532 |
irecout++; |
533 |
} // end loop on lchunk |
534 |
} // end loop on iset |
535 |
|
536 |
firsttimethrough=0; |
537 |
drms_free_array(inarr); |
538 |
continue_outer_loop: |
539 |
inrec = drms_recordset_fetchnext(drms_env, inrecset, &fetchstat, &chunkstat, NULL); |
540 |
} // end loop on irecin |
541 |
|
542 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
543 |
|
544 |
int nsegments=0; |
545 |
for (irecout=0; irecout < nrecsout; irecout++) |
546 |
{ |
547 |
outrec=outrecset->records[irecout]; |
548 |
if (noinput || nskiparr[irecout] == nrecsin) |
549 |
{ |
550 |
drms_setkey_int(outrec, "QUALITY", QUAL_NODATA); |
551 |
} |
552 |
else if (mixflagarr[irecout]) |
553 |
{ |
554 |
drms_setkey_int(outrec, "QUALITY", QUAL_MIXEDCALVER); |
555 |
nsegments++; |
556 |
} |
557 |
else |
558 |
{ |
559 |
drms_setkey_int(outrec, "QUALITY", 0); |
560 |
nsegments++; |
561 |
} |
562 |
|
563 |
for (i=0;i<16;i++) |
564 |
calversout=setbits(calversout,4*i+3,4,nybblearrout[16*irecout + i]); |
565 |
drms_setkey_longlong(outrec, "CALVER64", calversout); |
566 |
|
567 |
tnow = (double)time(NULL); |
568 |
tnow += UNIX_epoch; |
569 |
drms_setkey_time(outrec, "DATE", tnow); |
570 |
} |
571 |
|
572 |
free(nskiparr); |
573 |
drms_close_records(outrecset, DRMS_INSERT_RECORD); |
574 |
|
575 |
wt=getwalltime(); |
576 |
ct=getcputime(&ut, &st); |
577 |
if (verbflag) |
578 |
{ |
579 |
printf("number of records created = %d\n", nrecsout); |
580 |
printf("number of segments created = %d\n", nsegments); |
581 |
fprintf(stdout, "total time spent: %.2f ms wall time, %.2f ms cpu time\n", |
582 |
wt-wt0, ct-ct0); |
583 |
} |
584 |
|
585 |
printf("module %s successful completion\n", cmdparams.argv[0]); |
586 |
|
587 |
return 0; |
588 |
|
589 |
} |