Changeset 5828 for trunk/psphot/src/psphotOutput.c
- Timestamp:
- Dec 22, 2005, 4:20:27 PM (21 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/psphotOutput.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/psphotOutput.c
r5802 r5828 5 5 6 6 bool status; 7 8 psTimerStart ("psphot"); 7 9 8 10 char *outputMode = psMetadataLookupPtr (&status, config, "OUTPUT_MODE"); 9 11 char *outputFile = psMetadataLookupPtr (&status, config, "OUTPUT_FILE"); 10 12 char *residImage = psMetadataLookupPtr (&status, config, "RESID_IMAGE"); 13 char *psfFile = psMetadataLookupPtr (&status, config, "PSF_OUTPUT_FILE"); 11 14 12 15 if (residImage != NULL) psphotSaveImage (imdata->header, imdata->image, residImage); 16 if (psfFile != NULL) psphotWritePSF (psf, psfFile); 13 17 14 18 if (outputFile == NULL) { … … 44 48 return; 45 49 } 50 46 51 psAbort ("psphot", "unknown output mode %s", outputMode); 47 52 } … … 287 292 288 293 // set NAXIS to 0 289 fprintf (stderr, "setting naxis\n");290 294 mdi = psMetadataLookup (imdata->header, "NAXIS"); 291 295 mdi->data.S32 = 0; … … 540 544 } 541 545 542 fprintf (stderr, "writing out moments\n");543 546 for (i = 0; i < sources->n; i++) { 544 547 source = sources->data[i]; … … 604 607 605 608 606 bool psphotSamplePSFs (pmPSF *psf, psImage *image) { 607 608 // make sample PSFs for 4 corners and the center 609 bool psphotSamplePSFs (psMetadata *config, pmPSF *psf, psImage *image) { 610 611 bool status; 612 613 // make sample PSFs for 4 corners and the center 609 614 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; 610 621 611 622 pmModel *modelFLT = pmModelAlloc (psf->type); … … 613 624 modelFLT->params->data.F32[1] = 1; 614 625 615 psFits *fits = psFitsOpen ( "sample.psf.fits", "w");626 psFits *fits = psFitsOpen (output, "w"); 616 627 617 628 sample = pmModelPSFatXY (image, modelFLT, psf, 25, 25, 25, 25); … … 630 641 } 631 642 643 psPolynomial2D *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 668 psPolynomial3D *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 697 bool 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 735 bool 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 776 bool 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 805 pmPSF *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 632 845 bool psphotDumpMoments (psMetadata *config, psArray *sources) { 633 846
Note:
See TracChangeset
for help on using the changeset viewer.
