Changeset 36085 for trunk/psModules/src/objects/models
- Timestamp:
- Aug 31, 2013, 5:55:16 AM (13 years ago)
- Location:
- trunk/psModules
- Files:
-
- 10 edited
-
. (modified) (1 prop)
-
src/objects/models/pmModel_DEV.c (modified) (10 diffs)
-
src/objects/models/pmModel_EXP.c (modified) (8 diffs)
-
src/objects/models/pmModel_GAUSS.c (modified) (1 diff)
-
src/objects/models/pmModel_PGAUSS.c (modified) (1 diff)
-
src/objects/models/pmModel_PS1_V1.c (modified) (1 diff)
-
src/objects/models/pmModel_QGAUSS.c (modified) (1 diff)
-
src/objects/models/pmModel_RGAUSS.c (modified) (1 diff)
-
src/objects/models/pmModel_SERSIC.c (modified) (8 diffs)
-
src/objects/models/pmModel_TRAIL.c (modified) (1 diff)
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)", -
trunk/psModules/src/objects/models/pmModel_EXP.c
r35768 r36085 45 45 #include "pmPSFtry.h" 46 46 #include "pmDetections.h" 47 #include "pmModel_CentralPixel.h" 47 48 48 49 #include "pmModel_EXP.h" … … 65 66 // Lax parameter limits 66 67 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.05, 0.05, -1.0 }; 67 static float paramsMaxLax[] = { 1.0e5, 1.0e 8, 1.0e4, 1.0e4, 100, 100, 1.0 };68 static float paramsMaxLax[] = { 1.0e5, 1.0e9, 1.0e5, 1.0e5, 100, 100, 1.0 }; 68 69 69 70 // Moderate parameter limits … … 78 79 static float *paramsMinUse = paramsMinLax; 79 80 static float *paramsMaxUse = paramsMaxLax; 80 static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5};81 static float betaUse[] = { 2, 3e6, 5, 5, 10.0, 10.0, 0.5}; 81 82 82 83 static bool limitsApply = true; // Apply limits? 83 84 84 # include "pmModel_SERSIC.CP.h" 85 // # include "pmModel_SERSIC.CP.h" 86 87 // the problems I'm having with the SERSIC-like functions are: 88 // 1) making sure I have the right functional form so that PAR[SXX,etc] represent R_eff (half-light radius) 89 // 2) getting the central pixel right 90 // 3) getting the derivaties right. 85 91 86 92 psF32 PM_MODEL_FUNC (psVector *deriv, … … 101 107 psAssert (z >= 0, "do not allow negative z values in model"); 102 108 103 float index = 1.0; 104 float par7 = 0.5; 105 float bn = 1.9992*index - 0.3271; 106 float Io = exp(bn); 107 108 psF32 f2 = bn*sqrt(z); 109 psF32 f1 = Io*exp(-f2); 110 109 // for EXP, we can hard-wire kappa(1): 110 // float index = 1.0; 111 float kappa = 1.70056; 112 113 // sqrt(z) is r 114 float q = kappa*sqrt(z); 115 psF32 f0 = exp(-q); 116 117 assert (isfinite(q)); 118 119 // only worry about the central 4 pixels at most 111 120 psF32 radius = hypot(X, Y); 112 if (radius < 1.0) { 113 114 // ** use bilinear interpolation to the given location from the 4 surrounding pixels centered on the object center 115 116 // first, use Rmajor and index to find the central pixel flux (fraction of total flux) 117 psEllipseAxes axes; 118 pmModelParamsToAxes (&axes, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], true); 119 120 // get the central pixel flux from the lookup table 121 float xPix = (axes.major - centralPixelXo) / centralPixeldX; 122 xPix = PS_MIN (PS_MAX(xPix, 0), centralPixelNX - 1); 123 float yPix = (index - centralPixelYo) / centralPixeldY; 124 yPix = PS_MIN (PS_MAX(yPix, 0), centralPixelNY - 1); 125 126 // the integral of a Sersic has an analytical form as follows: 127 float logGamma = lgamma(2.0*index); 128 float bnFactor = pow(bn, 2.0*index); 129 float norm = 2.0 * M_PI * PS_SQR(axes.major) * index * exp(bn) * exp(logGamma) / bnFactor; 130 131 // XXX interpolate to get the value 132 // XXX for the moment, just integerize 133 // XXX I need to multiply by the integrated flux to get the flux in the central pixel 134 float Vcenter = centralPixel[(int)yPix][(int)xPix] * norm; 135 136 float px1 = 1.0 / PAR[PM_PAR_SXX]; 137 float py1 = 1.0 / PAR[PM_PAR_SYY]; 138 float z10 = PS_SQR(px1); 139 float z01 = PS_SQR(py1); 140 141 // which pixels do we need for this interpolation? 142 // (I do not keep state information, so I don't know anything about other evaluations of nearby pixels...) 143 if ((X >= 0) && (Y >= 0)) { 144 float z11 = z10 + z01 + PAR[PM_PAR_SXY]; // X * Y positive 145 float V00 = Vcenter; 146 float V10 = Io*exp(-bn*pow(z10,par7)); 147 float V01 = Io*exp(-bn*pow(z01,par7)); 148 float V11 = Io*exp(-bn*pow(z11,par7)); 149 f1 = interpolatePixels(V00, V10, V01, V11, X, Y); 150 } 151 if ((X < 0) && (Y >= 0)) { 152 float z11 = z10 + z01 - PAR[PM_PAR_SXY]; // X * Y negative 153 float V00 = Io*exp(-bn*pow(z10,par7)); 154 float V10 = Vcenter; 155 float V01 = Io*exp(-bn*pow(z11,par7)); 156 float V11 = Io*exp(-bn*pow(z01,par7)); 157 f1 = interpolatePixels(V00, V10, V01, V11, (1.0 + 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(z01,par7)); 162 float V10 = Io*exp(-bn*pow(z11,par7)); 163 float V01 = Vcenter; 164 float V11 = Io*exp(-bn*pow(z10,par7)); 165 f1 = interpolatePixels(V00, V10, V01, V11, X, (1.0 + Y)); 166 } 167 if ((X < 0) && (Y < 0)) { 168 float z11 = z10 + z01 + PAR[PM_PAR_SXY]; // X * Y positive 169 float V00 = Io*exp(-bn*pow(z11,par7)); 170 float V10 = Io*exp(-bn*pow(z10,par7)); 171 float V01 = Io*exp(-bn*pow(z01,par7)); 172 float V11 = Vcenter; 173 f1 = interpolatePixels(V00, V10, V01, V11, (1.0 + X), (1.0 + Y)); 174 } 175 } 176 177 psF32 z0 = PAR[PM_PAR_I0]*f1; 178 psF32 f0 = PAR[PM_PAR_SKY] + z0; 179 180 assert (isfinite(f2)); 121 if (radius <= 1.5) { 122 f0 = pmModelCP_SersicSubpix (X, Y, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], 1.0, 51); 123 } 124 assert (isfinite(f0)); 125 126 psF32 f1 = PAR[PM_PAR_I0]*f0; 127 psF32 f = PAR[PM_PAR_SKY] + f1; 128 181 129 assert (isfinite(f1)); 182 assert (isfinite(z0)); 183 assert (isfinite(f0)); 130 assert (isfinite(f)); 184 131 185 132 if (deriv != NULL) { … … 187 134 188 135 dPAR[PM_PAR_SKY] = +1.0; 189 dPAR[PM_PAR_I0] = +f1; 190 191 // gradient is infinite for z = 0; saturate at z = 0.01 192 // z1 is -df/dz (the negative sign is canceled by most of dz/dPAR[i] 193 psF32 z1 = (z < 0.01) ? 0.5*bn*z0/sqrt(0.01) : 0.5*bn*z0/sqrt(z); 194 195 // XXX dampen SXX and SYY as in GAUSS? 196 dPAR[PM_PAR_XPOS] = +1.0*z1*(2.0*px/PAR[PM_PAR_SXX] + Y*PAR[PM_PAR_SXY]); 197 dPAR[PM_PAR_YPOS] = +1.0*z1*(2.0*py/PAR[PM_PAR_SYY] + X*PAR[PM_PAR_SXY]); 198 dPAR[PM_PAR_SXX] = +2.0*z1*px*px/PAR[PM_PAR_SXX]; 199 dPAR[PM_PAR_SYY] = +2.0*z1*py*py/PAR[PM_PAR_SYY]; 200 dPAR[PM_PAR_SXY] = -1.0*z1*X*Y; 201 } 202 return (f0); 136 dPAR[PM_PAR_I0] = +f0; 137 138 if (z > 0.01) { 139 float z1 = 0.5*f1*kappa/sqrt(z); 140 dPAR[PM_PAR_XPOS] = +1.0*z1*(2.0*px + Y*PAR[PM_PAR_SXY]); 141 dPAR[PM_PAR_YPOS] = +1.0*z1*(2.0*py + X*PAR[PM_PAR_SXY]); 142 dPAR[PM_PAR_SXX] = +2.0*z1*px*px/PAR[PM_PAR_SXX]; 143 dPAR[PM_PAR_SYY] = +2.0*z1*py*py/PAR[PM_PAR_SYY]; 144 dPAR[PM_PAR_SXY] = -1.0*z1*X*Y; 145 } else { 146 // gradient -> 0 for z -> 0, but has undef form 147 float z1 = 0.5*f1*kappa; 148 dPAR[PM_PAR_XPOS] = +1.0*z1*(2.0/PAR[PM_PAR_SXX] + PAR[PM_PAR_SXY]); 149 dPAR[PM_PAR_YPOS] = +1.0*z1*(2.0/PAR[PM_PAR_SYY] + PAR[PM_PAR_SXY]); 150 dPAR[PM_PAR_SXX] = +2.0*z1*px/PAR[PM_PAR_SXX]/PAR[PM_PAR_SXX]; 151 dPAR[PM_PAR_SYY] = +2.0*z1*py/PAR[PM_PAR_SYY]/PAR[PM_PAR_SYY]; 152 dPAR[PM_PAR_SXY] = -1.0*z1; 153 } 154 } 155 return (f); 203 156 } 204 157 … … 314 267 psEllipseAxes axes; 315 268 pmModelParamsToAxes (&axes, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], true); 316 float AspectRatio = axes.minor / axes.major; 317 318 float index = 1.0; 319 float bn = 1.9992*index - 0.3271; 320 321 // the integral of a Sersic has an analytical form as follows: 322 float logGamma = lgamma(2.0*index); 323 float bnFactor = pow(bn, 2.0*index); 324 float norm = 2.0 * M_PI * PS_SQR(axes.major) * index * exp(bn) * exp(logGamma) / bnFactor; 325 326 psF64 Flux = PAR[PM_PAR_I0] * norm * AspectRatio; 327 328 return(Flux); 269 270 // static value for EXP: 271 float norm = 0.34578; // \int exp(-kappa*sqrt(z)) r dr 272 273 float flux = PAR[PM_PAR_I0] * 2.0 * M_PI * axes.major * axes.minor * norm; 274 275 return(flux); 329 276 } 330 277 … … 345 292 pmModelParamsToAxes (&axes, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], true); 346 293 347 // f = Io exp(-sqrt(z)) -> sqrt(z) = ln(Io/f) 348 psF64 zn = log(PAR[PM_PAR_I0] / flux); 349 psF64 radius = axes.major * sqrt (2.0) * zn; 294 // static value for EXP: 295 float kappa = 1.70056; 296 297 // f = Io exp(-kappa*sqrt(z)) -> sqrt(z) = ln(Io/f) / kappa 298 psF64 zn = log(PAR[PM_PAR_I0] / flux) / kappa; 299 psF64 radius = axes.major * zn; 350 300 351 301 psAssert (isfinite(radius), "fix this code: radius should not be nan for Io = %f, flux = %f, major = %f (%f, %f, %f)", … … 501 451 return; 502 452 } 453 454 # if (0) 455 void bilin_inter_function () { 456 // first, use Rmajor and index to find the central pixel flux (fraction of total flux) 457 psEllipseAxes axes; 458 pmModelParamsToAxes (&axes, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], true); 459 460 // get the central pixel flux from the lookup table 461 float xPix = (axes.major - centralPixelXo) / centralPixeldX; 462 xPix = PS_MIN (PS_MAX(xPix, 0), centralPixelNX - 1); 463 float yPix = (index - centralPixelYo) / centralPixeldY; 464 yPix = PS_MIN (PS_MAX(yPix, 0), centralPixelNY - 1); 465 466 // the integral of a Sersic has an analytical form as follows: 467 float logGamma = lgamma(2.0*index); 468 float bnFactor = pow(bn, 2.0*index); 469 float norm = 2.0 * M_PI * PS_SQR(axes.major) * index * exp(bn) * exp(logGamma) / bnFactor; 470 471 // XXX interpolate to get the value 472 // XXX for the moment, just integerize 473 // XXX I need to multiply by the integrated flux to get the flux in the central pixel 474 float Vcenter = centralPixel[(int)yPix][(int)xPix] * norm; 475 476 float px1 = 1.0 / PAR[PM_PAR_SXX]; 477 float py1 = 1.0 / PAR[PM_PAR_SYY]; 478 float z10 = PS_SQR(px1); 479 float z01 = PS_SQR(py1); 480 481 // which pixels do we need for this interpolation? 482 // (I do not keep state information, so I don't know anything about other evaluations of nearby pixels...) 483 if ((X >= 0) && (Y >= 0)) { 484 float z11 = z10 + z01 + PAR[PM_PAR_SXY]; // X * Y positive 485 float V00 = Vcenter; 486 float V10 = Io*exp(-bn*pow(z10,par7)); 487 float V01 = Io*exp(-bn*pow(z01,par7)); 488 float V11 = Io*exp(-bn*pow(z11,par7)); 489 f1 = interpolatePixels(V00, V10, V01, V11, X, Y); 490 } 491 if ((X < 0) && (Y >= 0)) { 492 float z11 = z10 + z01 - PAR[PM_PAR_SXY]; // X * Y negative 493 float V00 = Io*exp(-bn*pow(z10,par7)); 494 float V10 = Vcenter; 495 float V01 = Io*exp(-bn*pow(z11,par7)); 496 float V11 = Io*exp(-bn*pow(z01,par7)); 497 f1 = interpolatePixels(V00, V10, V01, V11, (1.0 + X), Y); 498 } 499 if ((X >= 0) && (Y < 0)) { 500 float z11 = z10 + z01 - PAR[PM_PAR_SXY]; // X * Y negative 501 float V00 = Io*exp(-bn*pow(z01,par7)); 502 float V10 = Io*exp(-bn*pow(z11,par7)); 503 float V01 = Vcenter; 504 float V11 = Io*exp(-bn*pow(z10,par7)); 505 f1 = interpolatePixels(V00, V10, V01, V11, X, (1.0 + Y)); 506 } 507 if ((X < 0) && (Y < 0)) { 508 float z11 = z10 + z01 + PAR[PM_PAR_SXY]; // X * Y positive 509 float V00 = Io*exp(-bn*pow(z11,par7)); 510 float V10 = Io*exp(-bn*pow(z10,par7)); 511 float V01 = Io*exp(-bn*pow(z01,par7)); 512 float V11 = Vcenter; 513 f1 = interpolatePixels(V00, V10, V01, V11, (1.0 + X), (1.0 + Y)); 514 } 515 } 516 # endif -
trunk/psModules/src/objects/models/pmModel_GAUSS.c
r35768 r36085 61 61 // Lax parameter limits 62 62 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0 }; 63 static float paramsMaxLax[] = { 1.0e5, 1.0e 8, 1.0e4, 1.0e4, 100, 100, 1.0 };63 static float paramsMaxLax[] = { 1.0e5, 1.0e9, 1.0e5, 1.0e5, 100, 100, 1.0 }; 64 64 65 65 // Moderate parameter limits -
trunk/psModules/src/objects/models/pmModel_PGAUSS.c
r35768 r36085 61 61 // Lax parameter limits 62 62 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0 }; 63 static float paramsMaxLax[] = { 1.0e5, 1.0e 8, 1.0e4, 1.0e4, 100, 100, 1.0 };63 static float paramsMaxLax[] = { 1.0e5, 1.0e9, 1.0e5, 1.0e5, 100, 100, 1.0 }; 64 64 65 65 // Moderate parameter limits -
trunk/psModules/src/objects/models/pmModel_PS1_V1.c
r35768 r36085 70 70 // Lax parameter limits 71 71 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, -1.0 }; 72 static float paramsMaxLax[] = { 1.0e5, 1.0e 8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 };72 static float paramsMaxLax[] = { 1.0e5, 1.0e9, 1.0e5, 1.0e5, 100, 100, 1.0, 20.0 }; 73 73 74 74 // Moderate parameter limits 75 75 // Tolerate a small divot (k < 0) 76 76 static float paramsMinModerate[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, -0.05 }; 77 static float paramsMaxModerate[] = { 1.0e5, 1.0e 8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 };77 static float paramsMaxModerate[] = { 1.0e5, 1.0e9, 1.0e5, 1.0e5, 100, 100, 1.0, 20.0 }; 78 78 79 79 // Strict parameter limits 80 80 // k = PAR_7 < 0 is very undesirable (big divot in the middle) 81 81 static float paramsMinStrict[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, 0.0 }; 82 static float paramsMaxStrict[] = { 1.0e5, 1.0e 8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 };82 static float paramsMaxStrict[] = { 1.0e5, 1.0e9, 1.0e5, 1.0e5, 100, 100, 1.0, 20.0 }; 83 83 84 84 // Parameter limits to use -
trunk/psModules/src/objects/models/pmModel_QGAUSS.c
r35768 r36085 70 70 // Lax parameter limits 71 71 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, -1.0 }; 72 static float paramsMaxLax[] = { 1.0e5, 1.0e 8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 };72 static float paramsMaxLax[] = { 1.0e5, 1.0e9, 1.0e5, 1.0e5, 100, 100, 1.0, 20.0 }; 73 73 74 74 // Moderate parameter limits 75 75 // Tolerate a small divot (k < 0) 76 76 static float paramsMinModerate[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, -0.05 }; 77 static float paramsMaxModerate[] = { 1.0e5, 1.0e 8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 };77 static float paramsMaxModerate[] = { 1.0e5, 1.0e9, 1.0e5, 1.0e5, 100, 100, 1.0, 20.0 }; 78 78 79 79 // Strict parameter limits 80 80 // k = PAR_7 < 0 is very undesirable (big divot in the middle) 81 81 static float paramsMinStrict[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, 0.0 }; 82 static float paramsMaxStrict[] = { 1.0e5, 1.0e 8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 };82 static float paramsMaxStrict[] = { 1.0e5, 1.0e9, 1.0e5, 1.0e5, 100, 100, 1.0, 20.0 }; 83 83 84 84 // Parameter limits to use -
trunk/psModules/src/objects/models/pmModel_RGAUSS.c
r35768 r36085 66 66 // Lax parameter limits 67 67 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, 1.25 }; 68 static float paramsMaxLax[] = { 1.0e5, 1.0e 8, 1.0e4, 1.0e4, 100, 100, 1.0, 4.0 };68 static float paramsMaxLax[] = { 1.0e5, 1.0e9, 1.0e5, 1.0e5, 100, 100, 1.0, 4.0 }; 69 69 70 70 // Moderate parameter limits -
trunk/psModules/src/objects/models/pmModel_SERSIC.c
r35768 r36085 20 20 * note that a Sersic model is usually defined in terms of R_e, the half-light radius. This 21 21 construction does not include a factor of 2 in the X^2 term, etc, like for a Gaussian. 22 Conversion from SXX, SYY, SXY to R_major, R_minor, theta can be done by using setting:22 Conversion from SXX, SYY, SXY to R_major, R_minor, theta can be done by using: 23 23 shape.sx = SXX / sqrt(2), shape.sy = SYY / sqrt(2), shape.sxy = SXY, then calling 24 24 psEllipseShapeToAxes, and multiplying the values of axes.major, axes.minor by sqrt(2) … … 55 55 #include "pmPSFtry.h" 56 56 #include "pmDetections.h" 57 #include "pmModel_CentralPixel.h" 57 58 58 59 #include "pmModel_SERSIC.h" … … 74 75 75 76 // Lax parameter limits 76 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.001, 0.001, -1.0, 0. 05};77 static float paramsMaxLax[] = { 1.0e5, 1.0e 8, 1.0e4, 1.0e4, 100, 100, 1.0, 4.0 };77 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.001, 0.001, -1.0, 0.1 }; 78 static float paramsMaxLax[] = { 1.0e5, 1.0e9, 1.0e5, 1.0e5, 100, 100, 1.0, 1.0 }; 78 79 79 80 // Moderate parameter limits … … 88 89 static float *paramsMinUse = paramsMinLax; 89 90 static float *paramsMaxUse = paramsMaxLax; 90 static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5, 2.0};91 static float betaUse[] = { 2, 3e6, 5, 5, 10.0, 10.0, 0.5, 1.0}; 91 92 92 93 static bool limitsApply = true; // Apply limits? 93 94 94 # include "pmModel_SERSIC.CP.h"95 // # include "pmModel_SERSIC.CP.h" 95 96 96 97 psF32 PM_MODEL_FUNC (psVector *deriv, … … 111 112 psAssert (z >= 0, "do not allow negative z values in model"); 112 113 113 float index = 0.5 / PAR[PM_PAR_7];114 float par7 = PAR[PM_PAR_7];115 float bn = 1.9992*index - 0.3271; 116 float Io = exp(bn);117 118 psF32 f2 = bn*pow(z,par7); 119 psF32 f1 = Io*exp(-f2);114 float Sindex = 0.5 / PAR[PM_PAR_7]; 115 float kappa = pmSersicKappa (Sindex); 116 117 float q = kappa*pow(z,PAR[PM_PAR_7]); 118 psF32 f0 = exp(-q); 119 120 assert (isfinite(q)); 120 121 121 122 psF32 radius = hypot(X, Y); 122 if (radius < 1.0) { 123 124 // ** use bilinear interpolation to the given location from the 4 surrounding pixels centered on the object center 125 126 // first, use Rmajor and index to find the central pixel flux (fraction of total flux) 127 psEllipseAxes axes; 128 pmModelParamsToAxes (&axes, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], true); 129 130 // get the central pixel flux from the lookup table 131 float xPix = (axes.major - centralPixelXo) / centralPixeldX; 132 xPix = PS_MIN (PS_MAX(xPix, 0), centralPixelNX - 1); 133 float yPix = (index - centralPixelYo) / centralPixeldY; 134 yPix = PS_MIN (PS_MAX(yPix, 0), centralPixelNY - 1); 135 136 // the integral of a Sersic has an analytical form as follows: 137 float logGamma = lgamma(2.0*index); 138 float bnFactor = pow(bn, 2.0*index); 139 float norm = 2.0 * M_PI * PS_SQR(axes.major) * index * exp(bn) * exp(logGamma) / bnFactor; 140 141 // XXX interpolate to get the value 142 // XXX for the moment, just integerize 143 // XXX I need to multiply by the integrated flux to get the flux in the central pixel 144 float Vcenter = centralPixel[(int)yPix][(int)xPix] * norm; 145 146 float px1 = 1.0 / PAR[PM_PAR_SXX]; 147 float py1 = 1.0 / PAR[PM_PAR_SYY]; 148 float z10 = PS_SQR(px1); 149 float z01 = PS_SQR(py1); 150 151 // which pixels do we need for this interpolation? 152 // (I do not keep state information, so I don't know anything about other evaluations of nearby pixels...) 153 if ((X >= 0) && (Y >= 0)) { 154 float z11 = z10 + z01 + PAR[PM_PAR_SXY]; // X * Y positive 155 float V00 = Vcenter; 156 float V10 = Io*exp(-bn*pow(z10,par7)); 157 float V01 = Io*exp(-bn*pow(z01,par7)); 158 float V11 = Io*exp(-bn*pow(z11,par7)); 159 f1 = interpolatePixels(V00, V10, V01, V11, X, Y); 160 } 161 if ((X < 0) && (Y >= 0)) { 162 float z11 = z10 + z01 - PAR[PM_PAR_SXY]; // X * Y negative 163 float V00 = Io*exp(-bn*pow(z10,par7)); 164 float V10 = Vcenter; 165 float V01 = Io*exp(-bn*pow(z11,par7)); 166 float V11 = Io*exp(-bn*pow(z01,par7)); 167 f1 = interpolatePixels(V00, V10, V01, V11, (1.0 + X), Y); 168 } 169 if ((X >= 0) && (Y < 0)) { 170 float z11 = z10 + z01 - PAR[PM_PAR_SXY]; // X * Y negative 171 float V00 = Io*exp(-bn*pow(z01,par7)); 172 float V10 = Io*exp(-bn*pow(z11,par7)); 173 float V01 = Vcenter; 174 float V11 = Io*exp(-bn*pow(z10,par7)); 175 f1 = interpolatePixels(V00, V10, V01, V11, X, (1.0 + Y)); 176 } 177 if ((X < 0) && (Y < 0)) { 178 float z11 = z10 + z01 + PAR[PM_PAR_SXY]; // X * Y positive 179 float V00 = Io*exp(-bn*pow(z11,par7)); 180 float V10 = Io*exp(-bn*pow(z10,par7)); 181 float V01 = Io*exp(-bn*pow(z01,par7)); 182 float V11 = Vcenter; 183 f1 = interpolatePixels(V00, V10, V01, V11, (1.0 + X), (1.0 + Y)); 184 } 185 } 186 187 psF32 z0 = PAR[PM_PAR_I0]*f1; 188 psF32 f0 = PAR[PM_PAR_SKY] + z0; 189 190 if (!isfinite(z0)) { 191 fprintf(stderr, "z0 is not finite for %f %f %f %f %f. Parameters: \n", X, Y, radius, z, f1); 123 if (radius <= 1.5) { 124 // Nsub ~ 10*index^2 + 1 125 psEllipseAxes axes = pmPSF_ModelToAxes(PAR, pmModelClassGetType ("PS_MODEL_SERSIC")); 126 int Nsub = 2 * ((int)(6.0*Sindex / 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], Sindex, Nsub); 130 } 131 if (!isfinite(f0)) { 132 fprintf(stderr, "f0 is not finite for %f %f %f %f %f. Parameters: \n", X, Y, radius, z, q); 192 133 fprintf(stderr, "%f %f %f %f %f %f %f %f\n", PAR[0], PAR[1], PAR[2], PAR[3], PAR[4], 193 134 PAR[5], PAR[6], PAR[7]); 194 135 } 195 196 assert (isfinite(f2)); 136 assert (isfinite(f0)); 137 138 psF32 f1 = PAR[PM_PAR_I0]*f0; 139 psF32 f = PAR[PM_PAR_SKY] + f1; 140 197 141 assert (isfinite(f1)); 198 assert (isfinite(z0)); 199 assert (isfinite(f0)); 142 assert (isfinite(f)); 200 143 201 144 if (deriv != NULL) { … … 203 146 204 147 dPAR[PM_PAR_SKY] = +1.0; 205 dPAR[PM_PAR_I0] = +f1; 206 207 // gradient is infinite for z = 0; saturate at z = 0.01 208 psF32 z1 = (z < 0.01) ? z0*bn*par7*pow(0.01,par7 - 1.0) : z0*bn*par7*pow(z,par7 - 1.0); 209 210 dPAR[PM_PAR_7] = (z < 0.01) ? -z0*pow(0.01,par7)*log(0.01) : -z0*f2*log(z); 211 dPAR[PM_PAR_7] *= 3.0; 212 213 assert (isfinite(z1)); 148 dPAR[PM_PAR_I0] = +f0; 149 150 if (z > 0.01) { 151 float z1 = f1*kappa*PAR[PM_PAR_7]*pow(z,PAR[PM_PAR_7]-1.0); 152 dPAR[PM_PAR_XPOS] = +1.0*z1*(2.0*px + Y*PAR[PM_PAR_SXY]); 153 dPAR[PM_PAR_YPOS] = +1.0*z1*(2.0*py + X*PAR[PM_PAR_SXY]); 154 dPAR[PM_PAR_SXX] = +2.0*z1*px*px/PAR[PM_PAR_SXX]; 155 dPAR[PM_PAR_SYY] = +2.0*z1*py*py/PAR[PM_PAR_SYY]; 156 dPAR[PM_PAR_SXY] = -1.0*z1*X*Y; 157 dPAR[PM_PAR_7] = -1.0*f1*q*log(z); 158 } else { 159 // gradient -> 0 for z -> 0, but has undef form 160 float z1 = f1*kappa*PAR[PM_PAR_7]*pow(z,PAR[PM_PAR_7]); 161 dPAR[PM_PAR_XPOS] = +1.0*z1*(2.0/PAR[PM_PAR_SXX] + PAR[PM_PAR_SXY]); 162 dPAR[PM_PAR_YPOS] = +1.0*z1*(2.0/PAR[PM_PAR_SYY] + PAR[PM_PAR_SXY]); 163 dPAR[PM_PAR_SXX] = +2.0*z1*px/PAR[PM_PAR_SXX]/PAR[PM_PAR_SXX]; 164 dPAR[PM_PAR_SYY] = +2.0*z1*py/PAR[PM_PAR_SYY]/PAR[PM_PAR_SYY]; 165 dPAR[PM_PAR_SXY] = -1.0*z1; 166 // dPAR[PM_PAR_7] = -1.0*f1*q*log(z + 0.0001); 167 dPAR[PM_PAR_7] = -1.0*f1*q*log(z + 0.0001); // factor of 16 to reduce the gain 168 } 214 169 assert (isfinite(dPAR[PM_PAR_7])); 215 216 dPAR[PM_PAR_XPOS] = +1.0*z1*(2.0*px/PAR[PM_PAR_SXX] + Y*PAR[PM_PAR_SXY]); 217 dPAR[PM_PAR_YPOS] = +1.0*z1*(2.0*py/PAR[PM_PAR_SYY] + X*PAR[PM_PAR_SXY]); 218 dPAR[PM_PAR_SXX] = +2.0*z1*px*px/PAR[PM_PAR_SXX]; // XXX : increase drag? 219 dPAR[PM_PAR_SYY] = +2.0*z1*py*py/PAR[PM_PAR_SYY]; 220 dPAR[PM_PAR_SXY] = -1.0*z1*X*Y; 221 } 222 return (f0); 170 } 171 return (f); 223 172 } 224 173 … … 370 319 psEllipseAxes axes; 371 320 pmModelParamsToAxes (&axes, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], true); 372 float AspectRatio = axes.minor / axes.major; 373 374 float index = 0.5 / PAR[PM_PAR_7]; 375 float bn = 1.9992*index - 0.3271; 376 377 // the integral of a Sersic has an analytical form as follows: 378 float logGamma = lgamma(2.0*index); 379 float bnFactor = pow(bn, 2.0*index); 380 float norm = 2.0 * M_PI * PS_SQR(axes.major) * index * exp(bn) * exp(logGamma) / bnFactor; 381 382 psF64 Flux = PAR[PM_PAR_I0] * norm * AspectRatio; 383 384 return(Flux); 321 322 float Sindex = 0.5 / PAR[PM_PAR_7]; 323 float norm = pmSersicNorm (Sindex); 324 325 float flux = PAR[PM_PAR_I0] * 2.0 * M_PI * axes.major * axes.minor * norm; 326 327 return(flux); 385 328 } 386 329 … … 401 344 pmModelParamsToAxes (&axes, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], true); 402 345 346 float Sindex = 0.5 / PAR[PM_PAR_7]; 347 float kappa = pmSersicKappa (Sindex); 348 403 349 // f = Io exp(-z^n) -> z^n = ln(Io/f) 404 psF64 zn = log(PAR[PM_PAR_I0] / flux) ;405 psF64 radius = axes.major * sqrt (2.0) * pow(zn, 0.5 / PAR[PM_PAR_7]);350 psF64 zn = log(PAR[PM_PAR_I0] / flux) / kappa; 351 psF64 radius = axes.major * pow(zn, Sindex); 406 352 407 353 psAssert (isfinite(radius), "fix this code: radius should not be nan for Io = %f, flux = %f, major = %f (%f, %f, %f), par 7 = %f", -
trunk/psModules/src/objects/models/pmModel_TRAIL.c
r35768 r36085 61 61 // Lax parameter limits 62 62 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -1.0e2, -1.0e2, 0.5, -3.3, -0.5 }; 63 static float paramsMaxLax[] = { 1.0e5, 1.0 e+8, +1.0e4, +1.0e4, 150.0, +3.3 , 5.0 };63 static float paramsMaxLax[] = { 1.0e5, 1.00+9, +1.0e5, +1.0e5, 150.0, +3.3 , 5.0 }; 64 64 65 65 // Moderate parameter limits
Note:
See TracChangeset
for help on using the changeset viewer.
