IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 36031


Ignore:
Timestamp:
Aug 25, 2013, 12:30:55 PM (13 years ago)
Author:
eugene
Message:

loop over Reff and Sindex

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20130711/psphot/src/psphotSourceFits.c

    r36025 r36031  
    760760# define N_INDEX_GUESS_INV 4
    761761
     762float reffGuess[] = {3.0, 10.0, 30.0};
     763# define N_REFF_GUESS 3
     764
    762765// A sersic model is very sensitive to the index.  attempt to find the index first by grid search in just the index
    763766// for a sersic model, attempt to fit just the index and normalization with a modest number of iterations
     
    787790    psEllipseAxes momentAxes = psEllipseMomentsToAxes (moments, 20.0);
    788791
    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    }
    800805
    801806    // set the model position
     
    813818    float iMin = NAN;
    814819    float sMin = NAN;
     820    float rMin = NAN;
    815821
    816822    // loop over index and Reff, keeping the ARatio and Theta constant?
    817823    // 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);
    823843       
    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;
    834871                }
    835                 // skip zero-variance points
    836                 if (source->variance->data.F32[iy][ix] == 0) {
    837                     continue;
    838                 }
    839                 // skip nan value points
    840                 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;
    851872            }
    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);
    863899    }
    864900
Note: See TracChangeset for help on using the changeset viewer.