- Timestamp:
- Sep 22, 2007, 3:47:28 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branch_20070921/psModules/src/objects/pmPSF_IO.c
r14980 r14986 6 6 * @author EAM, IfA 7 7 * 8 * @version $Revision: 1.22.2. 2$ $Name: not supported by cvs2svn $9 * @date $Date: 2007-09-22 02:20:11$8 * @version $Revision: 1.22.2.3 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2007-09-22 13:47:28 $ 10 10 * 11 11 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 246 246 247 247 // write the PSF model parameters in a FITS table 248 assert (psf->psfTrendMode != PM_TREND_NONE);249 248 { 250 249 // we need to write a header for the table, … … 254 253 psMetadataAddStr (header, PS_LIST_TAIL, "PSF_NAME", 0, "PSF model name", modelName); 255 254 256 psMetadataAddBool (header, PS_LIST_TAIL, "POISSON", 0, "Use Poisson errors in fits?", psf->poissonErrors); 255 psMetadataAddBool (header, PS_LIST_TAIL, "ERR_LMM", 0, "Use Poisson errors in fits?", psf->poissonErrorsPhotLMM); 256 psMetadataAddBool (header, PS_LIST_TAIL, "ERR_LIN", 0, "Use Poisson errors in fits?", psf->poissonErrorsPhotLin); 257 psMetadataAddBool (header, PS_LIST_TAIL, "ERR_PAR", 0, "Use Poisson errors in fits?", psf->poissonErrorsParams); 257 258 258 259 int nPar = pmModelClassParameterCount (psf->type) ; 259 260 psMetadataAdd (header, PS_LIST_TAIL, "PSF_NPAR", PS_DATA_S32, "PSF model parameter count", nPar); 261 262 psMetadataAddS32 (header, PS_LIST_TAIL, "IMAXIS1", 0, "Image X Size", psf->Nx); 263 psMetadataAddS32 (header, PS_LIST_TAIL, "IMAXIS2", 0, "Image Y Size", psf->Ny); 260 264 261 265 // save the dimensions of each parameter 262 266 for (int i = 0; i < nPar; i++) { 263 267 char name[9]; 264 psPolynomial2D *poly = psf->params->data[i]; 265 if (poly == NULL) continue; 268 int nX, nY; 269 270 pmTrend2D *trend = psf->params->data[i]; 271 if (trend == NULL) continue; 272 273 if (trend->mode == PM_TREND_MAP) { 274 nX = trend->map->map->numCols; 275 nY = trend->map->map->numRows; 276 } else { 277 nX = trend->poly->nX; 278 nY = trend->poly->nY; 279 } 266 280 snprintf (name, 9, "PAR%02d_NX", i); 267 psMetadataAddS32 (header, PS_LIST_TAIL, name, 0, "", poly->nX);281 psMetadataAddS32 (header, PS_LIST_TAIL, name, 0, "", nX); 268 282 snprintf (name, 9, "PAR%02d_NY", i); 269 psMetadataAddS32 (header, PS_LIST_TAIL, name, 0, "", poly->nY); 270 } 271 272 char *modeName = pmTrend2DModeToString(trend->mode); 283 psMetadataAddS32 (header, PS_LIST_TAIL, name, 0, "", nY); 284 snprintf (name, 9, "PAR%02d_MD", i); 285 char *modeName = pmTrend2DModeToString (trend->mode); 286 psMetadataAddStr (header, PS_LIST_TAIL, name, 0, "", modeName); 287 psFree (modeName); 288 } 273 289 274 290 // other required information describing the PSF … … 277 293 psMetadataAddF32 (header, PS_LIST_TAIL, "CHISQ", 0, "chi-square for fit", psf->chisq); 278 294 psMetadataAddS32 (header, PS_LIST_TAIL, "NSTARS", 0, "number of stars used to measure PSF", psf->nPSFstars); 279 psMetadataAddStr (header, PS_LIST_TAIL, "MODE", 0, "", modeName);280 psFree (modeName);281 295 282 296 // XXX can we drop this now? … … 536 550 if (!header) psAbort("cannot read table header"); 537 551 552 pmPSFOptions *options = pmPSFOptionsAlloc(); 553 538 554 // load the PSF model parameters from the FITS table 539 555 char *modelName = psMetadataLookupStr (&status, header, "PSF_NAME"); 540 pmModelTypetype = pmModelClassGetType (modelName);541 if ( type == -1) {556 options->type = pmModelClassGetType (modelName); 557 if (options->type == -1) { 542 558 psError(PS_ERR_UNKNOWN, true, "invalid model name %s in psf file %s", modelName, file->filename); 543 559 return false; 544 560 } 545 561 546 bool poissonErrors = psMetadataLookupBool (&status, header, "POISSON"); 562 options->poissonErrorsPhotLMM = psMetadataLookupBool (&status, header, "ERR_LMM"); 563 options->poissonErrorsPhotLin = psMetadataLookupBool (&status, header, "ERR_LIN"); 564 options->poissonErrorsParams = psMetadataLookupBool (&status, header, "ERR_PAR"); 565 566 // XXX this is a bit ad-hoc: determine the PSF trend mode by looking at one of the parameters 567 // this could allow the psf model to use different trend modes for different parameters, but we 568 // would need to change the alloc somewhat 547 569 548 570 // we determine the PSF parameter polynomials from the MD-defined polynomials 549 pmPSF *psf = pmPSFAlloc ( type, poissonErrors, NULL);571 pmPSF *psf = pmPSFAlloc (options); 550 572 551 573 // check the number of expected parameters … … 554 576 psAbort("mismatch model par count"); 555 577 556 // load the dimensions of each parameter 578 int nXimage = psMetadataLookupS32 (&status, header, "IMAXIS1"); 579 int nYimage = psMetadataLookupS32 (&status, header, "IMAXIS2"); 580 // XXX don't require this to exist? 0,0 if not defined? 581 582 // load the trend mode and dimensions of each parameter 557 583 for (int i = 0; i < nPar; i++) { 558 584 char name[9]; … … 572 598 return false; 573 599 } 574 // XXX allocate pmTrend2d based on the values here 575 psf->params->data[i] = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, nXorder, nYorder); 600 pmTrend2DMode psfTrendMode = pmTrend2DModeFromString (modeName); 601 // XXX default to POLY_ORD if not defined? 602 603 psf->params->data[i] = pmTrend2DFieldAlloc (psfTrendMode, nXimage, nYimage, nXorder, nYorder, NULL); 576 604 } 577 605 … … 584 612 // XXX can we drop this now? 585 613 psf->skyBias = psMetadataLookupF32 (&status, header, "SKY_BIAS"); 586 587 char *modeName = psMetadataLookupStr (&status, header, "MODE");588 trend->mode = pmTrend2DModeToString(modeName);589 614 590 615 // read the raw table data … … 608 633 psImageMap *map = trend->map; 609 634 map->map->data.F32[yPow][xPow] = psMetadataLookupF32 (&status, row, "VALUE"); 610 map->error->data.F32[yPow][xPow] = psMetadataLookupF32 (&status, row, "ERROR"); 611 // poly->mask[xPow][yPow] = psMetadataLookupU8 (&status, row, "MASK"); 635 map->error->data.F32[yPow][xPow] = psMetadataLookupF32 (&status, row, "ERROR"); 612 636 } else { 613 637 psPolynomial2D *poly = trend->poly; … … 666 690 667 691 // create a psMetadata representation (human-readable) of a psf model 668 // XXX drop this function? 669 psMetadata *pmPSFtoMetadata (psMetadata *metadata, pmPSF *psf) 670 { 671 672 if (metadata == NULL) { 673 metadata = psMetadataAlloc (); 674 } 675 676 char *modelName = pmModelClassGetName (psf->type); 677 psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_MODEL_NAME", PS_DATA_STRING, "PSF model name", modelName); 678 679 int nPar = pmModelClassParameterCount (psf->type) ; 680 psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_MODEL_NPAR", PS_DATA_S32, "PSF model parameter count", nPar); 681 682 for (int i = 0; i < nPar; i++) { 683 psPolynomial2D *poly = psf->params->data[i]; 684 if (poly == NULL) 685 continue; 686 psPolynomial2DtoMetadata (metadata, poly, "PSF_PAR%02d", i); 687 } 688 689 // XXX fix this 690 psWarning ("APTREND is currently missing"); 691 // psPolynomial4DtoMetadata (metadata, psf->ApTrend, "APTREND"); 692 693 psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_AP_RESID", PS_DATA_F32, "aperture residual", psf->ApResid); 694 psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_dAP_RESID", PS_DATA_F32, "aperture residual scatter", psf->dApResid); 695 psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_SKY_BIAS", PS_DATA_F32, "sky bias level", psf->skyBias); 696 697 psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "chi-square for fit", psf->chisq); 698 psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_NSTARS", PS_DATA_S32, "number of stars used to measure PSF", psf->nPSFstars); 699 psMetadataAdd (metadata, PS_LIST_TAIL, "PSF_POISSON_ERRORS", PS_DATA_BOOL, "Poisson errors for fits", psf->poissonErrors); 700 701 return metadata; 702 } 703 704 // parse a psMetadata representation (human-readable) of a psf model 705 // XXX drop this function? 706 pmPSF *pmPSFfromMetadata (psMetadata *metadata) 707 { 708 709 bool status; 710 char keyword[80]; 711 712 char *modelName = psMetadataLookupPtr (&status, metadata, "PSF_MODEL_NAME"); 713 pmModelType type = pmModelClassGetType (modelName); 714 715 bool poissonErrors = psMetadataLookupPtr (&status, metadata, "PSF_POISSON_ERRORS"); 716 if (!status) 717 poissonErrors = true; 718 719 // we determine the PSF parameter polynomials from the MD-defined polynomials 720 pmPSF *psf = pmPSFAlloc (type, poissonErrors, NULL); 721 722 int nPar = psMetadataLookupS32 (&status, metadata, "PSF_MODEL_NPAR"); 723 if (nPar != pmModelClassParameterCount (psf->type)) 724 psAbort("mismatch model par count"); 725 726 // un-fitted terms, not in the Metadata, are left NULL 727 // XXX add a double-check of the expected number? 728 for (int i = 0; i < nPar; i++) { 729 sprintf (keyword, "PSF_PAR%02d", i); 730 psMetadata *folder = psMetadataLookupPtr (&status, metadata, keyword); 731 if (!status) 732 continue; 733 psPolynomial2D *poly = psPolynomial2DfromMetadata (folder); 734 psFree (psf->params->data[i]); 735 psf->params->data[i] = poly; 736 } 737 738 // load the APTREND data 739 // XXX fix this to work with pmTrend2D 740 psWarning ("APTREND is not being read"); 741 # if (0) 742 sprintf (keyword, "APTREND"); 743 psMetadata *folder = psMetadataLookupPtr (&status, metadata, keyword); 744 psPolynomial4D *poly = psPolynomial4DfromMetadata (folder); 745 psFree (psf->ApTrend); 746 psf->ApTrend = poly; 747 # endif 748 749 psf->ApResid = psMetadataLookupF32 (&status, metadata, "PSF_AP_RESID"); 750 psf->dApResid = psMetadataLookupF32 (&status, metadata, "PSF_dAP_RESID"); 751 psf->skyBias = psMetadataLookupF32 (&status, metadata, "PSF_SKY_BIAS"); 752 753 psf->chisq = psMetadataLookupF32 (&status, metadata, "PSF_CHISQ"); 754 psf->nPSFstars = psMetadataLookupS32 (&status, metadata, "PSF_NSTARS"); 755 756 psFree (metadata); 757 return (psf); 758 } 692 // XXX pmPSF to/from Metadata functions were defined for 1.22 and earlier, but were dropped
Note:
See TracChangeset
for help on using the changeset viewer.
