IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Dec 22, 2005, 4:20:27 PM (21 years ago)
Author:
eugene
Message:

various cleanups, fixes, additions...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psphot/src/psphotOutput.c

    r5802 r5828  
    55
    66    bool status;
     7
     8    psTimerStart ("psphot");
    79
    810    char *outputMode = psMetadataLookupPtr (&status, config, "OUTPUT_MODE");
    911    char *outputFile = psMetadataLookupPtr (&status, config, "OUTPUT_FILE");
    1012    char *residImage = psMetadataLookupPtr (&status, config, "RESID_IMAGE");
     13    char *psfFile    = psMetadataLookupPtr (&status, config, "PSF_OUTPUT_FILE");
    1114
    1215    if (residImage != NULL) psphotSaveImage (imdata->header, imdata->image, residImage);
     16    if (psfFile != NULL) psphotWritePSF (psf, psfFile);
    1317
    1418    if (outputFile == NULL) {
     
    4448        return;
    4549    }
     50
    4651    psAbort ("psphot", "unknown output mode %s", outputMode);
    4752}
     
    287292
    288293    // set NAXIS to 0
    289     fprintf (stderr, "setting naxis\n");
    290294    mdi = psMetadataLookup (imdata->header, "NAXIS");
    291295    mdi->data.S32 = 0;
     
    540544    }
    541545
    542     fprintf (stderr, "writing out moments\n");
    543546    for (i = 0; i < sources->n; i++) {
    544547        source = sources->data[i];
     
    604607
    605608
    606 bool psphotSamplePSFs (pmPSF *psf, psImage *image) {
    607 
    608   // make sample PSFs for 4 corners and the center
     609bool psphotSamplePSFs (psMetadata *config, pmPSF *psf, psImage *image) {
     610
     611    bool status;
     612
     613    // make sample PSFs for 4 corners and the center
    609614    psImage *sample;
     615
     616    // optional dump of all rough source data
     617    char *output = psMetadataLookupPtr (&status, config, "PSF_SAMPLE_FILE");
     618    if (!status) return false;
     619    if (output == NULL) return false;
     620    if (output[0] == 0) return false;
    610621
    611622    pmModel *modelFLT = pmModelAlloc (psf->type);
     
    613624    modelFLT->params->data.F32[1] = 1;
    614625
    615     psFits *fits = psFitsOpen ("sample.psf.fits", "w");
     626    psFits *fits = psFitsOpen (output, "w");
    616627
    617628    sample = pmModelPSFatXY (image, modelFLT, psf, 25, 25, 25, 25);
     
    630641}
    631642
     643psPolynomial2D *psPolynomial2DfromMD (psMetadata *folder) {
     644
     645    bool status;
     646    char keyword[80];
     647
     648    // get polynomial orders
     649    // XXX add status failures tests
     650    int nXorder = psMetadataLookupS32 (&status, folder, "NORDER_X");
     651    int nYorder = psMetadataLookupS32 (&status, folder, "NORDER_Y");
     652
     653    psPolynomial2D *poly = psPolynomial2DAlloc (nXorder, nYorder, PS_POLYNOMIAL_ORD);
     654
     655    for (int nx = 0; nx < poly->nX + 1; nx++) {
     656        for (int ny = 0; ny < poly->nY + 1; ny++) {
     657            sprintf (keyword, "VAL_X%02d_Y%02d", nx, ny);
     658            poly->coeff[nx][ny] = psMetadataLookupF32 (&status, folder, keyword);
     659            if (!status) poly->mask[nx][ny] = 1;
     660
     661            sprintf (keyword, "ERR_X%02d_Y%02d", nx, ny);
     662            poly->coeffErr[nx][ny] = psMetadataLookupF32 (&status, folder, keyword);
     663        }
     664    }
     665    return (poly);
     666}
     667
     668psPolynomial3D *psPolynomial3DfromMD (psMetadata *folder) {
     669
     670    bool status;
     671    char keyword[80];
     672
     673    // get polynomial orders
     674    // XXX add status failures tests
     675    int nXorder = psMetadataLookupS32 (&status, folder, "NORDER_X");
     676    int nYorder = psMetadataLookupS32 (&status, folder, "NORDER_Y");
     677    int nZorder = psMetadataLookupS32 (&status, folder, "NORDER_Z");
     678
     679    psPolynomial3D *poly = psPolynomial3DAlloc (nXorder, nYorder, nZorder, PS_POLYNOMIAL_ORD);
     680
     681    for (int nx = 0; nx < poly->nX + 1; nx++) {
     682        for (int ny = 0; ny < poly->nY + 1; ny++) {
     683            for (int nz = 0; nz < poly->nZ + 1; nz++) {
     684                sprintf (keyword, "VAL_X%02d_Y%02d_Z%02d", nx, ny, nz);
     685                poly->coeff[nx][ny][nz] = psMetadataLookupF32 (&status, folder, keyword);
     686                if (!status) poly->mask[nx][ny][nz] = 1;
     687
     688                sprintf (keyword, "ERR_X%02d_Y%02d_Z%02d", nx, ny, nz);
     689                poly->coeffErr[nx][ny][nz] = psMetadataLookupF32 (&status, folder, keyword);
     690            }
     691        }
     692    }
     693    return (poly);
     694}
     695
     696// XXX : these may need F64, or %g format for output
     697bool psPolynomial2DtoMD (psMetadata *md, psPolynomial2D *poly, char *format, ...) {
     698
     699    int Nbyte;
     700    char tmp;
     701    char *root;
     702    va_list argp; 
     703
     704    va_start (argp, format);
     705    Nbyte = vsnprintf (&tmp, 0, format, argp);
     706    va_end (argp);
     707
     708    if (!Nbyte) return false;
     709
     710    va_start (argp, format);
     711    root = (char *) psAlloc (Nbyte + 1);
     712    memset (root, 0, Nbyte + 1);
     713    vsnprintf (root, Nbyte + 1, format, argp);
     714    va_end (argp);
     715
     716    psMetadata *folder = psMetadataAlloc ();
     717    psMetadataAdd (md, PS_LIST_TAIL, root, PS_DATA_METADATA, "folder for 2D polynomial", folder);
     718    psFree (root);
     719
     720    // specify the polynomial orders
     721    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_X", PS_DATA_S32, "number of x orders", poly->nX);
     722    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Y", PS_DATA_S32, "number of y orders", poly->nY);
     723
     724    // place polynomial entries on folder
     725    for (int nx = 0; nx < poly->nX + 1; nx++) {
     726        for (int ny = 0; ny < poly->nY + 1; ny++) {
     727            if (poly->mask[nx][ny]) continue;
     728            psMetadataAdd (folder, PS_LIST_TAIL, "VAL_X%02d_Y%02d", PS_DATA_F32, "polynomial coefficient", poly->coeff[nx][ny], nx, ny);
     729            psMetadataAdd (folder, PS_LIST_TAIL, "ERR_X%02d_Y%02d", PS_DATA_F32, "polynomial coefficient error", poly->coeffErr[nx][ny], nx, ny);
     730        }
     731    }
     732    return true;
     733}
     734
     735bool psPolynomial3DtoMD (psMetadata *md, psPolynomial3D *poly, char *format, ...) {
     736
     737    int Nbyte;
     738    char tmp;
     739    char *root;
     740    va_list argp; 
     741
     742    va_start (argp, format);
     743    Nbyte = vsnprintf (&tmp, 0, format, argp);
     744    va_end (argp);
     745
     746    if (!Nbyte) return false;
     747
     748    va_start (argp, format);
     749    root = (char *) psAlloc (Nbyte + 1);
     750    memset (root, 0, Nbyte + 1);
     751    vsnprintf (root, Nbyte + 1, format, argp);
     752    va_end (argp);
     753
     754    psMetadata *folder = psMetadataAlloc ();
     755    psMetadataAdd (md, PS_LIST_TAIL, root, PS_DATA_METADATA, "folder for 3D polynomial", folder);
     756    psFree (root);
     757
     758    // specify the polynomial orders
     759    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_X", PS_DATA_S32, "number of x orders", poly->nX);
     760    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Y", PS_DATA_S32, "number of y orders", poly->nY);
     761    psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Z", PS_DATA_S32, "number of z orders", poly->nZ);
     762
     763    // place polynomial entries on folder
     764    for (int nx = 0; nx < poly->nX + 1; nx++) {
     765        for (int ny = 0; ny < poly->nY + 1; ny++) {
     766            for (int nz = 0; nz < poly->nZ + 1; nz++) {
     767                if (poly->mask[nx][ny][nz]) continue;
     768                psMetadataAdd (folder, PS_LIST_TAIL, "VAL_X%02d_Y%02d_Z%02d", PS_DATA_F32, "polynomial coefficient", poly->coeff[nx][ny][nz], nx, ny, nz);
     769                psMetadataAdd (folder, PS_LIST_TAIL, "ERR_X%02d_Y%02d_Z%02d", PS_DATA_F32, "polynomial coeffficient error", poly->coeffErr[nx][ny][nz], nx, ny, nz);
     770            }
     771        }
     772    }
     773    return true;
     774}
     775
     776bool psphotWritePSF (pmPSF *psf, char *filename) {
     777
     778    psMetadata *psfdata = psMetadataAlloc ();
     779
     780    char *modelName = pmModelGetType (psf->type);
     781    psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_MODEL_NAME", PS_DATA_STRING, "PSF model name", modelName);
     782
     783    int nPar = pmModelParameterCount (psf->type)    ;
     784    psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_MODEL_NPAR", PS_DATA_S32, "PSF model parameter count", nPar);
     785
     786    for (int i = 0; i < nPar - 4; i++) {
     787        psPolynomial2D *poly = psf->params->data[i];
     788        psPolynomial2DtoMD (psfdata, poly, "PSF_PAR%02d", i);
     789    }
     790    psPolynomial3DtoMD (psfdata, psf->ApTrend, "APTREND");
     791
     792    psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_AP_RESID", PS_DATA_F32, "aperture residual", psf->ApResid);
     793    psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_dAP_RESID", PS_DATA_F32, "aperture residual scatter", psf->dApResid);
     794    psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_SKY_BIAS", PS_DATA_F32, "sky bias level", psf->skyBias);
     795
     796    psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "chi-square for fit", psf->chisq);
     797    psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_NSTARS", PS_DATA_S32, "number of stars used to measure PSF", psf->nPSFstars);
     798   
     799    psMetadataConfigWrite (psfdata, filename);
     800    psFree (psfdata);
     801
     802    return true;
     803}
     804
     805pmPSF *psphotReadPSF (char *filename) {
     806
     807    bool status;
     808    unsigned int Nfail;
     809    char keyword[80];
     810
     811    psMetadata *psfdata = psMetadataConfigParse (NULL, &Nfail, filename, FALSE);
     812
     813    char *modelName = psMetadataLookupPtr (&status, psfdata, "PSF_MODEL_NAME");
     814    pmModelType type = pmModelSetType (modelName);
     815
     816    pmPSF *psf = pmPSFAlloc (type);
     817
     818    int nPar = psMetadataLookupS32 (&status, psfdata, "PSF_MODEL_NPAR");
     819    if (nPar != pmModelParameterCount (psf->type)) psAbort ("read PSF" , "mismatch model par count");
     820
     821    for (int i = 0; i < nPar - 4; i++) {
     822        sprintf (keyword, "PSF_PAR%02d", i);
     823        psMetadata *folder = psMetadataLookupPtr (&status, psfdata, keyword);
     824        psPolynomial2D *poly = psPolynomial2DfromMD (folder);
     825        psFree (psf->params->data[i]);
     826        psf->params->data[i] = poly;
     827    }
     828    sprintf (keyword, "APTREND");
     829    psMetadata *folder = psMetadataLookupPtr (&status, psfdata, keyword);
     830    psPolynomial3D *poly = psPolynomial3DfromMD (folder);
     831    psFree (psf->ApTrend);
     832    psf->ApTrend = poly;
     833
     834    psf->ApResid = psMetadataLookupF32 (&status, psfdata, "PSF_AP_RESID");
     835    psf->dApResid = psMetadataLookupF32 (&status, psfdata, "PSF_dAP_RESID");
     836    psf->skyBias = psMetadataLookupF32 (&status, psfdata, "PSF_SKY_BIAS");
     837
     838    psf->chisq = psMetadataLookupF32 (&status, psfdata, "PSF_CHISQ");
     839    psf->nPSFstars = psMetadataLookupS32 (&status, psfdata, "PSF_NSTARS");
     840
     841    psFree (psfdata);
     842    return (psf);
     843}
     844
    632845bool psphotDumpMoments (psMetadata *config, psArray *sources) {
    633846
Note: See TracChangeset for help on using the changeset viewer.