Changeset 36375 for trunk/psphot/src/psphotPetrosianStats.c
- Timestamp:
- Dec 10, 2013, 2:55:11 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
-
. (modified) (1 prop)
-
psphot (modified) (1 prop)
-
psphot/src (modified) (2 props)
-
psphot/src/psphotPetrosianStats.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
trunk/psphot
- Property svn:mergeinfo changed
-
trunk/psphot/src
- Property svn:ignore
-
old new 24 24 psphotModelTest 25 25 psphotMinimal 26 psphotFullForce 27 psmakecff
-
- Property svn:mergeinfo changed
- Property svn:ignore
-
trunk/psphot/src/psphotPetrosianStats.c
r34086 r36375 6 6 // generate the Petrosian radius and flux from the mean surface brightness (r_i) 7 7 8 float InterpolateValuesQuadratic (float *Xin, float *Yin, float X); 8 9 float InterpolateValues (float X0, float Y0, float X1, float Y1, float X); 9 10 float InterpolateValuesErrX (float X0, float Y0, float X1, float Y1, float X, float dX0, float dX1); … … 20 21 if (!profile->binSB) { 21 22 psLogMsg ("psphot", PS_LOG_DETAIL, "no petrosian profile, skipping source %f, %f", source->peak->xf, source->peak->yf); 23 source->mode2 |= PM_SOURCE_MODE2_PETRO_NO_PROFILE; 22 24 return true; 23 25 } … … 53 55 float dFsum2 = 0.0; 54 56 55 float nSigma = 3.0;57 float nSigma = 2.0; 56 58 int lowestSignificantRadius = 0; 57 59 float lowestSignificantRatio = 1.0; … … 117 119 petRadius = InterpolateValues (1.0, 0.0, petRatio->data.F32[nOut], refRadius->data.F32[nOut], PETROSIAN_RATIO); 118 120 petRadiusErr = InterpolateValuesErrX (1.0, 0.0, petRatio->data.F32[nOut], refRadius->data.F32[nOut], PETROSIAN_RATIO, 0.0, petRatioErr->data.F32[nOut]); 119 } else { 120 petRadius = InterpolateValues (petRatio->data.F32[nOut-1], refRadius->data.F32[nOut-1], petRatio->data.F32[nOut], refRadius->data.F32[nOut], PETROSIAN_RATIO); 121 petRadiusErr = InterpolateValuesErrX (petRatio->data.F32[nOut-1], refRadius->data.F32[nOut-1], petRatio->data.F32[nOut], refRadius->data.F32[nOut], PETROSIAN_RATIO, petRatioErr->data.F32[nOut-1], petRatioErr->data.F32[nOut]); 121 source->mode2 |= PM_SOURCE_MODE2_PETRO_RATIO_ZEROBIN; 122 } else { 123 // petRadius = InterpolateValues (petRatio->data.F32[nOut-1], refRadius->data.F32[nOut-1], petRatio->data.F32[nOut], refRadius->data.F32[nOut], PETROSIAN_RATIO); 124 if (nOut > 1) { 125 petRadius = InterpolateValuesQuadratic (&petRatio->data.F32[nOut-2], &refRadius->data.F32[nOut-2], PETROSIAN_RATIO); 126 } else { 127 petRadius = InterpolateValuesQuadratic (&petRatio->data.F32[nOut-3], &refRadius->data.F32[nOut-3], PETROSIAN_RATIO); 128 } 129 # if (PS_TRACE_ON) 130 float petRadiusLinear = InterpolateValues (petRatio->data.F32[nOut-1], refRadius->data.F32[nOut-1], petRatio->data.F32[nOut], refRadius->data.F32[nOut], PETROSIAN_RATIO); 131 if (fabs(petRadius - petRadiusLinear) > fabs(refRadius->data.F32[nOut] - refRadius->data.F32[nOut-1])) { 132 fprintf (stderr, "big difference : %f vs %f\n", petRadius, petRadiusLinear); 133 } 134 #endif 135 petRadiusErr = InterpolateValuesErrX (petRatio->data.F32[nOut-1], refRadius->data.F32[nOut-1], petRatio->data.F32[nOut], refRadius->data.F32[nOut], PETROSIAN_RATIO, petRatioErr->data.F32[nOut-1], petRatioErr->data.F32[nOut]); 122 136 } 123 137 above = false; … … 148 162 fprintf (stderr, "nan pet radius\n"); 149 163 } 164 source->mode2 |= PM_SOURCE_MODE2_PETRO_INSIG_RATIO; 150 165 } 151 166 … … 180 195 bool found50 = false; 181 196 bool found90 = false; 197 182 198 // XXX use bisection to do this faster: 183 199 for (int i = 0; !(found50 && found90) && i < refRadius->n; i++) { … … 235 251 } 236 252 253 // Lagrange's form of the interpolating polynomial... 254 float InterpolateValuesQuadratic (float *Xin, float *Yin, float X) { 255 256 float dx01 = Xin[0] - Xin[1]; 257 float dx02 = Xin[0] - Xin[2]; 258 float dx12 = Xin[1] - Xin[2]; 259 260 float dx0 = X - Xin[0]; 261 float dx1 = X - Xin[1]; 262 float dx2 = X - Xin[2]; 263 264 float y0 = Yin[0]*dx1*dx2/(dx01*dx02); 265 float y1 = Yin[1]*dx0*dx2/(dx01*dx12); // need - sign 266 float y2 = Yin[2]*dx0*dx1/(dx02*dx12); 267 268 float Y = y0 - y1 + y2; 269 return Y; 270 } 271 237 272 float InterpolateValues (float X0, float Y0, float X1, float Y1, float X) { 238 273 float dydx = (Y1 - Y0) / (X1 - X0);
Note:
See TracChangeset
for help on using the changeset viewer.
