IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 19513


Ignore:
Timestamp:
Sep 11, 2008, 3:08:49 PM (18 years ago)
Author:
eugene
Message:

adding a test of the original guess

Location:
trunk/psastro/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psastro/src/psastroAnalysis.c

    r19049 r19513  
    8181    // psastroZeroPoint (config);
    8282
     83    psastroAstromGuessCheck (config);
     84
    8385    // XXX how do we specify stack astrometry?
    8486    // psastroStackAstrom (config, refs);
  • trunk/psastro/src/psastroAstromGuess.c

    r17933 r19513  
    11# include "psastroInternal.h"
     2# define DEBUG 0
    23
    34// this function loads the header WCS astrometry terms into the fpa terms and applies the
     
    5253    }
    5354
     55    psVector *cornerL = psVectorAllocEmpty (100, PS_TYPE_F32);
     56    psVector *cornerM = psVectorAllocEmpty (100, PS_TYPE_F32);
     57    psVector *cornerP = psVectorAllocEmpty (100, PS_TYPE_F32);
     58    psVector *cornerQ = psVectorAllocEmpty (100, PS_TYPE_F32);
     59    psVector *cornerR = psVectorAllocEmpty (100, PS_TYPE_F32);
     60    psVector *cornerD = psVectorAllocEmpty (100, PS_TYPE_F32);
     61
    5462    pmFPA *fpa = input->fpa;
     63
     64    if (DEBUG) psastroDumpCorners ("corners.up.guess1.dat", "corners.dn.guess1.dat", fpa);
    5565
    5666    // load mosaic-level astrometry?
     
    7787        }
    7888
     89        // report and save the current best guess for the chip 0,0 pixel coordinates
     90        {
     91            psPlane ptCH, ptFP, ptTP;
     92            psSphere ptSky;
     93
     94            ptCH.x = 0;
     95            ptCH.y = 0;
     96            psPlaneTransformApply (&ptFP, chip->toFPA, &ptCH);
     97            psPlaneTransformApply (&ptTP, fpa->toTPA, &ptFP);
     98            psDeproject (&ptSky, &ptTP, fpa->toSky);
     99            psLogMsg ("psastro", 3, "0,0 pix for chip %3d = %f,%f\n", view->chip, DEG_RAD*ptSky.r, DEG_RAD*ptSky.d);
     100
     101            psVectorAppend (cornerL, ptFP.x);
     102            psVectorAppend (cornerM, ptFP.y);
     103            psVectorAppend (cornerP, ptTP.x);
     104            psVectorAppend (cornerQ, ptTP.y);
     105            psVectorAppend (cornerR, ptSky.r);
     106            psVectorAppend (cornerD, ptSky.d);
     107        }
     108
    79109        // apply the new WCS guess data to all of the data in the readouts
    80110        while ((cell = pmFPAviewNextCell (view, fpa, 1)) != NULL) {
     
    85115            while ((readout = pmFPAviewNextReadout (view, fpa, 1)) != NULL) {
    86116                if (! readout->data_exists) { continue; }
    87 
    88                 // report the current best guess for the cell 0,0 pixel coordinate
    89                 {
    90                   psPlane ptCH, ptFP, ptTP;
    91                   psSphere ptSky;
    92 
    93                   ptCH.x = 0;
    94                   ptCH.y = 0;
    95                   psPlaneTransformApply (&ptFP, chip->toFPA, &ptCH);
    96                   psPlaneTransformApply (&ptTP, fpa->toTPA, &ptFP);
    97                   psDeproject (&ptSky, &ptTP, fpa->toSky);
    98                   psLogMsg ("psastro", 2, "0,0 pix for chip,cell %d,%d = %f,%f\n", view->chip, view->cell, DEG_RAD*ptSky.r, DEG_RAD*ptSky.d);
    99                 }
    100117
    101118                psArray *rawstars = psMetadataLookupPtr (NULL, readout->analysis, "PSASTRO.RAWSTARS");
     
    132149        }
    133150    }
     151
     152    if (DEBUG) psastroDumpCorners ("corners.up.guess2.dat", "corners.dn.guess2.dat", fpa);
    134153
    135154    // how many total sources are available to us?
     
    149168    psMetadataAddF32 (recipe, PS_LIST_TAIL, "DEC_MIN", PS_META_REPLACE, "", DECmin);
    150169    psMetadataAddF32 (recipe, PS_LIST_TAIL, "DEC_MAX", PS_META_REPLACE, "", DECmax);
     170
     171    psMetadataAddVector (input->fpa->analysis, PS_LIST_TAIL, "CORNER.L", PS_META_REPLACE, "corner pixel", cornerL);
     172    psMetadataAddVector (input->fpa->analysis, PS_LIST_TAIL, "CORNER.M", PS_META_REPLACE, "corner pixel", cornerM);
     173    psMetadataAddVector (input->fpa->analysis, PS_LIST_TAIL, "CORNER.P", PS_META_REPLACE, "corner pixel", cornerP);
     174    psMetadataAddVector (input->fpa->analysis, PS_LIST_TAIL, "CORNER.Q", PS_META_REPLACE, "corner pixel", cornerQ);
     175    psMetadataAddVector (input->fpa->analysis, PS_LIST_TAIL, "CORNER.R", PS_META_REPLACE, "corner pixel", cornerR);
     176    psMetadataAddVector (input->fpa->analysis, PS_LIST_TAIL, "CORNER.D", PS_META_REPLACE, "corner pixel", cornerD);
     177
     178    psFree (cornerL);
     179    psFree (cornerM);
     180    psFree (cornerP);
     181    psFree (cornerQ);
     182    psFree (cornerR);
     183    psFree (cornerD);
    151184
    152185    psFree (view);
     
    201234    return true;
    202235}
     236
     237// we made a guess at the beginning; how does the guess compare with the result?
     238bool psastroAstromGuessCheck (pmConfig *config) {
     239
     240    bool status;
     241
     242    // select the input data sources
     243    pmFPAfile *input = psMetadataLookupPtr (NULL, config->files, "PSASTRO.INPUT");
     244    if (!input) {
     245        psError(PSASTRO_ERR_CONFIG, true, "Can't find input data");
     246        return false;
     247    }
     248
     249    psVector *cornerLn = psVectorAllocEmpty (100, PS_TYPE_F32);
     250    psVector *cornerMn = psVectorAllocEmpty (100, PS_TYPE_F32);
     251    psVector *cornerPn = psVectorAllocEmpty (100, PS_TYPE_F32);
     252    psVector *cornerQn = psVectorAllocEmpty (100, PS_TYPE_F32);
     253    psVector *cornerRn = psVectorAllocEmpty (100, PS_TYPE_F32);
     254    psVector *cornerDn = psVectorAllocEmpty (100, PS_TYPE_F32);
     255
     256    pmFPA *fpa = input->fpa;
     257
     258    if (DEBUG) psastroDumpCorners ("corners.up.guess3.dat", "corners.dn.guess3.dat", fpa);
     259
     260    pmChip *chip = NULL;
     261    pmFPAview *view = pmFPAviewAlloc (0);
     262
     263    while ((chip = pmFPAviewNextChip (view, fpa, 1)) != NULL) {
     264        if (!chip->process || !chip->file_exists || !chip->data_exists) { continue; }
     265
     266        psPlane ptCH, ptFP, ptTP;
     267        psSphere ptSky;
     268
     269        ptCH.x = 0;
     270        ptCH.y = 0;
     271        psPlaneTransformApply (&ptFP, chip->toFPA, &ptCH);
     272        psPlaneTransformApply (&ptTP, fpa->toTPA, &ptFP);
     273        psDeproject (&ptSky, &ptTP, fpa->toSky);
     274        psLogMsg ("psastro", 3, "0,0 pix for chip %3d = %f,%f\n", view->chip, DEG_RAD*ptSky.r, DEG_RAD*ptSky.d);
     275
     276        // new corner locations based on the calibrated astrometry
     277        psVectorAppend (cornerLn, ptFP.x);
     278        psVectorAppend (cornerMn, ptFP.y);
     279        psVectorAppend (cornerPn, ptTP.x);
     280        psVectorAppend (cornerQn, ptTP.y);
     281        psVectorAppend (cornerRn, ptSky.r);
     282        psVectorAppend (cornerDn, ptSky.d);
     283    }
     284
     285    psVector *cornerLo = psMetadataLookupPtr (&status, input->fpa->analysis, "CORNER.L");
     286    psVector *cornerMo = psMetadataLookupPtr (&status, input->fpa->analysis, "CORNER.M");
     287    psVector *cornerPo = psMetadataLookupPtr (&status, input->fpa->analysis, "CORNER.P");
     288    psVector *cornerQo = psMetadataLookupPtr (&status, input->fpa->analysis, "CORNER.Q");
     289    psVector *cornerRo = psMetadataLookupPtr (&status, input->fpa->analysis, "CORNER.R");
     290    psVector *cornerDo = psMetadataLookupPtr (&status, input->fpa->analysis, "CORNER.D");
     291
     292    // compare the old R,D values projected to the same tangent plane as the new R,D values:
     293
     294    psVector *cornerPs = psVectorAllocEmpty (100, PS_TYPE_F32);
     295    psVector *cornerQs = psVectorAllocEmpty (100, PS_TYPE_F32);
     296
     297    for (int i = 0; i < cornerRo->n; i++) {
     298       
     299        psPlane ptTP;
     300        psSphere ptSky;
     301
     302        ptSky.r = cornerRo->data.F32[i];
     303        ptSky.d = cornerDo->data.F32[i];
     304
     305        psProject (&ptTP, &ptSky, fpa->toSky);
     306        psVectorAppend (cornerPs, ptTP.x);
     307        psVectorAppend (cornerQs, ptTP.y);
     308    }
     309
     310    psPlaneTransform *map = psPlaneTransformAlloc (1, 1);
     311    map->x->coeffMask[1][1] = PS_POLY_MASK_SET;
     312    map->y->coeffMask[1][1] = PS_POLY_MASK_SET;
     313   
     314    psVectorFitPolynomial2D (map->x, NULL, 0, cornerPn, NULL, cornerPs, cornerQs);
     315    psVectorFitPolynomial2D (map->y, NULL, 0, cornerQn, NULL, cornerPs, cornerQs);
     316   
     317    // apply the linear fit...
     318    psVector *cornerPf = psPolynomial2DEvalVector (map->x, cornerPs, cornerQs);
     319    psVector *cornerQf = psPolynomial2DEvalVector (map->y, cornerPs, cornerQs);
     320
     321    // ...and calculate the residual between Pn,Qn and Pf,Qf
     322    psVector *cornerPd = (psVector *) psBinaryOp (NULL, cornerPn, "-", cornerPf);
     323    psVector *cornerQd = (psVector *) psBinaryOp (NULL, cornerQn, "-", cornerQf);
     324
     325    psStats *statsP = psStatsAlloc (PS_STAT_SAMPLE_MEAN | PS_STAT_SAMPLE_STDEV);
     326    psStats *statsQ = psStatsAlloc (PS_STAT_SAMPLE_MEAN | PS_STAT_SAMPLE_STDEV);
     327
     328    psVectorStats (statsP, cornerPd, NULL, NULL, 0);
     329    psVectorStats (statsQ, cornerQd, NULL, NULL, 0);
     330
     331    float angle = atan2 (map->y->coeff[1][0], map->x->coeff[1][0]);
     332    float scale = hypot (map->y->coeff[1][0], map->x->coeff[1][0]);
     333   
     334    psLogMsg ("psastro", 3, "boresite offset  : %f,%f\n", map->x->coeff[0][0], map->y->coeff[0][0]);
     335    psLogMsg ("psastro", 3, "boresite angle   : %f, scale: %f", angle*PS_DEG_RAD, scale);
     336    psLogMsg ("psastro", 3, "boresite scatter : %f,%f\n", statsP->sampleStdev, statsQ->sampleStdev);
     337
     338    // write the elapsed time here; this will be updated in psastroMosaicAstrometry, if called
     339    psMetadata *header = psMetadataLookupMetadata (&status, input->fpa->analysis, "PSASTRO.HEADER");
     340    if (!header) {
     341        header = psMetadataAlloc();
     342        psMetadataAddMetadata (input->fpa->analysis, PS_LIST_TAIL, "PSASTRO.HEADER",  PS_META_REPLACE, "psastro header stats", header);
     343        psFree (header);  // drop this reference
     344    }
     345
     346    psMetadataAddF32 (header, PS_LIST_TAIL, "AST_R0", PS_META_REPLACE, "boresite offset in RA (TP units)", map->x->coeff[0][0]);
     347    psMetadataAddF32 (header, PS_LIST_TAIL, "AST_D0", PS_META_REPLACE, "boresite offset in DEC (TP units)", map->y->coeff[0][0]);
     348    psMetadataAddF32 (header, PS_LIST_TAIL, "AST_T0", PS_META_REPLACE, "boresite angle (degrees)", angle*PS_DEG_RAD);
     349    psMetadataAddF32 (header, PS_LIST_TAIL, "AST_S0", PS_META_REPLACE, "boresite scale correction", scale);
     350    psMetadataAddF32 (header, PS_LIST_TAIL, "AST_RS", PS_META_REPLACE, "boresite scatter in RA (TP units)", statsP->sampleStdev);
     351    psMetadataAddF32 (header, PS_LIST_TAIL, "AST_DS", PS_META_REPLACE, "boresite scatter in DEC (TP units)", statsQ->sampleStdev);
     352
     353    if (0) {
     354        FILE *f = fopen ("corners.dat", "w");
     355        for (int i = 0; i < cornerRo->n; i++) {
     356            fprintf (f, "%10.6f %10.6f  %9.2f %9.2f  %9.2f %9.2f  |  %10.6f %10.6f  %9.2f %9.2f  %9.2f %9.2f\n",
     357                     cornerRn->data.F32[i], cornerDn->data.F32[i], cornerPn->data.F32[i], cornerQn->data.F32[i], cornerLn->data.F32[i], cornerMn->data.F32[i],
     358                     cornerRo->data.F32[i], cornerDo->data.F32[i], cornerPo->data.F32[i], cornerQo->data.F32[i], cornerLo->data.F32[i], cornerMo->data.F32[i]);
     359        }
     360        fclose (f);
     361    }
     362
     363    psFree (cornerPf);
     364    psFree (cornerQf);
     365    psFree (cornerPd);
     366    psFree (cornerQd);
     367
     368    psFree (statsP);
     369    psFree (statsQ);
     370
     371    psFree (cornerLn);
     372    psFree (cornerMn);
     373    psFree (cornerPn);
     374    psFree (cornerQn);
     375    psFree (cornerRn);
     376    psFree (cornerDn);
     377    psFree (cornerPs);
     378    psFree (cornerQs);
     379    psFree (map);
     380    psFree (view);
     381   
     382
     383    return true;
     384}
Note: See TracChangeset for help on using the changeset viewer.