IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Feb 9, 2009, 11:25:34 AM (17 years ago)
Author:
Paul Price
Message:

Merging cnb_branch_20090113. No major conflicts. Compiles, but not tested.

File:
1 edited

Legend:

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

    r21409 r21422  
    66 *
    77 *  @author IfA
    8  *  @version $Revision: 1.34 $ $Name: not supported by cvs2svn $
    9  *  @date $Date: 2009-02-07 02:03:34 $
     8 *  @version $Revision: 1.35 $ $Name: not supported by cvs2svn $
     9 *  @date $Date: 2009-02-09 21:25:34 $
    1010 *  Copyright 2009 Institute for Astronomy, University of Hawaii
    1111 */
     
    4242    psMetadata *recipe  = psMetadataLookupPtr (NULL, config->recipes, PSASTRO_RECIPE);
    4343    if (!recipe) {
    44         psError(PSASTRO_ERR_CONFIG, true, "Can't find PSASTRO recipe!");
    45         return false;
     44        psError(PSASTRO_ERR_CONFIG, true, "Can't find PSASTRO recipe!");
     45        return false;
    4646    }
    4747
     
    4949    bool useModel = psMetadataLookupBool (&status, config->arguments, "PSASTRO.USE.MODEL");
    5050    if (!status) {
    51         useModel = psMetadataLookupBool (&status, recipe, "PSASTRO.USE.MODEL");
     51        useModel = psMetadataLookupBool (&status, recipe, "PSASTRO.USE.MODEL");
    5252    }
    5353
     
    5555    pmFPAfile *input = psMetadataLookupPtr (NULL, config->files, "PSASTRO.INPUT");
    5656    if (!input) {
    57         psError(PSASTRO_ERR_CONFIG, true, "Can't find input data");
    58         return false;
     57        psError(PSASTRO_ERR_CONFIG, true, "Can't find input data");
     58        return false;
    5959    }
    6060
     
    6262    double pixelScale = psMetadataLookupF32 (&status, recipe, "PSASTRO.PIXEL.SCALE");
    6363    if (!status) {
    64         psError(PS_ERR_IO, true, "Failed to lookup pixel scale");
    65         return false;
    66     } 
     64        psError(PS_ERR_IO, true, "Failed to lookup pixel scale");
     65        return false;
     66    }
    6767
    6868    psVector *cornerL = psVectorAllocEmpty (100, PS_TYPE_F32);
     
    8080    bool bilevelAstrometry = false;
    8181    if (!useModel) {
    82         psastroAstromGuessSetFPA (fpa, &bilevelAstrometry);
     82        psastroAstromGuessSetFPA (fpa, &bilevelAstrometry);
    8383    }
    8484
     
    8888        if (!chip->process || !chip->file_exists || !chip->data_exists) { continue; }
    8989
    90         if (!useModel) {
    91             if (!psastroAstromGuessSetChip (fpa, chip, view, pixelScale, bilevelAstrometry)) continue;
    92         }
     90        if (!useModel) {
     91            if (!psastroAstromGuessSetChip (fpa, chip, view, pixelScale, bilevelAstrometry)) continue;
     92        }
    9393
    9494        if (newFPA) {
    9595            newFPA = false;
    96             while (fpa->toSky->R <        0) fpa->toSky->R += 2.0*M_PI;
    97             while (fpa->toSky->R > 2.0*M_PI) fpa->toSky->R -= 2.0*M_PI;
     96            while (fpa->toSky->R <        0) fpa->toSky->R += 2.0*M_PI;
     97            while (fpa->toSky->R > 2.0*M_PI) fpa->toSky->R -= 2.0*M_PI;
    9898            RAminSky = fpa->toSky->R - M_PI;
    9999            RAmaxSky = fpa->toSky->R + M_PI;
    100100        }
    101101
    102         // report and save the current best guess for the chip 0,0 pixel coordinates
    103         {
    104             psPlane ptCH, ptFP, ptTP;
    105             psSphere ptSky;
    106 
    107             ptCH.x = 0;
    108             ptCH.y = 0;
    109             psPlaneTransformApply (&ptFP, chip->toFPA, &ptCH);
    110             psPlaneTransformApply (&ptTP, fpa->toTPA, &ptFP);
    111             psDeproject (&ptSky, &ptTP, fpa->toSky);
    112             psLogMsg ("psastro", 3, "0,0 pix for chip %3d = %f,%f\n", view->chip, DEG_RAD*ptSky.r, DEG_RAD*ptSky.d);
    113 
    114             psVectorAppend (cornerL, ptFP.x);
    115             psVectorAppend (cornerM, ptFP.y);
    116             psVectorAppend (cornerP, ptTP.x);
    117             psVectorAppend (cornerQ, ptTP.y);
    118             psVectorAppend (cornerR, ptSky.r);
    119             psVectorAppend (cornerD, ptSky.d);
    120         }
     102        // report and save the current best guess for the chip 0,0 pixel coordinates
     103        {
     104            psPlane ptCH, ptFP, ptTP;
     105            psSphere ptSky;
     106
     107            ptCH.x = 0;
     108            ptCH.y = 0;
     109            psPlaneTransformApply (&ptFP, chip->toFPA, &ptCH);
     110            psPlaneTransformApply (&ptTP, fpa->toTPA, &ptFP);
     111            psDeproject (&ptSky, &ptTP, fpa->toSky);
     112            psLogMsg ("psastro", 3, "0,0 pix for chip %3d = %f,%f\n", view->chip, DEG_RAD*ptSky.r, DEG_RAD*ptSky.d);
     113
     114            psVectorAppend (cornerL, ptFP.x);
     115            psVectorAppend (cornerM, ptFP.y);
     116            psVectorAppend (cornerP, ptTP.x);
     117            psVectorAppend (cornerQ, ptTP.y);
     118            psVectorAppend (cornerR, ptSky.r);
     119            psVectorAppend (cornerD, ptSky.d);
     120        }
    121121
    122122        // apply the new WCS guess data to all of the data in the readouts
     
    132132                if (rawstars == NULL) { continue; }
    133133
    134                 *nStars += rawstars->n;
     134                *nStars += rawstars->n;
    135135                for (int i = 0; i < rawstars->n; i++) {
    136136                    pmAstromObj *raw = rawstars->data[i];
     
    151151                }
    152152
    153                 // dump or plot the resulting projected positions
    154                 if (psTraceGetLevel("psastro.dump") > 0) {
    155                     psastroDumpRawstars (rawstars, fpa, chip);
    156                 }
    157 
    158                 psastroVisualPlotRawStars(rawstars, fpa, chip, recipe);
    159 
    160                 if (psTraceGetLevel("psastro.plot") > 0) {
    161                     psastroPlotRawstars (rawstars, fpa, chip, recipe);
    162                 }
     153                // dump or plot the resulting projected positions
     154                if (psTraceGetLevel("psastro.dump") > 0) {
     155                    psastroDumpRawstars (rawstars, fpa, chip);
     156                }
     157
     158                pmAstromVisualPlotRawStars(rawstars, fpa, chip, recipe);
     159
     160                if (psTraceGetLevel("psastro.plot") > 0) {
     161                    psastroPlotRawstars (rawstars, fpa, chip, recipe);
     162                }
    163163            }
    164164        }
     
    170170    psMetadataAddS32 (recipe, PS_LIST_TAIL, "NTOTSTAR",  PS_META_REPLACE, "", *nStars);
    171171    if (*nStars == 0) {
    172         psLogMsg ("psastro", 2, "no sources available for astrometry\n");
    173         psFree (view);
    174         return true;
    175     }
    176 
    177     psLogMsg ("psastro", 2, "loaded raw data from %f,%f to %f,%f\n", 
    178               DEG_RAD*RAmin, DEG_RAD*DECmin,
    179               DEG_RAD*RAmax, DEG_RAD*DECmax);
     172        psLogMsg ("psastro", 2, "no sources available for astrometry\n");
     173        psFree (view);
     174        return true;
     175    }
     176
     177    psLogMsg ("psastro", 2, "loaded raw data from %f,%f to %f,%f\n",
     178              DEG_RAD*RAmin, DEG_RAD*DECmin,
     179              DEG_RAD*RAmax, DEG_RAD*DECmax);
    180180
    181181    psMetadataAddF32 (recipe, PS_LIST_TAIL, "RA_MIN",  PS_META_REPLACE, "", RAmin);
     
    216216    pmHDU *hdu = pmFPAviewThisHDU (view, fpa);
    217217    if (bilevelAstrometry) {
    218         if (!pmAstromReadBilevelChip (chip, hdu->header)) {
    219             psWarning("Could not get WCS information from header for chip %d, skipping", view->chip);
    220             return false;
    221         }
     218        if (!pmAstromReadBilevelChip (chip, hdu->header)) {
     219            psWarning("Could not get WCS information from header for chip %d, skipping", view->chip);
     220            return false;
     221        }
    222222    } else {
    223         if (!pmAstromReadWCS (fpa, chip, hdu->header, pixelScale)) {
    224             psWarning("Could not get WCS information from header for chip %d, skipping", view->chip);
    225             return false;
    226         }
     223        if (!pmAstromReadWCS (fpa, chip, hdu->header, pixelScale)) {
     224            psWarning("Could not get WCS information from header for chip %d, skipping", view->chip);
     225            return false;
     226        }
    227227    }
    228228    return true;
     
    238238    // load mosaic-level astrometry?
    239239    if (phu) {
    240         char *ctype = psMetadataLookupStr (NULL, phu->header, "CTYPE1");
    241         if (ctype) {
    242             *bilevelAstrometry = !strcmp (&ctype[4], "-DIS");
    243         }
     240        char *ctype = psMetadataLookupStr (NULL, phu->header, "CTYPE1");
     241        if (ctype) {
     242            *bilevelAstrometry = !strcmp (&ctype[4], "-DIS");
     243        }
    244244    }
    245245    if (*bilevelAstrometry) {
    246         pmAstromReadBilevelMosaic (fpa, phu->header);
    247     } 
     246        pmAstromReadBilevelMosaic (fpa, phu->header);
     247    }
    248248    psFree (view);
    249249    return true;
     
    258258    pmFPAfile *input = psMetadataLookupPtr (NULL, config->files, "PSASTRO.INPUT");
    259259    if (!input) {
    260         psError(PSASTRO_ERR_CONFIG, true, "Can't find input data");
    261         return false;
     260        psError(PSASTRO_ERR_CONFIG, true, "Can't find input data");
     261        return false;
    262262    }
    263263
     
    290290        if (!chip->process || !chip->file_exists || !chip->data_exists) { continue; }
    291291
    292         // XXX we are currently inconsistent with marking the good vs the bad data
    293         // psastroChipAstrom sets data_exists to false if the fit is bad.  this is
    294         // probably wrong since it implies there is no data!
    295 
    296         // skip chips for which the astrometry failed (NASTRO == 0)
    297         if (!chip->cells->n) goto skip_chip;
    298         pmCell *cell = chip->cells->data[0];
    299         if (!cell) goto skip_chip;
    300 
    301         if (!cell->readouts->n) goto skip_chip;
    302         pmReadout *readout = cell->readouts->data[0];
    303         if (!readout) goto skip_chip;
    304 
    305         psMetadata *updates = psMetadataLookupMetadata (&status, readout->analysis, "PSASTRO.HEADER");
    306         if (!updates) goto skip_chip;
    307        
    308         int nAstro = psMetadataLookupS32 (&status, updates, "NASTRO");
    309         if (!nAstro) goto skip_chip;
    310 
    311         float astError = psMetadataLookupF32 (&status, updates, "CERROR");
    312         if (fabs(astError) < 1e-6) goto skip_chip;
    313 
    314         psPlane ptCH, ptFP, ptTP;
    315         psSphere ptSky;
    316 
    317         ptCH.x = 0;
    318         ptCH.y = 0;
    319         psPlaneTransformApply (&ptFP, chip->toFPA, &ptCH);
    320         psPlaneTransformApply (&ptTP, fpa->toTPA, &ptFP);
    321         psDeproject (&ptSky, &ptTP, fpa->toSky);
    322         psLogMsg ("psastro", 3, "0,0 pix for chip %3d = %f,%f\n", view->chip, DEG_RAD*ptSky.r, DEG_RAD*ptSky.d);
    323 
    324         // new corner locations based on the calibrated astrometry
    325         psVectorAppend (cornerLn, ptFP.x);
    326         psVectorAppend (cornerMn, ptFP.y);
    327         psVectorAppend (cornerPn, ptTP.x);
    328         psVectorAppend (cornerQn, ptTP.y);
    329         psVectorAppend (cornerRn, ptSky.r);
    330         psVectorAppend (cornerDn, ptSky.d);
    331         psVectorAppend (cornerMK, 0);
    332         continue;
     292        // XXX we are currently inconsistent with marking the good vs the bad data
     293        // psastroChipAstrom sets data_exists to false if the fit is bad.  this is
     294        // probably wrong since it implies there is no data!
     295
     296        // skip chips for which the astrometry failed (NASTRO == 0)
     297        if (!chip->cells->n) goto skip_chip;
     298        pmCell *cell = chip->cells->data[0];
     299        if (!cell) goto skip_chip;
     300
     301        if (!cell->readouts->n) goto skip_chip;
     302        pmReadout *readout = cell->readouts->data[0];
     303        if (!readout) goto skip_chip;
     304
     305        psMetadata *updates = psMetadataLookupMetadata (&status, readout->analysis, "PSASTRO.HEADER");
     306        if (!updates) goto skip_chip;
     307
     308        int nAstro = psMetadataLookupS32 (&status, updates, "NASTRO");
     309        if (!nAstro) goto skip_chip;
     310
     311        float astError = psMetadataLookupF32 (&status, updates, "CERROR");
     312        if (fabs(astError) < 1e-6) goto skip_chip;
     313
     314        psPlane ptCH, ptFP, ptTP;
     315        psSphere ptSky;
     316
     317        ptCH.x = 0;
     318        ptCH.y = 0;
     319        psPlaneTransformApply (&ptFP, chip->toFPA, &ptCH);
     320        psPlaneTransformApply (&ptTP, fpa->toTPA, &ptFP);
     321        psDeproject (&ptSky, &ptTP, fpa->toSky);
     322        psLogMsg ("psastro", 3, "0,0 pix for chip %3d = %f,%f\n", view->chip, DEG_RAD*ptSky.r, DEG_RAD*ptSky.d);
     323
     324        // new corner locations based on the calibrated astrometry
     325        psVectorAppend (cornerLn, ptFP.x);
     326        psVectorAppend (cornerMn, ptFP.y);
     327        psVectorAppend (cornerPn, ptTP.x);
     328        psVectorAppend (cornerQn, ptTP.y);
     329        psVectorAppend (cornerRn, ptSky.r);
     330        psVectorAppend (cornerDn, ptSky.d);
     331        psVectorAppend (cornerMK, 0);
     332        continue;
    333333
    334334    skip_chip:
    335         // new corner locations based on the calibrated astrometry
    336         psVectorAppend (cornerLn, 0.0);
    337         psVectorAppend (cornerMn, 0.0);
    338         psVectorAppend (cornerPn, 0.0);
    339         psVectorAppend (cornerQn, 0.0);
    340         psVectorAppend (cornerRn, 0.0);
    341         psVectorAppend (cornerDn, 0.0);
    342         psVectorAppend (cornerMK, 1);
     335        // new corner locations based on the calibrated astrometry
     336        psVectorAppend (cornerLn, 0.0);
     337        psVectorAppend (cornerMn, 0.0);
     338        psVectorAppend (cornerPn, 0.0);
     339        psVectorAppend (cornerQn, 0.0);
     340        psVectorAppend (cornerRn, 0.0);
     341        psVectorAppend (cornerDn, 0.0);
     342        psVectorAppend (cornerMK, 1);
    343343    }
    344344
     
    349349
    350350    for (int i = 0; i < cornerRo->n; i++) {
    351        
    352         psPlane ptTP;
    353         psSphere ptSky;
    354 
    355         ptSky.r = cornerRo->data.F32[i];
    356         ptSky.d = cornerDo->data.F32[i];
    357 
    358         psProject (&ptTP, &ptSky, fpa->toSky);
    359         psVectorAppend (cornerPs, ptTP.x);
    360         psVectorAppend (cornerQs, ptTP.y);
     351
     352        psPlane ptTP;
     353        psSphere ptSky;
     354
     355        ptSky.r = cornerRo->data.F32[i];
     356        ptSky.d = cornerDo->data.F32[i];
     357
     358        psProject (&ptTP, &ptSky, fpa->toSky);
     359        psVectorAppend (cornerPs, ptTP.x);
     360        psVectorAppend (cornerQs, ptTP.y);
    361361    }
    362362
     
    364364    map->x->coeffMask[1][1] = PS_POLY_MASK_SET;
    365365    map->y->coeffMask[1][1] = PS_POLY_MASK_SET;
    366    
     366
    367367    // fit the valid chips, mask the invalid chips
    368368    psVectorFitPolynomial2D (map->x, cornerMK, 1, cornerPn, NULL, cornerPs, cornerQs);
    369369    psVectorFitPolynomial2D (map->y, cornerMK, 1, cornerQn, NULL, cornerPs, cornerQs);
    370    
     370
    371371    // apply the linear fit...
    372372    psVector *cornerPf = psPolynomial2DEvalVector (map->x, cornerPs, cornerQs);
     
    377377    psVector *cornerQd = (psVector *) psBinaryOp (NULL, cornerQn, "-", cornerQf);
    378378
    379     psastroVisualPlotAstromGuessCheck (cornerPo, cornerQo, cornerPn, cornerQn, cornerPd, cornerQd);
     379    pmAstromVisualPlotAstromGuessCheck (cornerPo, cornerQo, cornerPn, cornerQn, cornerPd, cornerQd);
    380380
    381381    psStats *statsP = psStatsAlloc (PS_STAT_SAMPLE_MEAN | PS_STAT_SAMPLE_STDEV);
     
    387387    float angle = atan2 (map->y->coeff[1][0], map->x->coeff[1][0]);
    388388    float scale = hypot (map->y->coeff[1][0], map->x->coeff[1][0]);
    389    
     389
    390390    psLogMsg ("psastro", 3, "boresite offset  : %f,%f\n", map->x->coeff[0][0], map->y->coeff[0][0]);
    391391    psLogMsg ("psastro", 3, "boresite angle   : %f, scale: %f", angle*PS_DEG_RAD, scale);
     
    395395    psMetadata *header = psMetadataLookupMetadata (&status, input->fpa->analysis, "PSASTRO.HEADER");
    396396    if (!header) {
    397         header = psMetadataAlloc();
    398         psMetadataAddMetadata (input->fpa->analysis, PS_LIST_TAIL, "PSASTRO.HEADER",  PS_META_REPLACE, "psastro header stats", header);
    399         psFree (header);  // drop this reference
     397        header = psMetadataAlloc();
     398        psMetadataAddMetadata (input->fpa->analysis, PS_LIST_TAIL, "PSASTRO.HEADER",  PS_META_REPLACE, "psastro header stats", header);
     399        psFree (header);  // drop this reference
    400400    }
    401401
     
    408408
    409409    if (DEBUG) {
    410         FILE *f = fopen ("corners.dat", "w");
    411         for (int i = 0; i < cornerRo->n; i++) {
    412             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",
    413                      cornerRn->data.F32[i], cornerDn->data.F32[i], cornerPn->data.F32[i], cornerQn->data.F32[i], cornerLn->data.F32[i], cornerMn->data.F32[i],
    414                      cornerRo->data.F32[i], cornerDo->data.F32[i], cornerPo->data.F32[i], cornerQo->data.F32[i], cornerLo->data.F32[i], cornerMo->data.F32[i]);
    415         }
    416         fclose (f);
     410        FILE *f = fopen ("corners.dat", "w");
     411        for (int i = 0; i < cornerRo->n; i++) {
     412            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",
     413                     cornerRn->data.F32[i], cornerDn->data.F32[i], cornerPn->data.F32[i], cornerQn->data.F32[i], cornerLn->data.F32[i], cornerMn->data.F32[i],
     414                     cornerRo->data.F32[i], cornerDo->data.F32[i], cornerPo->data.F32[i], cornerQo->data.F32[i], cornerLo->data.F32[i], cornerMo->data.F32[i]);
     415        }
     416        fclose (f);
    417417    }
    418418
     
    437437    psFree (map);
    438438    psFree (view);
    439    
     439
    440440
    441441    return true;
Note: See TracChangeset for help on using the changeset viewer.