Changeset 5993
- Timestamp:
- Jan 15, 2006, 8:30:16 AM (20 years ago)
- Location:
- trunk/psphot
- Files:
-
- 1 added
- 8 deleted
- 26 edited
-
Makefile (modified) (1 diff)
-
src/pmSourceFitFixed.c (deleted)
-
src/pmSourceFitSet.c (modified) (1 diff)
-
src/psBicube.c (deleted)
-
src/psLibUtils.c (deleted)
-
src/psModulesUtils.c (modified) (1 diff)
-
src/psPolynomialUtils.c (added)
-
src/psphot.c (modified) (1 diff)
-
src/psphot.h (modified) (3 diffs)
-
src/psphotApResid.c (modified) (3 diffs)
-
src/psphotApplyPSF.c (modified) (1 diff)
-
src/psphotArguments.c (modified) (2 diffs)
-
src/psphotBasicDeblend.c (modified) (3 diffs)
-
src/psphotBlendFit.c (modified) (2 diffs)
-
src/psphotChoosePSF.c (modified) (4 diffs)
-
src/psphotDefinePixels.c (modified) (2 diffs)
-
src/psphotEnsemblePSF.c (modified) (7 diffs)
-
src/psphotEvalFLT.c (modified) (3 diffs)
-
src/psphotEvalPSF.c (modified) (2 diffs)
-
src/psphotFitGalaxies.c (modified) (5 diffs)
-
src/psphotFixedPSF.c (deleted)
-
src/psphotFullFit.c (modified) (2 diffs)
-
src/psphotMagnitudes.c (modified) (1 diff)
-
src/psphotMarkPSF.c (deleted)
-
src/psphotModelTest.c (modified) (3 diffs)
-
src/psphotOutput.c (modified) (16 diffs)
-
src/psphotRadiusChecks.c (modified) (1 diff)
-
src/psphotReapplyPSF.c (deleted)
-
src/psphotReplaceUnfit.c (modified) (1 diff)
-
src/psphotRoughClass.c (modified) (1 diff)
-
src/psphotSourceFits.c (modified) (7 diffs)
-
src/psphotSparseMatrix.c (deleted)
-
src/psphotSubtractPSF.c (deleted)
-
src/psphotTest.c (modified) (2 diffs)
-
src/psphotTestArguments.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/Makefile
r5980 r5993 24 24 $(SRC)/psphotArguments.$(ARCH).o \ 25 25 $(SRC)/psphotSetup.$(ARCH).o \ 26 $(SRC)/psphotModelTest.$(ARCH).o \ 26 27 $(SRC)/psphotImageStats.$(ARCH).o \ 28 $(SRC)/psphotImageBackground.$(ARCH).o \ 29 $(SRC)/psphotFindPeaks.$(ARCH).o \ 27 30 $(SRC)/psphotSourceStats.$(ARCH).o \ 31 $(SRC)/psphotRoughClass.$(ARCH).o \ 32 $(SRC)/psphotBasicDeblend.$(ARCH).o \ 28 33 $(SRC)/psphotChoosePSF.$(ARCH).o \ 34 $(SRC)/psphotEnsemblePSF.$(ARCH).o \ 35 $(SRC)/psphotFullFit.$(ARCH).o \ 36 $(SRC)/psphotBlendFit.$(ARCH).o \ 29 37 $(SRC)/psphotApplyPSF.$(ARCH).o \ 30 $(SRC)/psphotFixedPSF.$(ARCH).o \31 $(SRC)/psphotEnsemblePSF.$(ARCH).o \32 $(SRC)/psphotReapplyPSF.$(ARCH).o \33 38 $(SRC)/psphotFitGalaxies.$(ARCH).o \ 34 $(SRC)/psphotOutput.$(ARCH).o \ 35 $(SRC)/psphotMarkPSF.$(ARCH).o \ 39 $(SRC)/psphotReplaceUnfit.$(ARCH).o \ 40 $(SRC)/psphotApResid.$(ARCH).o \ 41 $(SRC)/psphotOutput.$(ARCH).o 42 43 SUPPORT = \ 44 $(SRC)/psphotModelGroupInit.$(ARCH).o \ 45 $(SRC)/psphotGrowthCurve.$(ARCH).o \ 46 $(SRC)/psphotEvalPSF.$(ARCH).o \ 47 $(SRC)/psphotEvalFLT.$(ARCH).o \ 48 $(SRC)/psphotSourceFits.$(ARCH).o \ 36 49 $(SRC)/psphotSortBySN.$(ARCH).o \ 37 50 $(SRC)/psphotDefinePixels.$(ARCH).o \ 38 51 $(SRC)/psphotMagnitudes.$(ARCH).o \ 39 $(SRC)/psphotRadiusChecks.$(ARCH).o \ 40 $(SRC)/psphotReplaceUnfit.$(ARCH).o \ 41 $(SRC)/psphotEvalPSF.$(ARCH).o \ 42 $(SRC)/psphotEvalFLT.$(ARCH).o \ 43 $(SRC)/psphotFullFit.$(ARCH).o \ 52 $(SRC)/psphotRadiusChecks.$(ARCH).o 53 54 PSMODULES = \ 55 $(SRC)/psLine.$(ARCH).o \ 56 $(SRC)/psSparse.$(ARCH).o \ 57 $(SRC)/psPolynomialUtils.$(ARCH).o \ 58 $(SRC)/psImageData.$(ARCH).o \ 59 $(SRC)/psModulesUtils.$(ARCH).o \ 44 60 $(SRC)/pmSourceContour.$(ARCH).o \ 45 $(SRC)/psLine.$(ARCH).o \ 46 $(SRC)/psModulesUtils.$(ARCH).o \ 47 $(SRC)/pmPeaksSigmaLimit.$(ARCH).o \ 48 $(SRC)/pmSourceFitFixed.$(ARCH).o \ 49 $(SRC)/psSparse.$(ARCH).o \ 50 $(SRC)/psImageData.$(ARCH).o \ 51 $(SRC)/psphotModelTest.$(ARCH).o \ 52 $(SRC)/psphotImageBackground.$(ARCH).o \ 53 $(SRC)/psphotBasicDeblend.$(ARCH).o \ 54 $(SRC)/psphotModelGroupInit.$(ARCH).o \ 55 $(SRC)/pmModelFitSet.$(ARCH).o \ 56 $(SRC)/pmSourceFitSet.$(ARCH).o \ 57 $(SRC)/psphotSourceFits.$(ARCH).o \ 58 $(SRC)/psphotBlendFit.$(ARCH).o \ 59 $(SRC)/psphotApResid.$(ARCH).o \ 60 $(SRC)/psphotAssessPSF.$(ARCH).o \ 61 $(SRC)/psBicube.$(ARCH).o 62 63 MODELS = \ 64 $(SRC)/models/pmModel_GAUSS.c \ 65 $(SRC)/models/pmModel_PGAUSS.c \ 66 $(SRC)/models/pmModel_QGAUSS.c \ 67 $(SRC)/models/pmModel_SGAUSS.c \ 68 $(SRC)/models/pmModel_TGAUSS.c 69 70 $(SRC)/pmModelGroup.$(ARCH).o: $(MODELS) 71 72 MODELTEST = \ 73 $(SRC)/modelTestFitSource.$(ARCH).o \ 74 $(SRC)/modelTestArguments.$(ARCH).o \ 75 $(SRC)/psphotModelGroupInit.$(ARCH).o \ 76 $(SRC)/psModulesUtils.$(ARCH).o \ 77 $(SRC)/psImageData.$(ARCH).o \ 78 $(SRC)/psphotSetup.$(ARCH).o \ 79 $(SRC)/psphotDefinePixels.$(ARCH).o \ 80 $(SRC)/psphotModelTest.$(ARCH).o 61 $(SRC)/pmModelFitSet.$(ARCH).o \ 62 $(SRC)/pmSourceFitSet.$(ARCH).o 81 63 82 64 TEST = \ 83 $(SRC)/psphotTest.$(ARCH).o \84 $(SRC)/ps photTestArguments.$(ARCH).o\85 $(SRC)/psphot ApResid.$(ARCH).o65 $(SRC)/psphotTest.$(ARCH).o \ 66 $(SRC)/psBicube.$(ARCH).o \ 67 $(SRC)/psphotTestArguments.$(ARCH).o 86 68 87 69 psphot: $(BIN)/psphot.$(ARCH) 88 $(BIN)/psphot.$(ARCH) : $(PSPHOT) 70 $(BIN)/psphot.$(ARCH) : $(PSPHOT) $(PSMODULES) $(SUPPORT) 89 71 $(PSPHOT) : $(SRC)/psphot.h 90 72 91 modeltest.install: psphotModelTest.install 92 modeltest: $(BIN)/psphotModelTest.$(ARCH) 93 $(BIN)/psphotModelTest.$(ARCH) : $(MODELTEST) 94 $(MODELTEST): $(SRC)/psphot.h 73 test.install: psphotTest.install 74 test: $(BIN)/psphotTest.$(ARCH) 75 $(DESTBIN)/test : $(DESTBIN)/psphotTest 95 76 96 test-install: psphotTest.install97 test: $(BIN)/psphotTest.$(ARCH)98 77 $(BIN)/psphotTest.$(ARCH) : $(TEST) 99 78 $(TEST): $(SRC)/psphot.h -
trunk/psphot/src/pmSourceFitSet.c
r5828 r5993 91 91 } 92 92 93 // PSF model only fits first 4 parameters, FLT model fits all93 // PSF model only fits first 4 parameters, EXT model fits all 94 94 int nParams = PSF ? nSrc*3 + 1 : nSrc*nPar + 1; 95 95 -
trunk/psphot/src/psModulesUtils.c
r5828 r5993 123 123 return (new); 124 124 } 125 126 float pmSourceCrossProduct (pmSource *Mi, pmSource *Mj) { 127 128 int Xs, Xe, Ys, Ye; 129 int xi, xj, yi, yj; 130 int xIs, xJs, yIs, yJs; 131 int xIe, yIe; 132 float flux; 133 134 psImage *Pi = Mi->pixels; 135 psImage *Pj = Mj->pixels; 136 137 psImage *Ti = Mi->mask; 138 psImage *Tj = Mj->mask; 139 140 Xs = PS_MAX (Pi->col0, Pj->col0); 141 Xe = PS_MIN (Pi->col0 + Pi->numCols, Pj->col0 + Pj->numCols); 142 143 Ys = PS_MAX (Pi->row0, Pj->row0); 144 Ye = PS_MIN (Pi->row0 + Pi->numRows, Pj->row0 + Pj->numRows); 145 146 xIs = Xs - Pi->col0; 147 xJs = Xs - Pj->col0; 148 yIs = Ys - Pi->row0; 149 yJs = Ys - Pj->row0; 150 151 xIe = Xe - Pi->col0; 152 yIe = Ye - Pi->row0; 153 154 flux = 0; 155 for (yi = yIs, yj = yJs; yi < yIe; yi++, yj++) { 156 for (xi = xIs, xj = xJs; xi < xIe; xi++, xj++) { 157 if (Ti->data.U8[yi][xi]) continue; 158 if (Tj->data.U8[yj][xj]) continue; 159 flux += Pi->data.F32[yi][xi] * Pj->data.F32[yj][xj]; 160 } 161 } 162 return (flux); 163 } -
trunk/psphot/src/psphot.c
r5986 r5993 67 67 68 68 case 3: 69 // fit extended objects with galaxy models70 69 psphotApplyPSF (imdata, config, sources, psf, sky); 71 70 break; 72 71 73 72 case 4: 74 // fit extended objects with galaxy models75 73 psphotApplyPSF (imdata, config, sources, psf, sky); 76 psphotFit Galaxies(imdata, config, sources, sky);74 psphotFitExtended (imdata, config, sources, sky); 77 75 break; 78 76 } -
trunk/psphot/src/psphot.h
r5986 r5993 24 24 psMetadata *psphotArguments (int *argc, char **argv); 25 25 eamReadout *psphotSetup (psMetadata *config); 26 bool psphotModelTest (eamReadout *imdata, psMetadata *config); 26 27 psStats *psphotImageStats (eamReadout *imdata, psMetadata *config); 28 psPolynomial2D *psphotImageBackground (eamReadout *imdata, psMetadata *config, psStats *sky); 27 29 psArray *psphotFindPeaks (eamReadout *imdata, psMetadata *config, psStats *sky); 28 30 psArray *psphotSourceStats (eamReadout *imdata, psMetadata *config, psArray *allpeaks); 29 31 bool psphotRoughClass (psArray *sources, psMetadata *config); 32 bool psphotBasicDeblend (psArray *sources, psMetadata *config, psStats *sky); 30 33 pmPSF *psphotChoosePSF (psMetadata *config, psArray *sources, psStats *sky); 31 bool psphotApplyPSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);32 bool psphotFixedPSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky);33 bool psphotFitGalaxies (eamReadout *imdata, psMetadata *config, psArray *sources, psStats *skyStats);34 34 void psphotOutput (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky); 35 35 36 bool psphotMarkPSF (pmSource *source, float shapeNsigma, float minSN, float maxChi, float SATURATE); 37 bool psphotSubtractPSF (pmSource *source); 36 // optional object analysis steps 37 bool psphotEnsemblePSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky); 38 bool psphotFullFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky); 39 bool psphotBlendFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky); 40 bool psphotReplaceUnfit (psArray *sources); 41 bool psphotApplyPSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky); 42 bool psphotFitExtended (eamReadout *imdata, psMetadata *config, psArray *sources, psStats *skyStats); 43 bool psphotApResid (eamReadout *imdata, psArray *sources, psMetadata *config, pmPSF *psf); 44 45 // basic support functions 46 pmModel *pmModelCopy (pmModel *model); 47 pmModel *pmSourceMagnitudes (pmSource *source, pmPSF *psf, float apRadius); 48 float pmSourceCrossProduct (pmSource *Mi, pmSource *Mj); 49 psArray *pmSourceContour_EAM (psImage *image, int x, int y, float threshold); 50 void psphotModelGroupInit (void); 38 51 int psphotSortBySN (const void **a, const void **b); 39 52 int psphotSortByY (const void **a, const void **b); 40 int psphotSaveImage (psMetadata *header, psImage *image, char *filename); 53 bool psphotGrowthCurve (eamReadout *imdata, pmPSF *psf); 54 void psphotTestArguments (int *argc, char **argv); 55 56 // functions to set the correct source pixels 57 bool psphotInitRadiusPSF (psMetadata *config, psStats *sky, pmModelType type); 58 bool psphotCheckRadiusPSF (eamReadout *imdata, pmSource *source, pmModel *model); 59 bool psphotInitRadiusEXT (psMetadata *config, psStats *sky, pmModelType type); 60 bool psphotCheckRadiusEXT (eamReadout *imdata, pmSource *source, pmModel *model); 41 61 bool psphotDefinePixels (pmSource *mySource, const eamReadout *imdata, psF32 x, psF32 y, psF32 Radius); 42 62 bool psphotRedefinePixels (pmSource *mySource, const eamReadout *imdata, psF32 x, psF32 y, psF32 Radius); 43 void psphotModelGroupInit (void);44 45 bool pmSourceFitFixed (pmSource *source, pmModel *model);46 pmModel *pmSourceMagnitudes (pmSource *source, pmPSF *psf, float apRadius);47 pmModel *pmSourceSelectModel (pmSource *source);48 49 // eamReadout functions50 eamReadout *eamReadoutAlloc (psImage *image, psImage *noise, psImage *mask, psMetadata *header);51 63 52 64 // output functions … … 57 69 bool pmSourcesWriteSX (eamReadout *imdata, psMetadata *config, char *filename, psArray *sources, pmPSF *psf, psStats *sky); 58 70 71 bool pmModelWritePSFs (psArray *sources, psMetadata *config, char *filename, pmPSF *psf); 72 bool pmModelWriteEXTs (psArray *sources, char *filename); 73 bool pmModelWriteNULLs (psArray *sources, char *filename); 59 74 bool pmPeaksWriteText (psArray *sources, char *filename); 60 75 bool pmMomentsWriteText (psArray *sources, char *filename); 61 bool pmModelWritePSFs (psArray *sources, psMetadata *config, char *filename, pmPSF *psf);62 bool pmModelWriteFLTs (psArray *sources, char *filename);63 bool pmModelWriteNULLs (psArray *sources, char *filename);64 76 77 bool psphotSamplePSFs (psMetadata *config, pmPSF *psf, psImage *image); 78 bool psphotDumpMoments (psMetadata *config, psArray *sources); 79 int psphotSaveImage (psMetadata *header, psImage *image, char *filename); 80 bool psphotUpdateHeader (psMetadata *header, psMetadata *config); 65 81 int pmSourcesDophotType (pmSource *source); 82 bool psMetadataItemTransfer (psMetadata *out, psMetadata *in, char *key); 66 83 67 // psphotModelTest functions 68 bool psphotEnsemblePSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky); 69 float psphotCrossProduct (pmSource *Mi, pmSource *Mj); 70 psPolynomial2D *psphotImageBackground (eamReadout *imdata, psMetadata *config, psStats *sky); 71 bool psphotReapplyPSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky); 84 // PSF / DBL / EXT evaluation functions 85 bool psphotEvalPSF (pmSource *source, pmModel *model); 86 bool psphotEvalDBL (pmSource *source, pmModel *model); 87 bool psphotEvalEXT (pmSource *source, pmModel *model); 72 88 73 pmModel *pmModelCopy (pmModel *model); 74 psArray *pmSourceContour_EAM (psImage *image, int x, int y, float threshold); 75 bool psphotBasicDeblend (psArray *sources, psMetadata *config, psStats *sky); 89 // functions to support simultaneous multi-source fitting 90 bool psphotFitSet (pmSource *oneSrc, pmModel *oneModel, char *fitset, bool PSF); 91 bool pmSourceFitSet (pmSource *source, psArray *modelSet, const bool PSF); 92 psF32 pmModelFitSet (psVector *deriv, const psVector *params, const psVector *x); 93 bool pmModelFitSetInit (pmModelType type); 76 94 77 bool psphotFullFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky); 78 bool psphotInitLimitsPSF (psMetadata *config); 79 bool psphotEvalPSF (pmSource *source, pmModel *model); 80 bool psphotEvalDBL (pmSource *source, pmModel *model); 81 bool psphotEvalFLT (pmSource *source, pmModel *model); 82 bool psphotInitRadiusPSF (psMetadata *config, psStats *sky, pmModelType type); 83 bool psphotCheckRadiusPSF (eamReadout *imdata, pmSource *source, pmModel *model); 84 bool psphotInitRadiusFLT (psMetadata *config, psStats *sky, pmModelType type); 85 bool psphotCheckRadiusFLT (eamReadout *imdata, pmSource *source, pmModel *model); 86 bool psphotSamplePSFs (psMetadata *config, pmPSF *psf, psImage *image); 87 bool psphotReplaceUnfit (psArray *sources); 88 bool psphotDumpMoments (psMetadata *config, psArray *sources); 89 bool psphotApResid (eamReadout *imdata, psArray *sources, psMetadata *config, pmPSF *psf); 90 bool psphotAssessPSF (eamReadout *imdata, psMetadata *config, pmPSF *psf); 95 // functions to support the source fitting process 96 bool psphotInitLimitsPSF (psMetadata *config); 97 bool psphotInitLimitsEXT (psMetadata *config, psStats *sky); 98 bool psphotFitBlend (eamReadout *imdata, pmSource *source); 99 bool psphotFitBlob (eamReadout *imdata, pmSource *source, psArray *sources); 100 bool psphotFitPSF (eamReadout *imdata, pmSource *source); 101 pmModel *psphotFitEXT (eamReadout *imdata, pmSource *source); 102 psArray *psphotFitDBL (eamReadout *imdata, pmSource *source); 91 103 92 bool psphotWritePSF (pmPSF *psf, char *filename); 93 pmPSF *psphotReadPSF (char *filename);104 // eamReadout functions 105 eamReadout *eamReadoutAlloc (psImage *image, psImage *noise, psImage *mask, psMetadata *header); 94 106 95 bool psPolynomial2DtoMD (psMetadata *md, psPolynomial2D *poly, char *format, ...); 96 bool psPolynomial3DtoMD (psMetadata *md, psPolynomial3D *poly, char *format, ...); 97 bool psPolynomial4DtoMD (psMetadata *md, psPolynomial4D *poly, char *format, ...); 98 psPolynomial2D *psPolynomial2DfromMD (psMetadata *folder); 99 psPolynomial3D *psPolynomial3DfromMD (psMetadata *folder); 100 psPolynomial4D *psPolynomial4DfromMD (psMetadata *folder); 101 bool psphotModelTest (eamReadout *imdata, psMetadata *config); 107 // bicubic interpolation 108 psPolynomial2D *psImageBicubeFit (psImage *image, int x, int y); 109 psPlane psImageBicubeMin (psPolynomial2D *poly); 102 110 103 bool psphotFitSet (pmSource *oneSrc, pmModel *oneModel, char *fitset, bool PSF); 104 bool pmSourceFitSet (pmSource *source, psArray *modelSet, const bool PSF); 105 psF32 pmModelFitSet (psVector *deriv, const psVector *params, const psVector *x); 106 bool pmModelFitSetInit (pmModelType type); 107 108 bool psphotBlendFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky); 109 110 bool psphotInitLimitsFLT (psMetadata *config, psStats *sky); 111 112 bool psphotFitPSF (eamReadout *imdata, pmSource *source); 113 bool psphotFitBlend (eamReadout *imdata, pmSource *source); 114 bool psphotFitBlob (eamReadout *imdata, pmSource *source, psArray *sources); 115 116 pmModel *psphotFitFLT (eamReadout *imdata, pmSource *source); 117 psArray *psphotFitDBL (eamReadout *imdata, pmSource *source); 118 119 psPolynomial2D *psImageBicubeFit (psImage *image, int x, int y); 120 psPlane psImageBicubeMin (psPolynomial2D *poly); 121 void psphotTestArguments (int *argc, char **argv); 122 123 bool psphotGrowthCurve (eamReadout *imdata, pmPSF *psf); 124 111 // optional mode for clip fit? 125 112 psPolynomial4D *psVectorChiClipFitPolynomial4D( 126 113 psPolynomial4D *poly, … … 134 121 const psVector *z, 135 122 const psVector *t); 136 137 // XXX deprecated138 // bool psphotApResidFullFit (psVector *x, psVector *y, psVector *radius, psVector *rflux, psVector *apresid, psVector *dmag);139 // bool psphotApResidPolyFit (psVector *x, psVector *y, psVector *radius, psVector *rflux, psVector *apresid, psVector *dmag); -
trunk/psphot/src/psphotApResid.c
r5980 r5993 1 1 # include "psphot.h" 2 3 psPolynomial4D *psVectorChiClipFitPolynomial4D(4 psPolynomial4D *poly,5 psStats *stats,6 const psVector *mask,7 psMaskType maskValue,8 const psVector *f,9 const psVector *fErr,10 const psVector *x,11 const psVector *y,12 const psVector *z,13 const psVector *t)14 {15 PS_ASSERT_POLY_NON_NULL(poly, NULL);16 PS_ASSERT_POLY_TYPE(poly, PS_POLYNOMIAL_ORD, NULL);17 PS_ASSERT_PTR_NON_NULL(stats, NULL);18 PS_ASSERT_VECTOR_NON_NULL(f, NULL);19 PS_ASSERT_VECTOR_TYPE_F32_OR_F64(f, NULL);20 if (mask != NULL) {21 PS_ASSERT_VECTORS_SIZE_EQUAL(f, mask, NULL);22 PS_ASSERT_VECTOR_TYPE(mask, PS_TYPE_U8, NULL);23 }24 PS_ASSERT_VECTOR_NON_NULL(x, NULL);25 PS_ASSERT_VECTORS_SIZE_EQUAL(f, x, NULL);26 PS_ASSERT_VECTOR_TYPE_F32_OR_F64(x, NULL);27 PS_ASSERT_VECTOR_NON_NULL(y, NULL);28 PS_ASSERT_VECTORS_SIZE_EQUAL(f, y, NULL);29 PS_ASSERT_VECTOR_TYPE_F32_OR_F64(y, NULL);30 PS_ASSERT_VECTOR_NON_NULL(z, NULL);31 PS_ASSERT_VECTORS_SIZE_EQUAL(f, z, NULL);32 PS_ASSERT_VECTOR_TYPE_F32_OR_F64(z, NULL);33 PS_ASSERT_VECTOR_NON_NULL(t, NULL);34 PS_ASSERT_VECTORS_SIZE_EQUAL(f, t, NULL);35 PS_ASSERT_VECTOR_TYPE_F32_OR_F64(t, NULL);36 PS_ASSERT_VECTOR_NON_NULL(fErr, NULL);37 PS_ASSERT_VECTORS_SIZE_EQUAL(fErr, mask, NULL);38 PS_ASSERT_VECTOR_TYPE_F32_OR_F64(fErr, NULL);39 40 // clipping range defined by min and max and/or clipSigma41 float minClipSigma;42 float maxClipSigma;43 if (isfinite(stats->max)) {44 maxClipSigma = +fabs(stats->max);45 } else {46 maxClipSigma = +fabs(stats->clipSigma);47 }48 if (isfinite(stats->min)) {49 minClipSigma = -fabs(stats->min);50 } else {51 minClipSigma = -fabs(stats->clipSigma);52 }53 psVector *fit = NULL;54 psVector *resid = psVectorAlloc (x->n, PS_TYPE_F64);55 56 // eventual expansion: user supplies one of various stats option pairs,57 // eg (SAMPLE_MEAN | SAMPLE_STDEV) and the correct pair is used to58 // evaluate the clipping sigma59 // for now, for the SAMPLE_MEDIAN and SAMPLE_STDEV to be used60 stats->options |= (PS_STAT_SAMPLE_MEDIAN | PS_STAT_SAMPLE_STDEV);61 62 for (int N = 0; N < stats->clipIter; N++) {63 int Nkeep = 0;64 65 poly = psVectorFitPolynomial4D (poly, mask, maskValue, f, fErr, x, y, z, t);66 fit = psPolynomial4DEvalVector (poly, x, y, z, t);67 resid = (psVector *) psBinaryOp (resid, (void *) f, "-", (void *) fit);68 69 stats = psVectorStats (stats, resid, NULL, mask, maskValue);70 psTrace (".psphot.VectorClipFit", 5, "resid stats: %f +/- %f\n", stats->sampleMedian, stats->sampleStdev);71 72 // set mask if pts are not valid73 // we are masking out any point which is out of range74 // recovery is not allowed with this scheme75 for (int i = 0; i < resid->n; i++) {76 if ((mask != NULL) && (mask->data.U8[i] & maskValue)) {77 continue;78 }79 float sigma = hypot (psVectorGet (fErr, i), stats->sampleStdev);80 if (resid->data.F64[i] - stats->sampleMedian > sigma*maxClipSigma) {81 if (mask != NULL) {82 mask->data.U8[i] |= 0x01;83 }84 continue;85 }86 if (resid->data.F64[i] - stats->sampleMedian < sigma*minClipSigma) {87 if (mask != NULL) {88 mask->data.U8[i] |= 0x01;89 }90 continue;91 }92 Nkeep ++;93 }94 95 psTrace (".psphot.VectorClipFit", 4, "keeping %d of %d pts for fit\n",96 Nkeep, x->n);97 98 stats->clippedNvalues = Nkeep;99 psFree (fit);100 }101 // Free local temporary variables102 psFree (resid);103 104 if (poly == NULL) {105 psError(PS_ERR_UNKNOWN, true, "Could not fit a polynomial to the data. Returning NULL.\n");106 return(NULL);107 }108 return(poly);109 }110 2 111 3 // measure the aperture residual statistics … … 347 239 psf->nApResid = residStats->clippedNvalues; 348 240 349 /* 350 (aprMag' - fitMag) = rflux*skyBias + ApTrend(x,y) 351 (aprMag - rflux*skyBias) - fitMag = ApTrend(x,y) 352 (aprMag - rflux*skyBias) = fitMag + ApTrend(x,y) 353 */ 241 // save results for later output 242 psMetadataAdd (config, PS_LIST_TAIL, "SKYBIAS", PS_DATA_F32 | PS_META_REPLACE, "aperture sky bias", psf->skyBias); 243 psMetadataAdd (config, PS_LIST_TAIL, "SKYSAT", PS_DATA_F32 | PS_META_REPLACE, "aperture sky bias", psf->skySat); 244 psMetadataAdd (config, PS_LIST_TAIL, "APMIFIT", PS_DATA_F32 | PS_META_REPLACE, "aperture residual", psf->ApResid); 245 psMetadataAdd (config, PS_LIST_TAIL, "DAPMIFIT", PS_DATA_F32 | PS_META_REPLACE, "ap residual scatter", psf->dApResid); 246 psMetadataAdd (config, PS_LIST_TAIL, "APLOSS", PS_DATA_F32 | PS_META_REPLACE, "ap residual scatter", psf->growth->apLoss); 247 psMetadataAdd (config, PS_LIST_TAIL, "NAPMIFIT", PS_DATA_S32 | PS_META_REPLACE, "ap residual scatter", psf->nApResid); 354 248 355 249 psLogMsg ("psphot.apresid", 3, "measure full-frame aperture residual: %f sec\n", psTimerMark ("psphot")); … … 370 264 } 371 265 266 /* 267 (aprMag' - fitMag) = rflux*skyBias + ApTrend(x,y) 268 (aprMag - rflux*skyBias) - fitMag = ApTrend(x,y) 269 (aprMag - rflux*skyBias) = fitMag + ApTrend(x,y) 270 */ 271 -
trunk/psphot/src/psphotApplyPSF.c
r5828 r5993 25 25 26 26 // use the source moments, etc to guess basic model parameters 27 pmModel *model FLT = pmSourceModelGuess (source, psf->type);27 pmModel *modelEXT = pmSourceModelGuess (source, psf->type); 28 28 29 29 // set PSF parameters for this model 30 pmModel *model = pmModelFromPSF (model FLT, psf);31 psFree (model FLT);30 pmModel *model = pmModelFromPSF (modelEXT, psf); 31 psFree (modelEXT); 32 32 33 33 source->modelPSF = model; -
trunk/psphot/src/psphotArguments.c
r5986 r5993 123 123 psMetadataAdd (config, PS_LIST_TAIL, "PSF_MODEL", PS_DATA_METADATA_MULTI, "folder for psf model entries", NULL); 124 124 125 config = psMetadataConfigParse (config, &Nfail, argv[3], FALSE); 125 // config file values override defaults set here 126 config = psMetadataConfigParse (config, &Nfail, argv[3], TRUE); 126 127 127 128 psMetadataItem *item = NULL; … … 129 130 while ((item = psMetadataGetAndIncrement (iter)) != NULL) { 130 131 psMetadataAddItem (config, item, PS_LIST_TAIL, PS_META_REPLACE); 131 //psFree (item);132 psFree (item); 132 133 } 133 //psFree (iter);134 psFree (iter); 134 135 135 136 // identify input image & optional weight & mask images -
trunk/psphot/src/psphotBasicDeblend.c
r5986 r5993 36 36 psArray *overlap = psArrayAlloc (100); 37 37 38 // XXX make sure this results in decreasing, not increasing, SN38 // examine sources in decreasing SN order 39 39 for (int i = sources->n - 1; i >= 0; i--) { 40 40 N = index->data.U32[i]; … … 73 73 // generate source contour (1/4 peak counts) 74 74 if (overlap->n > 0) { 75 // XXX EAM : make the 1/4 user-defined. 76 // XXX keep threshold from dropping too low (N*sky.sigma) 75 // set the threshold based on user inputs 77 76 threshold = FRACTION * (source->peak->counts - source->moments->Sky) + source->moments->Sky; 78 77 threshold = PS_MAX (threshold, minThreshold); 79 78 80 // XXX EAM : should the contour input coordinate be in parent or subimage coords? parent, for now79 // generate a basic contour (set of x,y coordinates at-or-below flux level) 81 80 psArray *contour = pmSourceContour_EAM (source->pixels, source->peak->x, source->peak->y, threshold); 82 81 if (contour == NULL) continue; … … 97 96 if (xv->data.F32[j+1] < testSource->peak->x) break; 98 97 99 # if (0)100 int xp0 = source->moments->x - source->pixels->col0;101 int xp1 = source->peak->x - source->pixels->col0;102 int xp2 = testSource->moments->x - source->pixels->col0;103 int xp3 = testSource->peak->x - source->pixels->col0;104 105 int yp0 = source->moments->y - source->pixels->row0;106 int yp1 = source->peak->y - source->pixels->row0;107 int yp2 = testSource->moments->y - testSource->pixels->row0;108 int yp3 = testSource->peak->y - testSource->pixels->row0;109 110 fprintf (f, "%d %d (%f, %f) : %d %d (%f, %f) vs %f\n",111 source->peak->x, source->peak->y,112 source->pixels->data.F32[yp0][xp0], source->pixels->data.F32[yp1][xp1],113 testSource->peak->x, testSource->peak->y,114 testSource->pixels->data.F32[yp2][xp2], testSource->pixels->data.F32[yp3][xp3], threshold115 );116 # endif117 118 98 testSource->mode |= PM_SOURCE_BLEND; 119 99 -
trunk/psphot/src/psphotBlendFit.c
r5828 r5993 1 1 # include "psphot.h" 2 2 3 bool psphotBlendFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky) 4 {3 // XXX I don't like this name 4 bool psphotBlendFit (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky) { 5 5 6 6 psTimerStart ("psphot"); … … 10 10 11 11 psphotInitLimitsPSF (config); 12 psphotInitLimits FLT (config, sky);12 psphotInitLimitsEXT (config, sky); 13 13 psphotInitRadiusPSF (config, sky, psf->type); 14 14 -
trunk/psphot/src/psphotChoosePSF.c
r5986 r5993 2 2 3 3 // try PSF models and select best option 4 pmPSF *psphotChoosePSF (psMetadata *config, psArray *sources, psStats *skystats) { 4 5 5 pmPSF *psphotChoosePSF (psMetadata *config, psArray *sources, psStats *skystats)6 {7 6 bool status; 8 7 char *modelName; … … 55 54 } 56 55 psFree (iter); 57 // psFree (list); XXX EAM -is list freed with iter?56 // psFree (list); XXX is list freed with iter? 58 57 psFree (stars); 59 58 … … 78 77 for (int i = 0; i < try->sources->n; i++) { 79 78 pmSource *source = try->sources->data[i]; 80 if (try->mask->data.U8[i] & PSFTRY_MASK_ FLT_FAIL) {79 if (try->mask->data.U8[i] & PSFTRY_MASK_EXT_FAIL) { 81 80 source->mode &= ~PM_SOURCE_PSFSTAR; 82 81 } … … 86 85 pmPSF *psf = psMemCopy(try->psf); 87 86 psFree (models); 87 88 psMetadataAdd (config, PS_LIST_TAIL, "NPSFSTAR", PS_DATA_S32 | PS_META_REPLACE, "number of stars used to make PSF", psf->nPSFstars); 88 89 89 90 modelName = pmModelGetType (psf->type); -
trunk/psphot/src/psphotDefinePixels.c
r5980 r5993 49 49 if (extend) { 50 50 // Grab a new subimage 51 //psFree (mySource->pixels);52 //psFree (mySource->weight);53 //psFree (mySource->mask);51 psFree (mySource->pixels); 52 psFree (mySource->weight); 53 psFree (mySource->mask); 54 54 55 // fprintf (stderr, "extend %f,%f\n", x, y);56 55 mySource->pixels = psImageSubset(imdata->image, newRegion); 57 56 mySource->weight = psImageSubset(imdata->weight, newRegion); … … 62 61 return extend; 63 62 } 64 65 66 //**** this function was ALWAYS restricting to model->radius67 // should have left it larger (PSF_FIT_RAD) for the faint sources -
trunk/psphot/src/psphotEnsemblePSF.c
r5980 r5993 1 1 # include "psphot.h" 2 3 psPolynomial2D *psImageBicubeFit (psImage *image, int x, int y) {4 5 int ix = x - image->col0;6 int iy = y - image->row0;7 8 psF32 *Fm = &image->data.F32[iy - 1][ix];9 psF32 *Fo = &image->data.F32[iy + 0][ix];10 psF32 *Fp = &image->data.F32[iy + 1][ix];11 12 double Fxm = Fm[-1] + Fo[-1] + Fp[-1];13 double Fxp = Fm[+1] + Fo[+1] + Fp[+1];14 double Fym = Fm[-1] + Fm[+0] + Fm[+1];15 double Fyp = Fp[-1] + Fp[+0] + Fp[+1];16 double Foo = Fym + Fyp + Fo[-1] + Fo[+0] + Fo[+1];17 18 psPolynomial2D *poly = psPolynomial2DAlloc (2, 2, PS_POLYNOMIAL_ORD);19 poly->mask[2][2] = 1;20 poly->mask[1][2] = 1;21 poly->mask[2][1] = 1;22 23 poly->coeff[0][0] = Foo*(5.0/9.0) - (Fxp + Fxm)/3.0 - (Fyp + Fym)/3.0 ;24 25 poly->coeff[1][0] = (Fxp - Fxm)/6.0;26 poly->coeff[0][1] = (Fyp - Fym)/6.0;27 28 poly->coeff[2][0] = (Fxp + Fxm)/2.0 - Foo/3.0;29 poly->coeff[0][2] = (Fyp + Fym)/2.0 - Foo/3.0;30 31 poly->coeff[1][1] = (Fp[+1] + Fm[-1] - Fm[+1] - Fp[-1])/4.0;32 33 return (poly);34 }35 36 psPlane psImageBicubeMin (psPolynomial2D *poly) {37 38 psPlane min;39 40 min.xErr = min.yErr = 0;41 42 double det = 4*poly->coeff[2][0]*poly->coeff[0][2] - PS_SQR(poly->coeff[1][1]);43 44 min.x = (poly->coeff[1][1]*poly->coeff[0][1] - 2*poly->coeff[0][2]*poly->coeff[1][0]) / det;45 min.y = (poly->coeff[1][1]*poly->coeff[1][0] - 2*poly->coeff[2][0]*poly->coeff[0][1]) / det;46 return (min);47 }48 2 49 3 bool psphotEnsemblePSF (eamReadout *imdata, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky) { … … 107 61 } 108 62 109 // XXX EAM : add option to use FLT or PSF form63 // XXX EAM : add option to use EXT or PSF form 110 64 // use the source moments, etc to guess basic model parameters 111 pmModel *model FLT = pmSourceModelGuess (inSource, psf->type);65 pmModel *modelEXT = pmSourceModelGuess (inSource, psf->type); 112 66 if (inSource->mode & PM_SOURCE_SATSTAR) { 113 model FLT->params->data.F32[2] = inSource->moments->x;114 model FLT->params->data.F32[3] = inSource->moments->y;67 modelEXT->params->data.F32[2] = inSource->moments->x; 68 modelEXT->params->data.F32[3] = inSource->moments->y; 115 69 } else { 116 70 // peak-up on peak (for non-sat objects) … … 123 77 124 78 psTrace ("psphotEnsemblePSF", 5, "peak coord: %f %f -> %f %f\n", 125 model FLT->params->data.F32[2], modelFLT->params->data.F32[3], min.x + ix, min.y + iy);79 modelEXT->params->data.F32[2], modelEXT->params->data.F32[3], min.x + ix, min.y + iy); 126 80 127 81 // if min point is too deviant, keep the old value 128 82 if ((fabs(min.x) < 1.5) && (fabs(min.y) < 1.5)) { 129 model FLT->params->data.F32[2] = min.x + ix;130 model FLT->params->data.F32[3] = min.y + iy;83 modelEXT->params->data.F32[2] = min.x + ix; 84 modelEXT->params->data.F32[3] = min.y + iy; 131 85 } 132 86 psFree (bicube); … … 134 88 135 89 // set PSF parameters for this model 136 pmModel *model = pmModelFromPSF (model FLT, psf);137 psFree (model FLT);90 pmModel *model = pmModelFromPSF (modelEXT, psf); 91 psFree (modelEXT); 138 92 139 93 // save the original coords … … 185 139 186 140 // diagonal element (auto-cross-product) 187 f = p sphotCrossProduct (Mi, Mi);141 f = pmSourceCrossProduct (Mi, Mi); 188 142 psSparseMatrixElement (sparse, i, i, f); 189 143 190 144 // find the image x model value 191 f = p sphotCrossProduct (Fi, Mi);145 f = pmSourceCrossProduct (Fi, Mi); 192 146 psSparseVectorElement (sparse, i, f); 193 147 … … 203 157 204 158 // got an overlap; calculate cross-product and add to output array 205 f = p sphotCrossProduct (Mi, Mj);159 f = pmSourceCrossProduct (Mi, Mj); 206 160 psSparseMatrixElement (sparse, j, i, f); 207 161 } … … 235 189 return true; 236 190 } 237 238 239 float psphotCrossProduct (pmSource *Mi, pmSource *Mj) {240 241 int Xs, Xe, Ys, Ye;242 int xi, xj, yi, yj;243 int xIs, xJs, yIs, yJs;244 int xIe, yIe;245 float flux;246 247 psImage *Pi = Mi->pixels;248 psImage *Pj = Mj->pixels;249 250 psImage *Ti = Mi->mask;251 psImage *Tj = Mj->mask;252 253 Xs = PS_MAX (Pi->col0, Pj->col0);254 Xe = PS_MIN (Pi->col0 + Pi->numCols, Pj->col0 + Pj->numCols);255 256 Ys = PS_MAX (Pi->row0, Pj->row0);257 Ye = PS_MIN (Pi->row0 + Pi->numRows, Pj->row0 + Pj->numRows);258 259 xIs = Xs - Pi->col0;260 xJs = Xs - Pj->col0;261 yIs = Ys - Pi->row0;262 yJs = Ys - Pj->row0;263 264 xIe = Xe - Pi->col0;265 yIe = Ye - Pi->row0;266 267 flux = 0;268 for (yi = yIs, yj = yJs; yi < yIe; yi++, yj++) {269 for (xi = xIs, xj = xJs; xi < xIe; xi++, xj++) {270 if (Ti->data.U8[yi][xi]) continue;271 if (Tj->data.U8[yj][xj]) continue;272 flux += Pi->data.F32[yi][xi] * Pj->data.F32[yj][xj];273 }274 }275 return (flux);276 } -
trunk/psphot/src/psphotEvalFLT.c
r5828 r5993 1 1 # include "psphot.h" 2 2 3 bool psphotEval FLT (pmSource *source, pmModel *model)3 bool psphotEvalEXT (pmSource *source, pmModel *model) 4 4 { 5 5 int keep; 6 6 7 // do we actually have a valid FLT model?7 // do we actually have a valid EXT model? 8 8 if (model == NULL) { 9 9 source->mode &= ~PM_SOURCE_FITTED; … … 22 22 case PM_MODEL_OFFIMAGE: 23 23 default: 24 psLogMsg ("psphot", 5, " GALfail fit\n");24 psLogMsg ("psphot", 5, "EXT fail fit\n"); 25 25 source->mode |= PM_SOURCE_FAIL; 26 26 return false; 27 27 } 28 28 29 // unless we prove otherwise, this object is a galaxy. 30 // XXX EAM : do we need to save the old type? 31 source->type = PM_SOURCE_GALAXY; 29 // unless we prove otherwise, this object is extended 30 source->type = PM_SOURCE_EXTENDED; 32 31 33 // the following source->mode information pertains to model PSF:34 source->mode |= PM_SOURCE_ FLTMODEL;32 // the following source->mode information pertains to modelEXT: 33 source->mode |= PM_SOURCE_EXTMODEL; 35 34 36 35 // if the object has a fitted peak below 0, the fit did not converge cleanly … … 44 43 45 44 // poor-quality fit; only keep if nothing else works... 46 psLogMsg ("psphot", 5, " GALpoor fit\n");45 psLogMsg ("psphot", 5, "EXT poor fit\n"); 47 46 source->mode |= PM_SOURCE_POOR; 48 47 return false; -
trunk/psphot/src/psphotEvalPSF.c
r5828 r5993 19 19 20 20 // saturated stars should fall outside (larger), but have peaks above SATURATION 21 // galaxies should be larger, cosmic rays smaller21 // extended sources should be larger, cosmic rays smaller 22 22 // we also reject objects with S/N too low or ChiSquare to high 23 23 … … 138 138 } 139 139 140 // object appears to be large, suspected galaxy140 // object appears to be large, suspected extended source 141 141 if ((nSx >= PSF_SHAPE_NSIGMA) || (nSy >= PSF_SHAPE_NSIGMA)) { 142 source->type = PM_SOURCE_ GALAXY;142 source->type = PM_SOURCE_EXTENDED; 143 143 return false; 144 144 } -
trunk/psphot/src/psphotFitGalaxies.c
r5828 r5993 1 1 # include "psphot.h" 2 2 3 bool psphotFit Galaxies (eamReadout *imdata, psMetadata *config, psArray *sources, psStats *skyStats)3 bool psphotFitExtended (eamReadout *imdata, psMetadata *config, psArray *sources, psStats *skyStats) 4 4 { 5 5 bool status; … … 12 12 psTimerStart ("psphot"); 13 13 14 float GAL_MIN_SN = psMetadataLookupF32 (&status, config, "GAL_MIN_SN");15 float GAL_MOMENTS_RAD = psMetadataLookupF32 (&status, config, "GAL_MOMENTS_RADIUS");16 char *modelName = psMetadataLookupPtr (&status, config, " GAL_MODEL");14 float EXT_MIN_SN = psMetadataLookupF32 (&status, config, "EXT_MIN_SN"); 15 float EXT_MOMENTS_RAD = psMetadataLookupF32 (&status, config, "EXT_MOMENTS_RADIUS"); 16 char *modelName = psMetadataLookupPtr (&status, config, "EXT_MODEL"); 17 17 pmModelType modelType = pmModelSetType (modelName); 18 18 19 psphotInitRadius FLT (config, skyStats, modelType);19 psphotInitRadiusEXT (config, skyStats, modelType); 20 20 21 21 for (int i = 0; i < sources->n; i++) { … … 23 23 24 24 // only fit suspected extended sources 25 if (source->type != PM_SOURCE_ GALAXY) continue;25 if (source->type != PM_SOURCE_EXTENDED) continue; 26 26 if (source->mode & PM_SOURCE_BLEND) continue; 27 27 28 28 // skip possible extended sources below fit threshold 29 if (source->moments->SN < GAL_MIN_SN) continue;29 if (source->moments->SN < EXT_MIN_SN) continue; 30 30 31 // recalculate the source moments using the larger galaxymoments radius32 status = pmSourceMoments (source, GAL_MOMENTS_RAD);31 // recalculate the source moments using the larger extended-source moments radius 32 status = pmSourceMoments (source, EXT_MOMENTS_RAD); 33 33 if (!status) { 34 34 source->mode |= PM_SOURCE_FAIL; // better choice? … … 38 38 // use the source moments, etc to guess basic model parameters 39 39 pmModel *model = pmSourceModelGuess (source, modelType); 40 source->model FLT = model;40 source->modelEXT = model; 41 41 x = model->params->data.F32[2]; 42 42 y = model->params->data.F32[3]; 43 43 44 44 // sets the model radius (via source->model) and adjusts pixels as needed 45 psphotCheckRadius FLT (imdata, source, model);45 psphotCheckRadiusEXT (imdata, source, model); 46 46 47 // fit FLT (not PSF) model (set/unset the pixel mask)47 // fit EXT (not PSF) model (set/unset the pixel mask) 48 48 psImageKeepCircle (source->mask, x, y, model->radius, "OR", PSPHOT_MASK_MARKED); 49 49 pmSourceFitModel (source, model, false); … … 61 61 } 62 62 } 63 psLogMsg ("psphot", 3, "fit GAL models: %f sec for %d galaxies (%d total iterations)\n", psTimerMark ("psphot"), Nfit, Niter);64 psLogMsg ("psphot", 4, "subtracted %d GAL models\n", Nsub);63 psLogMsg ("psphot", 3, "fit EXT models: %f sec for %d objects (%d total iterations)\n", psTimerMark ("psphot"), Nfit, Niter); 64 psLogMsg ("psphot", 4, "subtracted %d EXT objects\n", Nsub); 65 65 return (true); 66 66 } -
trunk/psphot/src/psphotFullFit.c
r5828 r5993 14 14 sources = psArraySort (sources, psphotSortBySN); 15 15 16 // galaxymodel parameters17 float GAL_MIN_SN = psMetadataLookupF32 (&status, config, "GAL_MIN_SN");18 float GAL_MOMENTS_RAD = psMetadataLookupF32 (&status, config, "GAL_MOMENTS_RADIUS");16 // extended source model parameters 17 float EXT_MIN_SN = psMetadataLookupF32 (&status, config, "EXT_MIN_SN"); 18 float EXT_MOMENTS_RAD = psMetadataLookupF32 (&status, config, "EXT_MOMENTS_RADIUS"); 19 19 20 // 'galaxy'model descriptions21 char *modelName FLT = psMetadataLookupPtr (&status, config, "GAL_MODEL");22 pmModelType modelType FLT = pmModelSetType (modelNameFLT);20 // extended source model descriptions 21 char *modelNameEXT = psMetadataLookupPtr (&status, config, "EXT_MODEL"); 22 pmModelType modelTypeEXT = pmModelSetType (modelNameEXT); 23 23 24 24 psphotInitLimitsPSF (config); 25 25 psphotInitRadiusPSF (config, sky, psf->type); 26 psphotInitRadius FLT (config, sky, modelTypeFLT);26 psphotInitRadiusEXT (config, sky, modelTypeEXT); 27 27 28 28 for (int i = 0; i < sources->n; i++) { … … 82 82 83 83 // skip the source if we don't think it is extended 84 if (source->type != PM_SOURCE_ GALAXY) goto subLINEAR;85 if (source->moments->SN < GAL_MIN_SN) goto subLINEAR;84 if (source->type != PM_SOURCE_EXTENDED) goto subLINEAR; 85 if (source->moments->SN < EXT_MIN_SN) goto subLINEAR; 86 86 87 87 // add the double-PSF fit mode 88 88 // how do we compare the results? chisq? 89 89 90 // recalculate the source moments using the larger galaxymoments radius91 if (!pmSourceMoments (source, GAL_MOMENTS_RAD)) goto subLINEAR;90 // recalculate the source moments using the larger extended-source moments radius 91 if (!pmSourceMoments (source, EXT_MOMENTS_RAD)) goto subLINEAR; 92 92 93 93 // use the source moments, etc to guess basic model parameters 94 source->model FLT = pmSourceModelGuess (source, modelTypeFLT);95 pmModel *model FLT = source->modelFLT;94 source->modelEXT = pmSourceModelGuess (source, modelTypeEXT); 95 pmModel *modelEXT = source->modelEXT; 96 96 97 psphotCheckRadius FLT (imdata, source, modelFLT);97 psphotCheckRadiusEXT (imdata, source, modelEXT); 98 98 99 x = model FLT->params->data.F32[2];100 y = model FLT->params->data.F32[3];99 x = modelEXT->params->data.F32[2]; 100 y = modelEXT->params->data.F32[3]; 101 101 102 // fit FLT (not PSF) model (set/unset the pixel mask)103 psImageKeepCircle (source->mask, x, y, model FLT->radius, "OR", PSPHOT_MASK_MARKED);104 pmSourceFitModel (source, model FLT, false);105 psImageKeepCircle (source->mask, x, y, model FLT->radius, "AND", ~PSPHOT_MASK_MARKED);102 // fit EXT (not PSF) model (set/unset the pixel mask) 103 psImageKeepCircle (source->mask, x, y, modelEXT->radius, "OR", PSPHOT_MASK_MARKED); 104 pmSourceFitModel (source, modelEXT, false); 105 psImageKeepCircle (source->mask, x, y, modelEXT->radius, "AND", ~PSPHOT_MASK_MARKED); 106 106 107 107 // track model evaluations 108 Niter += model FLT[0].nIter;108 Niter += modelEXT[0].nIter; 109 109 Nfit++; 110 110 111 // does the FLT model succeed?112 if (psphotEval FLT (source, source->modelFLT)) {113 pmSourceSubModel (source->pixels, source->mask, source->model FLT, false, false);111 // does the EXT model succeed? 112 if (psphotEvalEXT (source, source->modelEXT)) { 113 pmSourceSubModel (source->pixels, source->mask, source->modelEXT, false, false); 114 114 source->mode |= PM_SOURCE_SUBTRACTED; 115 115 source->mode &= ~PM_SOURCE_TEMPSUB; -
trunk/psphot/src/psphotMagnitudes.c
r5980 r5993 21 21 break; 22 22 23 case PM_SOURCE_ GALAXY:24 model = source->model FLT;23 case PM_SOURCE_EXTENDED: 24 model = source->modelEXT; 25 25 if (model == NULL) return NULL; 26 26 radius = model->radius; -
trunk/psphot/src/psphotModelTest.c
r5986 r5993 6 6 bool status; 7 7 int modelType; 8 unsigned int Nfail; 8 9 float obsMag, fitMag, value; 9 10 char name[64]; … … 18 19 char *psfModeWord = psMetadataLookupPtr (&status, config, "TEST_FIT_MODE"); 19 20 if (!status) { 20 psfModeWord = psStringCopy (" FLT");21 psfModeWord = psStringCopy ("EXT"); 21 22 } 22 23 bool psfMode = !strcasecmp (psfModeWord, "PSF"); … … 26 27 char *psfFile = psMetadataLookupPtr (&status, config, "PSF_INPUT_FILE"); 27 28 if (!status) psAbort ("psphotModelTest", "PSF_INPUT_FILE not supplied"); 28 psf = psphotReadPSF (psfFile); 29 psMetadata *psfData = psMetadataConfigParse (NULL, &Nfail, psfFile, FALSE); 30 psf = pmPSFfromMD (psfData); 29 31 modelType = psf->type; 30 32 } else { -
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 } -
trunk/psphot/src/psphotRadiusChecks.c
r5980 r5993 31 31 } 32 32 33 # if (1)34 33 bool status = psphotRedefinePixels (source, imdata, model->params->data.F32[2], model->params->data.F32[3], model->radius); 35 34 return status; 36 37 # else38 39 if (model->radius > PSF_OUTER_RADIUS) {40 // (re)-allocate image, weight, mask arrays for each peak (square of radius OUTER)41 psphotDefinePixels (source, imdata, model->params->data.F32[2], model->params->data.F32[3], model->radius);42 return true;43 } else {44 fprintf (stderr, "skipping %f,%f\n", model->params->data.F32[2], model->params->data.F32[3]);45 }46 return false;47 # endif48 35 } 49 36 37 static float EXT_OUTER_RADIUS; 38 static float EXT_FIT_PADDING; 39 static float EXT_FLUX_LIMIT; 40 static pmModelRadius modelRadiusEXT; 50 41 51 static float GAL_OUTER_RADIUS; 52 static float GAL_FIT_PADDING; 53 static float GAL_FLUX_LIMIT; 54 static pmModelRadius modelRadiusGAL; 55 56 bool psphotInitRadiusFLT (psMetadata *config, psStats *sky, pmModelType type) { 42 bool psphotInitRadiusEXT (psMetadata *config, psStats *sky, pmModelType type) { 57 43 58 44 bool status; 59 45 60 float GAL_FIT_NSIGMA = psMetadataLookupF32 (&status, config, "GAL_FIT_NSIGMA");61 GAL_OUTER_RADIUS = psMetadataLookupF32 (&status, config, "GAL_OUTER_RADIUS");62 GAL_FIT_PADDING = psMetadataLookupF32 (&status, config, "GAL_FIT_PADDING");63 GAL_FLUX_LIMIT = GAL_FIT_NSIGMA * sky->sampleStdev;46 float EXT_FIT_NSIGMA = psMetadataLookupF32 (&status, config, "EXT_FIT_NSIGMA"); 47 EXT_OUTER_RADIUS = psMetadataLookupF32 (&status, config, "EXT_OUTER_RADIUS"); 48 EXT_FIT_PADDING = psMetadataLookupF32 (&status, config, "EXT_FIT_PADDING"); 49 EXT_FLUX_LIMIT = EXT_FIT_NSIGMA * sky->sampleStdev; 64 50 65 51 // this function specifies the radius at this the model hits the given flux 66 modelRadius GAL= pmModelRadius_GetFunction (type);52 modelRadiusEXT = pmModelRadius_GetFunction (type); 67 53 return true; 68 54 } 69 55 70 bool psphotCheckRadius FLT (eamReadout *imdata, pmSource *source, pmModel *model) {56 bool psphotCheckRadiusEXT (eamReadout *imdata, pmSource *source, pmModel *model) { 71 57 72 58 // set the fit radius based on the object flux limit and the model 73 model->radius = modelRadius GAL (model->params, GAL_FLUX_LIMIT) + GAL_FIT_PADDING;74 if (isnan(model->radius)) psAbort ( "fit_galaxies", "error in radius");59 model->radius = modelRadiusEXT (model->params, EXT_FLUX_LIMIT) + EXT_FIT_PADDING; 60 if (isnan(model->radius)) psAbort (__func__, "error in radius"); 75 61 76 # if (1)77 62 // redefine the pixels if needed 78 63 bool status = psphotRedefinePixels (source, imdata, model->params->data.F32[2], model->params->data.F32[3], model->radius); 79 64 return status; 80 81 # else82 83 // check if we need to redefine the pixels84 if (model->radius > GAL_OUTER_RADIUS) {85 // (re)-allocate image, weight, mask arrays for each peak (square of radius OUTER)86 // do I need to save the old pixel and mask data?87 psphotDefinePixels (source, imdata, model->params->data.F32[2], model->params->data.F32[3], model->radius);88 return true;89 }90 return false;91 # endif92 65 } -
trunk/psphot/src/psphotReplaceUnfit.c
r5828 r5993 20 20 return true; 21 21 } 22 23 # if (0)24 if (source->mode & PM_SOURCE_BLEND) continue;25 if (source->type == PM_SOURCE_SATURATED) continue;26 27 if (source->type == PM_SOURCE_DEFECT) {28 if (source->mode & PM_SOURCE_SUBTRACTED) goto addPSF;29 continue;30 }31 32 if (source->type == PM_SOURCE_GALAXY) {33 if (source->mode & PM_SOURCE_FAIL) goto addPSF;34 if (source->mode & PM_SOURCE_POOR) goto addPSF;35 continue;36 }37 38 // need to skip the successful fits39 if (source->type == PM_SOURCE_STAR) {40 if (source->mode & PM_SOURCE_FAIL) goto addPSF;41 if (source->mode & PM_SOURCE_POOR) goto addPSF;42 continue;43 }44 # endif -
trunk/psphot/src/psphotRoughClass.c
r5986 r5993 9 9 psfClump = pmSourcePSFClump (sources, config); 10 10 11 // group into STAR, COSMIC, GALAXY, SATURATED, etc.11 // group into STAR, COSMIC, EXTENDED, SATURATED, etc. 12 12 pmSourceRoughClass (sources, config, psfClump); 13 13 -
trunk/psphot/src/psphotSourceFits.c
r5828 r5993 41 41 42 42 43 static float GAL_MIN_SN;44 static float GAL_MOMENTS_RAD;45 static pmModelType modelType FLT;46 47 bool psphotInitLimits FLT (psMetadata *config, psStats *sky) {43 static float EXT_MIN_SN; 44 static float EXT_MOMENTS_RAD; 45 static pmModelType modelTypeEXT; 46 47 bool psphotInitLimitsEXT (psMetadata *config, psStats *sky) { 48 48 49 49 bool status; 50 50 51 // galaxymodel parameters52 GAL_MIN_SN = psMetadataLookupF32 (&status, config, "GAL_MIN_SN");53 GAL_MOMENTS_RAD = psMetadataLookupF32 (&status, config, "GAL_MOMENTS_RADIUS");54 55 // 'galaxy'model descriptions56 char *modelName FLT = psMetadataLookupPtr (&status, config, "GAL_MODEL");57 modelType FLT = pmModelSetType (modelNameFLT);58 psphotInitRadius FLT (config, sky, modelTypeFLT);51 // extended source model parameters 52 EXT_MIN_SN = psMetadataLookupF32 (&status, config, "EXT_MIN_SN"); 53 EXT_MOMENTS_RAD = psMetadataLookupF32 (&status, config, "EXT_MOMENTS_RADIUS"); 54 55 // extended source model descriptions 56 char *modelNameEXT = psMetadataLookupPtr (&status, config, "EXT_MODEL"); 57 modelTypeEXT = pmModelSetType (modelNameEXT); 58 psphotInitRadiusEXT (config, sky, modelTypeEXT); 59 59 60 60 return true; … … 63 63 bool psphotFitBlob (eamReadout *imdata, pmSource *source, psArray *sources) { 64 64 65 bool ok FLT, okDBL;66 float chi FLT, chiDBL;65 bool okEXT, okDBL; 66 float chiEXT, chiDBL; 67 67 68 68 // skip the source if we don't think it is extended … … 70 70 if (source->type == PM_SOURCE_DEFECT) return false; 71 71 if (source->type == PM_SOURCE_SATURATED) return false; 72 if (source->moments->SN < GAL_MIN_SN) return false;73 74 // recalculate the source moments using the larger galaxymoments radius75 if (!pmSourceMoments (source, GAL_MOMENTS_RAD)) return false;72 if (source->moments->SN < EXT_MIN_SN) return false; 73 74 // recalculate the source moments using the larger extended-source moments radius 75 if (!pmSourceMoments (source, EXT_MOMENTS_RAD)) return false; 76 76 77 77 psTrace ("psphot.blend", 5, "trying blob...\n"); … … 79 79 pmSource *tmpSrc = pmSourceAlloc (); 80 80 81 pmModel * FLT = psphotFitFLT (imdata, source);82 ok FLT = psphotEvalFLT (tmpSrc, FLT);83 chi FLT = FLT->chisq / FLT->nDOF;81 pmModel *EXT = psphotFitEXT (imdata, source); 82 okEXT = psphotEvalEXT (tmpSrc, EXT); 83 chiEXT = EXT->chisq / EXT->nDOF; 84 84 85 85 psArray *DBL = psphotFitDBL (imdata, source); … … 89 89 chiDBL = ONE->chisq / ONE->nDOF; 90 90 91 if (ok FLT && okDBL) {92 psTrace ("psphot.blend", 5, "blob chisq: %f vs %f\n", chi FLT, chiDBL);91 if (okEXT && okDBL) { 92 psTrace ("psphot.blend", 5, "blob chisq: %f vs %f\n", chiEXT, chiDBL); 93 93 // XXX EAM : a bogus bias: need to examine this better 94 if (3*chi FLT > chiDBL) goto keepDBL;95 goto keep FLT;96 } 97 98 if (ok FLT && !okDBL) goto keepFLT;99 if (!ok FLT && okDBL) goto keepDBL;94 if (3*chiEXT > chiDBL) goto keepDBL; 95 goto keepEXT; 96 } 97 98 if (okEXT && !okDBL) goto keepEXT; 99 if (!okEXT && okDBL) goto keepDBL; 100 100 return false; 101 101 102 keep FLT:103 // sub FLT104 pmSourceSubModel (source->pixels, source->mask, FLT, false, false);105 psTrace ("psphot.blend", 5, "blob as FLT: %f %f\n", FLT->params->data.F32[2], FLT->params->data.F32[3]);102 keepEXT: 103 // sub EXT 104 pmSourceSubModel (source->pixels, source->mask, EXT, false, false); 105 psTrace ("psphot.blend", 5, "blob as EXT: %f %f\n", EXT->params->data.F32[2], EXT->params->data.F32[3]); 106 106 107 107 // save new model 108 source->model FLT = FLT;108 source->modelEXT = EXT; 109 109 source->mode |= PM_SOURCE_SUBTRACTED; 110 110 source->mode &= ~PM_SOURCE_TEMPSUB; … … 168 168 y = PSF->params->data.F32[3]; 169 169 170 // fit FLT (not PSF) model (set/unset the pixel mask)170 // fit EXT (not PSF) model (set/unset the pixel mask) 171 171 psImageKeepCircle (source->mask, x, y, PSF->radius, "OR", PSPHOT_MASK_MARKED); 172 172 pmSourceFitSet (source, modelSet, true); … … 176 176 } 177 177 178 pmModel *psphotFit FLT (eamReadout *imdata, pmSource *source) {178 pmModel *psphotFitEXT (eamReadout *imdata, pmSource *source) { 179 179 180 180 float x, y; 181 181 182 182 // use the source moments, etc to guess basic model parameters 183 pmModel * FLT = pmSourceModelGuess (source, modelTypeFLT);184 185 psphotCheckRadius FLT (imdata, source, FLT);186 187 x = FLT->params->data.F32[2];188 y = FLT->params->data.F32[3];189 190 // fit FLT (not PSF) model (set/unset the pixel mask)191 psImageKeepCircle (source->mask, x, y, FLT->radius, "OR", PSPHOT_MASK_MARKED);192 pmSourceFitModel (source, FLT, false);193 psImageKeepCircle (source->mask, x, y, FLT->radius, "AND", ~PSPHOT_MASK_MARKED);194 195 return ( FLT);183 pmModel *EXT = pmSourceModelGuess (source, modelTypeEXT); 184 185 psphotCheckRadiusEXT (imdata, source, EXT); 186 187 x = EXT->params->data.F32[2]; 188 y = EXT->params->data.F32[3]; 189 190 // fit EXT (not PSF) model (set/unset the pixel mask) 191 psImageKeepCircle (source->mask, x, y, EXT->radius, "OR", PSPHOT_MASK_MARKED); 192 pmSourceFitModel (source, EXT, false); 193 psImageKeepCircle (source->mask, x, y, EXT->radius, "AND", ~PSPHOT_MASK_MARKED); 194 195 return (EXT); 196 196 } 197 197 -
trunk/psphot/src/psphotTest.c
r5980 r5993 1 1 # include "psphot.h" 2 bool apResidSetPower (float value);3 2 4 3 void psExit (int status, char *process, char *format, ...) { … … 16 15 int main (int argc, char **argv) { 17 16 18 // read in a file consisting of:19 // x y radius fitmag apmag dmag17 psMetadata *row; 18 psArray *table; 20 19 21 double fit;22 double ap;20 psMetadataItem *mdi; 21 psRegion region = {0,0,0,0}; // a region representing the entire array 23 22 24 23 psphotTestArguments (&argc, argv); 25 24 26 FILE *f = fopen (argv[1], "r"); 27 if (f == NULL) psExit (2, "test", "no file\n"); 25 psFits *file = psFitsOpen (argv[1], "r"); 26 psMetadata *header = psFitsReadHeader (NULL, file); 27 psImage *image = psFitsReadImage (NULL, file, region, 0); 28 psFitsClose (file); 28 29 29 float power = atof (argv[2]); 30 apResidSetPower (power); 30 psMetadataConfigWrite (header, argv[2]); 31 31 32 psVector *x = psVectorAlloc (100, PS_TYPE_F64); 33 psVector *y = psVectorAlloc (100, PS_TYPE_F64); 34 psVector *rad = psVectorAlloc (100, PS_TYPE_F64); 35 psVector *rflux = psVectorAlloc (100, PS_TYPE_F64); 36 psVector *apres = psVectorAlloc (100, PS_TYPE_F64); 37 psVector *dmag = psVectorAlloc (100, PS_TYPE_F64); 32 // attempt to write image with NAXIS = 0 33 mdi = psMetadataLookup (header, "NAXIS"); 34 mdi->data.S32 = 0; 35 mdi->type = PS_DATA_S32; 36 37 // create a test image 38 // psImage *tmpimage = psImageAlloc (10, 10, PS_DATA_F32); 38 39 39 int Npt = 0; 40 while (fscanf (f, "%lf %lf %lf %lf %lf %lf", 41 &x->data.F64[Npt], 42 &y->data.F64[Npt], 43 &rad->data.F64[Npt], 44 &fit, &ap, 45 &dmag->data.F64[Npt]) != EOF) { 40 // create a test table 41 table = psArrayAlloc (10); 42 table->n = 0; 46 43 47 if (fabs(ap-fit) > 0.1) continue; 48 if (fit > -10) continue; 44 for (int i = 0; i < 10; i++) { 45 row = psMetadataAlloc (); 46 psMetadataAdd (row, PS_LIST_TAIL, "ROW", PS_DATA_S32, "", i); 47 psMetadataAdd (row, PS_LIST_TAIL, "FROW", PS_TYPE_F32, "", 0.1*i); 48 psMetadataAdd (row, PS_LIST_TAIL, "DUMMY", PS_DATA_STRING, "", "test line"); 49 50 table->data[i] = row; 51 } 52 table->n = 10; 53 54 psMetadata *theader = psMetadataAlloc (); 55 psMetadataAdd (theader, PS_LIST_HEAD, "EXTNAME", PS_DATA_STRING, "extension name", "SMPFILE"); 49 56 50 apres->data.F64[Npt] = ap-fit; 51 rflux->data.F64[Npt] = pow(10.0, 0.4*fit); 57 psFits *fits = psFitsOpen (argv[3], "w"); 58 // psFitsWriteImage (fits, header, tmpimage, 0); 59 psFitsWriteHeader (header, fits); 60 psFitsWriteTable (fits, theader, table); 61 psFitsClose (fits); 52 62 53 psVectorExtend (x, 100, 1); 54 psVectorExtend (y, 100, 1); 55 psVectorExtend (rad, 100, 1); 56 psVectorExtend (rflux, 100, 1); 57 psVectorExtend (apres, 100, 1); 58 psVectorExtend (dmag, 100, 1); 59 Npt ++; 60 } 61 x->n = y->n = rad->n = rflux->n = apres->n = dmag->n = Npt; 62 63 psphotApResidPolyFit (x, y, rad, rflux, apres, dmag); 64 63 psFree (header); 64 psFree (image); 65 65 exit (0); 66 66 } -
trunk/psphot/src/psphotTestArguments.c
r5980 r5993 8 8 psArgumentVerbosity (argc, argv); 9 9 10 if (*argc != 3) usage ();10 if (*argc != 4) usage (); 11 11 12 12 return; … … 15 15 static int usage () { 16 16 17 fprintf (stderr, "USAGE: psphot ModelTest (apresid.dat) (power)\n");17 fprintf (stderr, "USAGE: psphotTest (input.fits) (output.hdr) (out.fits)\n"); 18 18 exit (2); 19 19 }
Note:
See TracChangeset
for help on using the changeset viewer.
