Changeset 25027 for branches/pap/psModules/src/objects/pmSourceMoments.c
- Timestamp:
- Aug 7, 2009, 4:08:25 PM (17 years ago)
- Location:
- branches/pap
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/pap
- Property svn:mergeinfo changed
-
branches/pap/psModules
- Property svn:mergeinfo deleted
-
branches/pap/psModules/src/objects/pmSourceMoments.c
r21363 r25027 57 57 # define VALID_RADIUS(X,Y,RAD2) (((RAD2) >= (PS_SQR(X) + PS_SQR(Y))) ? 1 : 0) 58 58 59 bool pmSourceMoments(pmSource *source, psF32 radius )59 bool pmSourceMoments(pmSource *source, psF32 radius, psF32 sigma, psF32 minSN) 60 60 { 61 61 PS_ASSERT_PTR_NON_NULL(source, false); … … 84 84 psF32 Y1 = 0.0; 85 85 psF32 R2 = PS_SQR(radius); 86 psF32 minSN2 = PS_SQR(minSN); 87 psF32 rsigma2 = 0.5 / PS_SQR(sigma); 86 88 87 89 // a note about coordinates: coordinates of objects throughout psphot refer to the primary … … 97 99 98 100 for (psS32 row = 0; row < source->pixels->numRows ; row++) { 101 102 psF32 yDiff = row - yPeak; 103 if (fabs(yDiff) > radius) continue; 99 104 100 105 psF32 *vPix = source->pixels->data.F32[row]; … … 113 118 114 119 psF32 xDiff = col - xPeak; 115 psF32 yDiff = row - yPeak;120 if (fabs(xDiff) > radius) continue; 116 121 117 122 // radius is just a function of (xDiff, yDiff) … … 121 126 psF32 wDiff = *vWgt; 122 127 123 // XXX EAM : should this limit be user-defined? 124 if (PS_SQR(pDiff) < wDiff) continue; 125 126 Var += wDiff; 127 Sum += pDiff; 128 129 psF32 xWght = xDiff * pDiff; 130 psF32 yWght = yDiff * pDiff; 131 132 X1 += xWght; 133 Y1 += yWght; 128 // skip pixels below specified significance level 129 if (PS_SQR(pDiff) < minSN2*wDiff) continue; 130 if (pDiff < 0) continue; 131 132 if (sigma > 0.0) { 133 // apply a pseudo-gaussian weight 134 135 // XXX a lot of extra flops; can we do pre-calculate? 136 psF32 z = (PS_SQR(xDiff) + PS_SQR(yDiff))*rsigma2; 137 assert (z >= 0.0); 138 psF32 t = 1.0 + z*(1.0 + z/2.0*(1.0 + z/3.0)); 139 psF32 weight = 1.0 / t; 140 141 // fprintf (stderr, "%6.1f %6.1f %8.1f %8.1f %5.3f ", xDiff, yDiff, pDiff, wDiff, weight); 142 143 wDiff *= weight; 144 pDiff *= weight; 145 } 146 147 Var += wDiff; 148 Sum += pDiff; 149 150 psF32 xWght = xDiff * pDiff; 151 psF32 yWght = yDiff * pDiff; 152 153 X1 += xWght; 154 Y1 += yWght; 155 156 // fprintf (stderr, " : %6.1f %6.1f %8.1f %8.1f\n", X1, Y1, Sum, Var); 134 157 135 158 peakPixel = PS_MAX (*vPix, peakPixel); … … 188 211 for (psS32 row = 0; row < source->pixels->numRows ; row++) { 189 212 213 psF32 yDiff = row - yCM; 214 if (fabs(yDiff) > radius) continue; 215 190 216 psF32 *vPix = source->pixels->data.F32[row]; 191 217 psF32 *vWgt = source->variance->data.F32[row]; … … 203 229 204 230 psF32 xDiff = col - xCM; 205 psF32 yDiff = row - yCM;231 if (fabs(xDiff) > radius) continue; 206 232 207 233 // radius is just a function of (xDiff, yDiff) … … 215 241 // XXX EAM : should this limit be user-defined? 216 242 217 if (PS_SQR(pDiff) < wDiff) continue;243 if (PS_SQR(pDiff) < minSN2*wDiff) continue; 218 244 if (pDiff < 0) continue; 245 246 if (sigma > 0.0) { 247 // apply a pseudo-gaussian weight 248 249 // XXX a lot of extra flops; can we do pre-calculate? 250 psF32 z = (PS_SQR(xDiff) + PS_SQR(yDiff))*rsigma2; 251 assert (z >= 0.0); 252 psF32 t = 1.0 + z*(1.0 + z/2.0*(1.0 + z/3.0)); 253 psF32 weight = 1.0 / t; 254 255 // fprintf (stderr, "%6.1f %6.1f %8.1f %8.1f %5.3f ", xDiff, yDiff, pDiff, wDiff, weight); 256 257 wDiff *= weight; 258 pDiff *= weight; 259 } 219 260 220 261 Sum += pDiff;
Note:
See TracChangeset
for help on using the changeset viewer.
