- Timestamp:
- Jan 17, 2011, 5:07:46 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20101205/psModules/src/imcombine/pmSubtractionMatch.c
r30266 r30288 27 27 28 28 static bool useFFT = true; // Do convolutions using FFT 29 30 # define SUBMODE PM_SUBTRACTION_EQUATION_ALL31 29 32 30 //#define TESTING … … 473 471 } 474 472 473 bool pmSubtractionMatchAttempt(pmSubtractionQuality **bestMatch, pmSubtractionKernels *kernels, pmSubtractionStampList *stamps, pmSubtractionMode mode, int spatialOrder, bool final) { 474 475 pmSubtractionMode nativeMode = kernels->mode; 476 pmSubtractionMode nativeOrder = kernels->spatialOrder; 477 478 kernels->mode = mode; 479 kernels->spatialOrder = spatialOrder; 480 481 // we always need to recalculate the matrix equation elements... 482 pmSubtractionStampsResetStatus(stamps); 483 484 psTrace("psModules.imcombine", 3, "Convolving stamps as needed...\n"); 485 if (!pmSubtractionConvolveStamps(stamps, kernels)) { 486 psError(psErrorCodeLast(), false, "Unable to convolve stamps."); 487 return false; 488 } 489 490 // step 1: generate the elements of the matrix equation Ax = B 491 psTrace("psModules.imcombine", 3, "Calculating kernel equations...\n"); 492 if (!pmSubtractionCalculateEquation(stamps, kernels)) { 493 psError(psErrorCodeLast(), false, "Unable to calculate least-squares equation."); 494 return false; 495 } 496 497 // step 2: solve the matrix equation Ax = B 498 psTrace("psModules.imcombine", 3, "Solving kernel equations...\n"); 499 if (!pmSubtractionSolveEquation(kernels, stamps)) { 500 psError(psErrorCodeLast(), false, "Unable to calculate least-squares equation."); 501 return false; 502 } 503 memCheck(" solve equation"); 504 505 // calculate the score for this model fit attempt 506 // XXX store the chisq, flux and moments for stamp rejection 507 pmSubtractionCalculateChisqAndMoments(bestMatch, stamps, kernels); // Stamp deviations 508 509 // display the input and model stamps 510 pmSubtractionVisualShowFit(stamps, kernels); 511 pmSubtractionVisualPlotFit(kernels); 512 pmSubtractionVisualPlotConvKernels(kernels); 513 514 // reset the kernel if desired (on final pass, do not reset) 515 if (!final) { 516 kernels->mode = nativeMode; 517 kernels->spatialOrder = nativeOrder; 518 } 519 return true; 520 } 475 521 476 522 bool pmSubtractionMatch(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2, … … 559 605 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator 560 606 607 pmSubtractionQuality *bestMatch = NULL; 608 609 int N_TEST_MODES; 610 int N_TEST_ORDER = spatialOrder; 611 612 pmSubtractionMode TestModes[3]; 613 switch (subMode) { 614 case PM_SUBTRACTION_MODE_1: 615 N_TEST_MODES = 1; 616 TestModes[0] = PM_SUBTRACTION_MODE_1; 617 break; 618 case PM_SUBTRACTION_MODE_2: 619 N_TEST_MODES = 1; 620 TestModes[0] = PM_SUBTRACTION_MODE_2; 621 break; 622 case PM_SUBTRACTION_MODE_DUAL: 623 N_TEST_MODES = 3; 624 TestModes[0] = PM_SUBTRACTION_MODE_1; 625 TestModes[1] = PM_SUBTRACTION_MODE_2; 626 TestModes[2] = PM_SUBTRACTION_MODE_DUAL; 627 break; 628 default: 629 psError(psErrorCodeLast(), false, "For now, only modes 1, 2, and DUAL are supported."); 630 goto MATCH_ERROR; 631 } 632 561 633 memCheck("start"); 562 634 … … 689 761 690 762 int numRejected = -1; // Number of rejected stamps in each iteration 691 for (int k = 0; k < iter && numRejected != 0; k++) {763 for (int k = 0; (k < iter) && (numRejected != 0); k++) { 692 764 psLogMsg("psModules.imcombine", PS_LOG_INFO, "Iteration %d.", k); 693 765 … … 711 783 } 712 784 713 // step 0b : calculate the moments, pass along to the next steps via stamps->normValue 714 // XXX this step is now skipped -- delete 715 psTrace("psModules.imcombine", 3, "Calculating normalization...\n"); 716 if (!pmSubtractionCalculateMoments(kernels, stamps)) { 717 psError(psErrorCodeLast(), false, "Unable to calculate least-squares equation."); 785 // on each iteration, we start from scratch 786 psFree(bestMatch); 787 788 // choose the spatial order and subtraction direction (1, 2, dual) 789 // XXX need to make these respect recipe somewhat 790 for (int order = 0; order <= N_TEST_ORDER; order++) { 791 for (int j = 0; j < N_TEST_MODES; j++) { 792 if (!pmSubtractionMatchAttempt(&bestMatch, kernels, stamps, TestModes[j], order, false)) { 793 goto MATCH_ERROR; 794 } 795 } 796 } 797 798 // reject the deviant stamps based on the stats of the best match 799 psTrace("psModules.imcombine", 3, "Rejecting stamps...\n"); 800 numRejected = pmSubtractionRejectStamps(kernels, stamps, bestMatch, subMask, rej); 801 if (numRejected < 0) { 802 psError(psErrorCodeLast(), false, "Unable to reject stamps."); 718 803 goto MATCH_ERROR; 719 804 } 720 721 // step 1: generate the elements of the matrix equation Ax = B722 psTrace("psModules.imcombine", 3, "Calculating kernel equations...\n");723 if (!pmSubtractionCalculateEquation(stamps, kernels, SUBMODE)) {724 psError(psErrorCodeLast(), false, "Unable to calculate least-squares equation.");725 goto MATCH_ERROR;726 }727 728 // step 2: solve the matrix equation Ax = B729 psTrace("psModules.imcombine", 3, "Solving kernel equations...\n");730 if (!pmSubtractionSolveEquation(kernels, stamps, SUBMODE)) {731 psError(psErrorCodeLast(), false, "Unable to calculate least-squares equation.");732 goto MATCH_ERROR;733 }734 memCheck(" solve equation");735 736 pmSubtractionVisualPlotConvKernels(kernels);737 738 psVector *deviations = pmSubtractionCalculateDeviations(stamps, kernels); // Stamp deviations739 if (!deviations) {740 psError(psErrorCodeLast(), false, "Unable to calculate deviations.");741 goto MATCH_ERROR;742 }743 memCheck(" calculate deviations");744 745 pmSubtractionCalculateChisqAndMoments(stamps, kernels); // Stamp deviations746 747 psTrace("psModules.imcombine", 3, "Rejecting stamps...\n");748 numRejected = pmSubtractionRejectStamps(kernels, stamps, deviations, subMask, rej);749 if (numRejected < 0) {750 psError(psErrorCodeLast(), false, "Unable to reject stamps.");751 psFree(deviations);752 goto MATCH_ERROR;753 }754 psFree(deviations);755 756 805 memCheck(" reject stamps"); 757 806 } 758 807 759 // if we hit the max number of iterations and we have rejected stamps, re-solve 760 if (numRejected > 0) { 761 762 // step 1: generate the elements of the matrix equation Ax = B 763 psTrace("psModules.imcombine", 3, "Calculating equation for normalization...\n"); 764 if (!pmSubtractionCalculateEquation(stamps, kernels, SUBMODE)) { 765 psError(psErrorCodeLast(), false, "Unable to calculate least-squares equation."); 766 goto MATCH_ERROR; 767 } 768 769 // step 2: solve the matrix equation Ax = B 770 psTrace("psModules.imcombine", 3, "Solving equation for kernels...\n"); 771 if (!pmSubtractionSolveEquation(kernels, stamps, SUBMODE)) { 772 psError(psErrorCodeLast(), false, "Unable to calculate least-squares equation."); 773 goto MATCH_ERROR; 774 } 775 776 pmSubtractionVisualPlotConvKernels(kernels); 777 778 psVector *deviations = pmSubtractionCalculateDeviations(stamps, kernels); // Stamp deviations 779 if (!deviations) { 780 psError(psErrorCodeLast(), false, "Unable to calculate deviations."); 781 goto MATCH_ERROR; 782 } 783 pmSubtractionRejectStamps(kernels, stamps, deviations, subMask, NAN); 784 psFree(deviations); 785 } 808 // apply the best fit so we are ready to roll 809 fprintf (stderr, "applying order: %d, mode: %d\n", bestMatch->spatialOrder, bestMatch->mode); 810 if (!pmSubtractionMatchAttempt(NULL, kernels, stamps, bestMatch->mode, bestMatch->spatialOrder, true)) { 811 goto MATCH_ERROR; 812 } 786 813 psFree(stamps); 787 stamps = NULL; 788 814 psFree(bestMatch); 789 815 memCheck("solution"); 790 816 … … 860 886 psFree(variance); 861 887 psFree(rng); 888 psFree(bestMatch); 862 889 return false; 863 890 } … … 1077 1104 assert(kernels); 1078 1105 1106 psAbort("this function is not working"); 1107 # if (0) 1108 psTrace("psModules.imcombine", 3, "Convolving stamps as needed...\n"); 1109 if (!pmSubtractionConvolveStamps(stamps, kernels)) { 1110 psError(psErrorCodeLast(), false, "Unable to convolve stamps."); 1111 return false; 1112 } 1113 1079 1114 psTrace("psModules.imcombine", 3, "Calculating %s normalization equation...\n", description); 1080 if (!pmSubtractionCalculateEquation(stamps, kernels , SUBMODE)) {1115 if (!pmSubtractionCalculateEquation(stamps, kernels)) { 1081 1116 psError(psErrorCodeLast(), false, "Unable to calculate least-squares equation."); 1082 1117 return false; … … 1084 1119 1085 1120 psTrace("psModules.imcombine", 3, "Solving %s normalization equation...\n", description); 1086 if (!pmSubtractionSolveEquation(kernels, stamps , SUBMODE)) {1121 if (!pmSubtractionSolveEquation(kernels, stamps)) { 1087 1122 psError(psErrorCodeLast(), false, "Unable to calculate least-squares equation."); 1088 1123 return false; … … 1096 1131 } 1097 1132 1133 // XXX this needs to be made consistent with the modified 'reject stamps' function 1098 1134 psTrace("psModules.imcombine", 3, "Rejecting %s stamps...\n", description); 1099 1135 long numRejected = pmSubtractionRejectStamps(kernels, stamps, deviations, subMask, rej); … … 1108 1144 // Allow re-fit with reduced stamps set 1109 1145 psTrace("psModules.imcombine", 3, "Calculating %s normalization equation...\n", description); 1110 if (!pmSubtractionCalculateEquation(stamps, kernels , PM_SUBTRACTION_EQUATION_ALL)) {1146 if (!pmSubtractionCalculateEquation(stamps, kernels)) { 1111 1147 psError(psErrorCodeLast(), false, "Unable to calculate least-squares equation."); 1112 1148 return false; … … 1114 1150 1115 1151 psTrace("psModules.imcombine", 3, "Resolving %s equation...\n", description); 1116 if (!pmSubtractionSolveEquation(kernels, stamps , PM_SUBTRACTION_EQUATION_ALL)) {1152 if (!pmSubtractionSolveEquation(kernels, stamps)) { 1117 1153 psError(psErrorCodeLast(), false, "Unable to calculate least-squares equation."); 1118 1154 return false; … … 1134 1170 psFree(deviations); 1135 1171 } 1136 1172 # endif 1137 1173 return true; 1138 1174 }
Note:
See TracChangeset
for help on using the changeset viewer.
