Changeset 36085 for trunk/psModules/src/objects/models/pmModel_DEV.c
- Timestamp:
- Aug 31, 2013, 5:55:16 AM (13 years ago)
- Location:
- trunk/psModules
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
src/objects/models/pmModel_DEV.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules
- Property svn:mergeinfo changed
/branches/eam_branches/ipp-20130711/psModules (added) merged: 35843,35876,35947-35948,35961-35963,35966-35967,36021,36024,36027,36066-36069,36075
- Property svn:mergeinfo changed
-
trunk/psModules/src/objects/models/pmModel_DEV.c
r35768 r36085 16 16 * PM_PAR_SYY 5 - Y^2 term of elliptical contour (sqrt(2) / SigmaY) 17 17 * PM_PAR_SXY 6 - X*Y term of elliptical contour 18 * PM_PAR_7 7 - normalized dev parameter19 18 20 19 note that a standard dev model uses exp(-K*(z^(1/2n) - 1). the additional elements (K, … … 49 48 #include "pmPSFtry.h" 50 49 #include "pmDetections.h" 50 #include "pmModel_CentralPixel.h" 51 51 52 52 #include "pmModel_DEV.h" … … 63 63 # define PM_MODEL_SET_LIMITS pmModelSetLimits_DEV 64 64 65 // f = exp(-z^0.125) 65 // f = exp(-kappa*r^(1/index)) 66 // f = exp(-kappa*z^(0.5/index)) 67 // index = 4, 0.5/index = 0.125 66 68 # define ALPHA 0.125 67 // # define ALPHA 0.2568 69 69 70 // the model is a function of the pixel coordinate (pixcoord[0,1] = x,y) … … 73 74 // Lax parameter limits 74 75 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.001, 0.001, -1.0 }; 75 static float paramsMaxLax[] = { 1.0e5, 1.0e 8, 1.0e4, 1.0e4, 100, 100, 1.0 };76 static float paramsMaxLax[] = { 1.0e5, 1.0e9, 1.0e5, 1.0e5, 100, 100, 1.0 }; 76 77 77 78 // Moderate parameter limits … … 86 87 static float *paramsMinUse = paramsMinLax; 87 88 static float *paramsMaxUse = paramsMaxLax; 88 static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5 };89 static float betaUse[] = { 2, 3e6, 5, 5, 10.0, 10.0, 0.5 }; 89 90 90 91 static bool limitsApply = true; // Apply limits? 91 92 # include "pmModel_SERSIC.CP.h"93 92 94 93 psF32 PM_MODEL_FUNC (psVector *deriv, … … 109 108 psAssert (z >= 0, "do not allow negative z values in model"); 110 109 111 float index = 0.5 / ALPHA; 112 float par7 = ALPHA; 113 float bn = 1.9992*index - 0.3271; 114 float Io = exp(bn); 115 116 psF32 f2 = bn*pow(z,ALPHA); 117 psF32 f1 = Io*exp(-f2); 118 119 psF32 radius = hypot(X, Y); 120 if (radius < 1.0) { 121 122 // ** use bilinear interpolation to the given location from the 4 surrounding pixels centered on the object center 123 124 // first, use Rmajor and index to find the central pixel flux (fraction of total flux) 125 psEllipseAxes axes; 126 pmModelParamsToAxes (&axes, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], true); 127 128 // get the central pixel flux from the lookup table 129 float xPix = (axes.major - centralPixelXo) / centralPixeldX; 130 xPix = PS_MIN (PS_MAX(xPix, 0), centralPixelNX - 1); 131 float yPix = (index - centralPixelYo) / centralPixeldY; 132 yPix = PS_MIN (PS_MAX(yPix, 0), centralPixelNY - 1); 133 134 // the integral of a Sersic has an analytical form as follows: 135 float logGamma = lgamma(2.0*index); 136 float bnFactor = pow(bn, 2.0*index); 137 float norm = 2.0 * M_PI * PS_SQR(axes.major) * index * exp(bn) * exp(logGamma) / bnFactor; 138 139 // XXX interpolate to get the value 140 // XXX for the moment, just integerize 141 // XXX I need to multiply by the integrated flux to get the flux in the central pixel 142 float Vcenter = centralPixel[(int)yPix][(int)xPix] * norm; 143 144 float px1 = 1.0 / PAR[PM_PAR_SXX]; 145 float py1 = 1.0 / PAR[PM_PAR_SYY]; 146 float z10 = PS_SQR(px1); 147 float z01 = PS_SQR(py1); 148 149 // which pixels do we need for this interpolation? 150 // (I do not keep state information, so I don't know anything about other evaluations of nearby pixels...) 151 if ((X >= 0) && (Y >= 0)) { 152 float z11 = z10 + z01 + PAR[PM_PAR_SXY]; // X * Y positive 153 float V00 = Vcenter; 154 float V10 = Io*exp(-bn*pow(z10,par7)); 155 float V01 = Io*exp(-bn*pow(z01,par7)); 156 float V11 = Io*exp(-bn*pow(z11,par7)); 157 f1 = interpolatePixels(V00, V10, V01, V11, X, Y); 158 } 159 if ((X < 0) && (Y >= 0)) { 160 float z11 = z10 + z01 - PAR[PM_PAR_SXY]; // X * Y negative 161 float V00 = Io*exp(-bn*pow(z10,par7)); 162 float V10 = Vcenter; 163 float V01 = Io*exp(-bn*pow(z11,par7)); 164 float V11 = Io*exp(-bn*pow(z01,par7)); 165 f1 = interpolatePixels(V00, V10, V01, V11, (1.0 + X), Y); 166 } 167 if ((X >= 0) && (Y < 0)) { 168 float z11 = z10 + z01 - PAR[PM_PAR_SXY]; // X * Y negative 169 float V00 = Io*exp(-bn*pow(z01,par7)); 170 float V10 = Io*exp(-bn*pow(z11,par7)); 171 float V01 = Vcenter; 172 float V11 = Io*exp(-bn*pow(z10,par7)); 173 f1 = interpolatePixels(V00, V10, V01, V11, X, (1.0 + Y)); 174 } 175 if ((X < 0) && (Y < 0)) { 176 float z11 = z10 + z01 + PAR[PM_PAR_SXY]; // X * Y positive 177 float V00 = Io*exp(-bn*pow(z11,par7)); 178 float V10 = Io*exp(-bn*pow(z10,par7)); 179 float V01 = Io*exp(-bn*pow(z01,par7)); 180 float V11 = Vcenter; 181 f1 = interpolatePixels(V00, V10, V01, V11, (1.0 + X), (1.0 + Y)); 182 } 110 // for DEV, we can hard-wire kappa(4): 111 // float index = 4.0; 112 float kappa = 7.670628; 113 114 // r = sqrt(z) 115 float q = kappa*pow(z,ALPHA); 116 float f0 = exp(-q); 117 118 assert (isfinite(q)); 119 assert (isfinite(f0)); 120 121 // only worry about the central pixels at most 122 float radius = hypot(X, Y); 123 if (radius <= 1.5) { 124 // Nsub ~ 10*index^2 + 1 125 psEllipseAxes axes = pmPSF_ModelToAxes(PAR, pmModelClassGetType ("PS_MODEL_DEV")); 126 int Nsub = 2 * ((int)(25 / axes.minor)) + 1; 127 Nsub = PS_MIN (Nsub, 121); 128 Nsub = PS_MAX (Nsub, 11); 129 f0 = pmModelCP_SersicSubpix (X, Y, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], 4.0, Nsub); 183 130 } 184 131 185 psF32 z0 = PAR[PM_PAR_I0]*f1; 186 psF32 f0 = PAR[PM_PAR_SKY] + z0; 187 188 assert (isfinite(f2)); 132 float f1 = PAR[PM_PAR_I0]*f0; 133 float f = PAR[PM_PAR_SKY] + f1; 134 189 135 assert (isfinite(f1)); 190 assert (isfinite(z0)); 191 assert (isfinite(f0)); 136 assert (isfinite(f)); 192 137 193 138 if (deriv != NULL) { … … 195 140 196 141 dPAR[PM_PAR_SKY] = +1.0; 197 dPAR[PM_PAR_I0] = +2.0*f1; // XXX extra damping.. 198 199 // gradient is infinite for z = 0; saturate at z = 0.01 200 psF32 z1 = (z < 0.01) ? z0*bn*ALPHA*pow(0.01,ALPHA - 1.0) : z0*bn*ALPHA*pow(z,ALPHA - 1.0); 201 202 assert (isfinite(z1)); 203 204 dPAR[PM_PAR_XPOS] = +1.0*z1*(2.0*px/PAR[PM_PAR_SXX] + Y*PAR[PM_PAR_SXY]); 205 dPAR[PM_PAR_YPOS] = +1.0*z1*(2.0*py/PAR[PM_PAR_SYY] + X*PAR[PM_PAR_SXY]); 206 dPAR[PM_PAR_SXX] = +2.0*z1*px*px/PAR[PM_PAR_SXX]; 207 dPAR[PM_PAR_SYY] = +2.0*z1*py*py/PAR[PM_PAR_SYY]; 208 dPAR[PM_PAR_SXY] = -1.0*z1*X*Y; 209 } 210 return (f0); 142 dPAR[PM_PAR_I0] = +f0; 143 144 if (z > 0.01) { 145 float z1 = f1*kappa*ALPHA*pow(z,ALPHA-1.0); 146 dPAR[PM_PAR_XPOS] = +1.0*z1*(2.0*px + Y*PAR[PM_PAR_SXY]); 147 dPAR[PM_PAR_YPOS] = +1.0*z1*(2.0*py + X*PAR[PM_PAR_SXY]); 148 dPAR[PM_PAR_SXX] = +2.0*z1*px*px/PAR[PM_PAR_SXX]; 149 dPAR[PM_PAR_SYY] = +2.0*z1*py*py/PAR[PM_PAR_SYY]; 150 dPAR[PM_PAR_SXY] = -1.0*z1*X*Y; 151 } else { 152 // gradient -> 0 for z -> 0, but has undef form 153 float z1 = f1*kappa*ALPHA*pow(z,ALPHA); 154 dPAR[PM_PAR_XPOS] = +1.0*z1*(2.0/PAR[PM_PAR_SXX] + PAR[PM_PAR_SXY]); 155 dPAR[PM_PAR_YPOS] = +1.0*z1*(2.0/PAR[PM_PAR_SYY] + PAR[PM_PAR_SXY]); 156 dPAR[PM_PAR_SXX] = +2.0*z1*px/PAR[PM_PAR_SXX]/PAR[PM_PAR_SXX]; 157 dPAR[PM_PAR_SYY] = +2.0*z1*py/PAR[PM_PAR_SYY]/PAR[PM_PAR_SYY]; 158 dPAR[PM_PAR_SXY] = -1.0*z1; 159 } 160 } 161 return (f); 211 162 } 212 163 … … 302 253 } 303 254 304 // the normalization is modified by the slope305 float index = 0.5 / ALPHA;306 float bn = 1.9992*index - 0.3271;307 float Io = exp(0.5*bn);308 309 255 // set the model normalization 310 256 if (!pmModelSetNorm(&PAR[PM_PAR_I0], source)) { 311 257 return false; 312 258 } 313 PAR[PM_PAR_I0] /= Io;314 259 315 260 // set the model position … … 328 273 psEllipseAxes axes; 329 274 pmModelParamsToAxes (&axes, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], true); 330 float AspectRatio = axes.minor / axes.major; 331 332 float index = 4.0; 333 float bn = 1.9992*index - 0.3271; 334 335 // the integral of a Sersic has an analytical form as follows: 336 float logGamma = lgamma(2.0*index); 337 float bnFactor = pow(bn, 2.0*index); 338 float norm = 2.0 * M_PI * PS_SQR(axes.major) * index * exp(bn) * exp(logGamma) / bnFactor; 339 340 psF64 Flux = PAR[PM_PAR_I0] * norm * AspectRatio; 341 342 return(Flux); 275 276 float norm = 0.00168012; 277 float flux = PAR[PM_PAR_I0] * 2.0 * M_PI * axes.major * axes.minor * norm; 278 279 return(flux); 343 280 } 344 281 … … 359 296 pmModelParamsToAxes (&axes, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], true); 360 297 361 // f = Io exp(-z^n) -> z^n = ln(Io/f) 362 psF64 zn = log(PAR[PM_PAR_I0] / flux); 363 psF64 radius = axes.major * sqrt (2.0) * pow(zn, 0.5 / ALPHA); 298 // static value for DEV: 299 float kappa = 7.670628; 300 301 // f = Io exp(-kappa*z^n) -> z^n = ln(Io/f) / kappa 302 psF64 zn = log(PAR[PM_PAR_I0] / flux) / kappa; 303 psF64 radius = axes.major * pow(zn, 0.5 / ALPHA); 364 304 365 305 psAssert (isfinite(radius), "fix this code: radius should not be nan for Io = %f, flux = %f, major = %f (%f, %f, %f)",
Note:
See TracChangeset
for help on using the changeset viewer.
