ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/JSOC/proj/lev0/apps/do_flat.c
Revision: 1.23
Committed: Tue Sep 10 19:05:14 2013 UTC (10 years ago) by production
Content type: text/plain
Branch: MAIN
CVS Tags: Ver_9-1, Ver_8-8, Ver_8-2, Ver_8-3, Ver_8-1, Ver_8-6, Ver_8-7, Ver_8-4, Ver_8-5, Ver_8-10, Ver_8-11, Ver_8-12, Ver_9-0
Changes since 1.22: +2 -1 lines
Log Message:
change HIMGCFGFILE

File Contents

# Content
1 //#define HIMGCFGFILE "/home/production/img_cnfg_ids"
2 #define HIMGCFGFILE "/home/jsoc/cvs/Development/JSOC/proj/tables/img_cnfg_ids"
3
4 #define XXX_CANT_OPEN_HIMGCFGFILE -1
5 #define XXX_CORRUPT_HIMGCFGFILE -2
6 #define XXX_CANT_FIND_HIMGCFID -3
7 #define XXX_INVALID_HIMGCFID -4
8 #define XXX_INVALID_EXPTIME -5
9
10 #define MAXHIMGCFGS 4096
11 static int overscan_nrows[MAXHIMGCFGS];
12 static int overscan_ncols[MAXHIMGCFGS];
13 static int overscan_rowstr[MAXHIMGCFGS];
14 static int overscan_colstr[MAXHIMGCFGS];
15 static int overscan_valid[MAXHIMGCFGS];
16 static int dvals[MAXHIMGCFGS];
17
18 #define NBINS 1048576
19 #define MINOUT -256
20 #define MAXOUT 1048320
21 static int hist[NBINS];
22
23 #include "aia_despike.c"
24
25 ///////////////////////////////////
26 int get_overscan_info(int himgcfid)
27 {
28 static int firstcall = 1;
29 static FILE *fp;
30 static char line[256];
31 int found = 0;
32 int id;
33 char j[64];
34
35 if (firstcall) {
36 fp = fopen(HIMGCFGFILE,"r");
37 if (!fp)
38 return XXX_CANT_OPEN_HIMGCFGFILE;
39 firstcall = 0;
40 }
41
42 rewind(fp);
43 while (fgets(line, 256, fp)) {
44 if (1 != sscanf(line, "%d", &id))
45 continue;
46 if (id != himgcfid)
47 continue;
48 if (15 != sscanf(line, "%s%s%s%s%s%s%s%s%s%d%d%d%d%s%d",
49 j,j,j,j,j,j,j,j,j, &overscan_nrows[id], &overscan_ncols[id],
50 &overscan_rowstr[id], &overscan_colstr[id], j, &dvals[id]))
51 return XXX_CORRUPT_HIMGCFGFILE;
52 found = 1;
53 overscan_valid[himgcfid] = 1;
54 }
55
56 if (!found)
57 return XXX_CANT_FIND_HIMGCFID;
58
59 return 0;
60 }
61
62 ///////////////////////////
63 int do_flat(LEV0LEV1 *info)
64 {
65 int i,j,idx,IDX;
66 int nr,nc,r1,r2,c1,c2;
67 int status;
68 int is_dark = info->darkflag;
69 float *flat = info->adataff;
70 float *dark = info->adatadark;
71 short *in = info->adata0;
72 float *out = info->dat1.adata1;
73 short tmp;
74 int itmp;
75 float ftmp;
76 double dtmp;
77 double exptime;
78 double s, s2, s3, s4, ss;
79 int npix, min, max, medn;
80
81 exptime = drms_getkey_double(rs0, "EXPTIME", &status);
82 if (!is_dark && (status || !isfinite(exptime) || exptime <= 0.0))
83 return XXX_INVALID_EXPTIME;
84
85 if (info->himgcfid < 0 || info->himgcfid >= MAXHIMGCFGS)
86 return XXX_INVALID_HIMGCFID;
87 if (!overscan_valid[info->himgcfid]) {
88 status = get_overscan_info(info->himgcfid);
89 if (status) return status;
90 }
91
92 nr = overscan_nrows[info->himgcfid];
93 if (nr) {
94 r1 = overscan_rowstr[info->himgcfid];
95 r2 = r1 + nr;
96 } else
97 r1 = r2 = 4096;
98
99 nc = overscan_ncols[info->himgcfid];
100 if (nc) {
101 c1 = overscan_colstr[info->himgcfid];
102 c2 = c1 + nc;
103 } else
104 c1 = c2 = 4096;
105
106 //
107 // do overscan statistics
108 //
109 info->oscnmean = info->oscnrms = DRMS_MISSING_DOUBLE;
110 npix = 0;
111 s = s2 = 0.0;
112
113 if (nr) {
114 for (i=r1; i<r2; ++i) {
115 for (j=0; j<c1; ++j) {
116 tmp = in[4096*i+j];
117 if (tmp == DRMS_MISSING_SHORT)
118 continue;
119 dtmp = tmp;
120 s += dtmp;
121 s2 += dtmp*dtmp;
122 ++npix;
123 }
124 for (j=c2; j<4096; ++j) {
125 tmp = in[4096*i+j];
126 if (tmp == DRMS_MISSING_SHORT)
127 continue;
128 dtmp = tmp;
129 s += dtmp;
130 s2 += dtmp*dtmp;
131 ++npix;
132 }
133 }
134 }
135
136 if (nc) {
137 for (i=0; i<r1; ++i)
138 for (j=c1; j<c2; ++j) {
139 tmp = in[4096*i+j];
140 if (tmp == DRMS_MISSING_SHORT)
141 continue;
142 dtmp = tmp;
143 s += dtmp;
144 s2 += dtmp*dtmp;
145 ++npix;
146 }
147 for (i=r2; i<4096; ++i)
148 for (j=c1; j<c2; ++j) {
149 tmp = in[4096*i+j];
150 if (tmp == DRMS_MISSING_SHORT)
151 continue;
152 dtmp = tmp;
153 s += dtmp;
154 s2 += dtmp*dtmp;
155 ++npix;
156 }
157 }
158
159 if (npix > 1) {
160 info->oscnmean = s/npix;
161 info->oscnrms = sqrt((s2-s*s/npix) / (npix-1));
162 }
163
164 //
165 // apply dark, flat correction quadrant by quadrant
166 // and squeeze out the overscan rows and columns
167 //
168 memset(hist, 0, 4*NBINS);
169 npix = 0;
170 nr /= 2;
171 nc /= 2;
172 for (i=0; i<r1; ++i) {
173 idx = 4096*i;
174 IDX = idx + 4096*nr + nc;
175 for (j=0; j<c1; ++j) {
176 tmp = in[idx++];
177 if (DRMS_MISSING_SHORT == tmp)
178 out[IDX++] = DRMS_MISSING_FLOAT;
179 else {
180 //ftmp = (tmp - dark[IDX]) / (exptime * flat[IDX]);
181 ftmp = is_dark ? tmp : (tmp - dark[IDX]) / (exptime * flat[IDX]);
182 if (ftmp >= MINOUT && ftmp < MAXOUT) {
183 itmp = roundf(ftmp);
184 out[IDX] = ftmp;
185 ++hist[itmp-MINOUT];
186 ++npix;
187 } else if (ftmp < 0) {
188 out[IDX] = MINOUT;
189 ++hist[0];
190 ++npix;
191 } else if (ftmp > 0) {
192 out[IDX] = MAXOUT;
193 ++hist[NBINS-1];
194 ++npix;
195 }
196
197 ++IDX;
198 }
199 }
200 }
201 for (i=0; i<r1; ++i) {
202 idx = 4096*i + c2;
203 IDX = idx + 4096*nr - nc;
204 for (j=c2; j<4096; ++j) {
205 tmp = in[idx++];
206 if (DRMS_MISSING_SHORT == tmp)
207 out[IDX++] = DRMS_MISSING_FLOAT;
208 else {
209 //ftmp = (tmp - dark[IDX]) / (exptime * flat[IDX]);
210 ftmp = is_dark ? tmp : (tmp - dark[IDX]) / (exptime * flat[IDX]);
211 if (ftmp >= MINOUT && ftmp < MAXOUT) {
212 itmp = roundf(ftmp);
213 out[IDX] = ftmp;
214 ++hist[itmp-MINOUT];
215 ++npix;
216 } else if (ftmp < 0) {
217 out[IDX] = MINOUT;
218 ++hist[0];
219 ++npix;
220 } else if (ftmp > 0) {
221 out[IDX] = MAXOUT;
222 ++hist[NBINS-1];
223 ++npix;
224 }
225
226 ++IDX;
227 }
228 }
229 }
230 for (i=r2; i<4096; ++i) {
231 idx = 4096*i;
232 IDX = idx - 4096*nr + nc;
233 for (j=0; j<c1; ++j) {
234 tmp = in[idx++];
235 if (DRMS_MISSING_SHORT == tmp)
236 out[IDX++] = DRMS_MISSING_FLOAT;
237 else {
238 //ftmp = (tmp - dark[IDX]) / (exptime * flat[IDX]);
239 ftmp = is_dark ? tmp : (tmp - dark[IDX]) / (exptime * flat[IDX]);
240 if (ftmp >= MINOUT && ftmp < MAXOUT) {
241 itmp = roundf(ftmp);
242 out[IDX] = ftmp;
243 ++hist[itmp-MINOUT];
244 ++npix;
245 } else if (ftmp < 0) {
246 out[IDX] = MINOUT;
247 ++hist[0];
248 ++npix;
249 } else if (ftmp > 0) {
250 out[IDX] = MAXOUT;
251 ++hist[NBINS-1];
252 ++npix;
253 }
254
255 ++IDX;
256 }
257 }
258 }
259 for (i=r2; i<4096; ++i) {
260 idx = 4096*i + c2;
261 IDX = idx - 4096*nr - nc;
262 for (j=c2; j<4096; ++j) {
263 tmp = in[idx++];
264 if (DRMS_MISSING_SHORT == tmp)
265 out[IDX++] = DRMS_MISSING_FLOAT;
266 else {
267 //ftmp = (tmp - dark[IDX]) / (exptime * flat[IDX]);
268 ftmp = is_dark ? tmp : (tmp - dark[IDX]) / (exptime * flat[IDX]);
269 if (ftmp >= MINOUT && ftmp < MAXOUT) {
270 itmp = roundf(ftmp);
271 out[IDX] = ftmp;
272 ++hist[itmp-MINOUT];
273 ++npix;
274 } else if (ftmp < 0) {
275 out[IDX] = MINOUT;
276 ++hist[0];
277 ++npix;
278 } else if (ftmp > 0) {
279 out[IDX] = MAXOUT;
280 ++hist[NBINS-1];
281 ++npix;
282 }
283
284 ++IDX;
285 }
286 }
287 }
288
289 info->datavals = npix;
290 info->missvals = dvals[info->himgcfid] - npix;
291
292 //
293 // fill in blanks around the borders
294 //
295 if (nr) {
296 for (i=0; i<4096*nr; ++i) out[i] = DRMS_MISSING_FLOAT;
297 for (i=4096*(4096-nr); i<MAXPIXELS; ++i) out[i] = DRMS_MISSING_FLOAT;
298 }
299 if (nc) {
300 for (i=0; i<4096; ++i) {
301 for (j=0; j<nc; ++j)
302 out[i*4096+j] = DRMS_MISSING_FLOAT;
303 for (j=4096-nc; j<4096; ++j)
304 out[i*4096+j] = DRMS_MISSING_FLOAT;
305 }
306 }
307
308 //
309 // do statistics
310 //
311 info->datamin = info->datamax = info->datamedn = DRMS_MISSING_INT;
312 info->datamean = info->data_rms = info->dataskew
313 = info->datakurt = DRMS_MISSING_DOUBLE;
314
315 min = 0;
316 max = NBINS-1;
317 if (npix) {
318 while (hist[min] == 0)
319 ++min;
320 info->datamin = min + MINOUT;
321
322 while (hist[max] == 0)
323 --max;
324 info->datamax = max + MINOUT;
325
326 medn = min;
327 i = hist[medn];
328 while (2*i < npix)
329 i += hist[++medn];
330 info->datamedn = medn + MINOUT;
331
332 s = s2 = s3 = s4 = 0.0;
333 for (i=min; i<=max; ++i) {
334 double ii = i + MINOUT;
335 s += (dtmp = ii*hist[i]);
336 s2 += (dtmp *= ii);
337 s3 += (dtmp *= ii);
338 s4 += (dtmp *= ii);
339 }
340 s /= npix;
341 info->datamean = s;
342 ss = s*s;
343 s2 /= npix;
344 s3 /= npix;
345 s4 /= npix;
346 if (npix > 1) {
347 dtmp = npix * (s2-ss) / (npix-1);
348 info->data_rms = sqrt(dtmp);
349 if (dtmp > 0.0) {
350 info->dataskew = (s3 - s * (3*s2 - 2*ss)) /
351 (dtmp*info->data_rms);
352 info->datakurt = (s4 - 4*s*s3 + 3*ss*(2*s2-ss)) /
353 (dtmp*dtmp) - 3;
354 }
355 }
356 }
357
358 return 0;
359 }
360
361 ///////////////////////////
362 int do_flat_aia(LEV0LEV1 *info)
363 {
364 int i,j,idx,IDX;
365 int nr,nc,r1,r2,c1,c2;
366 int status;
367 float *flat = info->adataff;
368 float *dark = info->adatadark;
369 short *in = info->adata0;
370 int *out = info->dat1.adata1A;
371 short tmp;
372 float ftmp;
373 double dtmp;
374 double s=0.0, s2=0.0, s3=0.0, s4=0.0, ss;
375 int npix, min, max, medn;
376
377 if (info->himgcfid < 0 || info->himgcfid >= MAXHIMGCFGS)
378 return XXX_INVALID_HIMGCFID;
379 if (!overscan_valid[info->himgcfid]) {
380 status = get_overscan_info(info->himgcfid);
381 if (status) return status;
382 }
383
384 nr = overscan_nrows[info->himgcfid];
385 if (nr) {
386 r1 = overscan_rowstr[info->himgcfid];
387 r2 = r1 + nr;
388 } else
389 r1 = r2 = 4096;
390 nr /= 2;
391
392 nc = overscan_ncols[info->himgcfid];
393 if (nc) {
394 c1 = overscan_colstr[info->himgcfid];
395 c2 = c1 + nc;
396 } else
397 c1 = c2 = 4096;
398 nc /= 2;
399
400 info->oscnmean = info->oscnrms = DRMS_MISSING_DOUBLE;
401
402 memset(hist, 0, 4*NBINS);
403
404 //
405 // apply dark, flat correction quadrant by quadrant
406 // and squeeze out the overscan rows and columns
407 //
408 npix = 0;
409 for (i=0; i<r1; ++i) {
410 idx = 4096*i;
411 IDX = idx + 4096*nr + nc;
412 for (j=0; j<c1; ++j) {
413 tmp = in[idx++];
414 if (DRMS_MISSING_SHORT == tmp)
415 out[IDX++] = DRMS_MISSING_INT;
416 else {
417 ftmp = roundf((tmp - dark[IDX]) / flat[IDX]);
418 if (ftmp >= MINOUT && ftmp < MAXOUT) {
419 out[IDX] = ftmp;
420 ++hist[out[IDX]-MINOUT];
421 ++npix;
422 } else
423 out[IDX] = DRMS_MISSING_INT;
424 ++IDX;
425 }
426 }
427 }
428 for (i=0; i<r1; ++i) {
429 idx = 4096*i + c2;
430 IDX = idx + 4096*nr - nc;
431 for (j=c2; j<4096; ++j) {
432 tmp = in[idx++];
433 if (DRMS_MISSING_SHORT == tmp)
434 out[IDX++] = DRMS_MISSING_INT;
435 else {
436 ftmp = roundf((tmp - dark[IDX]) / flat[IDX]);
437 if (ftmp >= MINOUT && ftmp < MAXOUT) {
438 out[IDX] = ftmp;
439 ++hist[out[IDX]-MINOUT];
440 ++npix;
441 } else
442 out[IDX] = DRMS_MISSING_INT;
443 ++IDX;
444 }
445 }
446 }
447 for (i=r2; i<4096; ++i) {
448 idx = 4096*i;
449 IDX = idx - 4096*nr + nc;
450 for (j=0; j<c1; ++j) {
451 tmp = in[idx++];
452 if (DRMS_MISSING_SHORT == tmp)
453 out[IDX++] = DRMS_MISSING_INT;
454 else {
455 ftmp = roundf((tmp - dark[IDX]) / flat[IDX]);
456 if (ftmp >= MINOUT && ftmp < MAXOUT) {
457 out[IDX] = ftmp;
458 ++hist[out[IDX]-MINOUT];
459 ++npix;
460 } else
461 out[IDX] = DRMS_MISSING_INT;
462 ++IDX;
463 }
464 }
465 }
466 for (i=r2; i<4096; ++i) {
467 idx = 4096*i + c2;
468 IDX = idx - 4096*nr - nc;
469 for (j=c2; j<4096; ++j) {
470 tmp = in[idx++];
471 if (DRMS_MISSING_SHORT == tmp)
472 out[IDX++] = DRMS_MISSING_INT;
473 else {
474 ftmp = roundf((tmp - dark[IDX]) / flat[IDX]);
475 if (ftmp >= MINOUT && ftmp < MAXOUT) {
476 out[IDX] = ftmp;
477 ++hist[out[IDX]-MINOUT];
478 ++npix;
479 } else
480 out[IDX] = DRMS_MISSING_INT;
481 ++IDX;
482 }
483 }
484 }
485
486 info->datavals = npix;
487 info->missvals = dvals[info->himgcfid] - npix;
488
489 //
490 // fill in blanks around the borders
491 //
492 if (nr) {
493 for (i=0; i<4096*nr; ++i) out[i] = DRMS_MISSING_INT;
494 for (i=4096*(4096-nr); i<MAXPIXELS; ++i) out[i] = DRMS_MISSING_INT;
495 }
496 if (nc) {
497 for (i=0; i<4096; ++i) {
498 for (j=0; j<nc; ++j)
499 out[i*4096+j] = DRMS_MISSING_INT;
500 for (j=4096-nc; j<4096; ++j)
501 out[i*4096+j] = DRMS_MISSING_INT;
502 }
503 }
504
505 {
506 int *oldvalues, *spikelocs, *newvalues;
507 int aia_status, i, level = 7, niter = 3, nbads, nspikes=0, respike, rstatus;
508 float frac = 0.8;
509 int wl = drms_getkey_int(rs, "WAVELNTH", &rstatus);
510
511 switch (wl) {
512 case 1600:
513 case 1700:
514 case 4500:
515 respike = 1;
516 break;
517 default:
518 respike = 0;
519 break;
520 }
521 for (i=0; i<4096*4096; i++) {
522 // if (out[i] < MINOUT && out[i] != DRMS_MISSING_INT) out[i] = MINOUT;
523 if (out[i] > 32767) out[i] = 32767;
524 }
525 if (respike) niter = 0; else niter = 3;
526 nbads = ArrayBad->axis[0];
527 aia_status = aia_despike(info->dat1.adata1A, NULL, 4096, 4096, frac, level,
528 niter, info->adatabad, nbads, &nspikes, &oldvalues,
529 &spikelocs, &newvalues);
530 set_nspikes(nspikes);
531 set_spikelocs(spikelocs);
532 set_oldvalues(oldvalues);
533 set_newvalues(newvalues);
534 drms_setkey_int(rs, "NSPIKES", nspikes);
535 }
536 //
537 // do statistics
538 //
539 npix = 0; memset(hist, 0, 4*NBINS);
540 /*******Original Code
541 for (i=0; i<4096*4096; i++) {
542 if(out[i] != DRMS_MISSING_INT) { ++hist[out[i]-MINOUT]; ++npix; }
543 }
544 *******************/
545 //
546 // do statistics
547 //
548 npix = 0; memset(hist, 0, 4*NBINS);
549 for (i=0; i<4096*4096; i++) {
550 if(out[i] != DRMS_MISSING_INT) {
551 if (out[i] < MINOUT) out[i] = MINOUT;
552 if (out[i] > 16383) out[i] = 16383;
553 ++hist[out[i]-MINOUT];
554 ++npix;
555 }
556 }
557
558 info->datavals = npix;
559 info->missvals = dvals[info->himgcfid] - npix;
560 info->datamin = info->datamax = info->datamedn = DRMS_MISSING_INT;
561 //info->datavals = info->missvals = DRMS_MISSING_INT;
562 info->datamean = info->data_rms = info->dataskew
563 = info->datakurt = DRMS_MISSING_DOUBLE;
564
565 min = 0;
566 max = NBINS-1;
567 if (npix) {
568 while (hist[min] == 0)
569 ++min;
570 info->datamin = min + MINOUT;
571
572 while (hist[max] == 0)
573 --max;
574 info->datamax = max + MINOUT;
575
576 medn = min;
577 i = hist[medn];
578 while (2*i < npix)
579 i += hist[++medn];
580 info->datamedn = medn + MINOUT;
581
582 for (i=min; i<=max; ++i) {
583 double ii = i + MINOUT;
584 s += (dtmp = ii*hist[i]);
585 s2 += (dtmp *= ii);
586 s3 += (dtmp *= ii);
587 s4 += (dtmp *= ii);
588 }
589 s /= npix;
590 info->datamean = s;
591 ss = s*s;
592 s2 /= npix;
593 s3 /= npix;
594 s4 /= npix;
595 if (npix > 1) {
596 dtmp = npix * (s2-ss) / (npix-1);
597 info->data_rms = sqrt(dtmp);
598 if (dtmp > 0.0) {
599 info->dataskew = (s3 - s * (3*s2 - 2*ss)) /
600 (dtmp*info->data_rms);
601 info->datakurt = (s4 - 4*s*s3 + 3*ss*(2*s2-ss)) /
602 (dtmp*dtmp) - 3;
603 }
604 }
605
606 { //aia
607 int n=0, nsatpix=0, sum=0, dp[8];
608 dp[0] = 1; dp[1] = 10; dp[2] = 25; dp[3] = 75;
609 dp[4] = 90; dp[5] = 95; dp[6] = 98; dp[7] = 99;
610 for (i=min; i<=max; ++i) {
611 sum += hist[i];
612 if (sum > dp[n]*npix/100) switch (n) {
613 case 0:
614 drms_setkey_float(rs, "DATAP01", 1.0 + i + MINOUT);
615 if (sum > dp[n+1]*npix/100) n++;
616 case 1:
617 drms_setkey_float(rs, "DATAP10", 1.0 + i + MINOUT);
618 if (sum > dp[n+1]*npix/100) n++;
619 case 2:
620 drms_setkey_float(rs, "DATAP25", 1.0 + i + MINOUT);
621 if (sum > dp[n+1]*npix/100) n++;
622 case 3:
623 drms_setkey_float(rs, "DATAP75", 1.0 + i + MINOUT);
624 if (sum > dp[n+1]*npix/100) n++;
625 case 4:
626 drms_setkey_float(rs, "DATAP90", 1.0 + i + MINOUT);
627 if (sum > dp[n+1]*npix/100) n++;
628 case 5:
629 drms_setkey_float(rs, "DATAP95", 1.0 + i + MINOUT);
630 if (sum > dp[n+1]*npix/100) n++;
631 case 6:
632 drms_setkey_float(rs, "DATAP98", 1.0 + i + MINOUT);
633 if (sum > dp[n+1]*npix/100) n++;
634 case 7:
635 drms_setkey_float(rs, "DATAP99", 1.0 + i + MINOUT);
636 n++;
637 break;
638 }
639 if (i>max) n++;
640 if (i > (15000 - MINOUT)) nsatpix += hist[i];
641 }
642 drms_setkey_int(rs, "NSATPIX", nsatpix);
643 }
644 }
645
646 return 0;
647 }