Changeset 31153 for trunk/psModules/src/objects/pmSourceIO_CMF_PS1_V2.c
- Timestamp:
- Apr 4, 2011, 1:04:41 PM (15 years ago)
- Location:
- trunk/psModules
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
src/objects/pmSourceIO_CMF_PS1_V2.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules
- Property svn:ignore
-
old new 28 28 ChangeLog 29 29 psmodules-*.tar.* 30 a.out.dSYM
-
- Property svn:ignore
-
trunk/psModules/src/objects/pmSourceIO_CMF_PS1_V2.c
r30621 r31153 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 … … 91 72 if (source->seq == -1) { 92 73 // let's write these out in S/N order 93 sources = psArraySort (sources, pmSourceSortBy SN);74 sources = psArraySort (sources, pmSourceSortByFlux); 94 75 } else { 95 76 sources = psArraySort (sources, pmSourceSortBySeq); … … 98 79 99 80 table = psArrayAllocEmpty (sources->n); 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); 100 88 101 89 // we write out PSF-fits for all sources, regardless of quality. the source flags tell us the state … … 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); … … 322 261 // recreate the peak to match (xPos, yPos) +/- (xErr, yErr) 323 262 source->peak = pmPeakAlloc(PAR[PM_PAR_XPOS], PAR[PM_PAR_YPOS], peakFlux, PM_PEAK_LONE); 324 source->peak->flux = peakFlux; 263 source->peak->rawFlux = peakFlux; 264 source->peak->smoothFlux = peakFlux; 325 265 source->peak->xf = PAR[PM_PAR_XPOS]; // more accurate position 326 266 source->peak->yf = PAR[PM_PAR_YPOS]; // more accurate position 327 267 source->peak->dx = dPAR[PM_PAR_XPOS]; 328 268 source->peak->dy = dPAR[PM_PAR_YPOS]; 329 if (isfinite (source->errMag) && (source->errMag > 0.0)) {330 source->peak->SN = 1.0 / source->errMag;331 } else {332 source->peak->SN = sqrt(source->peak->flux); // an alternate proxy: various functions sort by peak S/N333 }334 269 335 270 source->pixWeightNotBad = psMetadataLookupF32 (&status, row, "PSF_QF"); … … 344 279 345 280 source->moments = pmMomentsAlloc (); 281 source->moments->Mx = source->peak->xf; // we don't have both Mx,My and xf,yf in the cmf 282 source->moments->My = source->peak->yf; // we don't have both Mx,My and xf,yf in the cmf 283 346 284 source->moments->Mxx = psMetadataLookupF32 (&status, row, "MOMENTS_XX"); 347 285 source->moments->Mxy = psMetadataLookupF32 (&status, row, "MOMENTS_XY"); … … 392 330 393 331 // let's write these out in S/N order 394 sources = psArraySort (sources, pmSourceSortBy SN);332 sources = psArraySort (sources, pmSourceSortByFlux); 395 333 396 334 table = psArrayAllocEmpty (sources->n); … … 611 549 612 550 // let's write these out in S/N order 613 sources = psArraySort (sources, pmSourceSortBy SN);551 sources = psArraySort (sources, pmSourceSortByFlux); 614 552 615 553 // we are writing one row per model; we need to write out same number of columns for each row: find the max Nparams
Note:
See TracChangeset
for help on using the changeset viewer.
