Changeset 32971 for trunk/psModules/src/objects/pmSourceIO_CMF_PS1_SV1.c
- Timestamp:
- Dec 19, 2011, 1:22:04 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/objects/pmSourceIO_CMF_PS1_SV1.c
r32347 r32971 539 539 } 540 540 541 bool pmSourcesRead_CMF_PS1_SV1_XSRC(psFits *fits, psMetadata *hduHeader, psArray *sources, long *sourceIndex) 542 { 543 PS_ASSERT_PTR_NON_NULL(fits, false); 544 PS_ASSERT_PTR_NON_NULL(sources, false); 545 546 bool status; 547 long numSources = psFitsTableSize(fits); // Number of sources in table 548 if (numSources == 0) { 549 psError(psErrorCodeLast(), false, "XSRC Table contains no entries\n"); 550 return false; 551 } 552 553 // petrosian mags are not saved, we need to calculate fluxes. For this we need exptime and zero point 554 float zeropt = psMetadataLookupF32(&status, hduHeader, "FPA.ZP"); 555 float exptime = psMetadataLookupF32(&status, hduHeader, "EXPTIME"); 556 float magOffset = zeropt + 2.5*log10(exptime); 557 558 for (long i = 0; i < numSources; i++) { 559 psMetadata *row = psFitsReadTableRow(fits, i); // Table row 560 if (!row) { 561 psError(psErrorCodeLast(), false, "Unable to read row %ld of sources", i); 562 psFree(row); 563 return false; 564 } 565 // Find the source with this sequence number. 566 // XXX: I am assuming that sources is sorted in order of seq 567 long seq = psMetadataLookupU32 (&status, row, "IPP_IDET"); 568 pmSource *source = NULL; 569 #ifndef ASSUME_SORTED 570 long j = seq < sources->n ? seq : sources->n - 1; 571 for (; j >= 0; j--) { 572 source = sources->data[j]; 573 if (source->seq == seq) { 574 break; 575 } 576 } 577 #else 578 long j = sourceIndex[seq]; 579 psAssert(j >= 0 && j < sources->n, "invalid sourceIndex"); 580 source = sources->data[j]; 581 #endif 582 if (!source) { 583 psError(PS_ERR_UNKNOWN, false, "Failed to find source for row %ld sequence number %ld\n", i, seq); 584 psFree(row); 585 return false; 586 } 587 588 if (!source->extpars) { 589 source->extpars = pmSourceExtendedParsAlloc (); 590 } 591 pmSourceExtendedPars *extpars = source->extpars; 592 593 // Assume that X_EXT Y_EXT and sigmas match the psf src so skip 594 595 // We don't have enough information to calculate the major and minor axis. Set major to 1. Should we scale this by 596 // psf size or something? 597 extpars->axes.major = 1.0; 598 extpars->axes.minor = extpars->axes.major * psMetadataLookupF32(&status, row, "F25_ARATIO"); 599 extpars->axes.theta = psMetadataLookupF32(&status, row, "F25_THETA"); 600 601 float mag = psMetadataLookupF32(&status, row, "PETRO_MAG"); 602 float magErr = psMetadataLookupF32(&status, row, "PETRO_MAG_ERR"); 603 if (isfinite(mag)) { 604 extpars->petrosianFlux = pow(10., (magOffset - mag) / 2.5); 605 if (isfinite(magErr)) { 606 extpars->petrosianFluxErr = extpars->petrosianFlux / magErr; 607 } 608 } 609 610 extpars->petrosianRadius = psMetadataLookupF32(&status, row, "PETRO_RADIUS"); 611 extpars->petrosianRadiusErr= psMetadataLookupF32(&status, row, "PETRO_RADIUS_ERR"); 612 extpars->petrosianR50 = psMetadataLookupF32(&status, row, "PETRO_RADIUS_50"); 613 extpars->petrosianR50Err = psMetadataLookupF32(&status, row, "PETRO_RADIUS_50_ERR"); 614 extpars->petrosianR90 = psMetadataLookupF32(&status, row, "PETRO_RADIUS_90"); 615 extpars->petrosianR90Err = psMetadataLookupF32(&status, row, "PETRO_RADIUS_90_ERR"); 616 extpars->petrosianFill = psMetadataLookupF32(&status, row, "PETRO_FILL"); 617 618 psVector *radSB = psMetadataLookupVector(&status, row, "PROF_SB"); 619 psVector *radFlux = psMetadataLookupVector(&status, row, "PROF_FLUX"); 620 psVector *radFill = psMetadataLookupVector(&status, row, "PROF_FILL"); 621 622 if (radSB && radSB->n > 0) { 623 extpars->radProfile = pmSourceRadialProfileAlloc(); 624 extpars->radProfile->binSB = psMemIncrRefCounter(radSB); 625 extpars->radProfile->binSum = psMemIncrRefCounter(radFlux); 626 extpars->radProfile->binFill = psMemIncrRefCounter(radFill); 627 } 628 629 psFree(row); 630 } 631 632 return true; 633 } 634 541 635 // XXX this layout is still the same as PS1_DEV_1 542 636 bool pmSourcesWrite_CMF_PS1_SV1_XFIT(psFits *fits, pmReadout *readout, psArray *sources, psMetadata *imageHeader, char *extname) … … 684 778 psFree (outhead); 685 779 psFree (table); 780 return true; 781 } 782 783 bool pmSourcesRead_CMF_PS1_SV1_XFIT(psFits *fits, psMetadata *hduHeader, psArray *sources, long *sourceIndex) 784 { 785 PS_ASSERT_PTR_NON_NULL(fits, false); 786 PS_ASSERT_PTR_NON_NULL(sources, false); 787 788 bool status; 789 long numSources = psFitsTableSize(fits); // Number of sources in table 790 if (numSources == 0) { 791 psError(psErrorCodeLast(), false, "XFIT Table contains no entries\n"); 792 return false; 793 } 794 795 for (long i = 0; i < numSources; i++) { 796 psMetadata *row = psFitsReadTableRow(fits, i); // Table row 797 if (!row) { 798 psError(psErrorCodeLast(), false, "Unable to read row %ld of sources", i); 799 psFree(row); 800 return false; 801 } 802 // Find the source with this sequence number. 803 // XXX: I am assuming that sources is sorted in order of seq. 804 long seq = psMetadataLookupU32 (&status, row, "IPP_IDET"); 805 long j = seq < sources->n ? seq : sources->n - 1; 806 pmSource *source = NULL; 807 for (; j >= 0; j--) { 808 source = sources->data[j]; 809 if (source->seq == seq) { 810 break; 811 } 812 } 813 if (!source) { 814 psError(PS_ERR_UNKNOWN, false, "Failed to find source for row %ld sequence number %ld\n", i, seq); 815 psFree(row); 816 return false; 817 } 818 if (!source->modelFits) { 819 // XXX: where to find the number of models to expect? 820 source->modelFits = psArrayAllocEmpty(5); 821 } 822 psString modelName = psMetadataLookupStr(&status, row, "MODEL_TYPE"); 823 if (!modelName) { 824 psError(PS_ERR_UNKNOWN, true, "Failed to find model name for row %ld\n", i); 825 psFree(row); 826 return false; 827 } 828 pmModelType modelType = pmModelClassGetType(modelName); 829 if (modelType < 0) { 830 psError(PS_ERR_UNKNOWN, true, "Failed to find model type for %s\n", modelName); 831 psFree(row); 832 return false; 833 } 834 pmModel *model = pmModelAlloc(modelType); 835 836 psF32 *PAR = model->params->data.F32; 837 psF32 *dPAR = model->dparams->data.F32; 838 839 PAR[PM_PAR_XPOS] = psMetadataLookupF32(&status, row, "X_EXT"); 840 PAR[PM_PAR_YPOS] = psMetadataLookupF32(&status, row, "Y_EXT"); 841 dPAR[PM_PAR_XPOS] = psMetadataLookupF32(&status, row, "X_EXT_SIG"); 842 dPAR[PM_PAR_YPOS] = psMetadataLookupF32(&status, row, "Y_EXT_SIG"); 843 844 model->mag = psMetadataLookupF32(&status, row, "EXT_INST_MAG"); 845 model->magErr = psMetadataLookupF32(&status, row, "EXT_INST_MAG_SIG"); 846 847 psEllipseAxes axes; 848 axes.major = psMetadataLookupF32(&status, row, "EXT_WIDTH_MAJ"); 849 axes.minor = psMetadataLookupF32(&status, row, "EXT_WIDTH_MIN"); 850 axes.theta = psMetadataLookupF32(&status, row, "EXT_THETA"); 851 if (!pmPSF_AxesToModel(PAR, axes, modelType)) { 852 // Do we need to fail here or can this happen? 853 psError(PS_ERR_UNKNOWN, false, "Failed to convert psf axes to model"); 854 psFree(model); 855 psFree(row); 856 return false; 857 } 858 // XXX: clean this up 859 if (model->params->n > 7) { 860 PAR[7] = psMetadataLookupF32(&status, row, "EXT_PAR_07"); 861 } 862 // read the covariance matrix 863 int nparams = model->params->n; 864 psImage *covar = psImageAlloc(nparams, nparams, PS_TYPE_F32); 865 for (int y = 0; y < nparams; y++) { 866 for (int x = 0; x < nparams; x++) { 867 char name[64]; 868 snprintf(name, 64, "EXT_COVAR_%02d_%02d", y, x); 869 covar->data.F32[y][x] = psMetadataLookupF32(&status, row, name); 870 } 871 } 872 model->covar = covar; 873 874 psArrayAdd(source->modelFits, 1, model); 875 psFree(model); 876 877 psFree(row); 878 } 879 686 880 return true; 687 881 } … … 831 1025 return true; 832 1026 } 1027 1028 bool pmSourcesRead_CMF_PS1_SV1_XRAD(psFits *fits, psMetadata *hduHeader, psArray *sources, long *sourceIndex) 1029 { 1030 PS_ASSERT_PTR_NON_NULL(fits, false); 1031 PS_ASSERT_PTR_NON_NULL(sources, false); 1032 1033 bool status; 1034 long numSources = psFitsTableSize(fits); // Number of sources in table 1035 if (numSources == 0) { 1036 psError(psErrorCodeLast(), false, "XRAD Table contains no entries\n"); 1037 return false; 1038 } 1039 1040 for (long i = 0; i < numSources; i++) { 1041 psMetadata *row = psFitsReadTableRow(fits, i); // Table row 1042 if (!row) { 1043 psError(psErrorCodeLast(), false, "Unable to read row %ld of sources", i); 1044 psFree(row); 1045 return false; 1046 } 1047 // Find the source with this sequence number. 1048 // XXX: I am assuming that sources is sorted in order of seq. 1049 long seq = psMetadataLookupU32 (&status, row, "IPP_IDET"); 1050 long j = seq < sources->n ? seq : sources->n - 1; 1051 pmSource *source = NULL; 1052 for (; j >= 0; j--) { 1053 source = sources->data[j]; 1054 if (source->seq == seq) { 1055 break; 1056 } 1057 } 1058 if (!source) { 1059 psError(PS_ERR_UNKNOWN, false, "Failed to find source for row %ld sequence number %ld\n", i, seq); 1060 psFree(row); 1061 return false; 1062 } 1063 if (!source->radialAper) { 1064 // XXX: where to find the number of models to expect? 1065 source->radialAper = psArrayAllocEmpty(5); 1066 } 1067 pmSourceRadialApertures *radialAper = pmSourceRadialAperturesAlloc(); 1068 1069 radialAper->flux = psMemIncrRefCounter(psMetadataLookupVector(&status, row, "APER_FLUX")); 1070 radialAper->fluxStdev = psMemIncrRefCounter(psMetadataLookupVector(&status, row, "APER_FLUX_STDEV")); 1071 radialAper->fluxErr = psMemIncrRefCounter(psMetadataLookupVector(&status, row, "APER_FLUX_ERR")); 1072 radialAper->fill = psMemIncrRefCounter(psMetadataLookupVector(&status, row, "APER_FILL")); 1073 1074 psArrayAdd(source->radialAper, 1, radialAper); 1075 1076 psFree(radialAper); 1077 psFree(row); 1078 } 1079 1080 return true; 1081 }
Note:
See TracChangeset
for help on using the changeset viewer.
