Changeset 30763
- Timestamp:
- Feb 28, 2011, 2:44:39 PM (15 years ago)
- Location:
- branches/eam_branches/ipp-20110213/psModules/src/objects
- Files:
-
- 2 added
- 15 edited
-
Makefile.am (modified) (2 diffs)
-
pmPCMdata.c (modified) (1 diff)
-
pmSourceFitModel.c (modified) (2 diffs)
-
pmSourceFitModel.h (modified) (1 diff)
-
pmSourceFitPCM.c (modified) (2 diffs)
-
pmSourceFitSet.c (modified) (5 diffs)
-
pmSourceFitSet.h (modified) (1 diff)
-
pmSourceIO_CMF_PS1_DV1.c (modified) (5 diffs)
-
pmSourceIO_CMF_PS1_DV2.c (modified) (6 diffs)
-
pmSourceIO_CMF_PS1_SV1.c (modified) (4 diffs)
-
pmSourceIO_CMF_PS1_V1.c (modified) (4 diffs)
-
pmSourceIO_CMF_PS1_V2.c (modified) (4 diffs)
-
pmSourceIO_CMF_PS1_V3.c (modified) (5 diffs)
-
pmSourceOutputs.c (added)
-
pmSourceOutputs.h (added)
-
pmSourcePhotometry.c (modified) (3 diffs)
-
pmSourcePhotometry.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20110213/psModules/src/objects/Makefile.am
r29004 r30763 32 32 pmSourceFitSet.c \ 33 33 pmSourcePhotometry.c \ 34 pmSourceOutputs.c \ 34 35 pmSourceIO.c \ 35 36 pmSourceIO_RAW.c \ … … 102 103 pmSourceFitSet.h \ 103 104 pmSourcePhotometry.h \ 105 pmSourceOutputs.h \ 104 106 pmSourceIO.h \ 105 107 pmSourcePlots.h \ -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmPCMdata.c
r29546 r30763 341 341 return false; 342 342 } 343 pcm->nDOF = pcm->nPix - nParams - 1;343 pcm->nDOF = pcm->nPix - nParams; 344 344 345 345 // has the source pixel window changed? -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceFitModel.c
r30705 r30763 40 40 #include "pmSourceDiffStats.h" 41 41 #include "pmSource.h" 42 #include "pmSourcePhotometry.h" 42 43 #include "pmSourceFitModel.h" 43 44 … … 238 239 239 240 // save the resulting chisq, nDOF, nIter 240 model->chisq = myMin->value; 241 if (options->poissonErrors) { 242 model->chisq = myMin->value; 243 model->nPix = y->n; 244 model->nDOF = y->n - nParams; 245 model->chisqNorm = model->chisq / model->nDOF; 246 } else { 247 pmSourceChisq (model, source->pixels, source->maskObj, source->variance, maskVal, options->covarFactor, nParams); 248 } 241 249 model->nIter = myMin->iter; 242 model->nPix = y->n; 243 model->nDOF = y->n - nParams; 244 model->chisqNorm = model->chisq / model->nDOF; 250 251 // set the model success or failure status 245 252 model->flags |= PM_MODEL_STATUS_FITTED; 246 253 if (!fitStatus) model->flags |= PM_MODEL_STATUS_NONCONVERGE; -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceFitModel.h
r30705 r30763 31 31 float maxChisqDOF; ///< convergence criterion 32 32 float weight; ///< use this weight for constant-weight fits 33 float covarFactor; ///< covariance factor for calculating the chisq 33 34 bool poissonErrors; ///< use poisson errors for fits? 34 35 bool saveCovariance; -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceFitPCM.c
r30719 r30763 38 38 #include "pmSourceDiffStats.h" 39 39 #include "pmSource.h" 40 #include "pmSourcePhotometry.h" 40 41 #include "pmSourceFitModel.h" 41 42 #include "pmPCMdata.h" … … 85 86 86 87 // save the resulting chisq, nDOF, nIter 87 pcm->modelConv->chisq = myMin->value; 88 if (fitOptions->poissonErrors) { 89 pcm->modelConv->chisq = myMin->value; 90 pcm->modelConv->nPix = pcm->nPix; 91 pcm->modelConv->nDOF = pcm->nDOF; 92 pcm->modelConv->chisqNorm = pcm->modelConv->chisq / pcm->modelConv->nDOF; 93 } else { 94 pmSourceChisq (pcm->modelConv, source->pixels, source->maskObj, source->variance, maskVal, fitOptions->covarFactor, pcm->nPix - pcm->nDOF - 1); 95 } 88 96 pcm->modelConv->nIter = myMin->iter; 89 pcm->modelConv->nPix = pcm->nPix; 90 pcm->modelConv->nDOF = pcm->nDOF; 91 pcm->modelConv->chisqNorm = pcm->modelConv->chisq / pcm->modelConv->nDOF; 97 98 // set the model success or failure status 92 99 pcm->modelConv->flags |= PM_MODEL_STATUS_FITTED; 93 100 if (!fitStatus) pcm->modelConv->flags |= PM_MODEL_STATUS_NONCONVERGE; -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceFitSet.c
r30705 r30763 39 39 #include "pmSourceDiffStats.h" 40 40 #include "pmSource.h" 41 #include "pmSourcePhotometry.h" 41 42 42 43 #include "pmSourceFitModel.h" … … 299 300 const psVector *dparam, const psVector *param, const psImage *covar, 300 301 pmSource *source, psMinimization *myMin, int nPix, 301 bool fitStatus, bool saveCovariance)302 bool fitStatus, pmSourceFitOptions *options, psImageMaskType maskVal) 302 303 { 303 304 PS_ASSERT_PTR_NON_NULL(set, false); … … 322 323 psTrace ("psModules.objects", 4, "%f +/- %f", param->data.F32[n], dparam->data.F32[n]); 323 324 } 324 if ( saveCovariance) {325 if (options->saveCovariance) { 325 326 // we only save the covar matrix for this object with itself (ignore cross terms between objects) 326 327 model->covar = psImageAlloc(model->params->n, model->params->n, PS_TYPE_F32); … … 336 337 // save the resulting chisq, nDOF, nIter 337 338 // these are not unique for any one source 338 model->chisq = myMin->value; 339 model->nIter = myMin->iter; 340 model->nDOF = nPix - model->params->n; 339 if (options->poissonErrors) { 340 model->chisq = myMin->value; 341 model->nPix = nPix; 342 model->nDOF = nPix - model->params->n; 343 model->chisqNorm = model->chisq / model->nDOF; 344 } else { 345 pmSourceChisq (model, source->pixels, source->maskObj, source->variance, maskVal, options->covarFactor, model->params->n); 346 } 347 model->nIter = myMin->iter; 341 348 342 349 // set the model success or failure status … … 592 599 } 593 600 594 pmSourceFitSetValues (thisSet, dparams, params, covar, source, myMin, y->n, fitStatus, options ->saveCovariance);601 pmSourceFitSetValues (thisSet, dparams, params, covar, source, myMin, y->n, fitStatus, options, maskVal); 595 602 psTrace ("psModules.objects", 5, "onPic: %d, fitStatus: %d, nIter: %d, chisq: %f, nPix: %ld\n", onPic, fitStatus, myMin->iter, myMin->value, y->n); 596 603 -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceFitSet.h
r30705 r30763 44 44 const psVector *dparam, const psVector *param, const psImage *covar, 45 45 pmSource *source, psMinimization *myMin, int nPix, 46 bool fitStatus, bool saveCovariance);46 bool fitStatus, pmSourceFitOptions *options, psImageMaskType maskVal); 47 47 48 48 psF32 pmSourceFitSetFunction(psVector *deriv, const psVector *param, const psVector *x); -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceIO_CMF_PS1_DV1.c
r30621 r30763 49 49 50 50 #include "pmSourceIO.h" 51 #include "pmSourceOutputs.h" 51 52 52 53 // panstarrs-style FITS table output (header + table in 1st extension) … … 62 63 PS_ASSERT_PTR_NON_NULL(extname, false); 63 64 64 int i;65 65 psArray *table; 66 66 psMetadata *row; 67 psF32 *PAR, *dPAR;68 psEllipseAxes axes;69 psF32 xPos, yPos;70 psF32 xErr, yErr;71 psF32 errMag, chisq, apRadius;72 psS32 nPix, nDOF;73 67 74 68 pmChip *chip = readout->parent->parent; 75 pmFPA *fpa = chip->parent; 76 77 bool status1 = false; 78 bool status2 = false; 79 float magOffset = NAN; 80 float exptime = psMetadataLookupF32 (&status1, fpa->concepts, "FPA.EXPOSURE"); 81 float zeropt = psMetadataLookupF32(&status2, fpa->concepts, "FPA.ZP"); 82 if (!isfinite(zeropt)) { 83 zeropt = psMetadataLookupF32 (&status2, imageHeader, "ZPT_OBS"); 84 } 85 if (status1 && status2 && (exptime > 0.0)) { 86 magOffset = zeropt + 2.5*log10(exptime); 87 } 88 float zeroptErr = psMetadataLookupF32 (&status2, imageHeader, "ZPT_ERR"); 69 89 70 90 71 // if the sequence is defined, write these in seq order; otherwise … … 100 81 } 101 82 83 short nImageOverlap; 84 float magOffset; 85 float zeroptErr; 86 float fwhmMajor; 87 float fwhmMinor; 88 pmSourceOutputsCommonValues (&nImageOverlap, &magOffset, &zeroptErr, &fwhmMajor, &fwhmMinor, readout, imageHeader); 89 102 90 table = psArrayAllocEmpty (sources->n); 103 91 104 92 // we write out PSF-fits for all sources, regardless of quality. the source flags tell us the state 105 93 // by the time we call this function, all values should be assigned. let's use asserts to be sure in some cases. 106 for (i = 0; i < sources->n; i++) {94 for (int i = 0; i < sources->n; i++) { 107 95 pmSource *source = (pmSource *) sources->data[i]; 108 96 … … 115 103 } 116 104 117 // no difference between PSF and non-PSF model 118 pmModel *model = source->modelPSF; 119 120 if (model != NULL) { 121 PAR = model->params->data.F32; 122 dPAR = model->dparams->data.F32; 123 xPos = PAR[PM_PAR_XPOS]; 124 yPos = PAR[PM_PAR_YPOS]; 125 if (source->mode & PM_SOURCE_MODE_NONLINEAR_FIT) { 126 xErr = dPAR[PM_PAR_XPOS]; 127 yErr = dPAR[PM_PAR_YPOS]; 128 } else { 129 // in linear-fit mode, there is no error on the centroid 130 xErr = source->peak->dx; 131 yErr = source->peak->dy; 132 } 133 if (isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX])) { 134 axes = pmPSF_ModelToAxes (PAR, 20.0); 135 } else { 136 axes.major = NAN; 137 axes.minor = NAN; 138 axes.theta = NAN; 139 } 140 chisq = model->chisq; 141 nDOF = model->nDOF; 142 nPix = model->nPix; 143 apRadius = source->apRadius; 144 errMag = model->dparams->data.F32[PM_PAR_I0] / model->params->data.F32[PM_PAR_I0]; 145 } else { 146 xPos = source->peak->xf; 147 yPos = source->peak->yf; 148 xErr = source->peak->dx; 149 yErr = source->peak->dy; 150 axes.major = NAN; 151 axes.minor = NAN; 152 axes.theta = NAN; 153 chisq = NAN; 154 nDOF = 0; 155 nPix = 0; 156 apRadius = NAN; 157 errMag = NAN; 158 } 159 160 float calMag = isfinite(magOffset) ? source->psfMag + magOffset : NAN; 161 float peakMag = (source->peak->flux > 0) ? -2.5*log10(source->peak->flux) : NAN; 162 psS16 nImageOverlap = 1; 163 164 psSphere ptSky = {0.0, 0.0, 0.0, 0.0}; 165 float posAngle = 0.0; 166 float pltScale = 0.0; 167 pmSourceLocalAstrometry (&ptSky, &posAngle, &pltScale, chip, xPos, yPos); 105 // set the 'best' values for various output fields: 106 pmSourceOutputs outputs; 107 pmSourceOutputsSetValues (&outputs, source, chip, fwhmMajor, fwhmMinor, magOffset); 108 109 pmSourceOutputsMoments moments; 110 pmSourceOutputsSetMoments (&moments, source); 168 111 169 112 pmSourceDiffStats diffStats; … … 175 118 row = psMetadataAlloc (); 176 119 psMetadataAdd (row, PS_LIST_TAIL, "IPP_IDET", PS_DATA_U32, "IPP detection identifier index", source->seq); 177 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF", PS_DATA_F32, "PSF x coordinate", xPos);178 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF", PS_DATA_F32, "PSF y coordinate", yPos);179 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF_SIG", PS_DATA_F32, "Sigma in PSF x coordinate", xErr); // XXX this is only measured for non-linear fits180 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF_SIG", PS_DATA_F32, "Sigma in PSF y coordinate", yErr); // XXX this is only measured for non-linear fits181 psMetadataAdd (row, PS_LIST_TAIL, "POSANGLE", PS_DATA_F32, "position angle at source (degrees)", posAngle*PS_DEG_RAD);182 psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE", PS_DATA_F32, "plate scale at source (arcsec/pixel)", pltScale*PS_DEG_RAD*3600.0);120 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF", PS_DATA_F32, "PSF x coordinate", outputs.xPos); 121 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF", PS_DATA_F32, "PSF y coordinate", outputs.yPos); 122 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF_SIG", PS_DATA_F32, "Sigma in PSF x coordinate", outputs.xErr); // XXX this is only measured for non-linear fits 123 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF_SIG", PS_DATA_F32, "Sigma in PSF y coordinate", outputs.yErr); // XXX this is only measured for non-linear fits 124 psMetadataAdd (row, PS_LIST_TAIL, "POSANGLE", PS_DATA_F32, "position angle at source (degrees)", outputs.posAngle); 125 psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE", PS_DATA_F32, "plate scale at source (arcsec/pixel)", outputs.pltScale); 183 126 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG", PS_DATA_F32, "PSF fit instrumental magnitude", source->psfMag); 184 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG_SIG", PS_DATA_F32, "Sigma of PSF instrumental magnitude", errMag);127 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG_SIG", PS_DATA_F32, "Sigma of PSF instrumental magnitude", source->errMag); 185 128 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_FLUX", PS_DATA_F32, "PSF fit instrumental magnitude", source->psfFlux); 186 129 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_FLUX_SIG",PS_DATA_F32, "Sigma of PSF instrumental magnitude", source->psfFluxErr); 187 130 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG", PS_DATA_F32, "magnitude in standard aperture", source->apMag); 188 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", apRadius);189 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", peakMag);190 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG", PS_DATA_F32, "PSF Magnitude using supplied calibration", calMag);131 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", outputs.apRadius); 132 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", outputs.peakMag); 133 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG", PS_DATA_F32, "PSF Magnitude using supplied calibration", outputs.calMag); 191 134 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG_SIG", PS_DATA_F32, "measured scatter of zero point calibration", zeroptErr); 192 psMetadataAdd (row, PS_LIST_TAIL, "RA_PSF", PS_DATA_F64, "PSF RA coordinate (degrees)", ptSky.r*PS_DEG_RAD);193 psMetadataAdd (row, PS_LIST_TAIL, "DEC_PSF", PS_DATA_F64, "PSF DEC coordinate (degrees)", ptSky.d*PS_DEG_RAD);135 psMetadataAdd (row, PS_LIST_TAIL, "RA_PSF", PS_DATA_F64, "PSF RA coordinate (degrees)", outputs.ra); 136 psMetadataAdd (row, PS_LIST_TAIL, "DEC_PSF", PS_DATA_F64, "PSF DEC coordinate (degrees)", outputs.dec); 194 137 psMetadataAdd (row, PS_LIST_TAIL, "SKY", PS_DATA_F32, "Sky level", source->sky); 195 138 psMetadataAdd (row, PS_LIST_TAIL, "SKY_SIGMA", PS_DATA_F32, "Sigma of sky level", source->skyErr); 196 139 197 psMetadataAdd (row, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "Chisq of PSF-fit", chisq);140 psMetadataAdd (row, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "Chisq of PSF-fit", outputs.chisq); 198 141 psMetadataAdd (row, PS_LIST_TAIL, "CR_NSIGMA", PS_DATA_F32, "Nsigma deviations from PSF to CF", source->crNsigma); 199 142 psMetadataAdd (row, PS_LIST_TAIL, "EXT_NSIGMA", PS_DATA_F32, "Nsigma deviations from PSF to EXT", source->extNsigma); 200 143 201 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MAJOR", PS_DATA_F32, "PSF width (major axis)", axes.major);202 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", axes.minor);203 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta);144 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MAJOR", PS_DATA_F32, "PSF width (major axis)", outputs.psfMajor); 145 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", outputs.psfMinor); 146 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", outputs.psfTheta); 204 147 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeightNotBad); 205 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", nDOF); 206 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", nPix); 207 208 // distinguish moments measure from window vs S/N > XX ?? 209 float mxx = source->moments ? source->moments->Mxx : NAN; 210 float mxy = source->moments ? source->moments->Mxy : NAN; 211 float myy = source->moments ? source->moments->Myy : NAN; 212 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", mxx); 213 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", mxy); 214 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", myy); 215 216 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NPOS", PS_DATA_S32, "nPos (n pix > 3 sigma)", diffStats.nGood); 217 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_FRATIO", PS_DATA_F32, "fPos / (fPos + fNeg)", diffStats.fRatio); 218 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NRATIO_BAD", PS_DATA_F32, "nPos / (nPos + nNeg)", diffStats.nRatioBad); 219 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NRATIO_MASK", PS_DATA_F32, "nPos / (nPos + nMask)", diffStats.nRatioMask); 220 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NRATIO_ALL", PS_DATA_F32, "nPos / (nGood + nMask + nBad)", diffStats.nRatioAll); 148 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", outputs.nDOF); 149 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", outputs.nPix); 150 151 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", moments.Mxx); 152 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", moments.Mxy); 153 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", moments.Myy); 154 155 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NPOS", PS_DATA_S32, "nPos (n pix > 3 sigma)", diffStats.nGood); 156 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_FRATIO", PS_DATA_F32, "fPos / (fPos + fNeg)", diffStats.fRatio); 157 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NRATIO_BAD", PS_DATA_F32, "nPos / (nPos + nNeg)", diffStats.nRatioBad); 158 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NRATIO_MASK", PS_DATA_F32, "nPos / (nPos + nMask)", diffStats.nRatioMask); 159 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NRATIO_ALL", PS_DATA_F32, "nPos / (nGood + nMask + nBad)", diffStats.nRatioAll); 221 160 222 161 psMetadataAdd (row, PS_LIST_TAIL, "FLAGS", PS_DATA_U32, "psphot analysis flags", source->mode); -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceIO_CMF_PS1_DV2.c
r30621 r30763 49 49 50 50 #include "pmSourceIO.h" 51 #include "pmSourceOutputs.h" 51 52 52 53 // panstarrs-style FITS table output (header + table in 1st extension) … … 62 63 PS_ASSERT_PTR_NON_NULL(extname, false); 63 64 64 int i;65 65 psArray *table; 66 66 psMetadata *row; 67 psF32 *PAR, *dPAR;68 psEllipseAxes axes;69 psF32 xPos, yPos;70 psF32 xErr, yErr;71 psF32 chisq, apRadius;72 psS32 nPix, nDOF;73 67 74 68 pmChip *chip = readout->parent->parent; 75 pmFPA *fpa = chip->parent;76 77 bool status1 = false;78 bool status2 = false;79 float magOffset = NAN;80 float exptime = psMetadataLookupF32 (&status1, fpa->concepts, "FPA.EXPOSURE");81 float zeropt = psMetadataLookupF32(&status2, fpa->concepts, "FPA.ZP");82 if (!isfinite(zeropt)) {83 zeropt = psMetadataLookupF32 (&status2, imageHeader, "ZPT_OBS");84 }85 if (status1 && status2 && (exptime > 0.0)) {86 magOffset = zeropt + 2.5*log10(exptime);87 }88 float zeroptErr = psMetadataLookupF32 (&status2, imageHeader, "ZPT_ERR");89 90 // we need a measure of the image quality (FWHM) for this image, in order to get the positional errors91 float fwhmMajor = psMetadataLookupF32(&status1, readout->analysis, "FWHM_MAJ");92 if (!status1) {93 fwhmMajor = psMetadataLookupF32(&status1, readout->analysis, "IQ_FW1");94 if (!status1) {95 fwhmMajor = 5.0; // XXX just a guess!96 }97 }98 float fwhmMinor = psMetadataLookupF32(&status1, readout->analysis, "FWHM_MIN");99 if (!status1) {100 fwhmMinor = psMetadataLookupF32(&status1, readout->analysis, "IQ_FW2");101 if (!status1) {102 fwhmMinor = 5.0; // XXX just a guess!103 }104 }105 69 106 70 // if the sequence is defined, write these in seq order; otherwise … … 118 82 table = psArrayAllocEmpty (sources->n); 119 83 84 short nImageOverlap; 85 float magOffset; 86 float zeroptErr; 87 float fwhmMajor; 88 float fwhmMinor; 89 pmSourceOutputsCommonValues (&nImageOverlap, &magOffset, &zeroptErr, &fwhmMajor, &fwhmMinor, readout, imageHeader); 90 120 91 // we write out PSF-fits for all sources, regardless of quality. the source flags tell us the state 121 92 // by the time we call this function, all values should be assigned. let's use asserts to be sure in some cases. 122 for (i = 0; i < sources->n; i++) {93 for (int i = 0; i < sources->n; i++) { 123 94 pmSource *source = (pmSource *) sources->data[i]; 124 95 … … 131 102 } 132 103 133 // no difference between PSF and non-PSF model 134 pmModel *model = source->modelPSF; 135 136 if (model != NULL) { 137 PAR = model->params->data.F32; 138 dPAR = model->dparams->data.F32; 139 xPos = PAR[PM_PAR_XPOS]; 140 yPos = PAR[PM_PAR_YPOS]; 141 if (source->mode & PM_SOURCE_MODE_NONLINEAR_FIT) { 142 xErr = dPAR[PM_PAR_XPOS]; 143 yErr = dPAR[PM_PAR_YPOS]; 144 } else { 145 // in linear-fit mode, there is no error on the centroid 146 xErr = fwhmMajor * source->errMag / 2.35; 147 yErr = fwhmMinor * source->errMag / 2.35; 148 } 149 if (isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX])) { 150 axes = pmPSF_ModelToAxes (PAR, 20.0); 151 } else { 152 axes.major = NAN; 153 axes.minor = NAN; 154 axes.theta = NAN; 155 } 156 chisq = model->chisq; 157 nDOF = model->nDOF; 158 nPix = model->nPix; 159 apRadius = source->apRadius; 160 } else { 161 bool useMoments = true; 162 useMoments = (useMoments && source->moments); // can't if there are no moments 163 useMoments = (useMoments && source->moments->nPixels); // can't if the moments were not measured 164 useMoments = (useMoments && !(source->mode && PM_SOURCE_MODE_MOMENTS_FAILURE)); // can't if the moments failed... 165 166 if (useMoments) { 167 xPos = source->moments->Mx; 168 yPos = source->moments->My; 169 xErr = fwhmMajor * source->errMag / 2.35; 170 yErr = fwhmMinor * source->errMag / 2.35; 171 } else { 172 xPos = source->peak->xf; 173 yPos = source->peak->yf; 174 xErr = source->peak->dx; 175 yErr = source->peak->dy; 176 } 177 axes.major = NAN; 178 axes.minor = NAN; 179 axes.theta = NAN; 180 chisq = NAN; 181 nDOF = 0; 182 nPix = 0; 183 apRadius = NAN; 184 } 185 186 float calMag = isfinite(magOffset) ? source->psfMag + magOffset : NAN; 187 float peakMag = (source->peak->flux > 0) ? -2.5*log10(source->peak->flux) : NAN; 188 psS16 nImageOverlap = 1; 189 190 psSphere ptSky = {0.0, 0.0, 0.0, 0.0}; 191 float posAngle = 0.0; 192 float pltScale = 0.0; 193 pmSourceLocalAstrometry (&ptSky, &posAngle, &pltScale, chip, xPos, yPos); 104 // set the 'best' values for various output fields: 105 pmSourceOutputs outputs; 106 pmSourceOutputsSetValues (&outputs, source, chip, fwhmMajor, fwhmMinor, magOffset); 107 108 pmSourceOutputsMoments moments; 109 pmSourceOutputsSetMoments (&moments, source); 194 110 195 111 pmSourceDiffStats diffStats; … … 201 117 row = psMetadataAlloc (); 202 118 psMetadataAdd (row, PS_LIST_TAIL, "IPP_IDET", PS_DATA_U32, "IPP detection identifier index", source->seq); 203 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF", PS_DATA_F32, "PSF x coordinate", xPos);204 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF", PS_DATA_F32, "PSF y coordinate", yPos);205 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF_SIG", PS_DATA_F32, "Sigma in PSF x coordinate", xErr); // XXX this is only measured for non-linear fits206 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF_SIG", PS_DATA_F32, "Sigma in PSF y coordinate", yErr); // XXX this is only measured for non-linear fits207 psMetadataAdd (row, PS_LIST_TAIL, "POSANGLE", PS_DATA_F32, "position angle at source (degrees)", posAngle*PS_DEG_RAD);208 psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE", PS_DATA_F32, "plate scale at source (arcsec/pixel)", pltScale*PS_DEG_RAD*3600.0);119 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF", PS_DATA_F32, "PSF x coordinate", outputs.xPos); 120 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF", PS_DATA_F32, "PSF y coordinate", outputs.yPos); 121 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF_SIG", PS_DATA_F32, "Sigma in PSF x coordinate", outputs.xErr); // XXX this is only measured for non-linear fits 122 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF_SIG", PS_DATA_F32, "Sigma in PSF y coordinate", outputs.yErr); // XXX this is only measured for non-linear fits 123 psMetadataAdd (row, PS_LIST_TAIL, "POSANGLE", PS_DATA_F32, "position angle at source (degrees)", outputs.posAngle); 124 psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE", PS_DATA_F32, "plate scale at source (arcsec/pixel)", outputs.pltScale); 209 125 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG", PS_DATA_F32, "PSF fit instrumental magnitude", source->psfMag); 210 126 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG_SIG", PS_DATA_F32, "Sigma of PSF instrumental magnitude", source->errMag); … … 214 130 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG", PS_DATA_F32, "magnitude in standard aperture", source->apMag); 215 131 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RAW", PS_DATA_F32, "magnitude in real aperture", source->apMagRaw); 216 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", apRadius);132 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", outputs.apRadius); 217 133 psMetadataAdd (row, PS_LIST_TAIL, "AP_FLUX", PS_DATA_F32, "instrumental flux in standard aperture", source->apFlux); 218 134 psMetadataAdd (row, PS_LIST_TAIL, "AP_FLUX_SIG", PS_DATA_F32, "aperture flux error", source->apFluxErr); 219 135 220 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", peakMag);221 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG", PS_DATA_F32, "PSF Magnitude using supplied calibration", calMag);136 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", outputs.peakMag); 137 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG", PS_DATA_F32, "PSF Magnitude using supplied calibration", outputs.calMag); 222 138 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG_SIG", PS_DATA_F32, "measured scatter of zero point calibration", zeroptErr); 223 psMetadataAdd (row, PS_LIST_TAIL, "RA_PSF", PS_DATA_F64, "PSF RA coordinate (degrees)", ptSky.r*PS_DEG_RAD);224 psMetadataAdd (row, PS_LIST_TAIL, "DEC_PSF", PS_DATA_F64, "PSF DEC coordinate (degrees)", ptSky.d*PS_DEG_RAD);139 psMetadataAdd (row, PS_LIST_TAIL, "RA_PSF", PS_DATA_F64, "PSF RA coordinate (degrees)", outputs.ra); 140 psMetadataAdd (row, PS_LIST_TAIL, "DEC_PSF", PS_DATA_F64, "PSF DEC coordinate (degrees)", outputs.dec); 225 141 psMetadataAdd (row, PS_LIST_TAIL, "SKY", PS_DATA_F32, "Sky level", source->sky); 226 142 psMetadataAdd (row, PS_LIST_TAIL, "SKY_SIGMA", PS_DATA_F32, "Sigma of sky level", source->skyErr); 227 143 228 psMetadataAdd (row, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "Chisq of PSF-fit", chisq);144 psMetadataAdd (row, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "Chisq of PSF-fit", outputs.chisq); 229 145 psMetadataAdd (row, PS_LIST_TAIL, "CR_NSIGMA", PS_DATA_F32, "Nsigma deviations from PSF to CF", source->crNsigma); 230 146 psMetadataAdd (row, PS_LIST_TAIL, "EXT_NSIGMA", PS_DATA_F32, "Nsigma deviations from PSF to EXT", source->extNsigma); 231 147 232 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MAJOR", PS_DATA_F32, "PSF width (major axis)", axes.major);233 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", axes.minor);234 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta);148 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MAJOR", PS_DATA_F32, "PSF width (major axis)", outputs.psfMajor); 149 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", outputs.psfMinor); 150 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", outputs.psfTheta); 235 151 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor (bad)", source->pixWeightNotBad); 236 152 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF_PERFECT", PS_DATA_F32, "PSF coverage/quality factor (poor)", source->pixWeightNotPoor); 237 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", nDOF); 238 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", nPix); 239 240 // distinguish moments measure from window vs S/N > XX ?? 241 float mxx = source->moments ? source->moments->Mxx : NAN; 242 float mxy = source->moments ? source->moments->Mxy : NAN; 243 float myy = source->moments ? source->moments->Myy : NAN; 244 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", mxx); 245 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", mxy); 246 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", myy); 247 248 float Mrf = source->moments ? source->moments->Mrf : NAN; 249 float Mrh = source->moments ? source->moments->Mrh : NAN; 250 float Krf = source->moments ? source->moments->KronFlux : NAN; 251 float dKrf = source->moments ? source->moments->KronFluxErr : NAN; 252 253 float Kinner = source->moments ? source->moments->KronFinner : NAN; 254 float Kouter = source->moments ? source->moments->KronFouter : NAN; 255 256 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_R1", PS_DATA_F32, "first radial moment", Mrf); 257 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_RH", PS_DATA_F32, "half radial moment", Mrh); 258 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX", PS_DATA_F32, "Kron Flux (in 2.5 R1)", Krf); 259 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_ERR", PS_DATA_F32, "Kron Flux Error", dKrf); 260 261 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_INNER", PS_DATA_F32, "Kron Flux (in 1.0 R1)", Kinner); 262 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_OUTER", PS_DATA_F32, "Kron Flux (in 4.0 R1)", Kouter); 263 264 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NPOS", PS_DATA_S32, "nPos (n pix > 3 sigma)", diffStats.nGood); 265 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_FRATIO", PS_DATA_F32, "fPos / (fPos + fNeg)", diffStats.fRatio); 266 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NRATIO_BAD", PS_DATA_F32, "nPos / (nPos + nNeg)", diffStats.nRatioBad); 267 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NRATIO_MASK", PS_DATA_F32, "nPos / (nPos + nMask)", diffStats.nRatioMask); 268 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NRATIO_ALL", PS_DATA_F32, "nPos / (nGood + nMask + nBad)", diffStats.nRatioAll); 153 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", outputs.nDOF); 154 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", outputs.nPix); 155 156 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", moments.Mxx); 157 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", moments.Mxy); 158 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", moments.Myy); 159 160 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_R1", PS_DATA_F32, "first radial moment", moments.Mrf); 161 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_RH", PS_DATA_F32, "half radial moment", moments.Mrh); 162 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX", PS_DATA_F32, "Kron Flux (in 2.5 R1)", moments.Krf); 163 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_ERR", PS_DATA_F32, "Kron Flux Error", moments.dKrf); 164 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_INNER", PS_DATA_F32, "Kron Flux (in 1.0 R1)", moments.Kinner); 165 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_OUTER", PS_DATA_F32, "Kron Flux (in 4.0 R1)", moments.Kouter); 166 167 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NPOS", PS_DATA_S32, "nPos (n pix > 3 sigma)", diffStats.nGood); 168 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_FRATIO", PS_DATA_F32, "fPos / (fPos + fNeg)", diffStats.fRatio); 169 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NRATIO_BAD", PS_DATA_F32, "nPos / (nPos + nNeg)", diffStats.nRatioBad); 170 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NRATIO_MASK", PS_DATA_F32, "nPos / (nPos + nMask)", diffStats.nRatioMask); 171 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_NRATIO_ALL", PS_DATA_F32, "nPos / (nGood + nMask + nBad)", diffStats.nRatioAll); 269 172 270 173 psMetadataAdd (row, PS_LIST_TAIL, "DIFF_R_P", PS_DATA_F32, "distance to positive match source", diffStats.Rp); -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceIO_CMF_PS1_SV1.c
r30704 r30763 50 50 51 51 #include "pmSourceIO.h" 52 #include "pmSourceOutputs.h" 52 53 53 54 // panstarrs-style FITS table output (header + table in 1st extension) … … 66 67 psArray *table; 67 68 psMetadata *row; 68 psF32 *PAR, *dPAR;69 psEllipseAxes axes;70 psF32 xPos, yPos;71 psF32 xErr, yErr;72 psF32 errMag, chisq, apRadius;73 psS32 nPix, nDOF;74 69 75 70 pmChip *chip = readout->parent->parent; 76 pmFPA *fpa = chip->parent;77 78 bool status1 = false;79 bool status2 = false;80 float magOffset = NAN;81 float exptime = psMetadataLookupF32 (&status1, fpa->concepts, "FPA.EXPOSURE");82 float zeropt = psMetadataLookupF32(&status2, fpa->concepts, "FPA.ZP");83 if (!isfinite(zeropt)) {84 zeropt = psMetadataLookupF32 (&status2, imageHeader, "ZPT_OBS");85 }86 if (status1 && status2 && (exptime > 0.0)) {87 magOffset = zeropt + 2.5*log10(exptime);88 }89 float zeroptErr = psMetadataLookupF32 (&status2, imageHeader, "ZPT_ERR");90 71 91 72 // if the sequence is defined, write these in seq order; otherwise … … 103 84 table = psArrayAllocEmpty (sources->n); 104 85 105 # if (0) 106 // we use this just to define the output vectors (which must be present for all objects) 107 bool status = false; 108 psVector *radMin = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.LOWER"); 109 psVector *radMax = psMetadataLookupPtr (&status, recipe, "RADIAL.ANNULAR.BINS.UPPER"); 110 psAssert (radMax, "this must have been defined and tested earlier!"); 111 psAssert (radMax->n, "this must have been defined and tested earlier!"); 112 psAssert (radMin->n == radMax->n, "inconsistent annular bins"); 113 114 // write the radial profile apertures to header 115 for (int i = 0; i < radMax->n; i++) { 116 sprintf (keyword1, "RMIN_%02d", i); 117 sprintf (keyword2, "RMAX_%02d", i); 118 psMetadataAddF32 (imageHeader, PS_LIST_TAIL, keyword1, PS_META_REPLACE, "min radius for SB profile", radMin->data.F32[i]); 119 psMetadataAddF32 (imageHeader, PS_LIST_TAIL, keyword2, PS_META_REPLACE, "min radius for SB profile", radMax->data.F32[i]); 120 } 121 # endif 86 short nImageOverlap; 87 float magOffset; 88 float zeroptErr; 89 float fwhmMajor; 90 float fwhmMinor; 91 pmSourceOutputsCommonValues (&nImageOverlap, &magOffset, &zeroptErr, &fwhmMajor, &fwhmMinor, readout, imageHeader); 122 92 123 93 // we write out PSF-fits for all sources, regardless of quality. the source flags tell us the state … … 134 104 } 135 105 136 // no difference between PSF and non-PSF model 137 pmModel *model = source->modelPSF; 138 139 if (model != NULL) { 140 PAR = model->params->data.F32; 141 dPAR = model->dparams->data.F32; 142 xPos = PAR[PM_PAR_XPOS]; 143 yPos = PAR[PM_PAR_YPOS]; 144 if (source->mode & PM_SOURCE_MODE_NONLINEAR_FIT) { 145 xErr = dPAR[PM_PAR_XPOS]; 146 yErr = dPAR[PM_PAR_YPOS]; 147 } else { 148 // in linear-fit mode, there is no error on the centroid 149 xErr = source->peak->dx; 150 yErr = source->peak->dy; 151 } 152 if (isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX])) { 153 axes = pmPSF_ModelToAxes (PAR, 20.0); 154 } else { 155 axes.major = NAN; 156 axes.minor = NAN; 157 axes.theta = NAN; 158 } 159 chisq = model->chisq; 160 nDOF = model->nDOF; 161 nPix = model->nPix; 162 apRadius = source->apRadius; 163 errMag = model->dparams->data.F32[PM_PAR_I0] / model->params->data.F32[PM_PAR_I0]; 164 } else { 165 xPos = source->peak->xf; 166 yPos = source->peak->yf; 167 xErr = source->peak->dx; 168 yErr = source->peak->dy; 169 axes.major = NAN; 170 axes.minor = NAN; 171 axes.theta = NAN; 172 chisq = NAN; 173 nDOF = 0; 174 nPix = 0; 175 apRadius = NAN; 176 errMag = NAN; 177 } 178 179 float calMag = isfinite(magOffset) ? source->psfMag + magOffset : NAN; 180 float peakMag = (source->peak->flux > 0) ? -2.5*log10(source->peak->flux) : NAN; 181 psS16 nImageOverlap = 1; 182 183 psSphere ptSky = {0.0, 0.0, 0.0, 0.0}; 184 float posAngle = 0.0; 185 float pltScale = 0.0; 186 pmSourceLocalAstrometry (&ptSky, &posAngle, &pltScale, chip, xPos, yPos); 106 // set the 'best' values for various output fields: 107 pmSourceOutputs outputs; 108 pmSourceOutputsSetValues (&outputs, source, chip, fwhmMajor, fwhmMinor, magOffset); 109 110 pmSourceOutputsMoments moments; 111 pmSourceOutputsSetMoments (&moments, source); 187 112 188 113 row = psMetadataAlloc (); 189 114 psMetadataAdd (row, PS_LIST_TAIL, "IPP_IDET", PS_DATA_U32, "IPP detection identifier index", source->seq); 190 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF", PS_DATA_F32, "PSF x coordinate", xPos);191 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF", PS_DATA_F32, "PSF y coordinate", yPos);192 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF_SIG", PS_DATA_F32, "Sigma in PSF x coordinate", xErr); // XXX this is only measured for non-linear fits193 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF_SIG", PS_DATA_F32, "Sigma in PSF y coordinate", yErr); // XXX this is only measured for non-linear fits194 psMetadataAdd (row, PS_LIST_TAIL, "POSANGLE", PS_DATA_F32, "position angle at source (degrees)", posAngle*PS_DEG_RAD);195 psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE", PS_DATA_F32, "plate scale at source (arcsec/pixel)", pltScale*PS_DEG_RAD*3600.0);115 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF", PS_DATA_F32, "PSF x coordinate", outputs.xPos); 116 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF", PS_DATA_F32, "PSF y coordinate", outputs.yPos); 117 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF_SIG", PS_DATA_F32, "Sigma in PSF x coordinate", outputs.xErr); 118 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF_SIG", PS_DATA_F32, "Sigma in PSF y coordinate", outputs.yErr); 119 psMetadataAdd (row, PS_LIST_TAIL, "POSANGLE", PS_DATA_F32, "position angle at source (degrees)", outputs.posAngle); 120 psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE", PS_DATA_F32, "plate scale at source (arcsec/pixel)", outputs.pltScale); 196 121 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG", PS_DATA_F32, "PSF fit instrumental magnitude", source->psfMag); 197 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG_SIG", PS_DATA_F32, "Sigma of PSF instrumental magnitude", errMag);122 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG_SIG", PS_DATA_F32, "Sigma of PSF instrumental magnitude", source->errMag); 198 123 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_FLUX", PS_DATA_F32, "PSF fit instrumental flux (counts)", source->psfFlux); 199 124 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_FLUX_SIG",PS_DATA_F32, "Sigma of PSF instrumental flux", source->psfFluxErr); 200 125 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG", PS_DATA_F32, "magnitude in standard aperture", source->apMag); 201 126 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RAW", PS_DATA_F32, "magnitude in reported aperture", source->apMagRaw); 202 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", apRadius);203 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", peakMag);204 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG", PS_DATA_F32, "PSF Magnitude using supplied calibration", calMag);127 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", outputs.apRadius); 128 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", outputs.peakMag); 129 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG", PS_DATA_F32, "PSF Magnitude using supplied calibration", outputs.calMag); 205 130 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG_SIG", PS_DATA_F32, "measured scatter of zero point calibration", zeroptErr); 206 psMetadataAdd (row, PS_LIST_TAIL, "RA_PSF", PS_DATA_F64, "PSF RA coordinate (degrees)", ptSky.r*PS_DEG_RAD);207 psMetadataAdd (row, PS_LIST_TAIL, "DEC_PSF", PS_DATA_F64, "PSF DEC coordinate (degrees)", ptSky.d*PS_DEG_RAD);131 psMetadataAdd (row, PS_LIST_TAIL, "RA_PSF", PS_DATA_F64, "PSF RA coordinate (degrees)", outputs.ra); 132 psMetadataAdd (row, PS_LIST_TAIL, "DEC_PSF", PS_DATA_F64, "PSF DEC coordinate (degrees)", outputs.dec); 208 133 psMetadataAdd (row, PS_LIST_TAIL, "SKY", PS_DATA_F32, "Sky level", source->sky); 209 134 psMetadataAdd (row, PS_LIST_TAIL, "SKY_SIGMA", PS_DATA_F32, "Sigma of sky level", source->skyErr); 210 135 211 psMetadataAdd (row, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "Chisq of PSF-fit", chisq);136 psMetadataAdd (row, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "Chisq of PSF-fit", outputs.chisq); 212 137 psMetadataAdd (row, PS_LIST_TAIL, "CR_NSIGMA", PS_DATA_F32, "Nsigma deviations from PSF to CF", source->crNsigma); 213 138 psMetadataAdd (row, PS_LIST_TAIL, "EXT_NSIGMA", PS_DATA_F32, "Nsigma deviations from PSF to EXT", source->extNsigma); 214 139 215 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MAJOR", PS_DATA_F32, "PSF width (major axis)", axes.major);216 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", axes.minor);217 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta);140 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MAJOR", PS_DATA_F32, "PSF width (major axis)", outputs.psfMajor); 141 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", outputs.psfMinor); 142 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", outputs.psfTheta); 218 143 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor (bad)", source->pixWeightNotBad); 219 144 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF_PERFECT", PS_DATA_F32, "PSF coverage/quality factor (poor)", source->pixWeightNotPoor); 220 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", nDOF); 221 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", nPix); 222 223 // distinguish moments measure from window vs S/N > XX ?? 224 float Mxx = source->moments ? source->moments->Mxx : NAN; 225 float Mxy = source->moments ? source->moments->Mxy : NAN; 226 float Myy = source->moments ? source->moments->Myy : NAN; 227 228 float Mrf = source->moments ? source->moments->Mrf : NAN; 229 float Mrh = source->moments ? source->moments->Mrh : NAN; 230 float Krf = source->moments ? source->moments->KronFlux : NAN; 231 float dKrf = source->moments ? source->moments->KronFluxErr : NAN; 232 233 float Kinner = source->moments ? source->moments->KronFinner : NAN; 234 float Kouter = source->moments ? source->moments->KronFouter : NAN; 235 236 float M_c3 = source->moments ? 1.0*source->moments->Mxxx - 3.0*source->moments->Mxyy : NAN; 237 float M_s3 = source->moments ? 3.0*source->moments->Mxxy - 1.0*source->moments->Myyy : NAN; 238 float M_c4 = source->moments ? 1.0*source->moments->Mxxxx - 6.0*source->moments->Mxxyy + 1.0*source->moments->Myyyy : NAN; 239 float M_s4 = source->moments ? 4.0*source->moments->Mxxxy - 4.0*source->moments->Mxyyy : NAN; 240 241 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", Mxx); 242 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", Mxy); 243 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", Myy); 244 245 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M3C", PS_DATA_F32, "third momemt cos theta", M_c3); 246 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M3S", PS_DATA_F32, "third momemt sin theta", M_s3); 247 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M4C", PS_DATA_F32, "fourth momemt cos theta", M_c4); 248 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M4S", PS_DATA_F32, "fourth momemt sin theta", M_s4); 249 250 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_R1", PS_DATA_F32, "first radial moment", Mrf); 251 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_RH", PS_DATA_F32, "half radial moment", Mrh); 252 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX", PS_DATA_F32, "Kron Flux (in 2.5 R1)", Krf); 253 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_ERR", PS_DATA_F32, "Kron Flux Error", dKrf); 254 255 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_INNER", PS_DATA_F32, "Kron Flux (in 2.5 R1)", Kinner); 256 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_OUTER", PS_DATA_F32, "Kron Flux (in 2.5 R1)", Kouter); 145 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", outputs.nDOF); 146 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", outputs.nPix); 147 148 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", moments.Mxx); 149 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", moments.Mxy); 150 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", moments.Myy); 151 152 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M3C", PS_DATA_F32, "third momemt cos theta", moments.M_c3); 153 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M3S", PS_DATA_F32, "third momemt sin theta", moments.M_s3); 154 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M4C", PS_DATA_F32, "fourth momemt cos theta", moments.M_c4); 155 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M4S", PS_DATA_F32, "fourth momemt sin theta", moments.M_s4); 156 157 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_R1", PS_DATA_F32, "first radial moment", moments.Mrf); 158 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_RH", PS_DATA_F32, "half radial moment", moments.Mrh); 159 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX", PS_DATA_F32, "Kron Flux (in 2.5 R1)", moments.Krf); 160 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_ERR", PS_DATA_F32, "Kron Flux Error", moments.dKrf); 161 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_INNER", PS_DATA_F32, "Kron Flux (in 2.5 R1)", moments.Kinner); 162 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_OUTER", PS_DATA_F32, "Kron Flux (in 2.5 R1)", moments.Kouter); 257 163 258 164 psMetadataAdd (row, PS_LIST_TAIL, "FLAGS", PS_DATA_U32, "psphot analysis flags", source->mode); 259 165 psMetadataAdd (row, PS_LIST_TAIL, "FLAGS2", PS_DATA_U32, "psphot analysis flags", source->mode2); 260 261 # if (0)262 // XXX if we have raw radial apertures, write them out here263 psVector *radFlux = psVectorAlloc(radMax->n, PS_TYPE_F32);264 psVector *radFluxErr = psVectorAlloc(radMax->n, PS_TYPE_F32);265 psVector *radFill = psVectorAlloc(radMax->n, PS_TYPE_F32);266 psVectorInit (radFlux, NAN);267 psVectorInit (radFluxErr, NAN);268 psVectorInit (radFill, NAN);269 if (!source->radial) goto empty_annuli;270 if (!source->radial->flux) goto empty_annuli;271 if (!source->radial->fill) goto empty_annuli;272 psAssert (source->radial->flux->n <= radFlux->n, "inconsistent vector lengths");273 psAssert (source->radial->fill->n <= radFlux->n, "inconsistent vector lengths");274 275 // copy the data from fluxVal (which is not guaranteed to be the full length) to radFlux276 for (int j = 0; j < source->radial->flux->n; j++) {277 radFlux->data.F32[j] = source->radial->flux->data.F32[j];278 radFluxErr->data.F32[j] = source->radial->fluxErr->data.F32[j];279 radFill->data.F32[j] = source->radial->fill->data.F32[j];280 }281 282 empty_annuli:283 psMetadataAdd (row, PS_LIST_TAIL, "APER_FLUX", PS_DATA_VECTOR, "flux within annuli", radFlux);284 psMetadataAdd (row, PS_LIST_TAIL, "APER_FLUX_ERR", PS_DATA_VECTOR, "flux error in annuli", radFluxErr);285 psMetadataAdd (row, PS_LIST_TAIL, "APER_FILL", PS_DATA_VECTOR, "fill factor of annuli", radFill);286 psFree (radFlux);287 psFree (radFluxErr);288 psFree (radFill);289 # endif290 166 291 167 // XXX not sure how to get this : need to load Nimages with weight? -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceIO_CMF_PS1_V1.c
r30621 r30763 49 49 50 50 #include "pmSourceIO.h" 51 #include "pmSourceOutputs.h" 51 52 52 53 // panstarrs-style FITS table output (header + table in 1st extension) … … 62 63 psArray *table; 63 64 psMetadata *row; 64 int i;65 psF32 *PAR, *dPAR;66 psEllipseAxes axes;67 psF32 xPos, yPos;68 psF32 xErr, yErr;69 psF32 errMag, chisq, apRadius;70 psS32 nPix, nDOF;71 65 72 66 pmChip *chip = readout->parent->parent; 73 pmFPA *fpa = chip->parent;74 75 bool status1 = false;76 bool status2 = false;77 float magOffset = NAN;78 float exptime = psMetadataLookupF32 (&status1, fpa->concepts, "FPA.EXPOSURE");79 float zeropt = psMetadataLookupF32(&status2, fpa->concepts, "FPA.ZP");80 if (!isfinite(zeropt)) {81 zeropt = psMetadataLookupF32 (&status2, imageHeader, "ZPT_OBS");82 }83 if (status1 && status2 && (exptime > 0.0)) {84 magOffset = zeropt + 2.5*log10(exptime);85 }86 float zeroptErr = psMetadataLookupF32 (&status2, imageHeader, "ZPT_ERR");87 67 88 68 // if the sequence is defined, write these in seq order; otherwise … … 100 80 table = psArrayAllocEmpty (sources->n); 101 81 82 short nImageOverlap; 83 float magOffset; 84 float zeroptErr; 85 float fwhmMajor; 86 float fwhmMinor; 87 pmSourceOutputsCommonValues (&nImageOverlap, &magOffset, &zeroptErr, &fwhmMajor, &fwhmMinor, readout, imageHeader); 88 102 89 // we write out PSF-fits for all sources, regardless of quality. the source flags tell us the state 103 90 // by the time we call this function, all values should be assigned. let's use asserts to be sure in some cases. 104 for (i = 0; i < sources->n; i++) {91 for (int i = 0; i < sources->n; i++) { 105 92 pmSource *source = (pmSource *) sources->data[i]; 106 93 … … 113 100 } 114 101 115 // no difference between PSF and non-PSF model 116 pmModel *model = source->modelPSF; 117 118 if (model != NULL) { 119 PAR = model->params->data.F32; 120 dPAR = model->dparams->data.F32; 121 xPos = PAR[PM_PAR_XPOS]; 122 yPos = PAR[PM_PAR_YPOS]; 123 if (source->mode & PM_SOURCE_MODE_NONLINEAR_FIT) { 124 xErr = dPAR[PM_PAR_XPOS]; 125 yErr = dPAR[PM_PAR_YPOS]; 126 } else { 127 // in linear-fit mode, there is no error on the centroid 128 xErr = source->peak->dx; 129 yErr = source->peak->dy; 130 } 131 if (isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX])) { 132 axes = pmPSF_ModelToAxes (PAR, 20.0); 133 } else { 134 axes.major = NAN; 135 axes.minor = NAN; 136 axes.theta = NAN; 137 } 138 chisq = model->chisq; 139 nDOF = model->nDOF; 140 nPix = model->nPix; 141 apRadius = source->apRadius; 142 errMag = model->dparams->data.F32[PM_PAR_I0] / model->params->data.F32[PM_PAR_I0]; 143 } else { 144 xPos = source->peak->xf; 145 yPos = source->peak->yf; 146 xErr = source->peak->dx; 147 yErr = source->peak->dy; 148 axes.major = NAN; 149 axes.minor = NAN; 150 axes.theta = NAN; 151 chisq = NAN; 152 nDOF = 0; 153 nPix = 0; 154 apRadius = NAN; 155 errMag = NAN; 156 } 157 158 float calMag = isfinite(magOffset) ? source->psfMag + magOffset : NAN; 159 float peakMag = (source->peak->flux > 0) ? -2.5*log10(source->peak->flux) : NAN; 160 psS16 nImageOverlap = 1; 161 162 psSphere ptSky = {0.0, 0.0, 0.0, 0.0}; 163 float posAngle = 0.0; 164 float pltScale = 0.0; 165 pmSourceLocalAstrometry (&ptSky, &posAngle, &pltScale, chip, xPos, yPos); 102 // set the 'best' values for various output fields: 103 pmSourceOutputs outputs; 104 pmSourceOutputsSetValues (&outputs, source, chip, fwhmMajor, fwhmMinor, magOffset); 105 106 pmSourceOutputsMoments moments; 107 pmSourceOutputsSetMoments (&moments, source); 166 108 167 109 row = psMetadataAlloc (); 168 110 psMetadataAdd (row, PS_LIST_TAIL, "IPP_IDET", PS_DATA_U32, "IPP detection identifier index", source->seq); 169 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF", PS_DATA_F32, "PSF x coordinate", xPos);170 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF", PS_DATA_F32, "PSF y coordinate", yPos);171 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF_SIG", PS_DATA_F32, "Sigma in PSF x coordinate", xErr); // XXX this is only measured for non-linear fits172 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF_SIG", PS_DATA_F32, "Sigma in PSF y coordinate", yErr); // XXX this is only measured for non-linear fits173 psMetadataAdd (row, PS_LIST_TAIL, "RA_PSF", PS_DATA_F32, "PSF RA coordinate (degrees)", ptSky.r*PS_DEG_RAD);174 psMetadataAdd (row, PS_LIST_TAIL, "DEC_PSF", PS_DATA_F32, "PSF DEC coordinate (degrees)", ptSky.d*PS_DEG_RAD);175 psMetadataAdd (row, PS_LIST_TAIL, "POSANGLE", PS_DATA_F32, "position angle at source (degrees)", posAngle*PS_DEG_RAD);176 psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE", PS_DATA_F32, "plate scale at source (arcsec/pixel)", pltScale*PS_DEG_RAD*3600.0);111 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF", PS_DATA_F32, "PSF x coordinate", outputs.xPos); 112 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF", PS_DATA_F32, "PSF y coordinate", outputs.yPos); 113 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF_SIG", PS_DATA_F32, "Sigma in PSF x coordinate", outputs.xErr); // XXX this is only measured for non-linear fits 114 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF_SIG", PS_DATA_F32, "Sigma in PSF y coordinate", outputs.yErr); // XXX this is only measured for non-linear fits 115 psMetadataAdd (row, PS_LIST_TAIL, "RA_PSF", PS_DATA_F32, "PSF RA coordinate (degrees)", outputs.ra); 116 psMetadataAdd (row, PS_LIST_TAIL, "DEC_PSF", PS_DATA_F32, "PSF DEC coordinate (degrees)", outputs.dec); 117 psMetadataAdd (row, PS_LIST_TAIL, "POSANGLE", PS_DATA_F32, "position angle at source (degrees)", outputs.posAngle); 118 psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE", PS_DATA_F32, "plate scale at source (arcsec/pixel)", outputs.pltScale); 177 119 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG", PS_DATA_F32, "PSF fit instrumental magnitude", source->psfMag); 178 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG_SIG", PS_DATA_F32, "Sigma of PSF instrumental magnitude", errMag);120 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG_SIG", PS_DATA_F32, "Sigma of PSF instrumental magnitude", source->errMag); 179 121 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG", PS_DATA_F32, "magnitude in standard aperture", source->apMag); 180 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", apRadius);181 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", peakMag);182 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG", PS_DATA_F32, "PSF Magnitude using supplied calibration", calMag);122 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", outputs.apRadius); 123 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", outputs.peakMag); 124 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG", PS_DATA_F32, "PSF Magnitude using supplied calibration", outputs.calMag); 183 125 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG_SIG", PS_DATA_F32, "measured scatter of zero point calibration", zeroptErr); 184 126 psMetadataAdd (row, PS_LIST_TAIL, "SKY", PS_DATA_F32, "Sky level", source->sky); 185 127 psMetadataAdd (row, PS_LIST_TAIL, "SKY_SIGMA", PS_DATA_F32, "Sigma of sky level", source->skyErr); 186 128 187 psMetadataAdd (row, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "Chisq of PSF-fit", chisq);129 psMetadataAdd (row, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "Chisq of PSF-fit", outputs.chisq); 188 130 psMetadataAdd (row, PS_LIST_TAIL, "CR_NSIGMA", PS_DATA_F32, "Nsigma deviations from PSF to CF", source->crNsigma); 189 131 psMetadataAdd (row, PS_LIST_TAIL, "EXT_NSIGMA", PS_DATA_F32, "Nsigma deviations from PSF to EXT", source->extNsigma); 190 132 191 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MAJOR", PS_DATA_F32, "PSF width (major axis)", axes.major);192 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", axes.minor);193 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta);133 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MAJOR", PS_DATA_F32, "PSF width (major axis)", outputs.psfMajor); 134 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", outputs.psfMinor); 135 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", outputs.psfTheta); 194 136 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeightNotBad); 195 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", nDOF); 196 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", nPix); 197 198 // distinguish moments measure from window vs S/N > XX ?? 199 float mxx = source->moments ? source->moments->Mxx : NAN; 200 float mxy = source->moments ? source->moments->Mxy : NAN; 201 float myy = source->moments ? source->moments->Myy : NAN; 202 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", mxx); 203 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", mxy); 204 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", myy); 137 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", outputs.nDOF); 138 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", outputs.nPix); 139 140 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", moments.Mxx); 141 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", moments.Mxy); 142 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", moments.Myy); 205 143 206 144 psMetadataAdd (row, PS_LIST_TAIL, "FLAGS", PS_DATA_U32, "psphot analysis flags", source->mode); -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceIO_CMF_PS1_V2.c
r30621 r30763 49 49 50 50 #include "pmSourceIO.h" 51 #include "pmSourceOutputs.h" 51 52 52 53 // panstarrs-style FITS table output (header + table in 1st extension) … … 62 63 psArray *table; 63 64 psMetadata *row; 64 psF32 *PAR, *dPAR;65 psEllipseAxes axes;66 psF32 xPos, yPos;67 psF32 xErr, yErr;68 psF32 errMag, chisq, apRadius;69 psS32 nPix, nDOF;70 65 71 66 pmChip *chip = readout->parent->parent; 72 pmFPA *fpa = chip->parent;73 74 bool status1 = false;75 bool status2 = false;76 float magOffset = NAN;77 float exptime = psMetadataLookupF32 (&status1, fpa->concepts, "FPA.EXPOSURE");78 float zeropt = psMetadataLookupF32(&status2, fpa->concepts, "FPA.ZP");79 if (!isfinite(zeropt)) {80 zeropt = psMetadataLookupF32 (&status2, imageHeader, "ZPT_OBS");81 }82 if (status1 && status2 && (exptime > 0.0)) {83 magOffset = zeropt + 2.5*log10(exptime);84 }85 float zeroptErr = psMetadataLookupF32 (&status2, imageHeader, "ZPT_ERR");86 67 87 68 // if the sequence is defined, write these in seq order; otherwise … … 99 80 table = psArrayAllocEmpty (sources->n); 100 81 82 short nImageOverlap; 83 float magOffset; 84 float zeroptErr; 85 float fwhmMajor; 86 float fwhmMinor; 87 pmSourceOutputsCommonValues (&nImageOverlap, &magOffset, &zeroptErr, &fwhmMajor, &fwhmMinor, readout, imageHeader); 88 101 89 // we write out PSF-fits for all sources, regardless of quality. the source flags tell us the state 102 90 // by the time we call this function, all values should be assigned. let's use asserts to be sure in some cases. … … 112 100 } 113 101 114 // no difference between PSF and non-PSF model 115 pmModel *model = source->modelPSF; 116 117 if (model != NULL) { 118 PAR = model->params->data.F32; 119 dPAR = model->dparams->data.F32; 120 xPos = PAR[PM_PAR_XPOS]; 121 yPos = PAR[PM_PAR_YPOS]; 122 if (source->mode & PM_SOURCE_MODE_NONLINEAR_FIT) { 123 xErr = dPAR[PM_PAR_XPOS]; 124 yErr = dPAR[PM_PAR_YPOS]; 125 } else { 126 // in linear-fit mode, there is no error on the centroid 127 xErr = source->peak->dx; 128 yErr = source->peak->dy; 129 } 130 if (isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX])) { 131 axes = pmPSF_ModelToAxes (PAR, 20.0); 132 } else { 133 axes.major = NAN; 134 axes.minor = NAN; 135 axes.theta = NAN; 136 } 137 chisq = model->chisq; 138 nDOF = model->nDOF; 139 nPix = model->nPix; 140 apRadius = source->apRadius; 141 errMag = model->dparams->data.F32[PM_PAR_I0] / model->params->data.F32[PM_PAR_I0]; 142 } else { 143 xPos = source->peak->xf; 144 yPos = source->peak->yf; 145 xErr = source->peak->dx; 146 yErr = source->peak->dy; 147 axes.major = NAN; 148 axes.minor = NAN; 149 axes.theta = NAN; 150 chisq = NAN; 151 nDOF = 0; 152 nPix = 0; 153 apRadius = NAN; 154 errMag = NAN; 155 } 156 157 float calMag = isfinite(magOffset) ? source->psfMag + magOffset : NAN; 158 float peakMag = (source->peak->flux > 0) ? -2.5*log10(source->peak->flux) : NAN; 159 psS16 nImageOverlap = 1; 160 161 psSphere ptSky = {0.0, 0.0, 0.0, 0.0}; 162 float posAngle = 0.0; 163 float pltScale = 0.0; 164 pmSourceLocalAstrometry (&ptSky, &posAngle, &pltScale, chip, xPos, yPos); 102 // set the 'best' values for various output fields: 103 pmSourceOutputs outputs; 104 pmSourceOutputsSetValues (&outputs, source, chip, fwhmMajor, fwhmMinor, magOffset); 105 106 pmSourceOutputsMoments moments; 107 pmSourceOutputsSetMoments (&moments, source); 165 108 166 109 row = psMetadataAlloc (); 167 110 psMetadataAdd (row, PS_LIST_TAIL, "IPP_IDET", PS_DATA_U32, "IPP detection identifier index", source->seq); 168 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF", PS_DATA_F32, "PSF x coordinate", xPos);169 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF", PS_DATA_F32, "PSF y coordinate", yPos);170 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF_SIG", PS_DATA_F32, "Sigma in PSF x coordinate", xErr); // XXX this is only measured for non-linear fits171 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF_SIG", PS_DATA_F32, "Sigma in PSF y coordinate", yErr); // XXX this is only measured for non-linear fits172 psMetadataAdd (row, PS_LIST_TAIL, "POSANGLE", PS_DATA_F32, "position angle at source (degrees)", posAngle*PS_DEG_RAD);173 psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE", PS_DATA_F32, "plate scale at source (arcsec/pixel)", pltScale*PS_DEG_RAD*3600.0);111 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF", PS_DATA_F32, "PSF x coordinate", outputs.xPos); 112 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF", PS_DATA_F32, "PSF y coordinate", outputs.yPos); 113 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF_SIG", PS_DATA_F32, "Sigma in PSF x coordinate", outputs.xErr); // XXX this is only measured for non-linear fits 114 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF_SIG", PS_DATA_F32, "Sigma in PSF y coordinate", outputs.yErr); // XXX this is only measured for non-linear fits 115 psMetadataAdd (row, PS_LIST_TAIL, "POSANGLE", PS_DATA_F32, "position angle at source (degrees)", outputs.posAngle); 116 psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE", PS_DATA_F32, "plate scale at source (arcsec/pixel)", outputs.pltScale); 174 117 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG", PS_DATA_F32, "PSF fit instrumental magnitude", source->psfMag); 175 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG_SIG", PS_DATA_F32, "Sigma of PSF instrumental magnitude", errMag);118 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG_SIG", PS_DATA_F32, "Sigma of PSF instrumental magnitude", source->errMag); 176 119 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG", PS_DATA_F32, "magnitude in standard aperture", source->apMag); 177 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", apRadius);178 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", peakMag);179 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG", PS_DATA_F32, "PSF Magnitude using supplied calibration", calMag);120 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", outputs.apRadius); 121 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", outputs.peakMag); 122 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG", PS_DATA_F32, "PSF Magnitude using supplied calibration", outputs.calMag); 180 123 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG_SIG", PS_DATA_F32, "measured scatter of zero point calibration", zeroptErr); 181 psMetadataAdd (row, PS_LIST_TAIL, "RA_PSF", PS_DATA_F64, "PSF RA coordinate (degrees)", ptSky.r*PS_DEG_RAD);182 psMetadataAdd (row, PS_LIST_TAIL, "DEC_PSF", PS_DATA_F64, "PSF DEC coordinate (degrees)", ptSky.d*PS_DEG_RAD);124 psMetadataAdd (row, PS_LIST_TAIL, "RA_PSF", PS_DATA_F64, "PSF RA coordinate (degrees)", outputs.ra); 125 psMetadataAdd (row, PS_LIST_TAIL, "DEC_PSF", PS_DATA_F64, "PSF DEC coordinate (degrees)", outputs.dec); 183 126 psMetadataAdd (row, PS_LIST_TAIL, "SKY", PS_DATA_F32, "Sky level", source->sky); 184 127 psMetadataAdd (row, PS_LIST_TAIL, "SKY_SIGMA", PS_DATA_F32, "Sigma of sky level", source->skyErr); 185 128 186 psMetadataAdd (row, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "Chisq of PSF-fit", chisq);129 psMetadataAdd (row, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "Chisq of PSF-fit", outputs.chisq); 187 130 psMetadataAdd (row, PS_LIST_TAIL, "CR_NSIGMA", PS_DATA_F32, "Nsigma deviations from PSF to CF", source->crNsigma); 188 131 psMetadataAdd (row, PS_LIST_TAIL, "EXT_NSIGMA", PS_DATA_F32, "Nsigma deviations from PSF to EXT", source->extNsigma); 189 132 190 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MAJOR", PS_DATA_F32, "PSF width (major axis)", axes.major);191 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", axes.minor);192 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta);133 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MAJOR", PS_DATA_F32, "PSF width (major axis)", outputs.psfMajor); 134 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", outputs.psfMinor); 135 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", outputs.psfTheta); 193 136 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor", source->pixWeightNotBad); 194 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", nDOF); 195 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", nPix); 196 197 // distinguish moments measure from window vs S/N > XX ?? 198 float mxx = source->moments ? source->moments->Mxx : NAN; 199 float mxy = source->moments ? source->moments->Mxy : NAN; 200 float myy = source->moments ? source->moments->Myy : NAN; 201 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", mxx); 202 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", mxy); 203 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", myy); 137 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", outputs.nDOF); 138 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", outputs.nPix); 139 140 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", moments.Mxx); 141 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", moments.Mxy); 142 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", moments.Myy); 204 143 205 144 psMetadataAdd (row, PS_LIST_TAIL, "FLAGS", PS_DATA_U32, "psphot analysis flags", source->mode); -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourceIO_CMF_PS1_V3.c
r30621 r30763 49 49 50 50 #include "pmSourceIO.h" 51 #include "pmSourceOutputs.h" 51 52 52 53 // panstarrs-style FITS table output (header + table in 1st extension) … … 62 63 psArray *table; 63 64 psMetadata *row; 64 psF32 *PAR, *dPAR;65 psEllipseAxes axes;66 psF32 xPos, yPos;67 psF32 xErr, yErr;68 psF32 chisq, apRadius;69 psS32 nPix, nDOF;70 65 71 66 pmChip *chip = readout->parent->parent; 72 pmFPA *fpa = chip->parent;73 74 bool status1 = false;75 bool status2 = false;76 float magOffset = NAN;77 float exptime = psMetadataLookupF32 (&status1, fpa->concepts, "FPA.EXPOSURE");78 float zeropt = psMetadataLookupF32(&status2, fpa->concepts, "FPA.ZP");79 if (!isfinite(zeropt)) {80 zeropt = psMetadataLookupF32 (&status2, imageHeader, "ZPT_OBS");81 }82 if (status1 && status2 && (exptime > 0.0)) {83 magOffset = zeropt + 2.5*log10(exptime);84 }85 float zeroptErr = psMetadataLookupF32 (&status2, imageHeader, "ZPT_ERR");86 87 // we need a measure of the image quality (FWHM) for this image, in order to get the positional errors88 float fwhmMajor = psMetadataLookupF32(&status1, readout->analysis, "FWHM_MAJ");89 if (!status1) {90 fwhmMajor = psMetadataLookupF32(&status1, readout->analysis, "IQ_FW1");91 if (!status1) {92 fwhmMajor = 5.0; // XXX just a guess!93 }94 }95 float fwhmMinor = psMetadataLookupF32(&status1, readout->analysis, "FWHM_MIN");96 if (!status1) {97 fwhmMinor = psMetadataLookupF32(&status1, readout->analysis, "IQ_FW2");98 if (!status1) {99 fwhmMinor = 5.0; // XXX just a guess!100 }101 }102 67 103 68 // if the sequence is defined, write these in seq order; otherwise … … 115 80 table = psArrayAllocEmpty (sources->n); 116 81 82 short nImageOverlap; 83 float magOffset; 84 float zeroptErr; 85 float fwhmMajor; 86 float fwhmMinor; 87 pmSourceOutputsCommonValues (&nImageOverlap, &magOffset, &zeroptErr, &fwhmMajor, &fwhmMinor, readout, imageHeader); 88 117 89 // we write out PSF-fits for all sources, regardless of quality. the source flags tell us the state 118 90 // by the time we call this function, all values should be assigned. let's use asserts to be sure in some cases. … … 128 100 } 129 101 130 // no difference between PSF and non-PSF model 131 pmModel *model = source->modelPSF; 132 133 if (model != NULL) { 134 PAR = model->params->data.F32; 135 dPAR = model->dparams->data.F32; 136 xPos = PAR[PM_PAR_XPOS]; 137 yPos = PAR[PM_PAR_YPOS]; 138 if (source->mode & PM_SOURCE_MODE_NONLINEAR_FIT) { 139 xErr = dPAR[PM_PAR_XPOS]; 140 yErr = dPAR[PM_PAR_YPOS]; 141 } else { 142 xErr = fwhmMajor * source->errMag / 2.35; 143 yErr = fwhmMinor * source->errMag / 2.35; 144 } 145 if (isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX]) && isfinite(PAR[PM_PAR_SXX])) { 146 axes = pmPSF_ModelToAxes (PAR, 20.0); 147 } else { 148 axes.major = NAN; 149 axes.minor = NAN; 150 axes.theta = NAN; 151 } 152 chisq = model->chisq; 153 nDOF = model->nDOF; 154 nPix = model->nPix; 155 apRadius = source->apRadius; 156 } else { 157 bool useMoments = true; 158 useMoments = (useMoments && source->moments); // can't if there are no moments 159 useMoments = (useMoments && source->moments->nPixels); // can't if the moments were not measured 160 useMoments = (useMoments && !(source->mode && PM_SOURCE_MODE_MOMENTS_FAILURE)); // can't if the moments failed... 161 162 if (useMoments) { 163 xPos = source->moments->Mx; 164 yPos = source->moments->My; 165 xErr = fwhmMajor * source->errMag / 2.35; 166 yErr = fwhmMinor * source->errMag / 2.35; 167 } else { 168 xPos = source->peak->xf; 169 yPos = source->peak->yf; 170 xErr = source->peak->dx; 171 yErr = source->peak->dy; 172 } 173 axes.major = NAN; 174 axes.minor = NAN; 175 axes.theta = NAN; 176 chisq = NAN; 177 nDOF = 0; 178 nPix = 0; 179 apRadius = NAN; 180 } 181 182 float calMag = isfinite(magOffset) ? source->psfMag + magOffset : NAN; 183 float peakMag = (source->peak->flux > 0) ? -2.5*log10(source->peak->flux) : NAN; 184 psS16 nImageOverlap = 1; 185 186 psSphere ptSky = {0.0, 0.0, 0.0, 0.0}; 187 float posAngle = 0.0; 188 float pltScale = 0.0; 189 pmSourceLocalAstrometry (&ptSky, &posAngle, &pltScale, chip, xPos, yPos); 102 // set the 'best' values for various output fields: 103 pmSourceOutputs outputs; 104 pmSourceOutputsSetValues (&outputs, source, chip, fwhmMajor, fwhmMinor, magOffset); 105 106 pmSourceOutputsMoments moments; 107 pmSourceOutputsSetMoments (&moments, source); 190 108 191 109 row = psMetadataAlloc (); 192 110 psMetadataAdd (row, PS_LIST_TAIL, "IPP_IDET", PS_DATA_U32, "IPP detection identifier index", source->seq); 193 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF", PS_DATA_F32, "PSF x coordinate", xPos);194 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF", PS_DATA_F32, "PSF y coordinate", yPos);195 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF_SIG", PS_DATA_F32, "Sigma in PSF x coordinate", xErr);196 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF_SIG", PS_DATA_F32, "Sigma in PSF y coordinate", yErr);197 psMetadataAdd (row, PS_LIST_TAIL, "POSANGLE", PS_DATA_F32, "position angle at source (degrees)", posAngle*PS_DEG_RAD);198 psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE", PS_DATA_F32, "plate scale at source (arcsec/pixel)", pltScale*PS_DEG_RAD*3600.0);111 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF", PS_DATA_F32, "PSF x coordinate", outputs.xPos); 112 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF", PS_DATA_F32, "PSF y coordinate", outputs.yPos); 113 psMetadataAdd (row, PS_LIST_TAIL, "X_PSF_SIG", PS_DATA_F32, "Sigma in PSF x coordinate", outputs.xErr); 114 psMetadataAdd (row, PS_LIST_TAIL, "Y_PSF_SIG", PS_DATA_F32, "Sigma in PSF y coordinate", outputs.yErr); 115 psMetadataAdd (row, PS_LIST_TAIL, "POSANGLE", PS_DATA_F32, "position angle at source (degrees)", outputs.posAngle); 116 psMetadataAdd (row, PS_LIST_TAIL, "PLTSCALE", PS_DATA_F32, "plate scale at source (arcsec/pixel)", outputs.pltScale); 199 117 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG", PS_DATA_F32, "PSF fit instrumental magnitude", source->psfMag); 200 118 psMetadataAdd (row, PS_LIST_TAIL, "PSF_INST_MAG_SIG", PS_DATA_F32, "Sigma of PSF instrumental magnitude", source->errMag); … … 203 121 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG", PS_DATA_F32, "magnitude in standard aperture", source->apMag); 204 122 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RAW", PS_DATA_F32, "magnitude in reported aperture", source->apMagRaw); 205 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", apRadius);206 207 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG", PS_DATA_F32, "PSF Magnitude using supplied calibration", calMag);123 psMetadataAdd (row, PS_LIST_TAIL, "AP_MAG_RADIUS", PS_DATA_F32, "radius used for aperture mags", outputs.apRadius); 124 125 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG", PS_DATA_F32, "PSF Magnitude using supplied calibration", outputs.calMag); 208 126 psMetadataAdd (row, PS_LIST_TAIL, "CAL_PSF_MAG_SIG", PS_DATA_F32, "measured scatter of zero point calibration", zeroptErr); 209 127 210 128 // NOTE: RA & DEC (both double) need to be on an 8-byte boundary... 211 psMetadataAdd (row, PS_LIST_TAIL, "RA_PSF", PS_DATA_F64, "PSF RA coordinate (degrees)", ptSky.r*PS_DEG_RAD);212 psMetadataAdd (row, PS_LIST_TAIL, "DEC_PSF", PS_DATA_F64, "PSF DEC coordinate (degrees)", ptSky.d*PS_DEG_RAD);213 214 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", peakMag);129 psMetadataAdd (row, PS_LIST_TAIL, "RA_PSF", PS_DATA_F64, "PSF RA coordinate (degrees)", outputs.ra); 130 psMetadataAdd (row, PS_LIST_TAIL, "DEC_PSF", PS_DATA_F64, "PSF DEC coordinate (degrees)", outputs.dec); 131 132 psMetadataAdd (row, PS_LIST_TAIL, "PEAK_FLUX_AS_MAG", PS_DATA_F32, "Peak flux expressed as magnitude", outputs.peakMag); 215 133 psMetadataAdd (row, PS_LIST_TAIL, "SKY", PS_DATA_F32, "Sky level", source->sky); 216 134 psMetadataAdd (row, PS_LIST_TAIL, "SKY_SIGMA", PS_DATA_F32, "Sigma of sky level", source->skyErr); 217 135 218 psMetadataAdd (row, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "Chisq of PSF-fit", chisq);136 psMetadataAdd (row, PS_LIST_TAIL, "PSF_CHISQ", PS_DATA_F32, "Chisq of PSF-fit", outputs.chisq); 219 137 psMetadataAdd (row, PS_LIST_TAIL, "CR_NSIGMA", PS_DATA_F32, "Nsigma deviations from PSF to CF", source->crNsigma); 220 138 psMetadataAdd (row, PS_LIST_TAIL, "EXT_NSIGMA", PS_DATA_F32, "Nsigma deviations from PSF to EXT", source->extNsigma); 221 139 222 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MAJOR", PS_DATA_F32, "PSF width (major axis)", axes.major);223 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", axes.minor);224 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", axes.theta);140 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MAJOR", PS_DATA_F32, "PSF width (major axis)", outputs.psfMajor); 141 psMetadataAdd (row, PS_LIST_TAIL, "PSF_MINOR", PS_DATA_F32, "PSF width (minor axis)", outputs.psfMinor); 142 psMetadataAdd (row, PS_LIST_TAIL, "PSF_THETA", PS_DATA_F32, "PSF orientation angle", outputs.psfTheta); 225 143 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF", PS_DATA_F32, "PSF coverage/quality factor (bad)", source->pixWeightNotBad); 226 144 psMetadataAdd (row, PS_LIST_TAIL, "PSF_QF_PERFECT", PS_DATA_F32, "PSF coverage/quality factor (poor)", source->pixWeightNotPoor); 227 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", nDOF); 228 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", nPix); 229 230 // distinguish moments measure from window vs S/N > XX ?? 231 float Mxx = source->moments ? source->moments->Mxx : NAN; 232 float Mxy = source->moments ? source->moments->Mxy : NAN; 233 float Myy = source->moments ? source->moments->Myy : NAN; 234 235 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", Mxx); 236 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", Mxy); 237 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", Myy); 238 239 float M_c3 = source->moments ? 1.0*source->moments->Mxxx - 3.0*source->moments->Mxyy : NAN; 240 float M_s3 = source->moments ? 3.0*source->moments->Mxxy - 1.0*source->moments->Myyy : NAN; 241 float M_c4 = source->moments ? 1.0*source->moments->Mxxxx - 6.0*source->moments->Mxxyy + 1.0*source->moments->Myyyy : NAN; 242 float M_s4 = source->moments ? 4.0*source->moments->Mxxxy - 4.0*source->moments->Mxyyy : NAN; 243 244 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M3C", PS_DATA_F32, "third momemt cos theta", M_c3); 245 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M3S", PS_DATA_F32, "third momemt sin theta", M_s3); 246 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M4C", PS_DATA_F32, "fourth momemt cos theta", M_c4); 247 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M4S", PS_DATA_F32, "fourth momemt sin theta", M_s4); 248 249 float Mrf = source->moments ? source->moments->Mrf : NAN; 250 float Mrh = source->moments ? source->moments->Mrh : NAN; 251 float Krf = source->moments ? source->moments->KronFlux : NAN; 252 float dKrf = source->moments ? source->moments->KronFluxErr : NAN; 253 254 float Kinner = source->moments ? source->moments->KronFinner : NAN; 255 float Kouter = source->moments ? source->moments->KronFouter : NAN; 256 257 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_R1", PS_DATA_F32, "first radial moment", Mrf); 258 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_RH", PS_DATA_F32, "half radial moment", Mrh); 259 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX", PS_DATA_F32, "Kron Flux (in 2.5 R1)", Krf); 260 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_ERR", PS_DATA_F32, "Kron Flux Error", dKrf); 261 262 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_INNER", PS_DATA_F32, "Kron Flux (in 2.5 R1)", Kinner); 263 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_OUTER", PS_DATA_F32, "Kron Flux (in 2.5 R1)", Kouter); 264 265 psMetadataAdd (row, PS_LIST_TAIL, "FLAGS", PS_DATA_U32, "psphot analysis flags", source->mode); 266 psMetadataAdd (row, PS_LIST_TAIL, "FLAGS2", PS_DATA_U32, "psphot analysis flags", source->mode2); 145 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NDOF", PS_DATA_S32, "degrees of freedom", outputs.nDOF); 146 psMetadataAdd (row, PS_LIST_TAIL, "PSF_NPIX", PS_DATA_S32, "number of pixels in fit", outputs.nPix); 147 148 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XX", PS_DATA_F32, "second moments (X^2)", moments.Mxx); 149 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_XY", PS_DATA_F32, "second moments (X*Y)", moments.Mxy); 150 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_YY", PS_DATA_F32, "second moments (Y*Y)", moments.Myy); 151 152 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M3C", PS_DATA_F32, "third momemt cos theta", moments.M_c3); 153 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M3S", PS_DATA_F32, "third momemt sin theta", moments.M_s3); 154 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M4C", PS_DATA_F32, "fourth momemt cos theta", moments.M_c4); 155 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_M4S", PS_DATA_F32, "fourth momemt sin theta", moments.M_s4); 156 157 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_R1", PS_DATA_F32, "first radial moment", moments.Mrf); 158 psMetadataAdd (row, PS_LIST_TAIL, "MOMENTS_RH", PS_DATA_F32, "half radial moment", moments.Mrh); 159 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX", PS_DATA_F32, "Kron Flux (in 2.5 R1)", moments.Krf); 160 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_ERR", PS_DATA_F32, "Kron Flux Error", moments.dKrf); 161 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_INNER", PS_DATA_F32, "Kron Flux (in 2.5 R1)", moments.Kinner); 162 psMetadataAdd (row, PS_LIST_TAIL, "KRON_FLUX_OUTER", PS_DATA_F32, "Kron Flux (in 2.5 R1)", moments.Kouter); 163 psMetadataAdd (row, PS_LIST_TAIL, "FLAGS", PS_DATA_U32, "psphot analysis flags", source->mode); 164 psMetadataAdd (row, PS_LIST_TAIL, "FLAGS2", PS_DATA_U32, "psphot analysis flags", source->mode2); 267 165 psMetadataAdd (row, PS_LIST_TAIL, "PADDING2", PS_DATA_S32, "more padding", 0); 268 166 -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourcePhotometry.c
r29935 r30763 422 422 *pixWeightNotPoor = notPoorSum / modelSum; 423 423 424 if (false && isfinite(*pixWeightNotBad) && isfinite(*pixWeightNotPoor)) { 425 psAssert (*pixWeightNotBad <= *pixWeightNotPoor, "error: all bad pixels should also be poor"); 426 } 427 424 428 return (true); 425 429 } … … 674 678 675 679 // determine chisq, etc for linear normalization-only fit 676 bool pmSourceChisq (pmModel *model, psImage *image, psImage *mask, psImage *variance, psImageMaskType maskVal, const float covarFactor )680 bool pmSourceChisq (pmModel *model, psImage *image, psImage *mask, psImage *variance, psImageMaskType maskVal, const float covarFactor, int nParams) 677 681 { 678 682 PS_ASSERT_PTR_NON_NULL(model, false); … … 689 693 if (variance->data.F32[j][i] <= 0) 690 694 continue; 691 dC += PS_SQR (image->data.F32[j][i]) / (covarFactor * variance->data.F32[j][i]); 695 // dC += PS_SQR (image->data.F32[j][i]) / (covarFactor * variance->data.F32[j][i]); 696 dC += PS_SQR (image->data.F32[j][i]) / variance->data.F32[j][i]; 692 697 Npix ++; 693 698 } 694 699 } 700 695 701 model->nPix = Npix; 696 model->nDOF = Npix - 1;702 model->nDOF = Npix - nParams - 1; 697 703 model->chisq = dC; 704 model->chisqNorm = dC / model->nDOF; 698 705 699 706 return (true); -
branches/eam_branches/ipp-20110213/psModules/src/objects/pmSourcePhotometry.h
r29546 r30763 69 69 bool pmSourcePixelWeight (float *pixWeightNotBad, float *pixWeightNotPoor, pmModel *model, psImage *mask, psImageMaskType maskVal, psImageMaskType markVal); 70 70 71 bool pmSourceChisq (pmModel *model, psImage *image, psImage *mask, psImage *weight, psImageMaskType maskVal, const float covarFactor );71 bool pmSourceChisq (pmModel *model, psImage *image, psImage *mask, psImage *weight, psImageMaskType maskVal, const float covarFactor, int nParams); 72 72 73 73 bool pmSourceMeasureDiffStats (pmSource *source, psImageMaskType maskVal, psImageMaskType markVal);
Note:
See TracChangeset
for help on using the changeset viewer.
