IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 30, 2010, 1:29:50 PM (16 years ago)
Author:
eugene
Message:

add diff stats; add flux to CMF_PS1_DV1; output PSF residual mask; more accurate calculation of radius of source model

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/objects/models/pmModel_PS1_V1.c

    r26916 r27531  
    267267psF64 PM_MODEL_RADIUS (const psVector *params, psF64 flux)
    268268{
    269     psF64 z, f;
     269    psF64 z;
    270270    int Nstep = 0;
    271271    psEllipseShape shape;
     
    273273    psF32 *PAR = params->data.F32;
    274274
    275     if (flux <= 0) {
    276         return 1.0;
    277     }
    278     if (PAR[PM_PAR_I0] <= 0) {
    279         return 1.0;
    280     }
    281     if (flux >= PAR[PM_PAR_I0]) {
    282         return 1.0;
    283     }
    284     if (PAR[PM_PAR_7] == 0.0) {
    285         return powf(PAR[PM_PAR_I0] / flux - 1.0, 1.0 / ALPHA);
    286     }
     275    if (flux <= 0) return 1.0;
     276    if (PAR[PM_PAR_I0] <= 0) return 1.0;
     277    if (flux >= PAR[PM_PAR_I0]) return 1.0;
     278    if (PAR[PM_PAR_7] == 0.0) return powf(PAR[PM_PAR_I0] / flux - 1.0, 1.0 / ALPHA);
    287279
    288280    shape.sx  = PAR[PM_PAR_SXX] / M_SQRT2;
     
    305297    if (PAR[PM_PAR_7] < 0.0) z1 *= 2.0;
    306298
    307     // perform a type of bisection to find the value
    308     float f0 = 1.0 / (1 + PAR[PM_PAR_7]*z0 + pow(z0, ALPHA));
    309     float f1 = 1.0 / (1 + PAR[PM_PAR_7]*z1 + pow(z1, ALPHA));
    310     while ((Nstep < 10) && (fabs(z1 - z0) > 0.5)) {
    311         z = 0.5*(z0 + z1);
    312         f = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, ALPHA));
    313         if (f > limit) {
    314             z0 = z;
    315             f0 = f;
    316         } else {
    317             z1 = z;
    318             f1 = f;
    319         }
    320         Nstep ++;
     299    // starting guess:
     300    z = 0.5*(z0 + z1);
     301    float dz = 1.0;
     302
     303    // use Newton-Raphson to minimize f(z) - limit = 0
     304    for (int i = 0; (i < 10) && (fabs(dz) > 0.0001); i++) {
     305        float q = (1.0 + PAR[PM_PAR_7]*z + pow(z, ALPHA));
     306        float dqdz = (PAR[PM_PAR_7] + ALPHA*pow(z, ALPHA - 1.0));
     307
     308        float f = 1.0 / q;
     309        float dfdz = -dqdz * f / q;
     310
     311        dz = (f - limit) / dfdz;
     312
     313        // fprintf (stderr, "%f %f %f : %f %f\n", f, z, dz, dfdz, q);
     314        z -= dz;
    321315    }
    322316    psF64 radius = sigma * sqrt (2.0 * z);
     
    350344    // convert to shape terms (SXX,SYY,SXY)
    351345    if (!pmPSF_FitToModel (out, 0.1)) {
    352         // psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", in[PM_PAR_YPOS], in[PM_PAR_XPOS]);
    353346        psTrace("psModules.objects", 5, "Failed to fit object at (r,c) = (%.1f,%.1f)", in[PM_PAR_YPOS], in[PM_PAR_XPOS]);
    354347        return false;
     
    475468}
    476469
    477 
    478470# undef PM_MODEL_FUNC
    479471# undef PM_MODEL_FLUX
Note: See TracChangeset for help on using the changeset viewer.