Changeset 5993 for trunk/psphot/src/psphotOutput.c
- Timestamp:
- Jan 15, 2006, 8:30:16 AM (21 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/psphotOutput.c (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/psphotOutput.c
r5986 r5993 14 14 15 15 if (residImage != NULL) psphotSaveImage (imdata->header, imdata->image, residImage); 16 if (psfFile != NULL) psphotWritePSF (psf, psfFile);17 16 psphotSamplePSFs (config, psf, imdata->image); 18 17 18 if (psfFile != NULL) { 19 psMetadata *psfData = pmPSFtoMD (NULL, psf); 20 psMetadataConfigWrite (psfData, psfFile); 21 psFree (psfData); 22 } 19 23 if (outputFile == NULL) { 20 24 psLogMsg ("output", 3, "no data output file selected"); … … 166 170 float ZERO_POINT = psMetadataLookupF32 (&status, config, "ZERO_POINT"); 167 171 if (!status) ZERO_POINT = 25.0; 168 char *PHOTCODE = psMetadataLookupPtr (&status, config, "PHOTCODE");169 172 170 173 // write necessary information to output header 171 psMetadataAdd (imdata->header, PS_LIST_TAIL, "NSTARS", PS_DATA_S32 | PS_META_REPLACE, "NUMBER OF STARS", sources->n); 172 psMetadataAdd (imdata->header, PS_LIST_TAIL, "ZERO_PT", PS_DATA_F32 | PS_META_REPLACE, "zero point", ZERO_POINT); 173 psMetadataAdd (imdata->header, PS_LIST_TAIL, "APMIFIT", PS_DATA_F32 | PS_META_REPLACE, "aperture residual", psf->ApResid); 174 psMetadataAdd (imdata->header, PS_LIST_TAIL, "DAPMIFIT", PS_DATA_F32 | PS_META_REPLACE, "ap residual scatter", psf->dApResid); 175 psMetadataAdd (imdata->header, PS_LIST_TAIL, "NAPMIFIT", PS_DATA_S32 | PS_META_REPLACE, "ap residual scatter", psf->nApResid); 176 psMetadataAdd (imdata->header, PS_LIST_TAIL, "NPSFSTAR", PS_DATA_S32 | PS_META_REPLACE, "ap residual scatter", psf->nPSFstars); 177 psMetadataAdd (imdata->header, PS_LIST_TAIL, "SKYBIAS", PS_DATA_F32 | PS_META_REPLACE, "aperture sky bias", psf->skyBias); 178 psMetadataAdd (imdata->header, PS_LIST_TAIL, "SKYSAT", PS_DATA_F32 | PS_META_REPLACE, "aperture sky bias", psf->skySat); 179 psMetadataAdd (imdata->header, PS_LIST_TAIL, "PHOTCODE", PS_DATA_STRING | PS_META_REPLACE, "photometry code", PHOTCODE); 180 psMetadataAdd (imdata->header, PS_LIST_TAIL, "FWHM_X", PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM X", 0.0); 181 psMetadataAdd (imdata->header, PS_LIST_TAIL, "FWHM_Y", PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM Y", 0.0); 182 psMetadataAdd (imdata->header, PS_LIST_TAIL, "ANGLE", PS_DATA_F32 | PS_META_REPLACE, "PSF ANGLE", 0.0); 183 psMetadataAdd (imdata->header, PS_LIST_TAIL, "FSATUR", PS_DATA_F32 | PS_META_REPLACE, "SATURATION MAG", 0.0); 184 psMetadataAdd (imdata->header, PS_LIST_TAIL, "FLIMIT", PS_DATA_F32 | PS_META_REPLACE, "COMPLETENESS MAG", 0.0); 174 psphotUpdateHeader (imdata->header, config); 175 psMetadataAdd (imdata->header, PS_LIST_TAIL, "NSTARS", PS_DATA_S32 | PS_META_REPLACE, "NUMBER OF STARS", sources->n); 185 176 186 177 // create file, write-out header … … 227 218 psLineAdd (line, "%2d ", type); 228 219 psLineAdd (line, "%3.1f ", lsky); 229 psLineAdd (line, "%6.3f ", 99.999); // should be 'Mgal220 psLineAdd (line, "%6.3f ", 99.999); // should be 'Mgal 230 221 psLineAdd (line, "%6.3f ", PS_MIN (99.999, source->apMag + ZERO_POINT)); 231 psLineAdd (line, "%6.2f ", PAR[4]); // should be 'FHWM x'232 psLineAdd (line, "%6.2f ", PAR[5]); // should be 'FHWM y'233 psLineAdd (line, "%5.1f\n", 0); // should be theta222 psLineAdd (line, "%6.2f ", PAR[4]); // should be 'FHWM x' 223 psLineAdd (line, "%6.2f ", PAR[5]); // should be 'FHWM y' 224 psLineAdd (line, "%5.1f\n", 0); // should be theta 234 225 fwrite (line->line, 1, line->Nline, f); 235 226 } … … 256 247 float RADIUS = psMetadataLookupF32 (&status, config, "AP_RADIUS"); 257 248 float ZERO_POINT = psMetadataLookupF32 (&status, config, "ZERO_POINT"); 258 char *PHOTCODE = psMetadataLookupPtr (&status, config, "PHOTCODE");259 249 260 250 // write necessary information to output header 261 psMetadataAdd (imdata->header, PS_LIST_TAIL, "NSTARS", PS_DATA_S32 | PS_META_REPLACE, "NUMBER OF STARS", sources->n); 262 psMetadataAdd (imdata->header, PS_LIST_TAIL, "ZERO_PT", PS_DATA_F32 | PS_META_REPLACE, "zero point", ZERO_POINT); 263 psMetadataAdd (imdata->header, PS_LIST_TAIL, "APMIFIT", PS_DATA_F32 | PS_META_REPLACE, "aperture residual", psf->ApResid); 264 psMetadataAdd (imdata->header, PS_LIST_TAIL, "dAPMIFIT", PS_DATA_F32 | PS_META_REPLACE, "ap residual scatter", psf->dApResid); 265 psMetadataAdd (imdata->header, PS_LIST_TAIL, "SKYBIAS", PS_DATA_F32 | PS_META_REPLACE, "aperture sky bias", psf->skyBias); 266 psMetadataAdd (imdata->header, PS_LIST_TAIL, "PHOTCODE", PS_DATA_STRING | PS_META_REPLACE, "photometry code", PHOTCODE); 267 psMetadataAdd (imdata->header, PS_LIST_TAIL, "FWHM_X", PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM X", 0.0); 268 psMetadataAdd (imdata->header, PS_LIST_TAIL, "FWHM_Y", PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM Y", 0.0); 269 psMetadataAdd (imdata->header, PS_LIST_TAIL, "ANGLE", PS_DATA_F32 | PS_META_REPLACE, "PSF ANGLE", 0.0); 270 psMetadataAdd (imdata->header, PS_LIST_TAIL, "FSATUR", PS_DATA_F32 | PS_META_REPLACE, "SATURATION MAG", 0.0); 271 psMetadataAdd (imdata->header, PS_LIST_TAIL, "FLIMIT", PS_DATA_F32 | PS_META_REPLACE, "COMPLETENESS MAG", 0.0); 272 273 // set NAXIS to 0 274 mdi = psMetadataLookup (imdata->header, "NAXIS"); 275 mdi->data.S32 = 0; 276 mdi->type = PS_DATA_S32; 251 psphotUpdateHeader (imdata->header, config); 277 252 278 253 table = psArrayAlloc (sources->n); … … 299 274 psMetadataAdd (row, PS_LIST_TAIL, "MAG_GAL", PS_DATA_F32, "", type); 300 275 psMetadataAdd (row, PS_LIST_TAIL, "MAG_AP", PS_DATA_F32, "", lsky); 301 psMetadataAdd (row, PS_LIST_TAIL, "LOG_SKY", PS_DATA_F32, "", 32.0); // should be 'Mgal'276 psMetadataAdd (row, PS_LIST_TAIL, "LOG_SKY", PS_DATA_F32, "", 32.0); 302 277 psMetadataAdd (row, PS_LIST_TAIL, "FWHM_X", PS_DATA_F32, "", source->apMag + ZERO_POINT); 303 psMetadataAdd (row, PS_LIST_TAIL, "FWHM_Y", PS_DATA_F32, "", PAR[4]); // should be 'FHWM x'304 psMetadataAdd (row, PS_LIST_TAIL, "THETA", PS_DATA_F32, "", PAR[5]); // should be 'FHWM y'305 psMetadataAdd (row, PS_LIST_TAIL, "DOPHOT", PS_ TYPE_S32, "", 0); // should be theta306 // psMetadataAdd (header, PS_LIST_HEAD, "DUMMY", PS_DATA_STRING, "", NULL);278 psMetadataAdd (row, PS_LIST_TAIL, "FWHM_Y", PS_DATA_F32, "", PAR[4]); 279 psMetadataAdd (row, PS_LIST_TAIL, "THETA", PS_DATA_F32, "", PAR[5]); 280 psMetadataAdd (row, PS_LIST_TAIL, "DOPHOT", PS_DATA_STRING, "", "0"); 281 psMetadataAdd (row, PS_LIST_TAIL, "DUMMY", PS_DATA_STRING, "", "123"); 307 282 308 283 psArrayAdd (table, 100, row); … … 310 285 } 311 286 312 // psAbort ("psphotOutput", "FITS table output not finished"); 313 314 // psImage *image = psImageAlloc (1, 1, PS_TYPE_F32); 315 // XXX missing: theader = psFitsHeaderFromTable (NULL, table, "SMPFILE"); 316 // psFitsWriteImage (fits, imdata->header, image, 0); 317 287 // write the correct number of sources in the header 288 psMetadataAdd (imdata->header, PS_LIST_TAIL, "NSTARS", PS_DATA_S32 | PS_META_REPLACE, "NUMBER OF STARS", table->n); 289 psMetadataAdd (imdata->header, PS_LIST_TAIL, "EXTEND", PS_DATA_BOOL | PS_META_REPLACE, "this file has extensions", true); 290 291 // set NAXIS to 0 (we don't write out the data array) 292 mdi = psMetadataLookup (imdata->header, "NAXIS"); 293 mdi->data.S32 = 0; 294 mdi->type = PS_DATA_S32; 295 296 // create the basic table header 318 297 theader = psMetadataAlloc (); 319 298 psMetadataAdd (theader, PS_LIST_HEAD, "EXTNAME", PS_DATA_STRING, "extension name", "SMPFILE"); 320 299 321 psImage *image; 322 323 image = psImageAlloc (512, 512, PS_DATA_F32); 324 for (int j = 0; j < 512; j++) { 325 for (int i = 0; i < 512; i++) { 326 image->data.F32[j][i] = i; 327 } 328 } 329 300 // write out the header and table 330 301 psFits *fits = psFitsOpen (filename, "w"); 331 // psFitsWriteHeader (imdata->header, fits); 332 // psFitsWriteTable (fits, theader, table); 333 334 psFitsWriteImage (fits, NULL, image, 0); 335 psFitsWriteTable (fits, NULL, table); 302 psFitsWriteHeader (imdata->header, fits); 303 psFitsWriteTable (fits, theader, table); 336 304 psFitsClose (fits); 337 305 … … 348 316 pmModelWritePSFs (sources, config, name, psf); 349 317 350 sprintf (name, "%s. flt.dat", filename);351 pmModelWrite FLTs (sources, name);318 sprintf (name, "%s.ext.dat", filename); 319 pmModelWriteEXTs (sources, name); 352 320 353 321 sprintf (name, "%s.nul.dat", filename); … … 417 385 418 386 // dump the sources to an output file 419 bool pmModelWrite FLTs (psArray *sources, char *filename) {387 bool pmModelWriteEXTs (psArray *sources, char *filename) { 420 388 421 389 double dPos, dMag; … … 427 395 f = fopen (filename, "w"); 428 396 if (f == NULL) { 429 psLogMsg ("pmModelWrite FLTs", 3, "can't open output file for moments%s\n", filename);397 psLogMsg ("pmModelWriteEXTs", 3, "can't open output file for moments%s\n", filename); 430 398 return false; 431 399 } … … 435 403 pmSource *source = (pmSource *) sources->data[i]; 436 404 437 if (source->type != PM_SOURCE_ GALAXY) continue;405 if (source->type != PM_SOURCE_EXTENDED) continue; 438 406 model = pmSourceMagnitudes (source, NULL, 0.0); 439 407 if (model == NULL) continue; … … 491 459 source = sources->data[i]; 492 460 493 // skip these sources (in PSF or FLT)461 // skip these sources (in PSF or EXT) 494 462 if (source->type == PM_SOURCE_STAR) continue; 495 if (source->type == PM_SOURCE_ GALAXY) continue;463 if (source->type == PM_SOURCE_EXTENDED) continue; 496 464 497 465 if (source->moments == NULL) { … … 580 548 return (1); 581 549 582 case PM_SOURCE_ GALAXY:550 case PM_SOURCE_EXTENDED: 583 551 return (2); 584 552 … … 597 565 } 598 566 599 psImage *pmModelPSFatXY (psImage *image, pmModel *model FLT, pmPSF *psf, int x, int y, int dx, int dy) {567 psImage *pmModelPSFatXY (psImage *image, pmModel *modelEXT, pmPSF *psf, int x, int y, int dx, int dy) { 600 568 601 569 psRegion region = {x - dx, x + dx, y - dy, y + dy}; … … 603 571 psImage *sample = psImageCopy (NULL, view, PS_TYPE_F32); 604 572 psImageInit (sample, 0); 605 model FLT->params->data.F32[2] = x;606 model FLT->params->data.F32[3] = y;607 pmModel *modelPSF = pmModelFromPSF (model FLT, psf);573 modelEXT->params->data.F32[2] = x; 574 modelEXT->params->data.F32[3] = y; 575 pmModel *modelPSF = pmModelFromPSF (modelEXT, psf); 608 576 pmSourceAddModel (sample, NULL, modelPSF, false, false); 609 577 psFree (modelPSF); … … 625 593 if (output[0] == 0) return false; 626 594 627 pmModel *model FLT = pmModelAlloc (psf->type);628 model FLT->params->data.F32[0] = 0;629 model FLT->params->data.F32[1] = 1;595 pmModel *modelEXT = pmModelAlloc (psf->type); 596 modelEXT->params->data.F32[0] = 0; 597 modelEXT->params->data.F32[1] = 1; 630 598 631 599 psFits *fits = psFitsOpen (output, "w"); 632 600 633 sample = pmModelPSFatXY (image, model FLT, psf, 25, 25, 25, 25);601 sample = pmModelPSFatXY (image, modelEXT, psf, 25, 25, 25, 25); 634 602 psFitsWriteImage (fits, NULL, sample, 0); 635 sample = pmModelPSFatXY (image, model FLT, psf, image->numCols - 25, image->numRows - 25, 25, 25);603 sample = pmModelPSFatXY (image, modelEXT, psf, image->numCols - 25, image->numRows - 25, 25, 25); 636 604 psFitsWriteImage (fits, NULL, sample, 0); 637 sample = pmModelPSFatXY (image, model FLT, psf, image->numCols - 25, 25, 25, 25);605 sample = pmModelPSFatXY (image, modelEXT, psf, image->numCols - 25, 25, 25, 25); 638 606 psFitsWriteImage (fits, NULL, sample, 0); 639 sample = pmModelPSFatXY (image, model FLT, psf, 25, image->numRows - 25, 25, 25);607 sample = pmModelPSFatXY (image, modelEXT, psf, 25, image->numRows - 25, 25, 25); 640 608 psFitsWriteImage (fits, NULL, sample, 0); 641 sample = pmModelPSFatXY (image, model FLT, psf, image->numCols / 2, image->numRows / 2, 25, 25);609 sample = pmModelPSFatXY (image, modelEXT, psf, image->numCols / 2, image->numRows / 2, 25, 25); 642 610 psFitsWriteImage (fits, NULL, sample, 0); 643 611 644 612 psFitsClose (fits); 645 613 return (TRUE); 646 }647 648 psPolynomial2D *psPolynomial2DfromMD (psMetadata *folder) {649 650 bool status;651 char keyword[80];652 653 // get polynomial orders654 // XXX add status failures tests655 int nXorder = psMetadataLookupS32 (&status, folder, "NORDER_X");656 int nYorder = psMetadataLookupS32 (&status, folder, "NORDER_Y");657 658 psPolynomial2D *poly = psPolynomial2DAlloc (nXorder, nYorder, PS_POLYNOMIAL_ORD);659 660 for (int nx = 0; nx < poly->nX + 1; nx++) {661 for (int ny = 0; ny < poly->nY + 1; ny++) {662 sprintf (keyword, "VAL_X%02d_Y%02d", nx, ny);663 poly->coeff[nx][ny] = psMetadataLookupF32 (&status, folder, keyword);664 if (!status) poly->mask[nx][ny] = 1;665 666 sprintf (keyword, "ERR_X%02d_Y%02d", nx, ny);667 poly->coeffErr[nx][ny] = psMetadataLookupF32 (&status, folder, keyword);668 }669 }670 return (poly);671 }672 673 psPolynomial3D *psPolynomial3DfromMD (psMetadata *folder) {674 675 bool status;676 char keyword[80];677 678 // get polynomial orders679 // XXX add status failures tests680 int nXorder = psMetadataLookupS32 (&status, folder, "NORDER_X");681 int nYorder = psMetadataLookupS32 (&status, folder, "NORDER_Y");682 int nZorder = psMetadataLookupS32 (&status, folder, "NORDER_Z");683 684 psPolynomial3D *poly = psPolynomial3DAlloc (nXorder, nYorder, nZorder, PS_POLYNOMIAL_ORD);685 686 for (int nx = 0; nx < poly->nX + 1; nx++) {687 for (int ny = 0; ny < poly->nY + 1; ny++) {688 for (int nz = 0; nz < poly->nZ + 1; nz++) {689 sprintf (keyword, "VAL_X%02d_Y%02d_Z%02d", nx, ny, nz);690 poly->coeff[nx][ny][nz] = psMetadataLookupF32 (&status, folder, keyword);691 if (!status) poly->mask[nx][ny][nz] = 1;692 693 sprintf (keyword, "ERR_X%02d_Y%02d_Z%02d", nx, ny, nz);694 poly->coeffErr[nx][ny][nz] = psMetadataLookupF32 (&status, folder, keyword);695 }696 }697 }698 return (poly);699 }700 701 psPolynomial4D *psPolynomial4DfromMD (psMetadata *folder) {702 703 bool status;704 char keyword[80];705 706 // get polynomial orders707 // XXX add status failures tests708 int nXorder = psMetadataLookupS32 (&status, folder, "NORDER_X");709 int nYorder = psMetadataLookupS32 (&status, folder, "NORDER_Y");710 int nZorder = psMetadataLookupS32 (&status, folder, "NORDER_Z");711 int nTorder = psMetadataLookupS32 (&status, folder, "NORDER_T");712 713 psPolynomial4D *poly = psPolynomial4DAlloc (nXorder, nYorder, nZorder, nTorder, PS_POLYNOMIAL_ORD);714 715 for (int nx = 0; nx < poly->nX + 1; nx++) {716 for (int ny = 0; ny < poly->nY + 1; ny++) {717 for (int nz = 0; nz < poly->nZ + 1; nz++) {718 for (int nt = 0; nt < poly->nT + 1; nt++) {719 sprintf (keyword, "VAL_X%02d_Y%02d_Z%02d_T%02d", nx, ny, nz, nt);720 poly->coeff[nx][ny][nz][nt] = psMetadataLookupF32 (&status, folder, keyword);721 if (!status) poly->mask[nx][ny][nz][nt] = 1;722 723 sprintf (keyword, "ERR_X%02d_Y%02d_Z%02d_T%02d", nx, ny, nz, nt);724 poly->coeffErr[nx][ny][nz][nt] = psMetadataLookupF32 (&status, folder, keyword);725 }726 }727 }728 }729 return (poly);730 }731 732 // XXX : these may need F64, or %g format for output733 bool psPolynomial2DtoMD (psMetadata *md, psPolynomial2D *poly, char *format, ...) {734 735 int Nbyte;736 char tmp;737 char *root;738 va_list argp;739 740 va_start (argp, format);741 Nbyte = vsnprintf (&tmp, 0, format, argp);742 va_end (argp);743 744 if (!Nbyte) return false;745 746 va_start (argp, format);747 root = (char *) psAlloc (Nbyte + 1);748 memset (root, 0, Nbyte + 1);749 vsnprintf (root, Nbyte + 1, format, argp);750 va_end (argp);751 752 psMetadata *folder = psMetadataAlloc ();753 psMetadataAdd (md, PS_LIST_TAIL, root, PS_DATA_METADATA, "folder for 2D polynomial", folder);754 psFree (root);755 756 // specify the polynomial orders757 psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_X", PS_DATA_S32, "number of x orders", poly->nX);758 psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Y", PS_DATA_S32, "number of y orders", poly->nY);759 760 // place polynomial entries on folder761 for (int nx = 0; nx < poly->nX + 1; nx++) {762 for (int ny = 0; ny < poly->nY + 1; ny++) {763 if (poly->mask[nx][ny]) continue;764 psMetadataAdd (folder, PS_LIST_TAIL, "VAL_X%02d_Y%02d", PS_DATA_F32, "polynomial coefficient", poly->coeff[nx][ny], nx, ny);765 psMetadataAdd (folder, PS_LIST_TAIL, "ERR_X%02d_Y%02d", PS_DATA_F32, "polynomial coefficient error", poly->coeffErr[nx][ny], nx, ny);766 }767 }768 return true;769 }770 771 bool psPolynomial3DtoMD (psMetadata *md, psPolynomial3D *poly, char *format, ...) {772 773 int Nbyte;774 char tmp;775 char *root;776 va_list argp;777 778 va_start (argp, format);779 Nbyte = vsnprintf (&tmp, 0, format, argp);780 va_end (argp);781 782 if (!Nbyte) return false;783 784 va_start (argp, format);785 root = (char *) psAlloc (Nbyte + 1);786 memset (root, 0, Nbyte + 1);787 vsnprintf (root, Nbyte + 1, format, argp);788 va_end (argp);789 790 psMetadata *folder = psMetadataAlloc ();791 psMetadataAdd (md, PS_LIST_TAIL, root, PS_DATA_METADATA, "folder for 3D polynomial", folder);792 psFree (root);793 794 // specify the polynomial orders795 psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_X", PS_DATA_S32, "number of x orders", poly->nX);796 psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Y", PS_DATA_S32, "number of y orders", poly->nY);797 psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Z", PS_DATA_S32, "number of z orders", poly->nZ);798 799 // place polynomial entries on folder800 for (int nx = 0; nx < poly->nX + 1; nx++) {801 for (int ny = 0; ny < poly->nY + 1; ny++) {802 for (int nz = 0; nz < poly->nZ + 1; nz++) {803 if (poly->mask[nx][ny][nz]) continue;804 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);805 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);806 }807 }808 }809 return true;810 }811 812 bool psPolynomial4DtoMD (psMetadata *md, psPolynomial4D *poly, char *format, ...) {813 814 int Nbyte;815 char tmp;816 char *root;817 va_list argp;818 819 va_start (argp, format);820 Nbyte = vsnprintf (&tmp, 0, format, argp);821 va_end (argp);822 823 if (!Nbyte) return false;824 825 va_start (argp, format);826 root = (char *) psAlloc (Nbyte + 1);827 memset (root, 0, Nbyte + 1);828 vsnprintf (root, Nbyte + 1, format, argp);829 va_end (argp);830 831 psMetadata *folder = psMetadataAlloc ();832 psMetadataAdd (md, PS_LIST_TAIL, root, PS_DATA_METADATA, "folder for 4D polynomial", folder);833 psFree (root);834 835 // specify the polynomial orders836 psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_X", PS_DATA_S32, "number of x orders", poly->nX);837 psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Y", PS_DATA_S32, "number of y orders", poly->nY);838 psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_Z", PS_DATA_S32, "number of z orders", poly->nZ);839 psMetadataAdd (folder, PS_LIST_TAIL, "NORDER_T", PS_DATA_S32, "number of z orders", poly->nT);840 841 // place polynomial entries on folder842 for (int nx = 0; nx < poly->nX + 1; nx++) {843 for (int ny = 0; ny < poly->nY + 1; ny++) {844 for (int nz = 0; nz < poly->nZ + 1; nz++) {845 for (int nt = 0; nt < poly->nT + 1; nt++) {846 if (poly->mask[nx][ny][nz][nt]) continue;847 psMetadataAdd (folder, PS_LIST_TAIL, "VAL_X%02d_Y%02d_Z%02d_T%02d", PS_DATA_F32, "polynomial coefficient", poly->coeff[nx][ny][nz][nt], nx, ny, nz, nt);848 psMetadataAdd (folder, PS_LIST_TAIL, "ERR_X%02d_Y%02d_Z%02d_T%02d", PS_DATA_F32, "polynomial coeffficient error", poly->coeffErr[nx][ny][nz][nt], nx, ny, nz, nt);849 }850 }851 }852 }853 return true;854 }855 856 bool psphotWritePSF (pmPSF *psf, char *filename) {857 858 psMetadata *psfdata = psMetadataAlloc ();859 860 char *modelName = pmModelGetType (psf->type);861 psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_MODEL_NAME", PS_DATA_STRING, "PSF model name", modelName);862 863 int nPar = pmModelParameterCount (psf->type) ;864 psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_MODEL_NPAR", PS_DATA_S32, "PSF model parameter count", nPar);865 866 for (int i = 0; i < nPar - 4; i++) {867 psPolynomial2D *poly = psf->params->data[i];868 psPolynomial2DtoMD (psfdata, poly, "PSF_PAR%02d", i);869 }870 psPolynomial4DtoMD (psfdata, psf->ApTrend, "APTREND");871 872 psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_AP_RESID", PS_DATA_F32, "aperture residual", psf->ApResid);873 psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_dAP_RESID", PS_DATA_F32, "aperture residual scatter", psf->dApResid);874 psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_SKY_BIAS", PS_DATA_F32, "sky bias level", psf->skyBias);875 876 psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "chi-square for fit", psf->chisq);877 psMetadataAdd (psfdata, PS_LIST_TAIL, "PSF_NSTARS", PS_DATA_S32, "number of stars used to measure PSF", psf->nPSFstars);878 879 psMetadataConfigWrite (psfdata, filename);880 psFree (psfdata);881 882 return true;883 }884 885 pmPSF *psphotReadPSF (char *filename) {886 887 bool status;888 unsigned int Nfail;889 char keyword[80];890 891 psMetadata *psfdata = psMetadataConfigParse (NULL, &Nfail, filename, FALSE);892 893 char *modelName = psMetadataLookupPtr (&status, psfdata, "PSF_MODEL_NAME");894 pmModelType type = pmModelSetType (modelName);895 896 pmPSF *psf = pmPSFAlloc (type);897 898 int nPar = psMetadataLookupS32 (&status, psfdata, "PSF_MODEL_NPAR");899 if (nPar != pmModelParameterCount (psf->type)) psAbort ("read PSF" , "mismatch model par count");900 901 for (int i = 0; i < nPar - 4; i++) {902 sprintf (keyword, "PSF_PAR%02d", i);903 psMetadata *folder = psMetadataLookupPtr (&status, psfdata, keyword);904 psPolynomial2D *poly = psPolynomial2DfromMD (folder);905 psFree (psf->params->data[i]);906 psf->params->data[i] = poly;907 }908 sprintf (keyword, "APTREND");909 psMetadata *folder = psMetadataLookupPtr (&status, psfdata, keyword);910 psPolynomial4D *poly = psPolynomial4DfromMD (folder);911 psFree (psf->ApTrend);912 psf->ApTrend = poly;913 914 psf->ApResid = psMetadataLookupF32 (&status, psfdata, "PSF_AP_RESID");915 psf->dApResid = psMetadataLookupF32 (&status, psfdata, "PSF_dAP_RESID");916 psf->skyBias = psMetadataLookupF32 (&status, psfdata, "PSF_SKY_BIAS");917 918 psf->chisq = psMetadataLookupF32 (&status, psfdata, "PSF_CHISQ");919 psf->nPSFstars = psMetadataLookupS32 (&status, psfdata, "PSF_NSTARS");920 921 psFree (psfdata);922 return (psf);923 614 } 924 615 … … 937 628 return true; 938 629 } 630 631 bool psphotUpdateHeader (psMetadata *header, psMetadata *config) { 632 633 // write necessary information to output header 634 psMetadataItemTransfer (header, config, "NSTARS"); 635 psMetadataItemTransfer (header, config, "ZERO_PT"); 636 psMetadataItemTransfer (header, config, "APMIFIT"); 637 psMetadataItemTransfer (header, config, "dAPMIFIT"); 638 psMetadataItemTransfer (header, config, "SKYBIAS"); 639 psMetadataItemTransfer (header, config, "PHOTCODE"); 640 641 // write necessary information to output header 642 psMetadataItemTransfer (header, config, "NPSFSTAR"); 643 psMetadataItemTransfer (header, config, "SKYBIAS"); 644 psMetadataItemTransfer (header, config, "SKYSAT"); 645 psMetadataItemTransfer (header, config, "APMIFIT"); 646 psMetadataItemTransfer (header, config, "DAPMIFIT"); 647 psMetadataItemTransfer (header, config, "NAPMIFIT"); 648 psMetadataItemTransfer (header, config, "APLOSS"); 649 650 // XXX these need to be defined from elsewhere 651 psMetadataAdd (header, PS_LIST_TAIL, "FWHM_X", PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM X", 0.0); 652 psMetadataAdd (header, PS_LIST_TAIL, "FWHM_Y", PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM Y", 0.0); 653 psMetadataAdd (header, PS_LIST_TAIL, "ANGLE", PS_DATA_F32 | PS_META_REPLACE, "PSF ANGLE", 0.0); 654 psMetadataAdd (header, PS_LIST_TAIL, "FSATUR", PS_DATA_F32 | PS_META_REPLACE, "SATURATION MAG", 0.0); 655 psMetadataAdd (header, PS_LIST_TAIL, "FLIMIT", PS_DATA_F32 | PS_META_REPLACE, "COMPLETENESS MAG", 0.0); 656 657 return true; 658 }
Note:
See TracChangeset
for help on using the changeset viewer.
