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 |
} |