Changeset 36031
- Timestamp:
- Aug 25, 2013, 12:30:55 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20130711/psphot/src/psphotSourceFits.c
r36025 r36031 760 760 # define N_INDEX_GUESS_INV 4 761 761 762 float reffGuess[] = {3.0, 10.0, 30.0}; 763 # define N_REFF_GUESS 3 764 762 765 // A sersic model is very sensitive to the index. attempt to find the index first by grid search in just the index 763 766 // for a sersic model, attempt to fit just the index and normalization with a modest number of iterations … … 787 790 psEllipseAxes momentAxes = psEllipseMomentsToAxes (moments, 20.0); 788 791 789 psEllipseAxes guessAxes; 790 guessAxes.major = source->moments->Mrf; 791 guessAxes.minor = (momentAxes.minor / momentAxes.minor) * guessAxes.major; 792 guessAxes.theta = momentAxes.theta; 793 794 if (!isfinite(guessAxes.major)) return false; 795 if (!isfinite(guessAxes.minor)) return false; 796 if (!isfinite(guessAxes.theta)) return false; 797 798 // convert the major,minor,theta to shape parameters for an Reff-like model 799 pmModelAxesToParams (&PAR[PM_PAR_SXX], &PAR[PM_PAR_SXY], &PAR[PM_PAR_SYY], guessAxes, true); 792 if (0) { 793 psEllipseAxes guessAxes; 794 guessAxes.major = source->moments->Mrf; 795 guessAxes.minor = (momentAxes.minor / momentAxes.minor) * guessAxes.major; 796 guessAxes.theta = momentAxes.theta; 797 798 if (!isfinite(guessAxes.major)) return false; 799 if (!isfinite(guessAxes.minor)) return false; 800 if (!isfinite(guessAxes.theta)) return false; 801 802 // convert the major,minor,theta to shape parameters for an Reff-like model 803 pmModelAxesToParams (&PAR[PM_PAR_SXX], &PAR[PM_PAR_SXY], &PAR[PM_PAR_SYY], guessAxes, true); 804 } 800 805 801 806 // set the model position … … 813 818 float iMin = NAN; 814 819 float sMin = NAN; 820 float rMin = NAN; 815 821 816 822 // loop over index and Reff, keeping the ARatio and Theta constant? 817 823 // loop over index guesses and find the best fit 818 for (int i = 0; i < N_INDEX_GUESS_INV; i++) { 819 PAR[PM_PAR_7] = indexGuessInv[i]; 820 821 // generated the modelFlux 822 pmPCMMakeModel (source, pcm->modelConv, maskVal, psfSize); 824 for (int j = 0; j < N_REFF_GUESS; j++) { 825 826 psEllipseAxes guessAxes; 827 guessAxes.major = reffGuess[j]; 828 guessAxes.minor = (momentAxes.minor / momentAxes.minor) * guessAxes.major; 829 guessAxes.theta = momentAxes.theta; 830 831 if (!isfinite(guessAxes.major)) return false; 832 if (!isfinite(guessAxes.minor)) return false; 833 if (!isfinite(guessAxes.theta)) return false; 834 835 // convert the major,minor,theta to shape parameters for an Reff-like model 836 pmModelAxesToParams (&PAR[PM_PAR_SXX], &PAR[PM_PAR_SXY], &PAR[PM_PAR_SYY], guessAxes, true); 837 838 for (int i = 0; i < N_INDEX_GUESS_INV; i++) { 839 PAR[PM_PAR_7] = indexGuessInv[i]; 840 841 // generated the modelFlux 842 pmPCMMakeModel (source, pcm->modelConv, maskVal, psfSize); 823 843 824 float YY = 0.0; 825 float YM = 0.0; 826 float MM = 0.0; 827 bool usePoisson = false; 828 829 for (int iy = 0; iy < source->pixels->numRows; iy++) { 830 for (int ix = 0; ix < source->pixels->numCols; ix++) { 831 // skip masked points 832 if (source->maskObj->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix]) { 833 continue; 844 float YY = 0.0; 845 float YM = 0.0; 846 float MM = 0.0; 847 bool usePoisson = false; 848 849 for (int iy = 0; iy < source->pixels->numRows; iy++) { 850 for (int ix = 0; ix < source->pixels->numCols; ix++) { 851 // skip masked points 852 if (source->maskObj->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix]) { 853 continue; 854 } 855 // skip zero-variance points 856 if (source->variance->data.F32[iy][ix] == 0) { 857 continue; 858 } 859 // skip nan value points 860 if (!isfinite(source->pixels->data.F32[iy][ix])) { 861 continue; 862 } 863 864 float fy = source->pixels->data.F32[iy][ix]; 865 float fm = source->modelFlux->data.F32[iy][ix]; 866 float wt = (usePoisson) ? 1.0 / source->variance->data.F32[iy][ix] : 1.0; 867 868 YY += PS_SQR(fy) * wt; 869 YM += fm * fy * wt; 870 MM += PS_SQR(fm) * wt; 834 871 } 835 // skip zero-variance points836 if (source->variance->data.F32[iy][ix] == 0) {837 continue;838 }839 // skip nan value points840 if (!isfinite(source->pixels->data.F32[iy][ix])) {841 continue;842 }843 844 float fy = source->pixels->data.F32[iy][ix];845 float fm = source->modelFlux->data.F32[iy][ix];846 float wt = (usePoisson) ? 1.0 / source->variance->data.F32[iy][ix] : 1.0;847 848 YY += PS_SQR(fy) * wt;849 YM += fm * fy * wt;850 MM += PS_SQR(fm) * wt;851 872 } 852 } 853 854 float Io = YM / MM; 855 float Chisq = YY - 2 * Io * YM + Io * Io * MM; 856 if ((i == 0) || (Chisq < xMin)) { 857 xMin = Chisq; 858 iMin = Io; 859 sMin = indexGuessInv[i]; 860 } 861 fprintf (stderr, "%d | %f %f %f | %f %f %f", i, indexGuessInv[i], Io, Chisq, sMin, iMin, xMin); 862 fprintf (stderr, "\n"); 873 874 float Io = YM / MM; 875 float Chisq = YY - 2 * Io * YM + Io * Io * MM; 876 if (isnan(xMin) || (Chisq < xMin)) { 877 xMin = Chisq; 878 iMin = Io; 879 sMin = indexGuessInv[i]; 880 rMin = reffGuess[j]; 881 } 882 fprintf (stderr, "%d | %f %f %f | %f %f %f", i, indexGuessInv[i], reffGuess[j], Io, Chisq, sMin, rMin, iMin, xMin); 883 fprintf (stderr, "\n"); 884 } 885 } 886 887 { 888 psEllipseAxes guessAxes; 889 guessAxes.major = rMin; 890 guessAxes.minor = (momentAxes.minor / momentAxes.minor) * guessAxes.major; 891 guessAxes.theta = momentAxes.theta; 892 893 if (!isfinite(guessAxes.major)) return false; 894 if (!isfinite(guessAxes.minor)) return false; 895 if (!isfinite(guessAxes.theta)) return false; 896 897 // convert the major,minor,theta to shape parameters for an Reff-like model 898 pmModelAxesToParams (&PAR[PM_PAR_SXX], &PAR[PM_PAR_SXY], &PAR[PM_PAR_SYY], guessAxes, true); 863 899 } 864 900
Note:
See TracChangeset
for help on using the changeset viewer.
