38 #include "boost/format.hpp"
40 #include "lsst/afw/geom.h"
41 #include "lsst/pex/exceptions.h"
42 #include "lsst/afw/image/MaskedImage.h"
47 namespace algorithms {
49 namespace image = lsst::afw::image;
50 namespace geom = lsst::afw::geom;
62 static std::vector<Defect::Ptr>
63 classify_defects(std::vector<Defect::Ptr>
const & badList,
69 std::vector<Defect::Ptr> badList1D;
71 for (
DefectCIter begin = badList.begin(), end = badList.end(), bri = begin; bri != end; ++bri) {
74 if (y < defect->getY0() || y > defect->getY1() || ncol < defect->getX0()) {
78 int const x0 = defect->getX0();
79 int x1 = defect->getX1();
83 for (++bri; bri != end; ++bri) {
86 if (y < defect->getY0() || y > defect->getY1()) {
89 if (x1 < defect->getX0() - 1) {
93 if (defect->getX1() > x1) {
98 int const nbad = x1 - x0 + 1;
105 geom::Extent2I(nbad, 1)
109 badList1D.push_back(defect);
118 for (
DefectCIter begin = badList1D.begin(), end = badList1D.end(), bri = begin; bri != end; ++bri) {
121 int const nbad = defect->getX1() - defect->getX0() + 1;
124 if (defect->getX0() == 0) {
130 }
else if (defect->getX0() == 1) {
136 }
else if (defect->getX1() == ncol - 2) {
142 }
else if (defect->getX1() == ncol - 1) {
159 switch (defect->getPos()) {
172 assert(defect_m->getX1() < defect->getX0());
174 if (defect_m->getX1() == defect->getX0() - 2) {
175 defect->classify(defect->getPos(), (defect->getType() & ~(02 << (nshift + 2))));
179 if (bri + 1 != end) {
182 if (defect->getX1() == defect_p->getX0() - 2) {
185 defect->classify(defect->getPos(), (defect->getType() & ~(02 << nshift)));
187 defect->classify(defectPos, (defect->getType() & ~01));
212 template<
typename ImageT>
213 static void do_defects(std::vector<Defect::Ptr>
const & badList,
216 typename ImageT::Pixel min,
217 double fallbackValue,
218 bool useFallbackValueAtEdge,
222 typedef typename ImageT::Pixel ImagePixel;
223 ImagePixel out1_2, out1_1, out2_1, out2_2;
228 int const ncol = data.getWidth();
229 typename ImageT::x_iterator out = data.row_begin(y);
231 for (
DefectCIter ptr = badList.begin(), end = badList.end(); ptr != end; ++ptr) {
234 if (y < defect->getY0() || y > defect->getY1()) {
238 int badX0 = defect->getX0();
239 int badX1 = defect->getX1();
242 unsigned int defectType = defect->getType();
244 int nbad = badX1 - badX0 + 1;
246 if (nbad > nUseInterp && useFallbackValueAtEdge) {
252 if (badX1 == ncol - 1) {
253 for (
int i = 0; i != ncol; ++i) {
254 out[i] = fallbackValue;
259 for (; badX0 <= badX1 - nUseInterp; ++badX0) {
260 out[badX0] = fallbackValue;
265 switch (defectType) {
266 case 01: defectType = 02;
break;
267 case 03: defectType = 03;
break;
269 throw std::runtime_error(str(boost::format(
"Impossible value of defectType: 0%o") %
273 nbad = badX1 - badX0 + 1;
274 defectType = (03 << (nbad + 2)) | defectType;
280 assert(badX1 == ncol - 1);
281 for (; badX1 >= badX0 + nUseInterp; --badX1) {
282 out[badX1] = fallbackValue;
284 nbad = badX1 - badX0 + 1;
285 defectType = (03 << (nbad + 2)) | 03;
295 assert(badX0 >= 0 && badX1 + 2 < ncol);
297 out2_1 = out[badX1 + 1];
298 out2_2 = out[badX1 + 2];
300 switch (defectType) {
303 out[badX1] = (val < min) ? out2_1 : val;
307 val = 1.4288*out2_1 - 0.4288*out2_2;
308 out[badX1] = (val < min) ? out2_1 : val;
312 val = 1.0933*out2_1 - 0.0933*out2_2;
313 out[badX0] = (val < min) ? out2_1 : val;
315 val = 1.4288*out2_1 - 0.4288*out2_2;
316 out[badX1] = (val < min) ? out2_1 : val;
321 out[badX0] = (val < min) ? out2_1 : val;
322 out[badX1] = (val < min) ? out2_1 : val;
326 val = 0.6968*out2_1 + 0.3032*out2_2;
327 out[badX0] = (val < min) ? out2_1 : val;
329 val = 1.0933*out2_1 - 0.0933*out2_2;
330 out[badX1 - 1] = (val < min) ? out2_1 : val;
332 val = 1.4288*out2_1 - 0.4288*out2_2;
333 out[badX1] = (val < min) ? out2_1 : val;
339 out[badX0] = (val < min) ? out2_1 : val;
340 out[badX1 - 1] = (val < min) ? out2_1 : val;
341 out[badX1] = (val < min) ? out2_1 : val;
345 val = 0.5370*out2_1 + 0.4630*out2_2;
346 out[badX0] = (val < min) ? out2_1 : val;
348 val = 0.6968*out2_1 + 0.3032*out2_2;
349 out[badX0 + 1] = (val < min) ? out2_1 : val;
351 val = 1.0933*out2_1 - 0.0933*out2_2;
352 out[badX1 - 1] = (val < min) ? out2_1 : val;
354 val = 1.4288*out2_1 - 0.4288*out2_2;
355 out[badX1] = (val < min) ? out2_1 : val;
361 out[badX0] = (val < min) ? out2_1 : val;
362 out[badX0 + 1] = (val < min) ? out2_1 : val;
363 out[badX1 - 1] = (val < min) ? out2_1 : val;
364 out[badX1] = (val < min) ? out2_1 : val;
368 val = 0.5041*out2_1 + 0.4959*out2_2;
369 out[badX0] = (val < min) ? out2_1 : val;
371 val = 0.5370*out2_1 + 0.4630*out2_2;
372 out[badX0 + 1] = (val < min) ? out2_1 : val;
374 val = 0.6968*out2_1 + 0.3032*out2_2;
375 out[badX1 - 2] = (val < min) ? out2_1 : val;
377 val = 1.0933*out2_1 - 0.0933*out2_2;
378 out[badX1 - 1] = (val < min) ? out2_1 : val;
380 val = 1.4288*out2_1 - 0.4288*out2_2;
381 out[badX1] = (val < min) ? out2_1 : val;
386 out[badX0] = (val < min) ? out2_1 : val;
387 out[badX0 + 1] = (val < min) ? out2_1 : val;
388 out[badX1 - 2] = (val < min) ? out2_1 : val;
389 out[badX1 - 1] = (val < min) ? out2_1 : val;
390 out[badX1] = (val < min) ? out2_1 : val;
394 val = 0.5003*out2_1 + 0.4997*out2_2;
395 out[badX0] = (val < min) ? out2_1 : val;
397 val = 0.5041*out2_1 + 0.4959*out2_2;
398 out[badX0 + 1] = (val < min) ? out2_1 : val;
400 val = 0.5370*out2_1 + 0.4630*out2_2;
401 out[badX0 + 2] = (val < min) ? out2_1 : val;
403 val = 0.6968*out2_1 + 0.3032*out2_2;
404 out[badX1 - 2] = (val < min) ? out2_1 : val;
406 val = 1.0933*out2_1 - 0.0933*out2_2;
407 out[badX1 - 1] = (val < min) ? out2_1 : val;
409 val = 1.4288*out2_1 - 0.4288*out2_2;
410 out[badX1] = (val < min) ? out2_1 : val;
416 out[badX0] = (val < min) ? out2_1 : val;
417 out[badX0 + 1] = (val < min) ? out2_1 : val;
418 out[badX0 + 2] = (val < min) ? out2_1 : val;
419 out[badX1 - 2] = (val < min) ? out2_1 : val;
420 out[badX1 - 1] = (val < min) ? out2_1 : val;
421 out[badX1] = (val < min) ? out2_1 : val;
425 val = 0.5000*out2_1 + 0.5000*out2_2;
426 out[badX0] = (val < min) ? out2_1 : val;
428 val = 0.5003*out2_1 + 0.4997*out2_2;
429 out[badX0 + 1] = (val < min) ? out2_1 : val;
431 val = 0.5041*out2_1 + 0.4959*out2_2;
432 out[badX0 + 2] = (val < min) ? out2_1 : val;
434 val = 0.5370*out2_1 + 0.4630*out2_2;
435 out[badX1 - 3] = (val < min) ? out2_1 : val;
437 val = 0.6968*out2_1 + 0.3032*out2_2;
438 out[badX1 - 2] = (val < min) ? out2_1 : val;
440 val = 1.0933*out2_1 - 0.0933*out2_2;
441 out[badX1 - 1] = (val < min) ? out2_1 : val;
443 val = 1.4288*out2_1 - 0.4288*out2_2;
444 out[badX1] = (val < min) ? out2_1 : val;
449 out[badX0] = (val < min) ? out2_1 : val;
450 out[badX0 + 1] = (val < min) ? out2_1 : val;
451 out[badX0 + 2] = (val < min) ? out2_1 : val;
452 out[badX1 - 3] = (val < min) ? out2_1 : val;
453 out[badX1 - 2] = (val < min) ? out2_1 : val;
454 out[badX1 - 1] = (val < min) ? out2_1 : val;
455 out[badX1] = (val < min) ? out2_1 : val;
459 val = 0.5000*out2_1 + 0.5000*out2_2;
460 out[badX0] = (val < min) ? out2_1 : val;
462 val = 0.5000*out2_1 + 0.5000*out2_2;
463 out[badX0 + 1] = (val < min) ? out2_1 : val;
465 val = 0.5003*out2_1 + 0.4997*out2_2;
466 out[badX0 + 2] = (val < min) ? out2_1 : val;
468 val = 0.5041*out2_1 + 0.4959*out2_2;
469 out[badX0 + 3] = (val < min) ? out2_1 : val;
471 val = 0.5370*out2_1 + 0.4630*out2_2;
472 out[badX1 - 3] = (val < min) ? out2_1 : val;
474 val = 0.6968*out2_1 + 0.3032*out2_2;
475 out[badX1 - 2] = (val < min) ? out2_1 : val;
477 val = 1.0933*out2_1 - 0.0933*out2_2;
478 out[badX1 - 1] = (val < min) ? out2_1 : val;
480 val = 1.4288*out2_1 - 0.4288*out2_2;
481 out[badX1] = (val < min) ? out2_1 : val;
486 out[badX0] = (val < min) ? out2_1 : val;
487 out[badX0 + 1] = (val < min) ? out2_1 : val;
488 out[badX0 + 2] = (val < min) ? out2_1 : val;
489 out[badX0 + 3] = (val < min) ? out2_1 : val;
490 out[badX1 - 3] = (val < min) ? out2_1 : val;
491 out[badX1 - 2] = (val < min) ? out2_1 : val;
492 out[badX1 - 1] = (val < min) ? out2_1 : val;
493 out[badX1] = (val < min) ? out2_1 : val;
497 val = 0.5000*out2_1 + 0.5000*out2_2;
498 out[badX0] = (val < min) ? out2_1 : val;
500 val = 0.5000*out2_1 + 0.5000*out2_2;
501 out[badX0 + 1] = (val < min) ? out2_1 : val;
503 val = 0.5000*out2_1 + 0.5000*out2_2;
504 out[badX0 + 2] = (val < min) ? out2_1 : val;
506 val = 0.5003*out2_1 + 0.4997*out2_2;
507 out[badX0 + 3] = (val < min) ? out2_1 : val;
509 val = 0.5041*out2_1 + 0.4959*out2_2;
510 out[badX1 - 4] = (val < min) ? out2_1 : val;
512 val = 0.5370*out2_1 + 0.4630*out2_2;
513 out[badX1 - 3] = (val < min) ? out2_1 : val;
515 val = 0.6968*out2_1 + 0.3032*out2_2;
516 out[badX1 - 2] = (val < min) ? out2_1 : val;
518 val = 1.0933*out2_1 - 0.0933*out2_2;
519 out[badX1 - 1] = (val < min) ? out2_1 : val;
521 val = 1.4288*out2_1 - 0.4288*out2_2;
522 out[badX1] = (val < min) ? out2_1 : val;
527 out[badX0] = (val < min) ? out2_1 : val;
528 out[badX0 + 1] = (val < min) ? out2_1 : val;
529 out[badX0 + 2] = (val < min) ? out2_1 : val;
530 out[badX0 + 3] = (val < min) ? out2_1 : val;
531 out[badX1 - 4] = (val < min) ? out2_1 : val;
532 out[badX1 - 3] = (val < min) ? out2_1 : val;
533 out[badX1 - 2] = (val < min) ? out2_1 : val;
534 out[badX1 - 1] = (val < min) ? out2_1 : val;
535 out[badX1] = (val < min) ? out2_1 : val;
539 val = 0.5000*out2_1 + 0.5000*out2_2;
540 out[badX0] = (val < min) ? out2_1 : val;
542 val = 0.5000*out2_1 + 0.5000*out2_2;
543 out[badX0 + 1] = (val < min) ? out2_1 : val;
545 val = 0.5000*out2_1 + 0.5000*out2_2;
546 out[badX0 + 2] = (val < min) ? out2_1 : val;
548 val = 0.5000*out2_1 + 0.5000*out2_2;
549 out[badX0 + 3] = (val < min) ? out2_1 : val;
551 val = 0.5003*out2_1 + 0.4997*out2_2;
552 out[badX0 + 4] = (val < min) ? out2_1 : val;
554 val = 0.5041*out2_1 + 0.4959*out2_2;
555 out[badX1 - 4] = (val < min) ? out2_1 : val;
557 val = 0.5370*out2_1 + 0.4630*out2_2;
558 out[badX1 - 3] = (val < min) ? out2_1 : val;
560 val = 0.6968*out2_1 + 0.3032*out2_2;
561 out[badX1 - 2] = (val < min) ? out2_1 : val;
563 val = 1.0933*out2_1 - 0.0933*out2_2;
564 out[badX1 - 1] = (val < min) ? out2_1 : val;
566 val = 1.4288*out2_1 - 0.4288*out2_2;
567 out[badX1] = (val < min) ? out2_1 : val;
573 out[badX0] = (val < min) ? out2_1 : val;
574 out[badX0 + 1] = (val < min) ? out2_1 : val;
575 out[badX0 + 2] = (val < min) ? out2_1 : val;
576 out[badX0 + 3] = (val < min) ? out2_1 : val;
577 out[badX0 + 4] = (val < min) ? out2_1 : val;
578 out[badX1 - 4] = (val < min) ? out2_1 : val;
579 out[badX1 - 3] = (val < min) ? out2_1 : val;
580 out[badX1 - 2] = (val < min) ? out2_1 : val;
581 out[badX1 - 1] = (val < min) ? out2_1 : val;
582 out[badX1] = (val < min) ? out2_1 : val;
592 if (badX1 + 2 >= ncol) {
594 if (badX1 == ncol - 2) {
599 for (
int j = badX0; j <= badX1; j++) {
604 out2_1 = out[badX1 + 1];
605 out2_2 = out[badX1 + 2];
607 switch (defectType) {
610 val = (val < min) ? out2_1 : val;
612 for (
int j = badX0; j <= badX1; j++) {
617 val = 0.5000*out2_1 + 0.5000*out2_2;
622 for (
int j = badX0; j < badX1 - 5; j++) {
626 val = 0.5003*out2_1 + 0.4997*out2_2;
627 out[badX1 - 5] = (val < min) ? out2_1 : val;
629 val = 0.5041*out2_1 + 0.4959*out2_2;
630 out[badX1 - 4] = (val < min) ? out2_1 : val;
632 val = 0.5370*out2_1 + 0.4630*out2_2;
633 out[badX1 - 3] = (val < min) ? out2_1 : val;
635 val = 0.6968*out2_1 + 0.3032*out2_2;
636 out[badX1 - 2] = (val < min) ? out2_1 : val;
638 val = 1.0933*out2_1 - 0.0933*out2_2;
639 out[badX1 - 1] = (val < min) ? out2_1 : val;
641 val = 1.4288*out2_1 - 0.4288*out2_2;
642 out[badX1] = (val < min) ? out2_1 : val;
652 assert(badX0 >= 2 && badX1 < ncol);
654 out1_2 = out[badX0 - 2];
655 out1_1 = out[badX0 - 1];
657 switch (defectType) {
659 val = -0.4288*out1_2 + 1.4288*out1_1;
660 out[badX1] = (val < min) ? out1_1 : val;
664 val = -0.4288*out1_2 + 1.4288*out1_1;
665 out[badX0] = (val < min) ? out1_1 : val;
667 val = -0.0933*out1_2 + 1.0933*out1_1;
668 out[badX1] = (val < min) ? out1_1 : val;
672 val = -0.4288*out1_2 + 1.4288*out1_1;
673 out[badX0] = (val < min) ? out1_1 : val;
675 val = -0.0933*out1_2 + 1.0933*out1_1;
676 out[badX1 - 1] = (val < min) ? out1_1 : val;
678 val = 0.3032*out1_2 + 0.6968*out1_1;
679 out[badX1] = (val < min) ? out1_1 : val;
683 val = -0.4288*out1_2 + 1.4288*out1_1;
684 out[badX0] = (val < min) ? out1_1 : val;
686 val = -0.0933*out1_2 + 1.0933*out1_1;
687 out[badX0 + 1] = (val < min) ? out1_1 : val;
689 val = 0.3032*out1_2 + 0.6968*out1_1;
690 out[badX1 - 1] = (val < min) ? out1_1 : val;
692 val = 0.4630*out1_2 + 0.5370*out1_1;
693 out[badX1] = (val < min) ? out1_1 : val;
697 val = -0.4288*out1_2 + 1.4288*out1_1;
698 out[badX0] = (val < min) ? out1_1 : val;
700 val = -0.0933*out1_2 + 1.0933*out1_1;
701 out[badX0 + 1] = (val < min) ? out1_1 : val;
703 val = 0.3032*out1_2 + 0.6968*out1_1;
704 out[badX1 - 2] = (val < min) ? out1_1 : val;
706 val = 0.4630*out1_2 + 0.5370*out1_1;
707 out[badX1 - 1] = (val < min) ? out1_1 : val;
709 val = 0.4959*out1_2 + 0.5041*out1_1;
710 out[badX1] = (val < min) ? out1_1 : val;
714 val = -0.4288*out1_2 + 1.4288*out1_1;
715 out[badX0] = (val < min) ? out1_1 : val;
717 val = -0.0933*out1_2 + 1.0933*out1_1;
718 out[badX0 + 1] = (val < min) ? out1_1 : val;
720 val = 0.3032*out1_2 + 0.6968*out1_1;
721 out[badX0 + 2] = (val < min) ? out1_1 : val;
723 val = 0.4630*out1_2 + 0.5370*out1_1;
724 out[badX1 - 2] = (val < min) ? out1_1 : val;
726 val = 0.4959*out1_2 + 0.5041*out1_1;
727 out[badX1 - 1] = (val < min) ? out1_1 : val;
729 val = 0.4997*out1_2 + 0.5003*out1_1;
730 out[badX1] = (val < min) ? out1_1 : val;
734 val = -0.4288*out1_2 + 1.4288*out1_1;
735 out[badX0] = (val < min) ? out1_1 : val;
737 val = -0.0933*out1_2 + 1.0933*out1_1;
738 out[badX0 + 1] = (val < min) ? out1_1 : val;
740 val = 0.3032*out1_2 + 0.6968*out1_1;
741 out[badX0 + 2] = (val < min) ? out1_1 : val;
743 val = 0.4630*out1_2 + 0.5370*out1_1;
744 out[badX1 - 3] = (val < min) ? out1_1 : val;
746 val = 0.4959*out1_2 + 0.5041*out1_1;
747 out[badX1 - 2] = (val < min) ? out1_1 : val;
749 val = 0.4997*out1_2 + 0.5003*out1_1;
750 out[badX1 - 1] = (val < min) ? out1_1 : val;
752 val = 0.5000*out1_2 + 0.5000*out1_1;
753 out[badX1] = (val < min) ? out1_1 : val;
757 val = -0.4288*out1_2 + 1.4288*out1_1;
758 out[badX0] = (val < min) ? out1_1 : val;
760 val = -0.0933*out1_2 + 1.0933*out1_1;
761 out[badX0 + 1] = (val < min) ? out1_1 : val;
763 val = 0.3032*out1_2 + 0.6968*out1_1;
764 out[badX0 + 2] = (val < min) ? out1_1 : val;
766 val = 0.4630*out1_2 + 0.5370*out1_1;
767 out[badX0 + 3] = (val < min) ? out1_1 : val;
769 val = 0.4959*out1_2 + 0.5041*out1_1;
770 out[badX1 - 3] = (val < min) ? out1_1 : val;
772 val = 0.4997*out1_2 + 0.5003*out1_1;
773 out[badX1 - 2] = (val < min) ? out1_1 : val;
775 val = 0.5000*out1_2 + 0.5000*out1_1;
776 out[badX1 - 1] = (val < min) ? out1_1 : val;
778 val = 0.5000*out1_2 + 0.5000*out1_1;
779 out[badX1] = (val < min) ? out1_1 : val;
783 val = -0.4288*out1_2 + 1.4288*out1_1;
784 out[badX0] = (val < min) ? out1_1 : val;
786 val = -0.0933*out1_2 + 1.0933*out1_1;
787 out[badX0 + 1] = (val < min) ? out1_1 : val;
789 val = 0.3032*out1_2 + 0.6968*out1_1;
790 out[badX0 + 2] = (val < min) ? out1_1 : val;
792 val = 0.4630*out1_2 + 0.5370*out1_1;
793 out[badX0 + 3] = (val < min) ? out1_1 : val;
795 val = 0.4959*out1_2 + 0.5041*out1_1;
796 out[badX1 - 4] = (val < min) ? out1_1 : val;
798 val = 0.4997*out1_2 + 0.5003*out1_1;
799 out[badX1 - 3] = (val < min) ? out1_1 : val;
801 val = 0.5000*out1_2 + 0.5000*out1_1;
802 out[badX1 - 2] = (val < min) ? out1_1 : val;
804 val = 0.5000*out1_2 + 0.5000*out1_1;
805 out[badX1 - 1] = (val < min) ? out1_1 : val;
807 val = 0.5000*out1_2 + 0.5000*out1_1;
808 out[badX1] = (val < min) ? out1_1 : val;
812 val = -0.4288*out1_2 + 1.4288*out1_1;
813 out[badX0] = (val < min) ? out1_1 : val;
815 val = -0.0933*out1_2 + 1.0933*out1_1;
816 out[badX0 + 1] = (val < min) ? out1_1 : val;
818 val = 0.3032*out1_2 + 0.6968*out1_1;
819 out[badX0 + 2] = (val < min) ? out1_1 : val;
821 val = 0.4630*out1_2 + 0.5370*out1_1;
822 out[badX0 + 3] = (val < min) ? out1_1 : val;
824 val = 0.4959*out1_2 + 0.5041*out1_1;
825 out[badX0 + 4] = (val < min) ? out1_1 : val;
827 val = 0.4997*out1_2 + 0.5003*out1_1;
828 out[badX1 - 4] = (val < min) ? out1_1 : val;
830 val = 0.5000*out1_2 + 0.5000*out1_1;
831 out[badX1 - 3] = (val < min) ? out1_1 : val;
833 val = 0.5000*out1_2 + 0.5000*out1_1;
834 out[badX1 - 2] = (val < min) ? out1_1 : val;
836 val = 0.5000*out1_2 + 0.5000*out1_1;
837 out[badX1 - 1] = (val < min) ? out1_1 : val;
839 val = 0.5000*out1_2 + 0.5000*out1_1;
840 out[badX1] = (val < min) ? out1_1 : val;
849 assert(badX1 < ncol);
858 for (
int j = badX0; j <= badX1; j++) {
864 out1_2 = out[badX0 - 2];
865 out1_1 = out[badX0 - 1];
867 switch (defectType) {
869 val = -0.4288*out1_2 + 1.4288*out1_1;
870 out[badX0] = (val < min) ? out1_1 : val;
872 val = -0.0933*out1_2 + 1.0933*out1_1;
873 out[badX0 + 1] = (val < min) ? out1_1 : val;
875 val = 0.3032*out1_2 + 0.6968*out1_1;
876 out[badX0 + 2] = (val < min) ? out1_1 : val;
878 val = 0.4630*out1_2 + 0.5370*out1_1;
879 out[badX0 + 3] = (val < min) ? out1_1 : val;
881 val = 0.4959*out1_2 + 0.5041*out1_1;
882 out[badX0 + 4] = (val < min) ? out1_1 : val;
884 val = 0.4997*out1_2 + 0.5003*out1_1;
885 out[badX0 + 5] = (val < min) ? out1_1 : val;
887 val = 0.5000*out1_2 + 0.5000*out1_1;
888 val = (val < min) ? out1_1 : val;
890 for (
int j = badX0 + 6; j <= badX1; j++) {
903 assert(badX0 >= 2 && badX1 + 2 < ncol);
904 out1_2 = out[badX0 - 2];
905 out2_2 = out[badX1 + 2];
907 assert(badX0 >= 1 && badX1 + 2 < ncol);
909 out2_2 = out[badX1 + 2];
911 assert(badX0 >= 2 && badX1 + 1 < ncol);
912 out1_2 = out[badX0 - 2];
916 out1_2 = out2_2 = -1;
918 out1_1 = out[badX0 - 1];
919 out2_1 = out[badX1 + 1];
921 switch (defectType) {
923 val = 0.5000*out1_1 + 0.5000*out2_1;
924 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
928 val = 0.4875*out1_1 + 0.8959*out2_1 - 0.3834*out2_2;
929 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
933 val = 0.7297*out1_1 + 0.2703*out2_1;
934 out[badX0] = (val < 0) ? 0 : val;
936 val = 0.2703*out1_1 + 0.7297*out2_1;
937 out[badX1] = (val < 0) ? 0 : val;
941 val = 0.7538*out1_1 + 0.5680*out2_1 - 0.3218*out2_2;
942 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
944 val = 0.3095*out1_1 + 1.2132*out2_1 - 0.5227*out2_2;
945 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
949 val = -0.3834*out1_2 + 0.8959*out1_1 + 0.4875*out2_1;
950 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
956 val = -0.2737*out1_2 + 0.7737*out1_1 + 0.7737*out2_1 - 0.2737*out2_2;
957 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
961 val = 0.8430*out1_1 + 0.1570*out2_1;
962 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
964 val = 0.5000*out1_1 + 0.5000*out2_1;
965 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
967 val = 0.1570*out1_1 + 0.8430*out2_1;
968 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
972 val = 0.8525*out1_1 + 0.2390*out2_1 - 0.0915*out2_2;
973 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
975 val = 0.5356*out1_1 + 0.8057*out2_1 - 0.3413*out2_2;
976 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
978 val = 0.2120*out1_1 + 1.3150*out2_1 - 0.5270*out2_2;
979 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
983 val = -0.5227*out1_2 + 1.2132*out1_1 + 0.3095*out2_1;
984 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
986 val = -0.3218*out1_2 + 0.5680*out1_1 + 0.7538*out2_1;
987 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
991 val = -0.4793*out1_2 + 1.1904*out1_1 + 0.5212*out2_1 - 0.2323*out2_2;
992 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
994 val = -0.2323*out1_2 + 0.5212*out1_1 + 1.1904*out2_1 - 0.4793*out2_2;
995 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
999 val = 0.8810*out1_1 + 0.1190*out2_1;
1000 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1002 val = 0.6315*out1_1 + 0.3685*out2_1;
1003 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1005 val = 0.3685*out1_1 + 0.6315*out2_1;
1006 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1008 val = 0.1190*out1_1 + 0.8810*out2_1;
1009 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1013 val = 0.8779*out1_1 + 0.0945*out2_1 + 0.0276*out2_2;
1014 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1016 val = 0.6327*out1_1 + 0.3779*out2_1 - 0.0106*out2_2;
1017 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1019 val = 0.4006*out1_1 + 0.8914*out2_1 - 0.2920*out2_2;
1020 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1022 val = 0.1757*out1_1 + 1.3403*out2_1 - 0.5160*out2_2;
1023 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1027 val = -0.5270*out1_2 + 1.3150*out1_1 + 0.2120*out2_1;
1028 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1030 val = -0.3413*out1_2 + 0.8057*out1_1 + 0.5356*out2_1;
1031 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1033 val = -0.0915*out1_2 + 0.2390*out1_1 + 0.8525*out2_1;
1034 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1038 val = -0.5230*out1_2 + 1.3163*out1_1 + 0.2536*out2_1 - 0.0469*out2_2;
1039 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1041 val = -0.3144*out1_2 + 0.8144*out1_1 + 0.8144*out2_1 - 0.3144*out2_2;
1042 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1044 val = -0.0469*out1_2 + 0.2536*out1_1 + 1.3163*out2_1 - 0.5230*out2_2;
1045 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1049 val = 0.8885*out1_1 + 0.1115*out2_1;
1050 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1052 val = 0.6748*out1_1 + 0.3252*out2_1;
1053 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1055 val = 0.5000*out1_1 + 0.5000*out2_1;
1056 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1058 val = 0.3252*out1_1 + 0.6748*out2_1;
1059 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1061 val = 0.1115*out1_1 + 0.8885*out2_1;
1062 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1066 val = 0.8824*out1_1 + 0.0626*out2_1 + 0.0549*out2_2;
1067 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1069 val = 0.6601*out1_1 + 0.2068*out2_1 + 0.1331*out2_2;
1070 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1072 val = 0.4938*out1_1 + 0.4498*out2_1 + 0.0564*out2_2;
1073 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1075 val = 0.3551*out1_1 + 0.9157*out2_1 - 0.2708*out2_2;
1076 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1078 val = 0.1682*out1_1 + 1.3447*out2_1 - 0.5129*out2_2;
1079 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1083 val = -0.5160*out1_2 + 1.3403*out1_1 + 0.1757*out2_1;
1084 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1086 val = -0.2920*out1_2 + 0.8914*out1_1 + 0.4006*out2_1;
1087 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1089 val = -0.0106*out1_2 + 0.3779*out1_1 + 0.6327*out2_1;
1090 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1092 val = 0.0276*out1_2 + 0.0945*out1_1 + 0.8779*out2_1;
1093 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1097 val = -0.5197*out1_2 + 1.3370*out1_1 + 0.1231*out2_1 + 0.0596*out2_2;
1098 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1100 val = -0.2924*out1_2 + 0.8910*out1_1 + 0.3940*out2_1 + 0.0074*out2_2;
1101 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1103 val = 0.0074*out1_2 + 0.3940*out1_1 + 0.8910*out2_1 - 0.2924*out2_2;
1104 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1106 val = 0.0596*out1_2 + 0.1231*out1_1 + 1.3370*out2_1 - 0.5197*out2_2;
1107 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1111 val = 0.8893*out1_1 + 0.1107*out2_1;
1112 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1114 val = 0.6830*out1_1 + 0.3170*out2_1;
1115 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1117 val = 0.5435*out1_1 + 0.4565*out2_1;
1118 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1120 val = 0.4565*out1_1 + 0.5435*out2_1;
1121 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1123 val = 0.3170*out1_1 + 0.6830*out2_1;
1124 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1126 val = 0.1107*out1_1 + 0.8893*out2_1;
1127 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1131 val = 0.8829*out1_1 + 0.0588*out2_1 + 0.0583*out2_2;
1132 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1134 val = 0.6649*out1_1 + 0.1716*out2_1 + 0.1635*out2_2;
1135 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1137 val = 0.5212*out1_1 + 0.2765*out2_1 + 0.2024*out2_2;
1138 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1140 val = 0.4477*out1_1 + 0.4730*out2_1 + 0.0793*out2_2;
1141 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1143 val = 0.3465*out1_1 + 0.9201*out2_1 - 0.2666*out2_2;
1144 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1146 val = 0.1673*out1_1 + 1.3452*out2_1 - 0.5125*out2_2;
1147 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1151 val = -0.5129*out1_2 + 1.3447*out1_1 + 0.1682*out2_1;
1152 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1154 val = -0.2708*out1_2 + 0.9157*out1_1 + 0.3551*out2_1;
1155 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1157 val = 0.0564*out1_2 + 0.4498*out1_1 + 0.4938*out2_1;
1158 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1160 val = 0.1331*out1_2 + 0.2068*out1_1 + 0.6601*out2_1;
1161 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1163 val = 0.0549*out1_2 + 0.0626*out1_1 + 0.8824*out2_1;
1164 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1168 val = -0.5179*out1_2 + 1.3397*out1_1 + 0.0928*out2_1 + 0.0854*out2_2;
1169 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1171 val = -0.2796*out1_2 + 0.9069*out1_1 + 0.2231*out2_1 + 0.1495*out2_2;
1172 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1174 val = 0.0533*out1_2 + 0.4467*out1_1 + 0.4467*out2_1 + 0.0533*out2_2;
1175 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1177 val = 0.1495*out1_2 + 0.2231*out1_1 + 0.9069*out2_1 - 0.2796*out2_2;
1178 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1180 val = 0.0854*out1_2 + 0.0928*out1_1 + 1.3397*out2_1 - 0.5179*out2_2;
1181 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1185 val = 0.8894*out1_1 + 0.1106*out2_1;
1186 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1188 val = 0.6839*out1_1 + 0.3161*out2_1;
1189 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1191 val = 0.5517*out1_1 + 0.4483*out2_1;
1192 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1194 val = 0.5000*out1_1 + 0.5000*out2_1;
1195 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1197 val = 0.4483*out1_1 + 0.5517*out2_1;
1198 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1200 val = 0.3161*out1_1 + 0.6839*out2_1;
1201 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1203 val = 0.1106*out1_1 + 0.8894*out2_1;
1204 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1208 val = 0.8829*out1_1 + 0.0585*out2_1 + 0.0585*out2_2;
1209 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1211 val = 0.6654*out1_1 + 0.1676*out2_1 + 0.1670*out2_2;
1212 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1214 val = 0.5260*out1_1 + 0.2411*out2_1 + 0.2329*out2_2;
1215 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1217 val = 0.4751*out1_1 + 0.2995*out2_1 + 0.2254*out2_2;
1218 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1220 val = 0.4390*out1_1 + 0.4773*out2_1 + 0.0836*out2_2;
1221 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1223 val = 0.3456*out1_1 + 0.9205*out2_1 - 0.2661*out2_2;
1224 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1226 val = 0.1673*out1_1 + 1.3452*out2_1 - 0.5125*out2_2;
1227 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1231 val = -0.5125*out1_2 + 1.3452*out1_1 + 0.1673*out2_1;
1232 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1234 val = -0.2666*out1_2 + 0.9201*out1_1 + 0.3465*out2_1;
1235 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1237 val = 0.0793*out1_2 + 0.4730*out1_1 + 0.4477*out2_1;
1238 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1240 val = 0.2024*out1_2 + 0.2765*out1_1 + 0.5212*out2_1;
1241 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1243 val = 0.1635*out1_2 + 0.1716*out1_1 + 0.6649*out2_1;
1244 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1246 val = 0.0583*out1_2 + 0.0588*out1_1 + 0.8829*out2_1;
1247 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1251 val = -0.5177*out1_2 + 1.3400*out1_1 + 0.0891*out2_1 + 0.0886*out2_2;
1252 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1254 val = -0.2771*out1_2 + 0.9095*out1_1 + 0.1878*out2_1 + 0.1797*out2_2;
1255 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1257 val = 0.0677*out1_2 + 0.4614*out1_1 + 0.2725*out2_1 + 0.1984*out2_2;
1258 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1260 val = 0.1984*out1_2 + 0.2725*out1_1 + 0.4614*out2_1 + 0.0677*out2_2;
1261 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1263 val = 0.1797*out1_2 + 0.1878*out1_1 + 0.9095*out2_1 - 0.2771*out2_2;
1264 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1266 val = 0.0886*out1_2 + 0.0891*out1_1 + 1.3400*out2_1 - 0.5177*out2_2;
1267 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1271 val = 0.8894*out1_1 + 0.1106*out2_1;
1272 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1274 val = 0.6839*out1_1 + 0.3161*out2_1;
1275 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1277 val = 0.5526*out1_1 + 0.4474*out2_1;
1278 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1280 val = 0.5082*out1_1 + 0.4918*out2_1;
1281 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1283 val = 0.4918*out1_1 + 0.5082*out2_1;
1284 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1286 val = 0.4474*out1_1 + 0.5526*out2_1;
1287 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1289 val = 0.3161*out1_1 + 0.6839*out2_1;
1290 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1292 val = 0.1106*out1_1 + 0.8894*out2_1;
1293 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1297 val = 0.8829*out1_1 + 0.0585*out2_1 + 0.0585*out2_2;
1298 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1300 val = 0.6654*out1_1 + 0.1673*out2_1 + 0.1673*out2_2;
1301 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1303 val = 0.5265*out1_1 + 0.2370*out2_1 + 0.2365*out2_2;
1304 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1306 val = 0.4799*out1_1 + 0.2641*out2_1 + 0.2560*out2_2;
1307 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1309 val = 0.4664*out1_1 + 0.3038*out2_1 + 0.2298*out2_2;
1310 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1312 val = 0.4381*out1_1 + 0.4778*out2_1 + 0.0841*out2_2;
1313 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1315 val = 0.3455*out1_1 + 0.9206*out2_1 - 0.2661*out2_2;
1316 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1318 val = 0.1673*out1_1 + 1.3452*out2_1 - 0.5125*out2_2;
1319 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1323 val = -0.5125*out1_2 + 1.3452*out1_1 + 0.1673*out2_1;
1324 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1326 val = -0.2661*out1_2 + 0.9205*out1_1 + 0.3456*out2_1;
1327 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1329 val = 0.0836*out1_2 + 0.4773*out1_1 + 0.4390*out2_1;
1330 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1332 val = 0.2254*out1_2 + 0.2995*out1_1 + 0.4751*out2_1;
1333 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1335 val = 0.2329*out1_2 + 0.2411*out1_1 + 0.5260*out2_1;
1336 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1338 val = 0.1670*out1_2 + 0.1676*out1_1 + 0.6654*out2_1;
1339 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1341 val = 0.0585*out1_2 + 0.0585*out1_1 + 0.8829*out2_1;
1342 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1346 val = -0.5177*out1_2 + 1.3400*out1_1 + 0.0889*out2_1 + 0.0888*out2_2;
1347 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1349 val = -0.2768*out1_2 + 0.9098*out1_1 + 0.1838*out2_1 + 0.1832*out2_2;
1350 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1352 val = 0.0703*out1_2 + 0.4639*out1_1 + 0.2370*out2_1 + 0.2288*out2_2;
1353 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1355 val = 0.2130*out1_2 + 0.2870*out1_1 + 0.2870*out2_1 + 0.2130*out2_2;
1356 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1358 val = 0.2288*out1_2 + 0.2370*out1_1 + 0.4639*out2_1 + 0.0703*out2_2;
1359 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1361 val = 0.1832*out1_2 + 0.1838*out1_1 + 0.9098*out2_1 - 0.2768*out2_2;
1362 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1364 val = 0.0888*out1_2 + 0.0889*out1_1 + 1.3400*out2_1 - 0.5177*out2_2;
1365 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1369 val = 0.8894*out1_1 + 0.1106*out2_1;
1370 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1372 val = 0.6839*out1_1 + 0.3161*out2_1;
1373 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1375 val = 0.5527*out1_1 + 0.4473*out2_1;
1376 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1378 val = 0.5091*out1_1 + 0.4909*out2_1;
1379 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1381 val = 0.5000*out1_1 + 0.5000*out2_1;
1382 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1384 val = 0.4909*out1_1 + 0.5091*out2_1;
1385 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1387 val = 0.4473*out1_1 + 0.5527*out2_1;
1388 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1390 val = 0.3161*out1_1 + 0.6839*out2_1;
1391 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1393 val = 0.1106*out1_1 + 0.8894*out2_1;
1394 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1398 val = 0.8829*out1_1 + 0.0585*out2_1 + 0.0585*out2_2;
1399 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1401 val = 0.6654*out1_1 + 0.1673*out2_1 + 0.1673*out2_2;
1402 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1404 val = 0.5265*out1_1 + 0.2368*out2_1 + 0.2367*out2_2;
1405 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1407 val = 0.4804*out1_1 + 0.2601*out2_1 + 0.2595*out2_2;
1408 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1410 val = 0.4712*out1_1 + 0.2685*out2_1 + 0.2603*out2_2;
1411 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1413 val = 0.4654*out1_1 + 0.3043*out2_1 + 0.2302*out2_2;
1414 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1416 val = 0.4380*out1_1 + 0.4778*out2_1 + 0.0842*out2_2;
1417 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1419 val = 0.3455*out1_1 + 0.9206*out2_1 - 0.2661*out2_2;
1420 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1422 val = 0.1673*out1_1 + 1.3452*out2_1 - 0.5125*out2_2;
1423 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1427 val = -0.5125*out1_2 + 1.3452*out1_1 + 0.1673*out2_1;
1428 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1430 val = -0.2661*out1_2 + 0.9206*out1_1 + 0.3455*out2_1;
1431 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1433 val = 0.0841*out1_2 + 0.4778*out1_1 + 0.4381*out2_1;
1434 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1436 val = 0.2298*out1_2 + 0.3038*out1_1 + 0.4664*out2_1;
1437 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1439 val = 0.2560*out1_2 + 0.2641*out1_1 + 0.4799*out2_1;
1440 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1442 val = 0.2365*out1_2 + 0.2370*out1_1 + 0.5265*out2_1;
1443 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1445 val = 0.1673*out1_2 + 0.1673*out1_1 + 0.6654*out2_1;
1446 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1448 val = 0.0585*out1_2 + 0.0585*out1_1 + 0.8829*out2_1;
1449 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1453 val = -0.5177*out1_2 + 1.3400*out1_1 + 0.0888*out2_1 + 0.0888*out2_2;
1454 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1456 val = -0.2768*out1_2 + 0.9098*out1_1 + 0.1835*out2_1 + 0.1835*out2_2;
1457 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1459 val = 0.0705*out1_2 + 0.4642*out1_1 + 0.2329*out2_1 + 0.2324*out2_2;
1460 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1462 val = 0.2155*out1_2 + 0.2896*out1_1 + 0.2515*out2_1 + 0.2434*out2_2;
1463 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1465 val = 0.2434*out1_2 + 0.2515*out1_1 + 0.2896*out2_1 + 0.2155*out2_2;
1466 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1468 val = 0.2324*out1_2 + 0.2329*out1_1 + 0.4642*out2_1 + 0.0705*out2_2;
1469 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1471 val = 0.1835*out1_2 + 0.1835*out1_1 + 0.9098*out2_1 - 0.2768*out2_2;
1472 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1474 val = 0.0888*out1_2 + 0.0888*out1_1 + 1.3400*out2_1 - 0.5177*out2_2;
1475 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1479 val = 0.8894*out1_1 + 0.1106*out2_1;
1480 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1482 val = 0.6839*out1_1 + 0.3161*out2_1;
1483 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1485 val = 0.5527*out1_1 + 0.4473*out2_1;
1486 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1488 val = 0.5092*out1_1 + 0.4908*out2_1;
1489 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1491 val = 0.5009*out1_1 + 0.4991*out2_1;
1492 out[badX0 + 4] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1494 val = 0.4991*out1_1 + 0.5009*out2_1;
1495 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1497 val = 0.4908*out1_1 + 0.5092*out2_1;
1498 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1500 val = 0.4473*out1_1 + 0.5527*out2_1;
1501 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1503 val = 0.3161*out1_1 + 0.6839*out2_1;
1504 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1506 val = 0.1106*out1_1 + 0.8894*out2_1;
1507 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1):
val;
1511 val = 0.8829*out1_1 + 0.0585*out2_1 + 0.0585*out2_2;
1512 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1514 val = 0.6654*out1_1 + 0.1673*out2_1 + 0.1673*out2_2;
1515 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1517 val = 0.5265*out1_1 + 0.2367*out2_1 + 0.2367*out2_2;
1518 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1520 val = 0.4804*out1_1 + 0.2598*out2_1 + 0.2598*out2_2;
1521 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1523 val = 0.4717*out1_1 + 0.2644*out2_1 + 0.2639*out2_2;
1524 out[badX0 + 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1526 val = 0.4703*out1_1 + 0.2690*out2_1 + 0.2608*out2_2;
1527 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1529 val = 0.4654*out1_1 + 0.3043*out2_1 + 0.2303*out2_2;
1530 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1532 val = 0.4380*out1_1 + 0.4778*out2_1 + 0.0842*out2_2;
1533 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1535 val = 0.3455*out1_1 + 0.9206*out2_1 - 0.2661*out2_2;
1536 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1538 val = 0.1673*out1_1 + 1.3452*out2_1 - 0.5125*out2_2;
1539 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1543 val = -0.5125*out1_2 + 1.3452*out1_1 + 0.1673*out2_1;
1544 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1546 val = -0.2661*out1_2 + 0.9206*out1_1 + 0.3455*out2_1;
1547 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1549 val = 0.0842*out1_2 + 0.4778*out1_1 + 0.4380*out2_1;
1550 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1552 val = 0.2302*out1_2 + 0.3043*out1_1 + 0.4654*out2_1;
1553 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1555 val = 0.2603*out1_2 + 0.2685*out1_1 + 0.4712*out2_1;
1556 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1558 val = 0.2595*out1_2 + 0.2601*out1_1 + 0.4804*out2_1;
1559 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1561 val = 0.2367*out1_2 + 0.2368*out1_1 + 0.5265*out2_1;
1562 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1564 val = 0.1673*out1_2 + 0.1673*out1_1 + 0.6654*out2_1;
1565 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1567 val = 0.0585*out1_2 + 0.0585*out1_1 + 0.8829*out2_1;
1568 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1572 val = -0.5177*out1_2 + 1.3400*out1_1 + 0.0888*out2_1 + 0.0888*out2_2;
1573 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1575 val = -0.2768*out1_2 + 0.9098*out1_1 + 0.1835*out2_1 + 0.1835*out2_2;
1576 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1578 val = 0.0705*out1_2 + 0.4642*out1_1 + 0.2326*out2_1 + 0.2326*out2_2;
1579 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1581 val = 0.2158*out1_2 + 0.2899*out1_1 + 0.2474*out2_1 + 0.2469*out2_2;
1582 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1584 val = 0.2459*out1_2 + 0.2541*out1_1 + 0.2541*out2_1 + 0.2459*out2_2;
1585 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1587 val = 0.2469*out1_2 + 0.2474*out1_1 + 0.2899*out2_1 + 0.2158*out2_2;
1588 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1590 val = 0.2326*out1_2 + 0.2326*out1_1 + 0.4642*out2_1 + 0.0705*out2_2;
1591 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1593 val = 0.1835*out1_2 + 0.1835*out1_1 + 0.9098*out2_1 - 0.2768*out2_2;
1594 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1596 val = 0.0888*out1_2 + 0.0888*out1_1 + 1.3400*out2_1 - 0.5177*out2_2;
1597 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1601 val = 0.8829*out1_1 + 0.0585*out2_1 + 0.0585*out2_2;
1602 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1604 val = 0.6654*out1_1 + 0.1673*out2_1 + 0.1673*out2_2;
1605 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1607 val = 0.5265*out1_1 + 0.2367*out2_1 + 0.2367*out2_2;
1608 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1610 val = 0.4804*out1_1 + 0.2598*out2_1 + 0.2598*out2_2;
1611 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1613 val = 0.4718*out1_1 + 0.2641*out2_1 + 0.2641*out2_2;
1614 out[badX0 + 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1616 val = 0.4708*out1_1 + 0.2649*out2_1 + 0.2644*out2_2;
1617 out[badX1 - 5] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1619 val = 0.4702*out1_1 + 0.2690*out2_1 + 0.2608*out2_2;
1620 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1622 val = 0.4654*out1_1 + 0.3044*out2_1 + 0.2303*out2_2;
1623 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1625 val = 0.4380*out1_1 + 0.4778*out2_1 + 0.0842*out2_2;
1626 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1628 val = 0.3455*out1_1 + 0.9206*out2_1 - 0.2661*out2_2;
1629 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1631 val = 0.1673*out1_1 + 1.3452*out2_1 - 0.5125*out2_2;
1632 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1636 val = -0.5125*out1_2 + 1.3452*out1_1 + 0.1673*out2_1;
1637 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1639 val = -0.2661*out1_2 + 0.9206*out1_1 + 0.3455*out2_1;
1640 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1642 val = 0.0842*out1_2 + 0.4778*out1_1 + 0.4380*out2_1;
1643 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1645 val = 0.2303*out1_2 + 0.3043*out1_1 + 0.4654*out2_1;
1646 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1648 val = 0.2608*out1_2 + 0.2690*out1_1 + 0.4703*out2_1;
1649 out[badX0 + 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1651 val = 0.2639*out1_2 + 0.2644*out1_1 + 0.4717*out2_1;
1652 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1654 val = 0.2598*out1_2 + 0.2598*out1_1 + 0.4804*out2_1;
1655 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1657 val = 0.2367*out1_2 + 0.2367*out1_1 + 0.5265*out2_1;
1658 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1660 val = 0.1673*out1_2 + 0.1673*out1_1 + 0.6654*out2_1;
1661 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1663 val = 0.0585*out1_2 + 0.0585*out1_1 + 0.8829*out2_1;
1664 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1668 val = -0.5177*out1_2 + 1.3400*out1_1 + 0.0888*out2_1 + 0.0888*out2_2;
1669 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1671 val = -0.2768*out1_2 + 0.9098*out1_1 + 0.1835*out2_1 + 0.1835*out2_2;
1672 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1674 val = 0.0705*out1_2 + 0.4642*out1_1 + 0.2326*out2_1 + 0.2326*out2_2;
1675 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1677 val = 0.2158*out1_2 + 0.2899*out1_1 + 0.2472*out2_1 + 0.2471*out2_2;
1678 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1680 val = 0.2462*out1_2 + 0.2544*out1_1 + 0.2500*out2_1 + 0.2495*out2_2;
1681 out[badX0 + 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1683 val = 0.2495*out1_2 + 0.2500*out1_1 + 0.2544*out2_1 + 0.2462*out2_2;
1684 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1686 val = 0.2471*out1_2 + 0.2472*out1_1 + 0.2899*out2_1 + 0.2158*out2_2;
1687 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1689 val = 0.2326*out1_2 + 0.2326*out1_1 + 0.4642*out2_1 + 0.0705*out2_2;
1690 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1692 val = 0.1835*out1_2 + 0.1835*out1_1 + 0.9098*out2_1 - 0.2768*out2_2;
1693 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1695 val = 0.0888*out1_2 + 0.0888*out1_1 + 1.3400*out2_1 - 0.5177*out2_2;
1696 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1700 val = 0.8829*out1_1 + 0.0585*out2_1 + 0.0585*out2_2;
1701 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1703 val = 0.6654*out1_1 + 0.1673*out2_1 + 0.1673*out2_2;
1704 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1706 val = 0.5265*out1_1 + 0.2367*out2_1 + 0.2367*out2_2;
1707 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1709 val = 0.4804*out1_1 + 0.2598*out2_1 + 0.2598*out2_2;
1710 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1712 val = 0.4718*out1_1 + 0.2641*out2_1 + 0.2641*out2_2;
1713 out[badX0 + 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1715 val = 0.4708*out1_1 + 0.2646*out2_1 + 0.2646*out2_2;
1716 out[badX0 + 5] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1718 val = 0.4707*out1_1 + 0.2649*out2_1 + 0.2644*out2_2;
1719 out[badX1 - 5] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1721 val = 0.4702*out1_1 + 0.2690*out2_1 + 0.2608*out2_2;
1722 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1724 val = 0.4654*out1_1 + 0.3044*out2_1 + 0.2303*out2_2;
1725 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1727 val = 0.4380*out1_1 + 0.4778*out2_1 + 0.0842*out2_2;
1728 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1730 val = 0.3455*out1_1 + 0.9206*out2_1 - 0.2661*out2_2;
1731 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1733 val = 0.1673*out1_1 + 1.3452*out2_1 - 0.5125*out2_2;
1734 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1738 val = -0.5125*out1_2 + 1.3452*out1_1 + 0.1673*out2_1;
1739 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1741 val = -0.2661*out1_2 + 0.9206*out1_1 + 0.3455*out2_1;
1742 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1744 val = 0.0842*out1_2 + 0.4778*out1_1 + 0.4380*out2_1;
1745 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1747 val = 0.2303*out1_2 + 0.3044*out1_1 + 0.4654*out2_1;
1748 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1750 val = 0.2608*out1_2 + 0.2690*out1_1 + 0.4702*out2_1;
1751 out[badX0 + 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1753 val = 0.2644*out1_2 + 0.2649*out1_1 + 0.4708*out2_1;
1754 out[badX1 - 5] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1756 val = 0.2641*out1_2 + 0.2641*out1_1 + 0.4718*out2_1;
1757 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1759 val = 0.2598*out1_2 + 0.2598*out1_1 + 0.4804*out2_1;
1760 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1762 val = 0.2367*out1_2 + 0.2367*out1_1 + 0.5265*out2_1;
1763 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1765 val = 0.1673*out1_2 + 0.1673*out1_1 + 0.6654*out2_1;
1766 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1768 val = 0.0585*out1_2 + 0.0585*out1_1 + 0.8829*out2_1;
1769 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1783 if (badX1 + 2 >= ncol) {
1785 if (badX1 == ncol - 2) {
1786 val = out[ncol - 1];
1788 val = fallbackValue;
1790 for (
int j = badX0; j <= badX1; j++) {
1796 out2_2 = out[badX1 + 2];
1798 assert(badX0 >= 2 && badX1 + 2 < ncol);
1799 out1_2 = out[badX0 - 2];
1800 out2_2 = out[badX1 + 2];
1802 assert(badX1 + 1 < ncol);
1809 val = fallbackValue;
1811 for (
int j = badX0; j <= badX1; j++) {
1816 out1_2 = out[badX0 - 2];
1820 out1_2 = out2_2 = -1;
1823 out1_1 = out[badX0 - 1];
1824 out2_1 = out[badX1 + 1];
1826 switch (defectType) {
1829 val = 0.8894*out1_1 + 0.1106*out2_1;
1830 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1832 val = 0.6839*out1_1 + 0.3161*out2_1;
1833 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1835 val = 0.5527*out1_1 + 0.4473*out2_1;
1836 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1838 val = 0.5092*out1_1 + 0.4908*out2_1;
1839 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1841 val = 0.5010*out1_1 + 0.4990*out2_1;
1842 out[badX0 + 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1844 val = 0.5001*out1_1 + 0.4999*out2_1;
1845 out[badX0 + 5] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1847 val = 0.5000*out1_1 + 0.5000*out2_1;
1849 for (
int j = badX0 + 6; j < badX1 - 5; j++) {
1853 val = 0.4999*out1_1 + 0.5001*out2_1;
1854 out[badX1 - 5] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1856 val = 0.4990*out1_1 + 0.5010*out2_1;
1857 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1859 val = 0.4908*out1_1 + 0.5092*out2_1;
1860 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1862 val = 0.4473*out1_1 + 0.5527*out2_1;
1863 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1865 val = 0.3161*out1_1 + 0.6839*out2_1;
1866 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1868 val = 0.1106*out1_1 + 0.8894*out2_1;
1869 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1873 val = 0.8829*out1_1 + 0.0585*out2_1 + 0.0585*out2_2;
1874 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1876 val = 0.6654*out1_1 + 0.1673*out2_1 + 0.1673*out2_2;
1877 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1879 val = 0.5265*out1_1 + 0.2367*out2_1 + 0.2367*out2_2;
1880 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1882 val = 0.4804*out1_1 + 0.2598*out2_1 + 0.2598*out2_2;
1883 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1885 val = 0.4718*out1_1 + 0.2641*out2_1 + 0.2641*out2_2;
1886 out[badX0 + 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1888 val = 0.4708*out1_1 + 0.2646*out2_1 + 0.2646*out2_2;
1889 out[badX0 + 5] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1891 val = 0.4707*out[badX0 - 1] + 0.2646*out[badX1 + 1] + 0.2646*out[badX1 + 2];
1893 for (
int j = badX0 + 6; j < badX1 - 5; j++) {
1897 val = 0.4707*out1_1 + 0.2649*out2_1 + 0.2644*out2_2;
1898 out[badX1 - 5] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1900 val = 0.4702*out1_1 + 0.2690*out2_1 + 0.2608*out2_2;
1901 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1903 val = 0.4654*out1_1 + 0.3044*out2_1 + 0.2303*out2_2;
1904 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1906 val = 0.4380*out1_1 + 0.4778*out2_1 + 0.0842*out2_2;
1907 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1909 val = 0.3455*out1_1 + 0.9206*out2_1 - 0.2661*out2_2;
1910 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1912 val = 0.1673*out1_1 + 1.3452*out2_1 - 0.5125*out2_2;
1913 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1917 val = -0.5125*out1_2 + 1.3452*out1_1 + 0.1673*out2_1;
1918 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1920 val = -0.2661*out1_2 + 0.9206*out1_1 + 0.3455*out2_1;
1921 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1923 val = 0.0842*out1_2 + 0.4778*out1_1 + 0.4380*out2_1;
1924 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1926 val = 0.2303*out1_2 + 0.3044*out1_1 + 0.4654*out2_1;
1927 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1929 val = 0.2608*out1_2 + 0.2690*out1_1 + 0.4702*out2_1;
1930 out[badX0 + 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1932 val = 0.2644*out1_2 + 0.2649*out1_1 + 0.4707*out2_1;
1933 out[badX0 + 5] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1935 val = 0.2646*out1_2 + 0.2646*out1_1 + 0.4707*out2_1;
1936 val = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1938 for (
int j = badX0 + 6; j < badX1 - 5; j++) {
1942 val = 0.2646*out1_2 + 0.2646*out1_1 + 0.4708*out2_1;
1943 out[badX1 - 5] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1945 val = 0.2641*out1_2 + 0.2641*out1_1 + 0.4718*out2_1;
1946 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1948 val = 0.2598*out1_2 + 0.2598*out1_1 + 0.4804*out2_1;
1949 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1951 val = 0.2367*out1_2 + 0.2367*out1_1 + 0.5265*out2_1;
1952 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1954 val = 0.1673*out1_2 + 0.1673*out1_1 + 0.6654*out2_1;
1955 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1957 val = 0.0585*out1_2 + 0.0585*out1_1 + 0.8829*out2_1;
1958 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1962 val = -0.5177*out1_2 + 1.3400*out1_1 + 0.0888*out2_1 + 0.0888*out2_2;
1963 out[badX0] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1965 val = -0.2768*out1_2 + 0.9098*out1_1 + 0.1835*out2_1 + 0.1835*out2_2;
1966 out[badX0 + 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1968 val = 0.0705*out1_2 + 0.4642*out1_1 + 0.2326*out2_1 + 0.2326*out2_2;
1969 out[badX0 + 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1971 val = 0.2158*out1_2 + 0.2899*out1_1 + 0.2472*out2_1 + 0.2472*out2_2;
1972 out[badX0 + 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1974 val = 0.2462*out1_2 + 0.2544*out1_1 + 0.2497*out2_1 + 0.2497*out2_2;
1975 out[badX0 + 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1977 val = 0.2497*out1_2 + 0.2503*out1_1 + 0.2500*out2_1 + 0.2500*out2_2;
1978 out[badX0 + 5] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1980 val = 0.2500*out1_2 + 0.2500*out1_1 + 0.2500*out2_1 + 0.2500*out2_2;
1981 val = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1983 for (
int j = badX0 + 6; j < badX1 - 5; j++) {
1987 val = 0.2500*out1_2 + 0.2500*out1_1 + 0.2503*out2_1 + 0.2497*out2_2;
1988 out[badX1 - 5] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1990 val = 0.2497*out1_2 + 0.2497*out1_1 + 0.2544*out2_1 + 0.2462*out2_2;
1991 out[badX1 - 4] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1993 val = 0.2472*out1_2 + 0.2472*out1_1 + 0.2899*out2_1 + 0.2158*out2_2;
1994 out[badX1 - 3] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1996 val = 0.2326*out1_2 + 0.2326*out1_1 + 0.4642*out2_1 + 0.0705*out2_2;
1997 out[badX1 - 2] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
1999 val = 0.1835*out1_2 + 0.1835*out1_1 + 0.9098*out2_1 - 0.2768*out2_2;
2000 out[badX1 - 1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
2002 val = 0.0888*out1_2 + 0.0888*out1_1 + 1.3400*out2_1 - 0.5177*out2_2;
2003 out[badX1] = (val < min) ? 0.5*(out1_1 + out2_1) :
val;
2015 template<
typename MaskT>
2016 static void do_defects(std::vector<Defect::Ptr>
const & badList,
2019 typename MaskT::Pixel
const interpBit,
2020 bool useFallbackValueAtEdge,
2024 typename MaskT::x_iterator mask_row = mask.row_begin(y);
2026 for (
DefectCIter ptr = badList.begin(), end = badList.end(); ptr != end; ++ptr) {
2029 if (y < defect->getY0() || y > defect->getY1()) {
2033 int const badX0 = defect->getX0();
2034 int const badX1 = defect->getX1();
2036 for (
int c = badX0; c <= badX1; ++c) {
2037 mask_row[c] |= interpBit;
2045 template<
typename T>
2046 struct Sort_ByX0 :
public std::binary_function<std::shared_ptr<T> const, std::shared_ptr<T> const, bool> {
2047 bool operator() (std::shared_ptr<T>
const a, std::shared_ptr<T>
const b)
const {
2048 return a->getX0() < b->getX0();
2056 template<
typename MaskedImageT>
2058 lsst::afw::detection::Psf
const &,
2059 std::vector<Defect::Ptr> &_badList,
2060 double fallbackValue,
2061 bool useFallbackValueAtEdge
2066 int const width = mimage.getWidth();
2067 int const height = mimage.getHeight();
2069 std::vector<Defect::Ptr> badList;
2070 badList.reserve(_badList.size());
2071 for (std::vector<Defect::Ptr>::iterator ptr = _badList.begin(), end = _badList.end(); ptr != end; ++ptr) {
2072 geom::BoxI bbox = (*ptr)->getBBox();
2073 bbox.shift(geom::ExtentI(-mimage.getX0(), -mimage.getY0()));
2074 geom::PointI min = bbox.getMin(), max = bbox.getMax();
2075 if(min.getX() >= width){
2077 }
else if (min.getX() < 0) {
2078 if (max.getX() < 0) {
2085 if (max.getX() < 0) {
2087 }
else if (max.getX() >= width) {
2088 max.setX(width - 1);
2091 bbox = geom::BoxI(min, max);
2093 ndefect->classify((*ptr)->getPos(), (*ptr)->getType());
2094 badList.push_back(ndefect);
2097 sort(badList.begin(), badList.end(), Sort_ByX0<Defect>());
2101 typename MaskedImageT::Mask::Pixel
const interpBit =
2102 mimage.getMask()->getPlaneBitMask(
"INTRP");
2104 constexpr
int nUseInterp = 6;
2105 static_assert(nUseInterp <
Defect::WIDE_DEFECT,
"make sure that we can handle these defects using"
2106 "the full interpolation not edge code");
2108 for (
int y = 0; y != height; y++) {
2109 std::vector<Defect::Ptr> badList1D = classify_defects(badList, y, width);
2111 do_defects(badList1D, y, *mimage.getImage(),
2112 -std::numeric_limits<typename MaskedImageT::Image::Pixel>::max(),
2113 fallbackValue, useFallbackValueAtEdge, nUseInterp);
2115 do_defects(badList1D, y, *mimage.getMask(), interpBit, useFallbackValueAtEdge, nUseInterp);
2117 do_defects(badList1D, y, *mimage.getVariance(),
2118 -std::numeric_limits<typename MaskedImageT::Image::Pixel>::max(),
2119 fallbackValue, useFallbackValueAtEdge, nUseInterp);
2133 template <
typename MaskedImageT>
2137 MaskedImageT
const&,
2149 static int ndatamax = 40;
2154 shAssert(badmask != NULL && badmask->type == shTypeGetFromName(
"OBJMASK"));
2155 shAssert(reg != NULL && reg->type == TYPE_PIX);
2160 for (z1 = colc - 1; z1 >= 0; z1--) {
2161 if (!phPixIntersectMask(badmask, z1, rowc)) {
2167 for (z2 = colc + 1; z2 < ncol; z2++) {
2168 if (!phPixIntersectMask(badmask, z2, rowc)) {
2174 i0 = (z1 > 2) ? z1 - 2 : 0;
2175 i1 = (z2 < ncol - 2) ? z2 + 2 : ncol - 1;
2177 if (i0 < 2 || i1 >= ncol - 2) {
2181 ndata = (i1 - i0 + 1);
2182 if (ndata > ndatamax) {
2186 data = alloca(ndata*
sizeof(PIX));
2187 for (i = i0; i <= i1; i++) {
2188 data[i - i0] = reg->ROWS[rowc][i];
2190 val = &data[colc - i0];
2192 for (z1 = rowc - 1; z1 >= 0; z1--) {
2193 if (!phPixIntersectMask(badmask, colc, z1)) {
2199 for (z2 = rowc + 1; z2 < nrow; z2++) {
2200 if (!phPixIntersectMask(badmask, colc, z2)) {
2206 i0 = (z1 > 2) ? z1 - 2 : 0;
2207 i1 = (z2 < nrow - 2) ? z2 + 2 : nrow - 1;
2209 if (i0 < 2 || i1 >= ncol - 2) {
2213 ndata = (i1 - i0 + 1);
2214 if (ndata > ndatamax) {
2218 data = alloca(ndata*
sizeof(PIX));
2219 for (i = i0; i <= i1; i++) {
2220 data[i - i0] = reg->ROWS[i][colc];
2222 val = &data[rowc - i0];
2225 defect.x1 = z1 - i0;
2226 defect.x2 = z2 - i0;
2227 classify_defects(&defect, 1, ndata);
2228 do_defect(&defect, 1, data, ndata, minval);
2233 return std::make_pair(
false, std::numeric_limits<typename MaskedImageT::Image::Pixel>::min());
2242 typedef float ImagePixel;
2246 lsst::afw::detection::Psf
const &, std::vector<Defect::Ptr> &badList,
double,
bool
2250 image::MaskedImage<ImagePixel, image::MaskPixel>
const& image,
2251 bool horizontal,
double minval);
2258 lsst::afw::detection::Psf
const &, std::vector<Defect::Ptr> &badList,
double,
bool
2263 image::MaskedImage<double, image::MaskPixel>
const& image,
2264 bool horizontal,
double minval);
defect is wide at right boundary
defect is in middle, and wide
defect is in middle of frame
defect is near right boundary
std::vector< Defect::Ptr >::const_iterator DefectCIter
afw::table::Key< double > b
defect is at left boundary
void interpolateOverDefects(MaskedImageT &image, lsst::afw::detection::Psf const &psf, std::vector< Defect::Ptr > &badList, double fallbackValue=0.0, bool useFallbackValueAtEdge=false)
Process a set of known bad pixels in an image.
defect is near right, and wide
defect is wide at left boundary
defect is near left, and wide
std::shared_ptr< Defect > Ptr
shared pointer to Defect
std::pair< bool, typename MaskedImageT::Image::Pixel > singlePixel(int x, int y, MaskedImageT const &image, bool horizontal, double minval)
Return a boolean status (true: interpolation is OK) and the interpolated value for a pixel...
defect is near left boundary
defect is at right boundary
Encapsulate information about a bad portion of a detector.