ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/JSOC/proj/lev0/apps/build_lev1_iris_test.c
Revision: 1.2
Committed: Thu Jan 30 22:27:04 2014 UTC (9 years, 7 months ago) by prodtest
Content type: text/plain
Branch: MAIN
CVS Tags: Ver_8-8, Ver_8-11, Ver_8-10, Ver_8-6, Ver_8-4, Ver_8-3, Ver_8-5, Ver_8-12, Ver_8-7, Ver_9-4, Ver_9-3, Ver_9-2, Ver_9-1, Ver_9-0
Changes since 1.1: +288 -589 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 /*-----------------------------------------------------------------------------
2 * cvs/JSOC/proj/lev1/apps/build_lev1.c
3 *-----------------------------------------------------------------------------
4 *
5 * This is a module that runs with DRMS and processes lev0
6 * filtergrams to lev1.
7 * It is scheduled by build_lev1_mgr either by qsub to the cluster
8 * or by fork to run on the local machine. It is called with
9 * 12 (NUMRECLEV1 defined in lev0lev1.h) lev0 images at a time.
10 * See the -h nice_intro() for details of the calling options.
11 */
12
13 #include <jsoc_main.h>
14 #include <cmdparams.h>
15 #include <drms.h>
16 #include <drms_names.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <ctype.h>
20 #include <strings.h>
21 #include <sys/types.h>
22 #include <sys/time.h>
23 #include <sys/stat.h> //for umask(2)
24 #include <unistd.h> //for alarm(2) among other things...
25 #include <printk.h>
26 #include <astro.h>
27 #include <fresize.h>
28 #include <gapfill.h>
29 #include "list.h"
30 #include </home/jsoc/include/fftw3.h>
31 //#include "fftw3.h"
32 #include "imgdecode.h"
33 #include "lev0lev1.h"
34 #include "quallev1.h"
35 #include "limb_fit.h"
36 #include "cosmic_ray.h"
37 #include "get_pointing_info.c"
38
39 //default in and out data series
40 #define LEV0SERIESNAMEIRIS "iris_ground.lev0_dc1"
41 #define LEV1SERIESNAMEIRIS "iris_ground.lev1_dc1"
42 //#define DSCRSNAME "iris_ground.crs_table"
43 #define DSCRSNAME "iris_ground.window_table"
44 #define DSFFNAME "iris.flatfield_prelim"
45 //#define DSFFNAME "iris_ground.flatfield_test"
46
47 //#define DSFFNAME "su_richard.flatfield" //temp test case
48 //#define DSFFNAMEHMI "su_production.hmi_flatfield" //temp test case
49 //#define DSFFNAMEHMI "hmi.flatfield"
50 //#define DSFFNAMEAIA "su_production.aia_flatfield" //temp test case
51 //#define DSFFNAMEAIA "aia_test.flatfield" //temp test case
52 //#define DSFFNAMEAIA "aia.flatfield"
53
54 #define LEV1LOG_BASEDIR "/usr/local/logs/lev1"
55 #define H1LOGFILE "/usr/local/logs/lev1/build_lev1_iris.%s.log"
56 #define NUMTIMERS 8 //number of seperate timers avail
57 #define NOTSPECIFIED "***NOTSPECIFIED***"
58 #define LOGTEST 0
59 #define CAL_HCFTID 17 //image is cal mode
60
61 // SAA-HLZ
62 #define SAA_HLZ_SERIES "iris.saa_hlz"
63
64 int compare_rptr(const void *a, const void *b);
65 static TIME SDO_to_DRMS_time(int sdo_s, int sdo_ss);
66
67 // List of default parameter values.
68 ModuleArgs_t module_args[] = {
69 {ARG_STRING, "mode", NOTSPECIFIED, "either recnum or fsn"},
70 {ARG_STRING, "dsin", NOTSPECIFIED, "dataset of lev0 filtergrams"},
71 {ARG_STRING, "dsout", NOTSPECIFIED, "dataset of lev1 output"},
72 {ARG_STRING, "logfile", NOTSPECIFIED, "optional log file name. Will create one if not given"},
73 {ARG_INTS, "brec", "0", "first lev0 rec# to process. 0=error must be given by build_lev1_mgr"},
74 {ARG_INTS, "erec", "0", "last lev0 rec# to process. 0=error must be given by build_lev1_mgr"},
75 {ARG_INTS, "bfsn", "0", "first lev0 fsn# to process. 0=error must be given by build_lev1_mgr"},
76 {ARG_INTS, "efsn", "0", "last lev0 fsn# to process. 0=error must be given by build_lev1_mgr"},
77 {ARG_INTS, "quicklook", "1", "1=quick look, 0 = definitive mode"},
78 {ARG_FLAG, "v", "0", "verbose flag"},
79 {ARG_FLAG, "h", "0", "help flag"},
80 {ARG_FLAG, "r", "0", "restart flag"},
81 {ARG_END}
82 };
83
84 CmdParams_t cmdparams;
85 // Module name presented to DRMS.
86 char *module_name = "build_lev1_iris_NEW";
87
88 FILE *h1logfp; // fp for h1 ouput log for this run
89 static LEV0LEV1 lev0lev1;
90 static LEV0LEV1 *l0l1 = &lev0lev1;
91 //static CCSDS_Packet_t *Hk;
92 static DRMS_Record_t *rs;
93 static DRMS_Record_t *crsrec;
94 static DRMS_Record_t *rs0, *rs1, *rsff, *rsbad_pix, *rec_bad_aia, *rt, *rresp;
95 static DRMS_Record_t *rptr;
96 static DRMS_Segment_t *segment, *segment0;
97 static DRMS_Segment_t *segmentff;
98 static DRMS_Segment_t *darkseg;
99 static DRMS_Segment_t *badseg;
100 //static DRMS_Segment_t *badoutpixseg;
101 //static DRMS_Segment_t *spikeseg;
102 static DRMS_Array_t *segArray;
103 static DRMS_RecordSet_t *crsset;
104 static DRMS_RecordSet_t *rset0, *rset1, *rsetff, *rsbad_aia, *rs_t=NULL,
105 *rs_resp=NULL;
106 static DRMS_Array_t *Array0;
107 static DRMS_Array_t *Arrayff;
108 static DRMS_Array_t *ArrayDark;
109 static DRMS_Array_t *ArrayBad;
110 static DRMS_Array_t *ArraySpike;
111 static TIME sdo_epoch;
112 static PTINFO *ptinfo = NULL;
113 static PTINFO ptdata;
114 static char bld_vers[16];
115 static char datestr[32];
116 static char open_dsname[256];
117 static char dsffname[128];
118 static char path[DRMS_MAXPATHLEN], bad_pix_path[DRMS_MAXPATHLEN];
119 static char bad_aia_path[DRMS_MAXPATHLEN];
120 static char rs1_path[DRMS_MAXPATHLEN];
121 static struct timeval first[NUMTIMERS], second[NUMTIMERS];
122 //static char *orbseries = "sdo.fds_orbit_vectors";
123 //static char *orbseries = "su_arta.orbitvectors";
124 static char *orbseries = "iris.orbit_vectors";
125
126 static int nspikes, respike, fid, aiftsid, *oldvalues, *spikelocs, *newvalues;
127 static int hcftid, aiagp6;
128 static short aifcps;
129 double aiascale = 1.0;
130
131 IORBIT_Info_t *IOinfo = NULL;
132
133 IORBIT_Info_t IOdata;
134 LIBASTRO_Error_t IOstatus;
135 unsigned int fsnarray[NUMRECLEV1];
136 unsigned int fsnx = 0;
137 //short data1[MAXPIXELS]; //iris lev1 is shorts
138 //int data1[MAXPIXELS];
139 float data1[MAXPIXELS]; //floats for HMI
140 float ftmp;
141 int data1A[MAXPIXELS]; //ints for AIA
142 short data1S[MAXPIXELS]; //shorts for iris
143 int array_cosmic[16777216]; //4096x4096
144 double tgttimes[NUMRECLEV1];
145
146 long long brec, erec, bfsn, efsn; //begin and end lev0 rec/fsn. must be same data type
147 long long bnumx, enumx; //has either the brec/erec of bfsn/efsn pair accord to mode
148 int verbose;
149 int modeflg = 0; //0=fsn, 1=recnum
150 int imagecnt = 0; // num of images since last commit
151 int restartflg = 0; // set when build_lev1 is called for a restart
152 int abortflg = 0;
153 int sigalrmflg = 0; // set on signal so prog will know
154 int ignoresigalrmflg = 0; // set after a close_image()
155 int quicklook;
156 //global quality flags
157 int flatmiss[NUMRECLEV1];
158 int orbmiss[NUMRECLEV1];
159 int asdmiss[NUMRECLEV1];
160 int mpdmiss[NUMRECLEV1];
161 int limbmiss[NUMRECLEV1];
162 int noimage[NUMRECLEV1];
163 int missflg[NUMRECLEV1];
164
165 char logname[128];
166 char argdsin[128], argdsout[128], arglogfile[128];
167 char argbx[80], argex[80], argquick[80], argmode[80];
168 char timetag[32];
169 char tlmseriesname[128]; // e.g. hmi.tlm
170 char lev0seriesname[128]; // e.g. hmi.lev0
171 char *username; // from getenv("USER")
172 char *logfile; // optional log name passed in
173 char *mode; // given mode. recnum or fsn
174 char *dsin; // lev0 input dataset
175 char *dsout; // lev1 output dataset
176 char *dsff; // flat field dataset
177
178 //!!TEMP
179 typedef struct {
180 float rsun_lf;
181 float x0_lf;
182 float y0_lf;
183 } LIMB_SOMETHING;
184
185
186
187 //int get_nspikes() { return nspikes; }
188 //int get_respike(void) { return respike; }
189 //int *get_spikelocs() { return spikelocs; }
190 //int *get_oldvalues() { return oldvalues; }
191 //int *get_newvalues() { return newvalues; }
192 //void set_nspikes(int new_nspikes) { nspikes = new_nspikes; }
193 //void set_spikelocs(int *new_spikelocs) { spikelocs = new_spikelocs; }
194 //void set_oldvalues(int *new_oldvalues) { oldvalues = new_oldvalues; }
195 //void set_newvalues(int *new_newvalues) { newvalues = new_newvalues; }
196
197 //Set the QUALITY keyword for lev1
198 void do_quallev1(DRMS_Record_t *rs0, DRMS_Record_t *rs1, int inx, unsigned int fsn)
199 {
200 int quallev1 = 0;
201 int rstatus;
202 char *pchar;
203
204 quallev1 = missflg[inx];
205 if(flatmiss[inx]) quallev1 = quallev1 | Q_NOFLAT;
206 if(orbmiss[inx]) quallev1 = quallev1 | Q_NOORB;
207 if(limbmiss[inx]) quallev1 = quallev1 | Q_NOLIMB;
208 if(asdmiss[inx]) {
209 quallev1 = quallev1 | Q_NOASD;
210 drms_setkey_string(rs1, "ASD_REC", DRMS_MISSING_STRING);
211 }
212 if(mpdmiss[inx]) quallev1 = quallev1 | Q_NOMPD;
213 if(noimage[inx]) quallev1 = quallev1 | Q_MISSALL;
214 if(ptinfo) {
215 ptdata = ptinfo[inx];
216 if(strcmp(ptdata.acs_mode, "SCIENCE")) { //not in science pointing mode
217 quallev1 = quallev1 | Q_NOACS_SCI;
218 }
219 if(strcmp(ptdata.acs_eclp, "NO")) { //in eclipse
220 quallev1 = quallev1 | Q_ACS_ECLP;
221 }
222 if(strcmp(ptdata.acs_sunp, "YES")) { //not in sun presence flag
223 quallev1 = quallev1 | Q_ACS_SUNP;
224 }
225 if(strcmp(ptdata.acs_safe, "NO")) { //safemode set
226 quallev1 = quallev1 | Q_ACS_SAFE;
227 }
228 }
229 pchar = drms_getkey_string(rs0, "IMG_TYPE", &rstatus);
230 if(rstatus) {
231 printk("ERROR: in drms_getkey_string(IMG_TYPE) fsn=%u\n", fsn);
232 }
233 else {
234 if(strcmp(pchar, "LIGHT")) { //dark image
235 quallev1 = quallev1 | Q_IMG_TYPE;
236 }
237 }
238 if(quicklook) {
239 quallev1 = quallev1 | Q_NRT;
240 }
241 drms_setkey_int(rs1, "QUALITY", quallev1);
242 drms_setkey_string(rs1, "BLD_VERS", bld_vers); //build vers to every record
243 }
244
245 int nice_intro ()
246 {
247 int usage = cmdparams_get_int (&cmdparams, "h", NULL);
248 if (usage)
249 {
250 printf ("Usage:\nbuild_lev1_iris [-vhr] "
251 "mode=<recnum|fsn> dsin=<lev0> dsout=<lev1>\n"
252 "brec=<rec#>|bfsn=<fsn#> erec=<rec#>|efsn=<fsn#>\n"
253 "quicklook=<0|1> [logfile=<file>]\n"
254 " -h: help - show this message then exit\n"
255 " -v: verbose\n"
256 " -r: restart. only used when we restart our selves periodically\n"
257 "mode= recnum: brec and erec have the record # range to process \n"
258 " fsn: bfsn and efsn have the fsn # range to process\n"
259 " For safety, the mode and arg name used must be consistent\n"
260 "dsin= data set name of lev0 input\n"
261 " default hmi=hmi.lev0e aia=aia.lev0e\n"
262 "dsout= data set name of lev1 output\n"
263 " default hmi=su_production.hmi_lev1e aia=su_production.aia_lev1e\n"
264 "brec= first lev0 rec# to process. 0=error must be given by build_lev1_mgr\n"
265 "erec= last lev0 rec# to process. 0=error must be given by build_lev1_mgr\n"
266 "bfsn= first fsn# to process. 0=error must be given by build_lev1_mgr\n"
267 "efsn= last fsn# to process. 0=error must be given by build_lev1_mgr\n"
268 "quicklook= 1 = quicklook mode, 0 = definitive mode\n"
269 "logfile= optional log file name. If not given uses:\n"
270 " /usr/local/logs/lev1/build_lev1_aia.<time_stamp>.log\n");
271 return(1);
272 }
273 verbose = cmdparams_get_int (&cmdparams, "v", NULL);
274 restartflg = cmdparams_get_int (&cmdparams, "r", NULL);
275 return (0);
276 }
277
278 TIME SDO_to_DRMS_time(int sdo_s, int sdo_ss)
279 {
280 static int firstcall = 1;
281 if (firstcall)
282 {
283 firstcall = 0;
284 }
285 /* XXX fix build 3/18/2008, arta */
286 return(sdo_epoch + (TIME)sdo_s + (TIME)(sdo_ss & 0xFFFF)/65536.0);
287 }
288
289 // Setup global datestr[] like: 2008.07.14_08:29:31
290 char *do_datestr() {
291 time_t tval;
292 struct tm *t_ptr;
293
294 tval = time(NULL);
295 t_ptr = localtime(&tval);
296 sprintf(datestr, "%d.%02d.%02d_%02d:%02d:%02d",
297 (t_ptr->tm_year+1900), (t_ptr->tm_mon+1),
298 t_ptr->tm_mday, t_ptr->tm_hour, t_ptr->tm_min, t_ptr->tm_sec);
299 return(datestr);
300 }
301
302 // Returns a time tag like yyyy.mm.dd.hhmmss
303 char *gettimetag()
304 {
305 struct timeval tvalr;
306 struct tm *t_ptr;
307
308 gettimeofday(&tvalr, NULL);
309 t_ptr = localtime((const time_t *)&tvalr);
310 sprintf(timetag, "%04d.%02d.%02d.%02d%02d%02d",
311 (t_ptr->tm_year+1900), (t_ptr->tm_mon+1), t_ptr->tm_mday, t_ptr->tm_hour, t_ptr->tm_min, t_ptr->tm_sec);
312 return(timetag);
313 }
314
315
316 void BeginTimer(int n)
317 {
318 gettimeofday (&first[n], NULL);
319 }
320
321 float EndTimer(int n)
322 {
323 gettimeofday (&second[n], NULL);
324 if (first[n].tv_usec > second[n].tv_usec) {
325 second[n].tv_usec += 1000000;
326 second[n].tv_sec--;
327 }
328 return (float) (second[n].tv_sec-first[n].tv_sec) +
329 (float) (second[n].tv_usec-first[n].tv_usec)/1000000.0;
330 }
331
332 // Outputs the variable format message (re: printf) to the log file.
333 int h1log(const char *fmt, ...)
334 {
335 va_list args;
336 char string[32768];
337
338 va_start(args, fmt);
339 vsprintf(string, fmt, args);
340 if(h1logfp) {
341 fprintf(h1logfp, string);
342 fflush(h1logfp);
343 }
344 else { // couldn't open log
345 printf(string); // also print to stdout
346 fflush(stdout);
347 }
348 va_end(args);
349 return(0);
350 }
351
352 int send_mail(char *fmt, ...)
353 {
354 va_list args;
355 char string[1024], cmd[1024];
356
357 va_start(args, fmt);
358 vsprintf(string, fmt, args);
359 sprintf(cmd, "echo \"%s\" | Mail -s \"build_lev1_iris mail\" lev0_user", string);
360 system(cmd);
361 va_end(args);
362 return(0);
363 }
364
365 // Got a fatal error.
366 void abortit(int stat)
367 {
368 printk("***Abort in progress ...\n");
369 printk("**Exit build_lev1_iris w/ status = %d\n", stat);
370 if (h1logfp) fclose(h1logfp);
371 exit(stat);
372 }
373
374 //!!TBD Keh-Cheng
375 int rdout_mode_correct()
376 {
377 return(0);
378 }
379
380 //!!TBD Art
381 int orbit_calc()
382 {
383 return(0);
384 }
385
386 static int GetSaaHlz(DRMS_Env_t *env, DRMS_RecordSet_t *rs, double *tgttimes, int ntimes, int (*myprintkerr)(const char *fmt, ...))
387 {
388 IORBIT_SaaHlzInfo_t *saahlzinfo = NULL;
389 int itime;
390 LinkedList_t *list = NULL;
391 LinkedList_t **pList = NULL;
392 ListNode_t *node = NULL;
393 char *eventType = NULL;
394 int nhlz;
395 int shlz;
396 int saa;
397 HContainer_t *colToList = NULL;
398 HContainer_t **pColToList = NULL;
399 char timeStr[IORBIT_SAAHLZINFO_TIME_KEY_LEN];
400 LIBASTRO_Error_t rv;
401 int ret = 0;
402
403 rv = iorbit_getSaaHlzInfo(env, SAA_HLZ_SERIES, tgttimes, ntimes, &saahlzinfo);
404
405 if (rv == kLIBASTRO_Success)
406 {
407 for (itime = 0; itime < ntimes; itime++)
408 {
409 nhlz = 0;
410 shlz = 0;
411 saa = 0;
412
413 snprintf(timeStr, sizeof(timeStr), "%lf", tgttimes[itime]);
414
415 if ((pColToList = hcon_lookup(saahlzinfo, timeStr)) != NULL)
416 {
417 colToList = *pColToList;
418
419 if ((pList = hcon_lookup(colToList, IORBIT_SAAHLZINFO_KW_EVENT_TYPE)) != NULL)
420 {
421 list = *pList;
422 list_llreset(list);
423
424 while((node = list_llnext(list)) != NULL)
425 {
426 eventType = (char *)node->data;
427
428 if (strcasecmp(eventType, "NHLZ") == 0)
429 {
430 nhlz = 1;
431 }
432 else if (strcasecmp(eventType, "SHLZ") == 0)
433 {
434 shlz = 1;
435 }
436 else if (strcasecmp(eventType, "SAA") == 0)
437 {
438 saa = 1;
439 }
440 }
441
442 /* Set SAA-HLZ keywords */
443 if (nhlz && shlz)
444 {
445 /* ERROR - set HLZ to 0. */
446 printkerr("ERROR - For tobs %lf, both event types NHLZ and SHLZ exist.\n", tgttimes[itime]);
447 drms_setkey_int(rs->records[itime], "HLZ", 0);
448 }
449 else if (nhlz)
450 {
451 printf(" Setting HLZ to 1.\n");
452 drms_setkey_int(rs->records[itime], "HLZ", 1);
453 }
454 else if (shlz)
455 {
456 printf(" Setting HLZ to 2.\n");
457 drms_setkey_int(rs->records[itime], "HLZ", 2);
458 }
459 else
460 {
461 drms_setkey_int(rs->records[itime], "HLZ", 0);
462 }
463
464 if (saa)
465 {
466 drms_setkey_int(rs->records[itime], "SAA", 1);
467 }
468 else
469 {
470 drms_setkey_int(rs->records[itime], "SAA", 0);
471 }
472 }
473 else
474 {
475 myprintkerr("ERROR - SAA-HLZ info for keyword %s unexecpectedly missing.\n", IORBIT_SAAHLZINFO_KW_EVENT_TYPE);
476 ret = 1;
477 }
478 }
479 else
480 {
481 myprintkerr("ERROR - SAA-HLZ info for tobs %lf unexecpectedly missing.\n", tgttimes[itime]);
482 ret = 1;
483 }
484 }
485
486 iorbit_cleanSaaHlzInfo(&saahlzinfo);
487 }
488 else
489 {
490 myprintkerr("ERROR - Couldn't query db properly.\n");
491 ret = 1;
492 }
493
494 return ret;
495 }
496
497 //#include "aia_despike.c"
498 //#include "do_flat.c"
499 #include "get_image_location.c"
500 #include "limb_fit_function.c"
501 #include "cosmic_ray.c"
502 #include "heightformation.c"
503
504 //Called with the range to do. The args are either rec#s or fsn#s accord to modeflg
505 int do_ingest(long long bbrec, long long eerec)
506 {
507 //FILE *fwt;
508 Image_Location *p_imageloc;
509 Image_Location imageloc[NUMRECLEV1];
510 TIME t_obs0;
511 TIME tobs[NUMRECLEV1];
512 float percentd;
513 float cdelt1, rsun, crpix1, crpix2, crota2;
514 double rsun_lf, x0_lf, y0_lf;
515 int rstatus, dstatus, lstatus, ncnt, fcnt, i, j, k, qualint, nobs;
516 int hshiexp, hcamid, nbad, n_cosmic;
517 int *spikedata, status, axes[2], nbytes;
518 uint32_t missvals, totvals;
519 long long recnum0, recnum1, recnumff;
520 char recrange[128], lev0name[128], flatrec[128], temprec[128], pointrec[128];
521 //char tmpname[80];
522 double scroll;
523
524 if(modeflg) sprintf(recrange, ":#%lld-#%lld", bbrec, eerec);
525 else sprintf(recrange, "%lld-%lld", bbrec, eerec);
526 sprintf(open_dsname, "%s[%s]", dsin, recrange);
527 printk("open_dsname = %s\n", open_dsname);
528 printk("#levnum recnum fsn\n");
529
530 t_obs0 = 0;
531 rset0 = drms_open_records(drms_env, open_dsname, &rstatus); //open lev0
532 if(!rset0 || (rset0->n == 0) || rstatus) {
533 printk("Can't do drms_open_records(%s)\n", open_dsname);
534 printf("Can't do drms_open_records(%s)\n", open_dsname);
535 //return(1);
536 return(0);
537 }
538 drms_stage_records(rset0, 1, 0);
539 ncnt = rset0->n;
540 rptr = (DRMS_Record_t *)malloc(ncnt * sizeof(DRMS_Record_t));
541 if(rptr == NULL) {
542 printk("Can't malloc() for DRMS_Record_t sort\n");
543 return(1);
544 }
545 //make opened records sequential in mem for sort
546 for(i=0; i < ncnt; i++) {
547 memcpy(&rptr[i], rset0->records[i], sizeof(DRMS_Record_t));
548 }
549 //Must sort to get in ascending t_obs order
550 qsort(rptr, ncnt, sizeof(DRMS_Record_t), &compare_rptr);
551
552 //this loop is for the benefit of the lev1view display to show
553 //info on all lev0 records opened
554 for(i=0; i < ncnt; i++) {
555 flatmiss[i] = 0; //init quality flags
556 orbmiss[i] = 0;
557 limbmiss[i] = 0;
558 asdmiss[i] = 0;
559 mpdmiss[i] = 0;
560 noimage[i] = 0;
561 missflg[i] = 0;
562 rs0 = &rptr[i];
563 recnum0 = rs0->recnum;
564 //must get fsn in case got record from last lev1 record
565 fsnx = drms_getkey_int(rs0, "FSN", &rstatus);
566 fsnarray[i] = fsnx;
567 printk("*0 %u %u\n", recnum0, fsnx);
568 //also set up call for get_pointing_info() and iorbit_getinfo()
569 tobs[i] = drms_getkey_time(rs0, "t_obs", &rstatus);
570 if(rstatus) {
571 printk("Error on drms_getkey_time() fsn=%u. Use DRMS_MISSING_TIME\n",
572 fsnx);
573 tobs[i] = DRMS_MISSING_TIME;
574 }
575 }
576 //New from Art's stuff 07Aug2013
577 HContainer_t *keymap = NULL;
578
579 keymap = hcon_create(DRMS_MAXKEYNAMELEN, DRMS_MAXKEYNAMELEN, NULL, NULL, NULL, NULL, 0);
580
581 if (!keymap)
582 {
583 IOstatus = kLIBASTRO_OutOfMemory;
584 }
585 else {
586 hcon_insert(keymap, "kXGCI", "geixobs");
587 hcon_insert(keymap, "kYGCI", "geiyobs");
588 hcon_insert(keymap, "kZGCI", "geizobs");
589 hcon_insert(keymap, "kXHCI", "heixobs");
590 hcon_insert(keymap, "kYHCI", "heiyobs");
591 hcon_insert(keymap, "kZHCI", "heizobs");
592 hcon_insert(keymap, "kRSUNOBS", "rsunobs");
593 hcon_insert(keymap, "kOBSVR", "obsvr");
594 hcon_insert(keymap, "kDSUNOBS", "dsunobs");
595 hcon_insert(keymap, "kOBSDATE", "obsdate");
596
597 IOstatus = iorbit_getinfo_ext(drms_env,
598 orbseries,
599 NULL,
600 IORBIT_Alg_Quadratic,
601 tobs,
602 ncnt,
603 kIORBIT_CacheAction_DontCache,
604 &IOinfo,
605 keymap);
606 hcon_destroy(&keymap);
607 }
608 if(IOstatus != kLIBASTRO_Success) {
609 if(IOstatus == kLIBASTRO_InsufficientData) {
610 printk("***ERROR in iorbit_getinfo_ext: kLIBASTRO_InsufficientData\n");
611 }
612 else {
613 printk("***ERROR in iorbit_getinfo_ext() status=%d\n", IOstatus);
614 }
615 for(j=0; j < ncnt; j++) { //set qual bits
616 orbmiss[j] = 1;
617 }
618 return(1); //abort. new 2/22/2011
619 }
620
621 /* IOStatus == kLIBASTRO_Success */
622
623 rset1 = drms_create_records(drms_env, ncnt, dsout, DRMS_PERMANENT,&dstatus);
624 if(dstatus) {
625 printk("**ERROR: Can't create records for %s\n", dsout);
626 for(j=0; j < ncnt; j++) { //set qual bits
627 noimage[j] = 1;
628 }
629 return(1); //new 2/22/2011
630 }
631
632 /*****************************************************************/
633 /* Obtain SAA-HLZ information, and set the SAA and HLZ keywords. */
634
635 if (GetSaaHlz(drms_env, rset1, tobs, ncnt, printkerr))
636 {
637 printk("***Error - Unable to fetch SAA-HLZ information.\n");
638 return 1;
639 }
640
641 /* End SAA-HLZ */
642 /*****************************************************************/
643
644
645 for(i=0; i < ncnt; i++) { //do for all the sorted lev0 records
646 //StartTimer(2); //!!TEMP
647 rs0 = &rptr[i];
648 recnum0 = rs0->recnum;
649 fsnx = fsnarray[i];
650 sprintf(lev0name, "%s[%u]", dsin, fsnx);
651 if(drms_getkey_int(rs0, "QUALITY", 0) < 0) {
652 printk("Bad QUALITY for %s, no lev1 made\n", lev0name);
653 noimage[i] = 1;
654 //continue; //make an image anyway so the lev1 fsn will exist
655 }
656 segment0 = drms_segment_lookupnum(rs0, 0);
657 int seg0sz = segment0->axis[0]*segment0->axis[1];
658 Array0 = drms_segment_read(segment0, DRMS_TYPE_SHORT, &rstatus);
659 if(!Array0) {
660 printk("Can't do drms_segment_read() %s status=%d\n",
661 lev0name, rstatus);
662 noimage[i] = 1;
663 return(1); //return until we learn
664 continue;
665 }
666 l0l1->adata0 = (short *)Array0->data; //free at end
667 l0l1->dat1.adata1A = &data1A; //int out
668 l0l1->rs0 = rs0;
669 l0l1->recnum0 = recnum0;
670 l0l1->fsn = fsnx;
671 l0l1->nx = segment0->axis[0];
672 l0l1->ny = segment0->axis[1];
673 l0l1->datavals = drms_getkey_int(rs0, "DATAVALS", &rstatus);
674 l0l1->missvals = drms_getkey_int(rs0, "MISSVALS", &rstatus);
675
676 sprintf(open_dsname, "%s[%u]", dsout, fsnx);
677 rs = rset1->records[i];
678
679 //
680 // find closest iris.pointing_data record and set scroll
681 //
682 {
683 if(!quicklook) {
684 DRMS_RecordSet_t *rset;
685 DRMS_Record_t *rt;
686 int st;
687 TIME t_obs, time_qbi;
688 float aeulrbrx, aeulrbry, aeulrbrz, acg_roll, ophase;
689 t_obs = drms_getkey_time(rs0, "t_obs", &st);
690 if (st) {
691 t_obs = DRMS_MISSING_TIME;
692 }
693 else {
694 sprintf(open_dsname, "iris.pointing_data[? date_obs > %f and date_obs <= %f ?]", t_obs-5, t_obs+5);
695 printf("%s\n", open_dsname);
696 rset = drms_open_records(drms_env, open_dsname, &st);
697 if (!rset || !rset->n || st) {
698 printk("Error in drms_open_records(%s); setting scroll to zero\n", open_dsname);
699 scroll = 0.0;
700 } else {
701 // There should be only one record returned
702 rt = rset->records[0];
703 sprintf(pointrec, "iris.pointing_data[:#%lld]", rt->recnum);
704 if(dstatus = drms_setkey_string(rs, "POINTREC", pointrec)) {
705 printk("**ERROR on drms_setkey_string() for %s\n", pointrec);
706 }
707 time_qbi = drms_getkey_time(rt, "TIME_QBI", &st);
708 aeulrbrx = drms_getkey_float(rt, "A_EULERBR_X", &st);
709 aeulrbry = drms_getkey_float(rt, "A_EULERBR_Y", &st);
710 aeulrbrz = drms_getkey_float(rt, "A_EULERBR_Z", &st);
711 acg_roll = drms_getkey_float(rt, "A_CG_ROLL_ANGLE", &st);
712 ophase = drms_getkey_float(rt, "OPHASE", &st);
713
714 drms_setkey_time(rs, "TIME_QBI", time_qbi);
715 drms_setkey_float(rs, "AEULRBRX", aeulrbrx);
716 drms_setkey_float(rs, "AEULRBRY", aeulrbry);
717 drms_setkey_float(rs, "AEULRBRZ", aeulrbrz);
718 drms_setkey_float(rs, "SAT_ROT", aeulrbrz);
719 drms_setkey_float(rs, "ACG_ROLL", acg_roll);
720 drms_setkey_float(rs, "OPHASE", ophase);
721
722 scroll = aeulrbrz;
723 }
724
725 if (rset)
726 drms_close_records(rset, DRMS_FREE_RECORD);
727 }
728 }
729 }
730
731 drms_record_directory(rs, rs1_path, 0);
732 if(!*rs1_path) {
733 printk("***ERROR: No path to segment for %s\n", open_dsname);
734 noimage[i] = 1;
735 continue;
736 }
737 printf("\npath to lev1 = %s\n", rs1_path); //!!TEMP
738 if(rstatus = iris_isp2wcs(rs0, rs, scroll)) {
739 printk("**ERROR: iris_isp2wcs() status = %d\n", rstatus);
740 printk("Press on after error at fsn=%u...\n", fsnx);
741 printf("**ERROR: at fsn %u\n", fsnx);
742 continue;
743 //printf("**ERROR: Abort on fsn = %u\n", fsnx);
744 //return(1);
745 }
746 dstatus = drms_setkey_int(rs, "FSN", fsnx);
747 //dstatus = drms_setkey_string(rs, "LEV0SERIES", lev0name); //no such keyword
748 if(!(segment = drms_segment_lookup(rs, "image_lev1"))) {
749 printk("No drms_segment_lookup(rs, image_lev1) for %s\n", open_dsname);
750 noimage[i] = 1;
751 continue;
752 }
753 segArray = drms_array_create(DRMS_TYPE_INT,
754 segment->info->naxis,
755 segment0->axis,
756 &data1A,
757 &dstatus);
758 //short *adata = (short *)Array0->data;
759 //short *bdata = &data1S;
760 //memcpy(bdata, adata, 2*seg0sz); //!!TEMP mv the lev0 in for now
761
762 //transer the lev0 keywords
763 rstatus = drms_copykeys(rs, rs0, 0, kDRMS_KeyClass_Explicit);
764 if(rstatus != DRMS_SUCCESS) {
765 printk("Error %d in drms_copykeys() for fsn %u\n", fsnx);
766 return(1); //new 2/22/2011
767 continue;
768 }
769 qualint = drms_getkey_int(rs0, "QUALITY", &rstatus);
770 drms_setkey_int(rs, "QUALLEV0", qualint);
771 fid = drms_getkey_int(rs0, "FID", &rstatus);
772
773 short isqisysn = drms_getkey_short(rs0, "ISQISYSN", &rstatus);
774 int iimgots1 = drms_getkey_int(rs0, "IIMGOTS1", &rstatus);
775 int iimgots2 = drms_getkey_int(rs0, "IIMGOTS2", &rstatus);
776 int iimgots3 = drms_getkey_int(rs0, "IIMGOTS3", &rstatus);
777 switch (isqisysn) {
778 case 0:
779 drms_setkey_int(rs, "IIMGOTS", iimgots1);
780 break;
781 case 1:
782 drms_setkey_int(rs, "IIMGOTS", iimgots2);
783 break;
784 case 2:
785 drms_setkey_int(rs, "IIMGOTS", iimgots3);
786 break;
787 }
788
789 drms_setkey_time(rs, "T_OBS", tobs[i]);
790 printk("t_obs for lev0 = %10.5f fsn=%u\n", tobs[i], fsnarray[i]); //!!TEMP
791 drms_setkey_double(rs, "DATE", CURRENT_SYSTEM_TIME);
792 if(ptinfo) {
793 ptdata = ptinfo[i];
794 drms_setkey_float(rs, "SAT_Y0", ptdata.sat_y0);
795 drms_setkey_float(rs, "SAT_Z0", ptdata.sat_z0);
796 drms_setkey_float(rs, "SAT_ROT", ptdata.sat_rot);
797 drms_setkey_string(rs, "ACS_MODE", ptdata.acs_mode);
798 drms_setkey_string(rs, "ACS_ECLP", ptdata.acs_eclp);
799 drms_setkey_string(rs, "ACS_SUNP", ptdata.acs_sunp);
800 drms_setkey_string(rs, "ACS_SAFE", ptdata.acs_safe);
801 drms_setkey_string(rs, "ASD_REC", ptdata.asd_rec);
802 drms_setkey_string(rs, "ACS_CGT", ptdata.acs_cgt);
803 }
804 if(IOinfo) {
805 IOdata = IOinfo[i];
806 drms_setkey_double(rs, "RSUN_OBS", IOdata.rsun_obs);
807 drms_setkey_double(rs, "DSUN_OBS", IOdata.dsun_obs);
808 drms_setkey_double(rs, "OBS_VR", IOdata.obs_vr);
809 drms_setkey_double(rs, "GEIX_OBS", IOdata.gciX);
810 drms_setkey_double(rs, "GEIY_OBS", IOdata.gciY);
811 drms_setkey_double(rs, "GEIZ_OBS", IOdata.gciZ);
812 drms_setkey_double(rs, "HEIX_OBS", IOdata.hciX);
813 drms_setkey_double(rs, "HEIY_OBS", IOdata.hciY);
814 drms_setkey_double(rs, "HEIZ_OBS", IOdata.hciZ);
815 drms_setkey_string(rs, "ORB_REC", IOdata.orb_rec);
816 }
817
818
819
820
821
822
823
824 drms_setkey_float(rs, "X0_MP", imageloc[i].x);
825 drms_setkey_float(rs, "Y0_MP", imageloc[i].y);
826 drms_setkey_float(rs, "INST_ROT", imageloc[i].instrot);
827 //drms_setkey_float(rs, "INST_ROT", 180.0); //force this for now
828 drms_setkey_float(rs, "IMSCL_MP", imageloc[i].imscale);
829 drms_setkey_string(rs, "MPO_REC", imageloc[i].mpo_rec);
830
831 int camera = drms_getkey_int(rs0, "CAMERA", &rstatus);
832 if(rstatus) {
833 printk("Can't do drms_getkey_int() for fsn %u\n", fsnx);
834 noimage[i] = 1;
835 goto TEMPSKIP;
836 //return(1);
837 }
838 if ( 0 == drms_setkey_time(rs, "T_REC", tobs[i])) {
839 int status, allstat = 0;
840 double tr_step;
841 long long tr_index;
842 TIME t_rec, tr_epoch;
843 tr_index = drms_getkey_longlong(rs, "T_REC_index", &status);
844 allstat += status;
845 tr_step = drms_getkey_double(rs, "T_REC_step", &status);
846 allstat += status;
847 tr_epoch = drms_getkey_time(rs, "T_REC_epoch", &status);
848 allstat += status;
849 if (0 == allstat) {
850 t_rec = tr_epoch + tr_index*tr_step;
851 drms_setkey_time(rs, "T_REC", t_rec);
852 }
853 }
854 //now get all the crs_table values according to lev0 IICRSID
855 int iicrsid = drms_getkey_int(rs0, "IICRSID", &rstatus);
856 if(rstatus) {
857 printk("Can't do drms_getkey_int() for IICRSID for fsn %u\n", fsnx);
858 printk("No CRS_TABLE keywords for lev1 fsn %u\n", fsnx);
859 }
860 else {
861 sprintf(open_dsname, "%s[%d]", DSCRSNAME, iicrsid);
862 printk("Open: %s\n", open_dsname);
863 crsset = drms_open_records(drms_env, open_dsname, &rstatus);
864 if(!crsset || (crsset->n == 0) || rstatus) {
865 printk("Can't do drms_open_records(%s)\n", open_dsname);
866 }
867 else {
868 crsrec = crsset->records[0];
869 char *crsstr = drms_getkey_string(crsrec, "CRS_DESC", &status);
870 drms_setkey_string(rs, "CRS_DESC", crsstr);
871 crsstr = drms_getkey_string(crsrec, "CRS_TYPE", &status);
872 drms_setkey_string(rs, "CRS_TYPE", crsstr);
873 int crsint = drms_getkey_int(crsrec, "CRS_NREG", &status);
874 drms_setkey_int(rs, "CRS_NREG", crsint);
875 crsint = drms_getkey_int(crsrec, "TSR1", &status);
876 drms_setkey_int(rs, "TSR1", crsint);
877 crsint = drms_getkey_int(crsrec, "TER1", &status);
878 drms_setkey_int(rs, "TER1", crsint);
879 crsint = drms_getkey_int(crsrec, "TSC1", &status);
880 drms_setkey_int(rs, "TSC1", crsint);
881 crsint = drms_getkey_int(crsrec, "TEC1", &status);
882 drms_setkey_int(rs, "TEC1", crsint);
883 crsint = drms_getkey_int(crsrec, "TSR2", &status);
884 drms_setkey_int(rs, "TSR2", crsint);
885 crsint = drms_getkey_int(crsrec, "TER2", &status);
886 drms_setkey_int(rs, "TER2", crsint);
887 crsint = drms_getkey_int(crsrec, "TSC2", &status);
888 drms_setkey_int(rs, "TSC2", crsint);
889 crsint = drms_getkey_int(crsrec, "TEC2", &status);
890 drms_setkey_int(rs, "TEC2", crsint);
891 crsint = drms_getkey_int(crsrec, "TSR3", &status);
892 drms_setkey_int(rs, "TSR3", crsint);
893 crsint = drms_getkey_int(crsrec, "TER3", &status);
894 drms_setkey_int(rs, "TER3", crsint);
895 crsint = drms_getkey_int(crsrec, "TSC3", &status);
896 drms_setkey_int(rs, "TSC3", crsint);
897 crsint = drms_getkey_int(crsrec, "TEC3", &status);
898 drms_setkey_int(rs, "TEC3", crsint);
899 crsint = drms_getkey_int(crsrec, "TSR4", &status);
900 drms_setkey_int(rs, "TSR4", crsint);
901 crsint = drms_getkey_int(crsrec, "TER4", &status);
902 drms_setkey_int(rs, "TER4", crsint);
903 crsint = drms_getkey_int(crsrec, "TSC4", &status);
904 drms_setkey_int(rs, "TSC4", crsint);
905 crsint = drms_getkey_int(crsrec, "TEC4", &status);
906 drms_setkey_int(rs, "TEC4", crsint);
907 crsint = drms_getkey_int(crsrec, "TSR5", &status);
908 drms_setkey_int(rs, "TSR5", crsint);
909 crsint = drms_getkey_int(crsrec, "TER5", &status);
910 drms_setkey_int(rs, "TER5", crsint);
911 crsint = drms_getkey_int(crsrec, "TSC5", &status);
912 drms_setkey_int(rs, "TSC5", crsint);
913 crsint = drms_getkey_int(crsrec, "TEC5", &status);
914 drms_setkey_int(rs, "TEC5", crsint);
915 crsint = drms_getkey_int(crsrec, "TSR6", &status);
916 drms_setkey_int(rs, "TSR6", crsint);
917 crsint = drms_getkey_int(crsrec, "TER6", &status);
918 drms_setkey_int(rs, "TER6", crsint);
919 crsint = drms_getkey_int(crsrec, "TSC6", &status);
920 drms_setkey_int(rs, "TSC6", crsint);
921 crsint = drms_getkey_int(crsrec, "TEC6", &status);
922 drms_setkey_int(rs, "TEC6", crsint);
923 crsint = drms_getkey_int(crsrec, "TSR7", &status);
924 drms_setkey_int(rs, "TSR7", crsint);
925 crsint = drms_getkey_int(crsrec, "TER7", &status);
926 drms_setkey_int(rs, "TER7", crsint);
927 crsint = drms_getkey_int(crsrec, "TSC7", &status);
928 drms_setkey_int(rs, "TSC7", crsint);
929 crsint = drms_getkey_int(crsrec, "TEC7", &status);
930 drms_setkey_int(rs, "TEC7", crsint);
931 crsint = drms_getkey_int(crsrec, "TSR8", &status);
932 drms_setkey_int(rs, "TSR8", crsint);
933 crsint = drms_getkey_int(crsrec, "TER8", &status);
934 drms_setkey_int(rs, "TER8", crsint);
935 crsint = drms_getkey_int(crsrec, "TSC8", &status);
936 drms_setkey_int(rs, "TSC8", crsint);
937 crsint = drms_getkey_int(crsrec, "TEC8", &status);
938 drms_setkey_int(rs, "TEC8", crsint);
939
940 crsint = drms_getkey_int(crsrec, "WIN_FLIP", &status);
941 l0l1->winflip = crsint;
942 drms_setkey_int(rs, "WIN_FLIP", crsint);
943 printk("Close: %s\n", open_dsname);
944 drms_close_records(crsset, DRMS_FREE_RECORD);
945 }
946 }
947
948 /****NEW from Rock 10Sep2013************************************************/
949 if(!quicklook) {
950 /* ITF1CCD1 CCD1_FUV1_OPERATING */
951 /* ITF2CCD2 CCD2_FUV2_OPERATING */
952 /* ITNUCCD3 CCD3_NUV_OPERATING */
953 /* ITSJCCD4 CCD4_SJI_OPERATING */
954 /* BT06CBPX CEB_ON_THE_POSX_AXIS */
955 /* BT07CBNX CEB_ON_THE_NEGX_AXIS */
956 /* BT15IEB ELECTRONICS_BOX */
957 /* IT08GTWM GUIDE_TELESCOPE_WEDGE_HC_MOTOR_TS08 */
958 /* IT14SPPX SPECTROGRAPH_OPTICS_PACKAGE_HOZ5_CONTROL_TS14 (pos_x) */
959 /* IT16SPNX SPECTROGRAPH_OPTICS_PACKAGE_HOZ7_CONTROL_TS16 (neg_x) */
960
961 float itf1ccd1, itf2ccd2, itnuccd3, itsjccd4;
962 float bt06cbpx, bt07cbnx, bt15ieb, it08gtwm;
963 float it14sppx, it16spnx;
964
965 char *dstemp = "iris.temperatures_60s";
966 if(fabs(tobs[i] - t_obs0) > 300.0) {
967 char *selstr = "select max(date_obs) from ";
968 char *whrstr = "where date_obs <= ";
969 int nr;
970 if(rs_t) {
971 drms_close_records(rs_t, DRMS_FREE_RECORD);
972 rs_t = NULL;
973 }
974 sprintf(open_dsname, "%s[? date_obs=(%s %s %s %f) ?]",
975 dstemp, selstr, dstemp, whrstr, tobs[i]);
976 printf(" %s\n", open_dsname);
977 rt = NULL;
978 rs_t = drms_open_records(drms_env, open_dsname, &rstatus);
979 if(rstatus) printk("Can not open temperature series.\n");
980 else {
981 nr = rs_t->n;
982 if(nr != 1) printk("%d records != 1.\n", nr);
983 rt = rs_t->records[0];
984 }
985 t_obs0 = tobs[i];
986 }
987 if (rt) {
988 int st;
989 sprintf(temprec, "%s[:#%lld]", dstemp, rt->recnum);
990 if(dstatus = drms_setkey_string(rs, "TEMP_REC", temprec)) {
991 printk("**ERROR on drms_setkey_string() for %s\n", temprec);
992 }
993 itf1ccd1 = drms_getkey_float(rt, "ITF1CCD1", &st);
994 itf2ccd2 = drms_getkey_float(rt, "ITF2CCD2", &st);
995 itnuccd3 = drms_getkey_float(rt, "ITNUCCD3", &st);
996 itsjccd4 = drms_getkey_float(rt, "ITSJCCD4", &st);
997 bt06cbpx = drms_getkey_float(rt, "BT06CBPX", &st);
998 bt07cbnx = drms_getkey_float(rt, "BT07CBNX", &st);
999 bt15ieb = drms_getkey_float(rt, "BT15IEB", &st);
1000 it08gtwm = drms_getkey_float(rt, "IT08GTWM", &st);
1001 it14sppx = drms_getkey_float(rt, "IT14SPPX", &st);
1002 it16spnx = drms_getkey_float(rt, "IT16SPNX", &st);
1003
1004 drms_setkey_float(rs, "ITF1CCD1", itf1ccd1);
1005 drms_setkey_float(rs, "ITF2CCD2", itf2ccd2);
1006 drms_setkey_float(rs, "ITNUCCD3", itnuccd3);
1007 drms_setkey_float(rs, "ITSJCCD4", itsjccd4);
1008 drms_setkey_float(rs, "BT06CBPX", bt06cbpx);
1009 drms_setkey_float(rs, "BT07CBNX", bt07cbnx);
1010 drms_setkey_float(rs, "BT15IEB", bt15ieb);
1011 drms_setkey_float(rs, "IT08GTWM", it08gtwm);
1012 drms_setkey_float(rs, "IT14SPPX", it14sppx);
1013 drms_setkey_float(rs, "IT16SPNX", it16spnx);
1014 }
1015 }
1016 /****END NEW from Rock 10Sep2013************************************************/
1017
1018 //For quicklook, find closest iris.timeline record & set scroll 26Nov2013
1019 if(quicklook) {
1020 DRMS_RecordSet_t *rset;
1021 DRMS_Record_t *rt;
1022 int st;
1023 TIME t_obs, roll_start;
1024 float roll_deg;
1025 t_obs = drms_getkey_time(rs0, "t_obs", &st);
1026 if (st) {
1027 t_obs = DRMS_MISSING_TIME;
1028 }
1029 else {
1030 sprintf(open_dsname, "iris.timeline_roll[? roll_start > %f and roll_start <= %f ?]", t_obs-86401, t_obs+1);
1031 printf("%s\n", open_dsname);
1032 rset = drms_open_records(drms_env, open_dsname, &st);
1033
1034 if (!rset || !rset->n || st) {
1035 printk("Error in drms_open_records(%s); setting scroll to zero\n", open_dsname);
1036 scroll = 0.0;
1037
1038 } else {
1039 // Pick last record
1040 //rt = rset->records[0];
1041 rt = rset->records[(rset->n)-1];
1042 sprintf(pointrec, "iris.timeline_roll[:#%lld]", rt->recnum);
1043 if(dstatus = drms_setkey_string(rs, "POINTREC", pointrec)) {
1044 printk("**ERROR on drms_setkey_string() for %s\n", pointrec);
1045 }
1046 roll_start = drms_getkey_time(rt, "ROLL_START", &st);
1047 roll_deg = drms_getkey_float(rt, "DEGREES", &st);
1048
1049 drms_setkey_float(rs, "SAT_ROT", roll_deg);
1050
1051 scroll = roll_deg;
1052 }
1053
1054 if (rset)
1055 drms_close_records(rset, DRMS_FREE_RECORD);
1056 }
1057 }
1058
1059 //char *wavstr = drms_getkey_string(rs0, "WAVE_STR", &rstatus);
1060 char *imgpath = drms_getkey_string(rs0, "IMG_PATH", &rstatus);
1061 if(rstatus) {
1062 printk("Can't do drms_getkey_string() for IMG_PATH\n");
1063 return(1);
1064 }
1065 if(quicklook) {
1066 sprintf(open_dsname, "%s[? t_start=(select max(t_start) from %s where t_start <= %10.5f and t_stop > %10.5f and IMG_PATH='%s') and IMG_PATH='%s' ?]",
1067 dsffname, dsffname, tobs[i], tobs[i], imgpath, imgpath);
1068 }
1069 else {
1070 sprintf(open_dsname, "%s[? t_start <= %10.5f and t_stop > %10.5f and IMG_PATH='%s' ?]",
1071 dsffname, tobs[i], tobs[i], imgpath);
1072 }
1073 //printf("!!TEMP Flat field query: %s\n", open_dsname); //!!TEMP
1074 //printk("!!TEMP Flat field query: %s\n", open_dsname); //!!TEMP
1075 rsetff = drms_open_records(drms_env, open_dsname, &rstatus); //open FF
1076 if(!rsetff || (rsetff->n == 0) || rstatus) {
1077 printk("Can't do drms_open_records(%s)\n", open_dsname);
1078 flatmiss[i] = 1; noimage[i] = 1;
1079 goto TEMPSKIP;
1080 return(1); //new 2/22/2011
1081 }
1082 fcnt = rsetff->n;
1083 if(fcnt > 1) {
1084 printk("More than one FF found for %s?\n", open_dsname);
1085 printk("Use last one of %d found\n", fcnt); //!!TEMP
1086 //return(1); //!!TBD
1087 }
1088 //rsff = rsetff->records[0];
1089 rsff = rsetff->records[fcnt-1];
1090 recnumff = rsff->recnum;
1091 sprintf(flatrec, "%s[:#%lld]", dsffname, recnumff);
1092 if(dstatus = drms_setkey_string(rs, "FLAT_REC", flatrec )) {
1093 printk("**ERROR on drms_setkey_string() for %s\n", flatrec);
1094 }
1095 drms_record_directory(rsff, path, 1);
1096 if(!*path) {
1097 printk("***ERROR: No path to segment for %s\n", open_dsname);
1098 //goto TEMPSKIP; //!!!TEMP until have good flatfield
1099 return(1);
1100 }
1101 //printf("\npath to FF = %s\n", path); //!!TEMP
1102 segmentff = drms_segment_lookup(rsff, "flatfield");
1103 Arrayff = drms_segment_read(segmentff, DRMS_TYPE_FLOAT, &rstatus);
1104 if(!Arrayff) {
1105 printk("Can't do drms_segment_read() for Flat Field status=%d\n",
1106 rstatus);
1107 return(1);
1108 }
1109 l0l1->adataff = (float *)Arrayff->data; //!!TBD free at end
1110
1111 /**************************No DARK for IRIS?**********************************/
1112 //darkseg = drms_segment_lookup(rsff, "DARK");
1113 darkseg = drms_segment_lookup(rsff, "dark");
1114 ArrayDark = drms_segment_read(darkseg, DRMS_TYPE_FLOAT, &rstatus);
1115 if(!ArrayDark) {
1116 printk("Can't do drms_segment_read() for dark. status=%d\n", rstatus);
1117 return(1);
1118 }
1119 l0l1->adatadark = (float *)ArrayDark->data; //free at end
1120
1121 badseg = drms_segment_lookup(rsff, "bad_pixel");
1122 ArrayBad = drms_segment_read(badseg, DRMS_TYPE_INT, &rstatus);
1123 nbad = drms_array_size(ArrayBad)/sizeof(int);
1124 if(!ArrayBad) {
1125 printk("Can't do drms_segment_read() for bad_pixel. status=%d\n",
1126 rstatus);
1127 return(1);
1128 }
1129 l0l1->adatabad = (int *)ArrayBad->data; //free at end
1130 //if(!(badoutpixseg = drms_segment_lookup(rs, "bad_pixel"))) {
1131 // printk("No drms_segment_lookup(rs, bad_pixel) for lev1\n");
1132 // return(1);
1133 //}
1134 l0l1->rs1 = rs;
1135 l0l1->rsff = rsff;
1136 l0l1->recnum1 = rs->recnum;
1137 l0l1->darkflag = 0;
1138 l0l1->sumx = drms_getkey_short(rs0, "SUMSPTRL", &rstatus);
1139 l0l1->sumy = drms_getkey_short(rs0, "SUMSPAT", &rstatus);
1140 hshiexp = drms_getkey_int(rs, "HSHIEXP", &rstatus);
1141 hcamid = drms_getkey_int(rs, "HCAMID", &rstatus);
1142 float sumdc=0.0;
1143 int idc, numdc=0;
1144 int aimgshce = drms_getkey_int(rs, "AIMGSHCE", &rstatus);
1145 //if(aimgshce == 0) l0l1->darkflag = 1;
1146 short iifrmtyp = drms_getkey_short(rs0, "IIFRMTYP", &rstatus);
1147 if((iifrmtyp == 2) || (iifrmtyp == 5)) l0l1->darkflag = 1;
1148 if(rstatus = do_flat_iris(l0l1)) {
1149 printk("***ERROR in do_flat_iris() status=%d\n", rstatus);
1150 printf("***ERROR in do_flat_iris() status=%d\n", rstatus);
1151 flatmiss[i] = 1; noimage[i] = 1;
1152 //return(1); //!!TBD what to do?
1153 goto FLATERR;
1154 }
1155
1156 //sprintf(tmpname, "/tmp/data_lev1.%u", fsnx);
1157 //fwt = fopen(tmpname, "w");
1158 //int wsize = 4096 * 4096;
1159 //fwrite(l0l1->adata1, sizeof(float), wsize, fwt);
1160 //fclose(fwt);
1161 drms_setkey_float(rs, "OSCNMEAN", l0l1->oscnmean);
1162 drms_setkey_float(rs, "OSCNRMS", l0l1->oscnrms);
1163 drms_setkey_int(rs, "DATAMIN", l0l1->datamin);
1164 drms_setkey_int(rs, "DATAMAX", l0l1->datamax);
1165 drms_setkey_int(rs, "DATAMEDN", l0l1->datamedn);
1166 drms_setkey_float(rs, "DATAMEAN", l0l1->datamean);
1167 drms_setkey_float(rs, "DATARMS", l0l1->data_rms);
1168 drms_setkey_float(rs, "DATASKEW", l0l1->dataskew);
1169 drms_setkey_float(rs, "DATAKURT", l0l1->datakurt);
1170 drms_setkey_int(rs, "DATAVALS", l0l1->datavals);
1171 drms_setkey_int(rs, "MISSVALS", l0l1->missvals);
1172 missvals = (uint32_t)l0l1->missvals;
1173 totvals = (uint32_t)l0l1->datavals + missvals;
1174 drms_setkey_int(rs, "TOTVALS", (int)totvals);
1175 percentd = (float)((100.0 * (float)l0l1->datavals)/(float)totvals);
1176 drms_setkey_float(rs, "PERCENTD", percentd);
1177 if(missvals > 0) missflg[i] = missflg[i] | Q_1_MISS0;
1178 if(missvals > (uint32_t)(totvals * 0.01))
1179 missflg[i] = missflg[i] | Q_1_MISS1;
1180 if(missvals > (uint32_t)(totvals * 0.05))
1181 missflg[i] = missflg[i] | Q_1_MISS2;
1182 if(missvals > (uint32_t)(totvals * 0.25))
1183 missflg[i] = missflg[i] | Q_1_MISS3;
1184 if(l0l1->datavals == 0)
1185 missflg[i] = missflg[i] | Q_MISSALL; //high bit, no data
1186 //if(nspikes) {
1187 // if (spikeseg = drms_segment_lookup(rs,"spikes") ) {
1188 // nbytes = nspikes*sizeof(int);
1189 // axes[0] = nspikes;
1190 // axes[1] = 3;
1191 // spikedata = (int *) malloc (3*nspikes*sizeof(int));
1192 // ArraySpike = drms_array_create(DRMS_TYPE_INT, 2, axes,
1193 // (void *) spikedata, &status);
1194 // memcpy((void *)spikedata, (void *)spikelocs, nbytes);
1195 // memcpy((void *)(spikedata+nspikes), (void *)oldvalues, nbytes);
1196 // memcpy((void *)(spikedata+2*nspikes), (void *)newvalues, nbytes);
1197 // status = drms_segment_write(spikeseg, ArraySpike, 0);
1198 // drms_free_array(ArraySpike);
1199 // } // else { printf("spikes segment not found\n"); }
1200 //}
1201
1202 /**************************No DARK for IRIS?**********************************/
1203
1204 FLATERR:
1205 drms_close_records(rsetff, DRMS_FREE_RECORD);
1206 free(ArrayDark->data);
1207 free(Arrayff->data);
1208 free(ArrayBad->data);
1209
1210 TEMPSKIP:
1211 x0_lf = DRMS_MISSING_DOUBLE;
1212 y0_lf = DRMS_MISSING_DOUBLE;
1213 rsun_lf = DRMS_MISSING_DOUBLE;
1214 //Don't send calmode or darks to limb_fit()
1215 //calmode: HCFTID=17
1216 //dark: HSHIEXP=0 and HCAMID=0 or 1
1217 int skiplimb = 0;
1218 hcftid = drms_getkey_int(rs, "HCFTID", &rstatus);
1219 if(hcftid == CAL_HCFTID) { //don't call limb_fit()
1220 printk("Cal mode image fsn=%u\n", fsnx);
1221 skiplimb = 1;
1222 }
1223 else {
1224 if(hshiexp == 0) {
1225 if(hcamid == 0 || hcamid == 1) {
1226 printk("Dark image fsn=%u\n", fsnx);
1227 skiplimb = 1;
1228 }
1229 }
1230 }
1231 lstatus = 1; //default bad limb_fit
1232 //goto WCSEND; //skip all WCS stuff for IRIS
1233
1234 WCSEND:
1235
1236 //if(hmiaiaflg) { //aia
1237 // int wl = drms_getkey_int(rs, "WAVELNTH", &rstatus);
1238 //}
1239
1240 do_quallev1(rs0, rs, i, fsnx);
1241 //ftmp = StopTimer(2); //!!!TEMP
1242 //printf( "\nTime sec in inside loop for fsn=%u : %f\n\n", fsnx, ftmp );
1243
1244 IRISSKIP:
1245 dstatus = drms_segment_writewithkeys(segment, segArray, 0);
1246 //dstatus = drms_segment_write(segment, segArray, 0);
1247 if (dstatus) {
1248 printk("ERROR: drms_segment_write error=%d for fsn=%u\n",
1249 dstatus,fsnx);
1250 noimage[i] = 1;
1251 }
1252 recnum1 = rs->recnum;
1253 printk("*1 %u %u\n", recnum1, fsnx);
1254 free(Array0->data);
1255 // if (rs_t) drms_close_records(rs_t, DRMS_FREE_RECORD);
1256 if (rs_resp) drms_close_records(rs_resp, DRMS_FREE_RECORD);
1257 rs_resp = NULL;
1258 } //END do for all the sorted lev0 records
1259
1260 drms_close_records(rset0, DRMS_FREE_RECORD); //close lev0 records
1261 drms_close_records(rset1, DRMS_INSERT_RECORD); //close lev1 records
1262 return(0);
1263 }
1264
1265 int compare_rptr(const void *a, const void *b)
1266 {
1267 TIME t1, t2;
1268 int rstatus;
1269 DRMS_Record_t *x=(DRMS_Record_t *)a, *y=(DRMS_Record_t *)b;
1270
1271 t1 = drms_getkey_time(x, "t_obs", &rstatus);
1272 if(rstatus) t1 = DRMS_MISSING_TIME; //treat error as missing t_obs
1273 t2 = drms_getkey_time(y, "t_obs", &rstatus);
1274 if(rstatus) t2 = DRMS_MISSING_TIME;
1275 if(t1 < t2) return(-1);
1276 if(t1 > t2) return(1);
1277 return(0);
1278 }
1279
1280 // Initial setup stuff called when main is first entered.
1281 void setup()
1282 {
1283 FILE *fin;
1284 char string[128], cwdbuf[128], idstr[256], lfile[128];
1285 int tpid;
1286
1287 sdo_epoch = sscan_time("1958.01.01_00:00:00_TAI");
1288 do_datestr();
1289 printk_set(h1log, h1log); // set for printk calls
1290 printk("%s\n", datestr);
1291 gethostname(idstr, 256);
1292 printf("Host: %s\n", idstr);
1293 printk("Host: %s\n", idstr);
1294 getcwd(cwdbuf, 126);
1295 sprintf(idstr, "Cwd: %s\nCall: ", cwdbuf);
1296 sprintf(string, "build_lev1_iris started as pid=%d ppid=%d user=%s\n",
1297 getpid(), getppid(), username);
1298 strcat(idstr, string);
1299 printk("%s", idstr);
1300 printf("%s", idstr);
1301 if(restartflg) printk("-r ");
1302 sprintf(argmode, "mode=%s", mode);
1303 sprintf(argdsin, "dsin=%s", dsin);
1304 sprintf(argdsout, "dsout=%s", dsout);
1305 if(modeflg) {
1306 sprintf(argbx, "brec=%lld", brec);
1307 sprintf(argex, "erec=%lld", erec);
1308 }
1309 else {
1310 sprintf(argbx, "bfsn=%lld", bfsn);
1311 sprintf(argex, "efsn=%lld", efsn);
1312 }
1313 sprintf(argquick, "quicklook=%d", quicklook);
1314 sprintf(arglogfile, "logfile=%s", logname);
1315 printk("%s %s %s %s %s %s %s\n",
1316 argmode, argdsin, argdsout, argbx, argex, argquick, arglogfile);
1317 printf("%s %s %s %s %s %s %s\n",
1318 argmode, argdsin, argdsout, argbx, argex, argquick, arglogfile);
1319 if(!restartflg) {
1320 //printk("tlmseriesname=%s\nlev0seriesname=%s\n",
1321 // tlmseriesname, lev0seriesname);
1322 }
1323 sprintf(bld_vers, "%s", jsoc_version);
1324 sprintf(idstr, "ps -ef | grep %s", LEV1VIEWERNAME);
1325 fin = popen(idstr, "r");
1326 while(fgets(string, sizeof string, fin)) { //get ps line
1327 if(!(strstr(string, "perl"))) continue;
1328 sscanf(string, "%s %d", idstr, &tpid); /* get user name & process id */
1329 sprintf(lfile, "%s/build_lev1_iris_restart_%d.touch", LEV1LOG_BASEDIR, tpid);
1330 sprintf(idstr, "/bin/touch %s", lfile);
1331 printk("%s\n", idstr);
1332 system(idstr);
1333 }
1334 umask(002); // allow group write
1335 //Image.initialized = 0; // init the two image structures
1336 //ImageOld.initialized = 0;
1337 //Img = &Image;
1338 //ImgO = &ImageOld;
1339 //Img->initialized = 0;
1340 //ImgO->initialized = 0;
1341 }
1342
1343 // Module main function.
1344 int DoIt(void)
1345 {
1346 long long numofrecs, frec, lrec;
1347 int numrec, numofchunks, i;
1348 char line[80];
1349
1350 if (nice_intro())
1351 return (0);
1352 if(!(username = (char *)getenv("USER"))) username = "nouser";
1353 mode = cmdparams_get_str(&cmdparams, "mode", NULL);
1354 if(strcmp(mode, "recnum") && strcmp(mode, "fsn")) {
1355 printf("Error: mode= must be given as 'recnum' or 'fsn'\n");
1356 return(0);
1357 }
1358 if(!strcmp(mode, "recnum")) modeflg = 1;
1359 dsin = cmdparams_get_str(&cmdparams, "dsin", NULL);
1360 dsout = cmdparams_get_str(&cmdparams, "dsout", NULL);
1361 brec = cmdparams_get_int(&cmdparams, "brec", NULL);
1362 erec = cmdparams_get_int(&cmdparams, "erec", NULL);
1363 bfsn = cmdparams_get_int(&cmdparams, "bfsn", NULL);
1364 efsn = cmdparams_get_int(&cmdparams, "efsn", NULL);
1365 quicklook = cmdparams_get_int(&cmdparams, "quicklook", NULL);
1366 //quicklook = 1; //!!TEMP for test
1367 if(modeflg) { //recnum mode
1368 if(brec == 0 || erec == 0) {
1369 fprintf(stderr, "brec and erec must be given for recnum mode. 0 not allowed\n");
1370 return(0);
1371 }
1372 if(brec > erec) {
1373 fprintf(stderr, "brec must be <= erec\n");
1374 return(0);
1375 }
1376 bnumx = brec;
1377 enumx = erec;
1378 }
1379 else { //fsn mode
1380 if(bfsn == 0 || efsn == 0) {
1381 fprintf(stderr, "bfsn and efsn must be given for fsn mode. 0 not allowed\n");
1382 return(0);
1383 }
1384 if(bfsn > efsn) {
1385 fprintf(stderr, "bfsn must be <= efsn\n");
1386 return(0);
1387 }
1388 bnumx = bfsn;
1389 enumx = efsn;
1390 }
1391 logfile = cmdparams_get_str(&cmdparams, "logfile", NULL);
1392 if (strcmp(dsin, NOTSPECIFIED) == 0) {
1393 dsin = LEV0SERIESNAMEIRIS;
1394 }
1395 if (strcmp(dsout, NOTSPECIFIED) == 0) {
1396 dsout = LEV1SERIESNAMEIRIS;
1397 }
1398 sprintf(dsffname, "%s", DSFFNAME);
1399
1400 if (strcmp(logfile, NOTSPECIFIED) == 0) {
1401 sprintf(logname, H1LOGFILE, gettimetag());
1402 }
1403 else {
1404 sprintf(logname, "%s", logfile);
1405 }
1406 if(restartflg || LOGTEST) {
1407 if((h1logfp=fopen(logname, "a")) == NULL)
1408 fprintf(stderr, "**Can't open for append the log file %s\n", logname);
1409 }
1410 else {
1411 if((h1logfp=fopen(logname, "w")) == NULL)
1412 fprintf(stderr, "**Can't open the log file %s\n", logname);
1413 }
1414 setup();
1415 numofrecs = (enumx - bnumx) + 1;
1416 numrec = NUMRECLEV1; //# of records to do at a time
1417 numofchunks = numofrecs/numrec;
1418 if((numofrecs % numrec) != 0) numofchunks++; //extra loop for partial chunk
1419 lrec = bnumx-1;
1420 for(i = 0; i < numofchunks; i++) {
1421 frec = lrec+1; lrec = (frec + numrec)-1;
1422 if(lrec > enumx) lrec=enumx;
1423 if(do_ingest(frec, lrec)) { //do a chunk to get files from the lev0
1424 printf("build_lev1_iris abort\nSee log: %s\n", logname);
1425 send_mail("build_lev1_iris abort\nSee log: %s\n", logname);
1426 return(0);
1427 }
1428 }
1429 printf("build_lev1_iris done last fsn=%u\n", fsnx);
1430 return(0);
1431 }