IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 20963


Ignore:
Timestamp:
Dec 11, 2008, 3:54:17 PM (17 years ago)
Author:
Paul Price
Message:

Soften errors during iteration. Without this, it gets the wrong solution.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/objects/pmSourceMatch.c

    r20953 r20963  
    290290                                const psArray *matches, // Array of matches
    291291                                const psVector *zp, // Zero points for each image (including airmass term)
    292                                 const psVector *photo // Photometric image?
     292                                const psVector *photo, // Photometric image?
     293                                float sysErr2 // Systematic error, squared
    293294                                )
    294295{
     
    321322            int index = match->image->data.U32[j]; // Image index
    322323            float mag = match->mag->data.F32[j]; // Measured magnitude
    323             double magErr = match->magErr->data.F32[j]; // Error in measured magnitude
    324             double invErr2 = 1.0 / PS_SQR(magErr); // Inverse square error
     324            double magErr2 = PS_SQR(match->magErr->data.F32[j]) + sysErr2; // Error in measured magnitude
     325            double invErr2 = 1.0 / magErr2; // Inverse square error
    325326            float cal = zp->data.F32[index]; // Calibration to apply to image
    326327            if (!photo || !photo->data.U8[index]) {
     
    351352            int index = match->image->data.U32[j]; // Image index
    352353            float mag = match->mag->data.F32[j]; // Measured magnitude
    353             double magErr = match->magErr->data.F32[j]; // Error in measured magnitude
    354             double invErr2 = 1.0 / PS_SQR(magErr); // Inverse square error
     354            double magErr2 = PS_SQR(match->magErr->data.F32[j]) + sysErr2; // Error in measured magnitude
     355            double invErr2 = 1.0 / magErr2; // Inverse square error
    355356            float cal = zp->data.F32[index]; // Calibration to apply to image
    356357            accum->data.F64[index] += (mag + cal - stars->data.F32[i]) * invErr2;
     
    377378            int index = match->image->data.U32[j]; // Image index
    378379            float mag = match->mag->data.F32[j]; // Measured magnitude
    379             float magErr = match->magErr->data.F32[j]; // Error in measured magnitude
     380            float magErr2 = PS_SQR(match->magErr->data.F32[j]) + sysErr2; // Error in measured magnitude
    380381            float cal = zp->data.F32[index]; // Calibration to apply to image
    381382            if (!photo || !photo->data.U8[index]) {
    382383                cal -= trans->data.F32[index];
    383384            }
    384             float dev = (mag + cal - stars->data.F32[index]) / magErr; // Deviation from fit
    385             if (isfinite(dev)) {
    386                 chi2 += PS_SQR(dev);
     385            float dev2 = mag + cal - stars->data.F32[index]; // Deviation from fit
     386            if (isfinite(dev2)) {
     387                chi2 += PS_SQR(dev2) / magErr2;
    387388                dof++;
    388389            }
     
    449450                                      const psVector *photo, // Photometric image?
    450451                                      float starClip, // Clipping for stars
    451                                       float sysErr // Systematic error
     452                                      float sysErr2 // Systematic error squared
    452453                                )
    453454{
     
    467468
    468469    starClip = PS_SQR(starClip);
    469     sysErr = PS_SQR(sysErr);
    470470
    471471    int numRejected = 0;                // Number rejected
     
    486486            }
    487487            float dev = mag + cal - stars->data.F32[i]; // Deviation
    488             if (PS_SQR(dev) > starClip * (PS_SQR(magErr) + sysErr)) {
     488            if (PS_SQR(dev) > starClip * (PS_SQR(magErr) + sysErr2)) {
    489489                numRejected++;
    490490                match->mask->data.PS_TYPE_MASK_DATA[j] = 0xFF;
     
    514514    PS_ASSERT_FLOAT_LARGER_THAN(transClip, 0.0, NULL);
    515515
     516    sysErr *= sysErr;
     517
    516518    int numImages = zp->n;              // Number of images
    517519    int numStars = matches->n;          // Number of stars
     
    522524    psVector *stars = psVectorAlloc(numStars, PS_TYPE_F32); // Magnitudes for each star
    523525
    524     float chi2 = sourceMatchRelphotIterate(trans, stars, matches, zp, photo); // chi^2 for solution
     526    float chi2 = sourceMatchRelphotIterate(trans, stars, matches, zp, photo, sysErr); // chi^2 for solution
    525527    psTrace("psModules.objects", 1, "Initial: chi^2 = %f\n", chi2);
    526528    float lastChi2 = INFINITY;          // chi^2 on last iteration
     
    544546        psTrace("psModules.objects", 3, "%f%% of measurements rejected", fracRej * 100);
    545547
    546         chi2 = sourceMatchRelphotIterate(trans, stars, matches, zp, photo); // chi^2 for solution
     548        chi2 = sourceMatchRelphotIterate(trans, stars, matches, zp, photo, sysErr); // chi^2 for solution
    547549        psTrace("psModules.objects", 1, "iter = %d: chi^2 = %f rejected = %f\n", i, chi2, fracRej);
    548550    }
Note: See TracChangeset for help on using the changeset viewer.