IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jan 28, 2009, 1:36:37 PM (18 years ago)
Author:
beaumont
Message:

Added QA plots to ppSub. Migrated psastro QA plots to psModules/extras.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/cnb_branch_20090113/psastro/src/psastroAstromGuess.c

    r20805 r21208  
    2929    psMetadata *recipe  = psMetadataLookupPtr (NULL, config->recipes, PSASTRO_RECIPE);
    3030    if (!recipe) {
    31         psError(PSASTRO_ERR_CONFIG, true, "Can't find PSASTRO recipe!");
    32         return false;
     31        psError(PSASTRO_ERR_CONFIG, true, "Can't find PSASTRO recipe!");
     32        return false;
    3333    }
    3434
     
    3636    bool useModel = psMetadataLookupBool (&status, config->arguments, "PSASTRO.USE.MODEL");
    3737    if (!status) {
    38         useModel = psMetadataLookupBool (&status, recipe, "PSASTRO.USE.MODEL");
     38        useModel = psMetadataLookupBool (&status, recipe, "PSASTRO.USE.MODEL");
    3939    }
    4040
     
    4242    pmFPAfile *input = psMetadataLookupPtr (NULL, config->files, "PSASTRO.INPUT");
    4343    if (!input) {
    44         psError(PSASTRO_ERR_CONFIG, true, "Can't find input data");
    45         return false;
     44        psError(PSASTRO_ERR_CONFIG, true, "Can't find input data");
     45        return false;
    4646    }
    4747
     
    4949    double pixelScale = psMetadataLookupF32 (&status, recipe, "PSASTRO.PIXEL.SCALE");
    5050    if (!status) {
    51         psError(PS_ERR_IO, true, "Failed to lookup pixel scale");
    52         return false;
    53     } 
     51        psError(PS_ERR_IO, true, "Failed to lookup pixel scale");
     52        return false;
     53    }
    5454
    5555    psVector *cornerL = psVectorAllocEmpty (100, PS_TYPE_F32);
     
    6767    bool bilevelAstrometry = false;
    6868    if (!useModel) {
    69         psastroAstromGuessSetFPA (fpa, &bilevelAstrometry);
     69        psastroAstromGuessSetFPA (fpa, &bilevelAstrometry);
    7070    }
    7171
     
    7575        if (!chip->process || !chip->file_exists || !chip->data_exists) { continue; }
    7676
    77         if (!useModel) {
    78             if (!psastroAstromGuessSetChip (fpa, chip, view, pixelScale, bilevelAstrometry)) continue;
    79         }
     77        if (!useModel) {
     78            if (!psastroAstromGuessSetChip (fpa, chip, view, pixelScale, bilevelAstrometry)) continue;
     79        }
    8080
    8181        if (newFPA) {
    8282            newFPA = false;
    83             while (fpa->toSky->R <        0) fpa->toSky->R += 2.0*M_PI;
    84             while (fpa->toSky->R > 2.0*M_PI) fpa->toSky->R -= 2.0*M_PI;
     83            while (fpa->toSky->R <        0) fpa->toSky->R += 2.0*M_PI;
     84            while (fpa->toSky->R > 2.0*M_PI) fpa->toSky->R -= 2.0*M_PI;
    8585            RAminSky = fpa->toSky->R - M_PI;
    8686            RAmaxSky = fpa->toSky->R + M_PI;
    8787        }
    8888
    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         }
     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        }
    108108
    109109        // apply the new WCS guess data to all of the data in the readouts
     
    119119                if (rawstars == NULL) { continue; }
    120120
    121                 *nStars += rawstars->n;
     121                *nStars += rawstars->n;
    122122                for (int i = 0; i < rawstars->n; i++) {
    123123                    pmAstromObj *raw = rawstars->data[i];
     
    138138                }
    139139
    140                 // dump or plot the resulting projected positions
    141                 if (psTraceGetLevel("psastro.dump") > 0) {
    142                     psastroDumpRawstars (rawstars, fpa, chip);
    143                 }
    144 
    145                 psastroVisualPlotRawStars(rawstars, fpa, chip, recipe);
    146 
    147                 if (psTraceGetLevel("psastro.plot") > 0) {
    148                     psastroPlotRawstars (rawstars, fpa, chip, recipe);
    149                 }
     140                // dump or plot the resulting projected positions
     141                if (psTraceGetLevel("psastro.dump") > 0) {
     142                    psastroDumpRawstars (rawstars, fpa, chip);
     143                }
     144
     145                pmAstromVisualPlotRawStars(rawstars, fpa, chip, recipe);
     146
     147                if (psTraceGetLevel("psastro.plot") > 0) {
     148                    psastroPlotRawstars (rawstars, fpa, chip, recipe);
     149                }
    150150            }
    151151        }
     
    157157    psMetadataAddS32 (recipe, PS_LIST_TAIL, "NTOTSTAR",  PS_META_REPLACE, "", *nStars);
    158158    if (*nStars == 0) {
    159         psLogMsg ("psastro", 2, "no sources available for astrometry\n");
    160         psFree (view);
    161         return true;
    162     }
    163 
    164     psLogMsg ("psastro", 2, "loaded raw data from %f,%f to %f,%f\n", 
    165               DEG_RAD*RAmin, DEG_RAD*DECmin,
    166               DEG_RAD*RAmax, DEG_RAD*DECmax);
     159        psLogMsg ("psastro", 2, "no sources available for astrometry\n");
     160        psFree (view);
     161        return true;
     162    }
     163
     164    psLogMsg ("psastro", 2, "loaded raw data from %f,%f to %f,%f\n",
     165              DEG_RAD*RAmin, DEG_RAD*DECmin,
     166              DEG_RAD*RAmax, DEG_RAD*DECmax);
    167167
    168168    psMetadataAddF32 (recipe, PS_LIST_TAIL, "RA_MIN",  PS_META_REPLACE, "", RAmin);
     
    203203    pmHDU *hdu = pmFPAviewThisHDU (view, fpa);
    204204    if (bilevelAstrometry) {
    205         if (!pmAstromReadBilevelChip (chip, hdu->header)) {
    206             psWarning("Could not get WCS information from header for chip %d, skipping", view->chip);
    207             return false;
    208         }
     205        if (!pmAstromReadBilevelChip (chip, hdu->header)) {
     206            psWarning("Could not get WCS information from header for chip %d, skipping", view->chip);
     207            return false;
     208        }
    209209    } else {
    210         if (!pmAstromReadWCS (fpa, chip, hdu->header, pixelScale)) {
    211             psWarning("Could not get WCS information from header for chip %d, skipping", view->chip);
    212             return false;
    213         }
     210        if (!pmAstromReadWCS (fpa, chip, hdu->header, pixelScale)) {
     211            psWarning("Could not get WCS information from header for chip %d, skipping", view->chip);
     212            return false;
     213        }
    214214    }
    215215    return true;
     
    225225    // load mosaic-level astrometry?
    226226    if (phu) {
    227         char *ctype = psMetadataLookupStr (NULL, phu->header, "CTYPE1");
    228         if (ctype) {
    229             *bilevelAstrometry = !strcmp (&ctype[4], "-DIS");
    230         }
     227        char *ctype = psMetadataLookupStr (NULL, phu->header, "CTYPE1");
     228        if (ctype) {
     229            *bilevelAstrometry = !strcmp (&ctype[4], "-DIS");
     230        }
    231231    }
    232232    if (*bilevelAstrometry) {
    233         pmAstromReadBilevelMosaic (fpa, phu->header);
    234     } 
     233        pmAstromReadBilevelMosaic (fpa, phu->header);
     234    }
    235235    psFree (view);
    236236    return true;
     
    245245    pmFPAfile *input = psMetadataLookupPtr (NULL, config->files, "PSASTRO.INPUT");
    246246    if (!input) {
    247         psError(PSASTRO_ERR_CONFIG, true, "Can't find input data");
    248         return false;
     247        psError(PSASTRO_ERR_CONFIG, true, "Can't find input data");
     248        return false;
    249249    }
    250250
     
    277277        if (!chip->process || !chip->file_exists || !chip->data_exists) { continue; }
    278278
    279         // XXX we are currently inconsistent with marking the good vs the bad data
    280         // psastroChipAstrom sets data_exists to false if the fit is bad.  this is
    281         // probably wrong since it implies there is no data!
    282 
    283         // skip chips for which the astrometry failed (NASTRO == 0)
    284         if (!chip->cells->n) goto skip_chip;
    285         pmCell *cell = chip->cells->data[0];
    286         if (!cell) goto skip_chip;
    287 
    288         if (!cell->readouts->n) goto skip_chip;
    289         pmReadout *readout = cell->readouts->data[0];
    290         if (!readout) goto skip_chip;
    291 
    292         psMetadata *updates = psMetadataLookupMetadata (&status, readout->analysis, "PSASTRO.HEADER");
    293         if (!updates) goto skip_chip;
    294        
    295         int nAstro = psMetadataLookupS32 (&status, updates, "NASTRO");
    296         if (!nAstro) goto skip_chip;
    297 
    298         float astError = psMetadataLookupF32 (&status, updates, "CERROR");
    299         if (fabs(astError) < 1e-6) goto skip_chip;
    300 
    301         psPlane ptCH, ptFP, ptTP;
    302         psSphere ptSky;
    303 
    304         ptCH.x = 0;
    305         ptCH.y = 0;
    306         psPlaneTransformApply (&ptFP, chip->toFPA, &ptCH);
    307         psPlaneTransformApply (&ptTP, fpa->toTPA, &ptFP);
    308         psDeproject (&ptSky, &ptTP, fpa->toSky);
    309         psLogMsg ("psastro", 3, "0,0 pix for chip %3d = %f,%f\n", view->chip, DEG_RAD*ptSky.r, DEG_RAD*ptSky.d);
    310 
    311         // new corner locations based on the calibrated astrometry
    312         psVectorAppend (cornerLn, ptFP.x);
    313         psVectorAppend (cornerMn, ptFP.y);
    314         psVectorAppend (cornerPn, ptTP.x);
    315         psVectorAppend (cornerQn, ptTP.y);
    316         psVectorAppend (cornerRn, ptSky.r);
    317         psVectorAppend (cornerDn, ptSky.d);
    318         psVectorAppend (cornerMK, 0);
    319         continue;
     279        // XXX we are currently inconsistent with marking the good vs the bad data
     280        // psastroChipAstrom sets data_exists to false if the fit is bad.  this is
     281        // probably wrong since it implies there is no data!
     282
     283        // skip chips for which the astrometry failed (NASTRO == 0)
     284        if (!chip->cells->n) goto skip_chip;
     285        pmCell *cell = chip->cells->data[0];
     286        if (!cell) goto skip_chip;
     287
     288        if (!cell->readouts->n) goto skip_chip;
     289        pmReadout *readout = cell->readouts->data[0];
     290        if (!readout) goto skip_chip;
     291
     292        psMetadata *updates = psMetadataLookupMetadata (&status, readout->analysis, "PSASTRO.HEADER");
     293        if (!updates) goto skip_chip;
     294
     295        int nAstro = psMetadataLookupS32 (&status, updates, "NASTRO");
     296        if (!nAstro) goto skip_chip;
     297
     298        float astError = psMetadataLookupF32 (&status, updates, "CERROR");
     299        if (fabs(astError) < 1e-6) goto skip_chip;
     300
     301        psPlane ptCH, ptFP, ptTP;
     302        psSphere ptSky;
     303
     304        ptCH.x = 0;
     305        ptCH.y = 0;
     306        psPlaneTransformApply (&ptFP, chip->toFPA, &ptCH);
     307        psPlaneTransformApply (&ptTP, fpa->toTPA, &ptFP);
     308        psDeproject (&ptSky, &ptTP, fpa->toSky);
     309        psLogMsg ("psastro", 3, "0,0 pix for chip %3d = %f,%f\n", view->chip, DEG_RAD*ptSky.r, DEG_RAD*ptSky.d);
     310
     311        // new corner locations based on the calibrated astrometry
     312        psVectorAppend (cornerLn, ptFP.x);
     313        psVectorAppend (cornerMn, ptFP.y);
     314        psVectorAppend (cornerPn, ptTP.x);
     315        psVectorAppend (cornerQn, ptTP.y);
     316        psVectorAppend (cornerRn, ptSky.r);
     317        psVectorAppend (cornerDn, ptSky.d);
     318        psVectorAppend (cornerMK, 0);
     319        continue;
    320320
    321321    skip_chip:
    322         // new corner locations based on the calibrated astrometry
    323         psVectorAppend (cornerLn, 0.0);
    324         psVectorAppend (cornerMn, 0.0);
    325         psVectorAppend (cornerPn, 0.0);
    326         psVectorAppend (cornerQn, 0.0);
    327         psVectorAppend (cornerRn, 0.0);
    328         psVectorAppend (cornerDn, 0.0);
    329         psVectorAppend (cornerMK, 1);
     322        // new corner locations based on the calibrated astrometry
     323        psVectorAppend (cornerLn, 0.0);
     324        psVectorAppend (cornerMn, 0.0);
     325        psVectorAppend (cornerPn, 0.0);
     326        psVectorAppend (cornerQn, 0.0);
     327        psVectorAppend (cornerRn, 0.0);
     328        psVectorAppend (cornerDn, 0.0);
     329        psVectorAppend (cornerMK, 1);
    330330    }
    331331
     
    336336
    337337    for (int i = 0; i < cornerRo->n; i++) {
    338        
    339         psPlane ptTP;
    340         psSphere ptSky;
    341 
    342         ptSky.r = cornerRo->data.F32[i];
    343         ptSky.d = cornerDo->data.F32[i];
    344 
    345         psProject (&ptTP, &ptSky, fpa->toSky);
    346         psVectorAppend (cornerPs, ptTP.x);
    347         psVectorAppend (cornerQs, ptTP.y);
     338
     339        psPlane ptTP;
     340        psSphere ptSky;
     341
     342        ptSky.r = cornerRo->data.F32[i];
     343        ptSky.d = cornerDo->data.F32[i];
     344
     345        psProject (&ptTP, &ptSky, fpa->toSky);
     346        psVectorAppend (cornerPs, ptTP.x);
     347        psVectorAppend (cornerQs, ptTP.y);
    348348    }
    349349
     
    351351    map->x->coeffMask[1][1] = PS_POLY_MASK_SET;
    352352    map->y->coeffMask[1][1] = PS_POLY_MASK_SET;
    353    
     353
    354354    // fit the valid chips, mask the invalid chips
    355355    psVectorFitPolynomial2D (map->x, cornerMK, 1, cornerPn, NULL, cornerPs, cornerQs);
    356356    psVectorFitPolynomial2D (map->y, cornerMK, 1, cornerQn, NULL, cornerPs, cornerQs);
    357    
     357
    358358    // apply the linear fit...
    359359    psVector *cornerPf = psPolynomial2DEvalVector (map->x, cornerPs, cornerQs);
     
    364364    psVector *cornerQd = (psVector *) psBinaryOp (NULL, cornerQn, "-", cornerQf);
    365365
    366     psastroVisualPlotAstromGuessCheck (cornerPo, cornerQo, cornerPn, cornerQn, cornerPd, cornerQd);
     366    pmAstromVisualPlotAstromGuessCheck (cornerPo, cornerQo, cornerPn, cornerQn, cornerPd, cornerQd);
    367367
    368368    psStats *statsP = psStatsAlloc (PS_STAT_SAMPLE_MEAN | PS_STAT_SAMPLE_STDEV);
     
    374374    float angle = atan2 (map->y->coeff[1][0], map->x->coeff[1][0]);
    375375    float scale = hypot (map->y->coeff[1][0], map->x->coeff[1][0]);
    376    
     376
    377377    psLogMsg ("psastro", 3, "boresite offset  : %f,%f\n", map->x->coeff[0][0], map->y->coeff[0][0]);
    378378    psLogMsg ("psastro", 3, "boresite angle   : %f, scale: %f", angle*PS_DEG_RAD, scale);
     
    382382    psMetadata *header = psMetadataLookupMetadata (&status, input->fpa->analysis, "PSASTRO.HEADER");
    383383    if (!header) {
    384         header = psMetadataAlloc();
    385         psMetadataAddMetadata (input->fpa->analysis, PS_LIST_TAIL, "PSASTRO.HEADER",  PS_META_REPLACE, "psastro header stats", header);
    386         psFree (header);  // drop this reference
     384        header = psMetadataAlloc();
     385        psMetadataAddMetadata (input->fpa->analysis, PS_LIST_TAIL, "PSASTRO.HEADER",  PS_META_REPLACE, "psastro header stats", header);
     386        psFree (header);  // drop this reference
    387387    }
    388388
     
    395395
    396396    if (DEBUG) {
    397         FILE *f = fopen ("corners.dat", "w");
    398         for (int i = 0; i < cornerRo->n; i++) {
    399             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",
    400                      cornerRn->data.F32[i], cornerDn->data.F32[i], cornerPn->data.F32[i], cornerQn->data.F32[i], cornerLn->data.F32[i], cornerMn->data.F32[i],
    401                      cornerRo->data.F32[i], cornerDo->data.F32[i], cornerPo->data.F32[i], cornerQo->data.F32[i], cornerLo->data.F32[i], cornerMo->data.F32[i]);
    402         }
    403         fclose (f);
     397        FILE *f = fopen ("corners.dat", "w");
     398        for (int i = 0; i < cornerRo->n; i++) {
     399            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",
     400                     cornerRn->data.F32[i], cornerDn->data.F32[i], cornerPn->data.F32[i], cornerQn->data.F32[i], cornerLn->data.F32[i], cornerMn->data.F32[i],
     401                     cornerRo->data.F32[i], cornerDo->data.F32[i], cornerPo->data.F32[i], cornerQo->data.F32[i], cornerLo->data.F32[i], cornerMo->data.F32[i]);
     402        }
     403        fclose (f);
    404404    }
    405405
     
    424424    psFree (map);
    425425    psFree (view);
    426    
     426
    427427
    428428    return true;
Note: See TracChangeset for help on using the changeset viewer.