Changeset 36085
- Timestamp:
- Aug 31, 2013, 5:55:16 AM (13 years ago)
- Location:
- trunk/psModules
- Files:
-
- 23 edited
- 4 copied
-
. (modified) (1 prop)
-
src/detrend/pmPattern.c (modified) (2 diffs)
-
src/objects/Makefile.am (modified) (3 diffs)
-
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)
-
src/objects/pmFootprintCullPeaks.c (modified) (4 diffs)
-
src/objects/pmModel_CentralPixel.c (copied) (copied from branches/eam_branches/ipp-20130711/psModules/src/objects/pmModel_CentralPixel.c )
-
src/objects/pmModel_CentralPixel.h (copied) (copied from branches/eam_branches/ipp-20130711/psModules/src/objects/pmModel_CentralPixel.h )
-
src/objects/pmPCM_MinimizeChisq.c (modified) (8 diffs)
-
src/objects/pmPCMdata.c (modified) (4 diffs)
-
src/objects/pmPCMdata.h (modified) (1 diff)
-
src/objects/pmSourceFitModel.c (modified) (2 diffs)
-
src/objects/pmSourceFitModel.h (modified) (2 diffs)
-
src/objects/pmSourceFitPCM.c (modified) (1 diff)
-
src/objects/pmSourceFitSet.c (modified) (1 diff)
-
src/psmodules.h (modified) (1 diff)
-
test/objects (modified) (1 prop)
-
test/objects/Makefile.am (modified) (1 diff)
-
test/objects/tap_pmModel_CentralPixel.c (copied) (copied from branches/eam_branches/ipp-20130711/psModules/test/objects/tap_pmModel_CentralPixel.c )
-
test/objects/tap_pmModel_CentralPixel_v2.c (copied) (copied from branches/eam_branches/ipp-20130711/psModules/test/objects/tap_pmModel_CentralPixel_v2.c )
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/detrend/pmPattern.c
r35270 r36085 1222 1222 } 1223 1223 double max_XX = 0; 1224 #if (PS_TRACE_ON) 1224 1225 double solution_V = 0; 1225 1226 int i_peak = -1; 1227 #endif 1226 1228 for (int i = 0; i < numChips + 4; i++) { // If any cells have no value of themself, set the matrix to 1.0. 1227 1229 if (XX->data.F64[i][i] == 0.0) { … … 1230 1232 if (XX->data.F64[i][i] > max_XX) { 1231 1233 max_XX = XX->data.F64[i][i]; 1234 #if (PS_TRACE_ON) 1232 1235 solution_V = solution->data.F64[i]; 1233 1236 i_peak = i; 1237 #endif 1234 1238 } 1235 1239 } -
trunk/psModules/src/objects/Makefile.am
r34823 r36085 20 20 pmModelClass.c \ 21 21 pmModelUtils.c \ 22 pmModel_CentralPixel.c \ 22 23 pmSource.c \ 23 24 pmPhotObj.c \ … … 97 98 pmModelClass.h \ 98 99 pmModelUtils.h \ 100 pmModel_CentralPixel.h \ 99 101 pmSource.h \ 100 102 pmPhotObj.h \ … … 110 112 pmSourceOutputs.h \ 111 113 pmSourceIO.h \ 112 pmSourceSatstar.h \ 114 pmSourceSatstar.h \ 113 115 pmSourcePlots.h \ 114 116 pmSourceVisual.h \ -
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 -
trunk/psModules/src/objects/pmFootprintCullPeaks.c
r34800 r36085 25 25 bool dumpfootprints (pmFootprint *fp, pmFootprintSpans *fpSp); 26 26 27 /*28 * Examine the peaks in a pmFootprint, and throw away the ones that are not sufficiently29 * isolated. More precisely, for each peak find the highest coll that you'd have to traverse30 * to reach a still higher peak --- and if that coll's more (less?) than nsigma DN below your31 * starting point, discard the peak.32 */27 /* 28 * Examine the peaks in a pmFootprint, and throw away the ones that are not sufficiently 29 * isolated. More precisely, for each peak find the highest coll that you'd have to traverse 30 * to reach a still higher peak --- and if that coll's more (less?) than nsigma DN below your 31 * starting point, discard the peak. 32 */ 33 33 34 34 # define IN_PEAK 1 … … 48 48 49 49 if (fp->peaks == NULL || fp->peaks->n < 2) { // nothing to do 50 return PS_ERR_NONE;50 return PS_ERR_NONE; 51 51 } 52 52 … … 91 91 92 92 // max flux is above threshold for brightest peak 93 pmPeak *maxPeak = NULL;94 for (int i = 0; i < fp->peaks->n; i++) {95 pmPeak *testPeak = fp->peaks->data[i];96 float this_peak = useSmoothedImage ? testPeak->smoothFlux : testPeak->rawFlux;93 pmPeak *maxPeak = NULL; 94 for (int i = 0; i < fp->peaks->n; i++) { 95 pmPeak *testPeak = fp->peaks->data[i]; 96 float this_peak = useSmoothedImage ? testPeak->smoothFlux : testPeak->rawFlux; 97 97 98 if (isfinite(this_peak)) {99 maxPeak = fp->peaks->data[i];100 break;101 }102 }103 psAssert(maxPeak,"maxPeak was not set in these peaks");104 // = fp->peaks->data[0];98 if (isfinite(this_peak)) { 99 maxPeak = fp->peaks->data[i]; 100 break; 101 } 102 } 103 psAssert(maxPeak,"maxPeak was not set in these peaks"); 104 // = fp->peaks->data[0]; 105 105 float maxFlux = useSmoothedImage ? maxPeak->smoothFlux : maxPeak->rawFlux; 106 106 … … 130 130 } 131 131 #if (0) 132 if (threshbounds->data.F32[threshbounds->n-1] > maxFlux) {133 psWarning ("upper limit: %f does not include max flux: %f",134 threshbounds->data.F32[threshbounds->n-1], maxFlux);135 }132 if (threshbounds->data.F32[threshbounds->n-1] > maxFlux) { 133 psWarning ("upper limit: %f does not include max flux: %f", 134 threshbounds->data.F32[threshbounds->n-1], maxFlux); 135 } 136 136 #endif 137 137 psHistogram *threshist = psHistogramAllocGeneric(threshbounds); -
trunk/psModules/src/objects/pmPCM_MinimizeChisq.c
r35768 r36085 42 42 #include "pmPCMdata.h" 43 43 44 # define SAVE_IMAGES 0 45 # if (SAVE_IMAGES) 46 int psphotSaveImage (psMetadata *header, psImage *image, char *filename); 47 # endif 48 44 49 # define FACILITY "psModules.objects" 45 50 … … 91 96 psF32 lambda = 0.001; 92 97 psF32 dLinear = 0.0; 93 psF32 nu = 2.0;98 psF32 nu = 3.0; 94 99 95 100 # if (USE_FFT && PRE_CONVOLVE) … … 130 135 } 131 136 137 char key[10]; // used for interactive responses 138 bool testValue = false; 139 132 140 // set a new guess for Alpha, Beta, Params 133 141 if (!psMinLM_GuessABP(Alpha, Beta, Params, alpha, beta, params, paramMask, checkLimits, lambda, &dLinear)) { 142 if (min->isInteractive) { 143 fprintf (stdout, "guess failed (singular matrix or NaN values), continue? [Y,n] "); 144 if (!fgets(key, 8, stdin)) { 145 psWarning("Unable to read option"); 146 } 147 switch (key[0]) { 148 case 'n': 149 case 'N': 150 done = true; 151 break; 152 case 'y': 153 case 'Y': 154 case '\n': 155 lambda *= 10.0; 156 continue; 157 default: 158 lambda *= 10.0; 159 continue; 160 } 161 if (done) break; 162 } 134 163 min->iter ++; 135 164 if (min->iter >= min->maxIter) break; … … 138 167 } 139 168 169 if (min->isInteractive) { 170 p_psVectorPrint(psTraceGetDestination(), Params, "current parameters: "); 171 fprintf (stdout, "last chisq : %f\n", min->value); 172 bool getOptions = true; 173 while (getOptions) { 174 fprintf (stdout, "options: (m)odify, (g)o, (q)uit: "); 175 if (!fgets(key, 8, stdin)) { 176 psWarning("Unable to read option"); 177 } 178 switch (key[0]) { 179 case 'm': 180 case 'M': 181 testValue = TRUE; 182 fprintf (stdout, "enter (Npar) (value): "); 183 int Npar = 0; 184 float value= 0; 185 int Nscan = fscanf (stdin, "%d %f", &Npar, &value); 186 if (Nscan != 2) { 187 fprintf (stderr, "scan failure\n"); 188 } 189 Params->data.F32[Npar] = value; 190 break; 191 case 'g': 192 case 'G': 193 case '\n': 194 getOptions = false; 195 break; 196 default: 197 done = true; 198 break; 199 } 200 fprintf (stderr, "foo\n"); 201 } 202 if (done) break; 203 } 204 140 205 // dump some useful info if trace is defined 141 206 if (psTraceGetLevel(FACILITY) >= 6) { … … 202 267 // XXX : Madsen gives suggestion for better use of rho 203 268 // rho is positive if the new chisq is smaller 204 if ( rho >= -1e-6) {269 if (testValue || (rho >= -1e-6)) { 205 270 min->value = Chisq; 206 271 alpha = psImageCopy(alpha, Alpha, PS_TYPE_F32); … … 215 280 case 0: 216 281 if (rho >= -1e-6) { 217 lambda *= 0. 25;282 lambda *= 0.1; 218 283 } else { 219 284 lambda *= 10.0; … … 234 299 if (rho > 0.0) { 235 300 lambda *= PS_MAX(0.33, (1.0 - pow(2.0*rho - 1.0, 3.0))); 236 nu = 2.0;301 nu = 3.0; 237 302 } else { 238 303 lambda *= nu; 239 nu *= 2.0;304 nu *= 3.0; 240 305 } 241 306 break; … … 474 539 // XXX TEST : SAVE IMAGES 475 540 # if (SAVE_IMAGES) 476 psphotSaveImage (NULL, pcm->psf->image, "psf.fits"); 477 psphotSaveImage (NULL, pcm->modelFlux, "model.fits"); 478 psphotSaveImage (NULL, pcm->modelConvFlux, "modelConv.fits"); 479 psphotSaveImage (NULL, source->pixels, "obj.fits"); 480 psphotSaveImage (NULL, source->maskObj, "mask.fits"); 481 psphotSaveImage (NULL, source->variance, "variance.fits"); 541 static int Npass = 0; 542 char name[128]; 543 snprintf (name, 128, "psf.%03d.fits", Npass); psphotSaveImage (NULL, pcm->psf->image, name); 544 snprintf (name, 128, "mod.%03d.fits", Npass); psphotSaveImage (NULL, pcm->modelFlux, name); 545 snprintf (name, 128, "cnv.%03d.fits", Npass); psphotSaveImage (NULL, pcm->modelConvFlux, name); 546 snprintf (name, 128, "obj.%03d.fits", Npass); psphotSaveImage (NULL, source->pixels, name); 547 snprintf (name, 128, "msk.%03d.fits", Npass); psphotSaveImage (NULL, source->maskObj, name); 548 snprintf (name, 128, "var.%03d.fits", Npass); psphotSaveImage (NULL, source->variance, name); 549 for (int n = 0; n < pcm->dmodelsFlux->n; n++) { 550 psImage *dmodelConv = pcm->dmodelsConvFlux->data[n]; 551 if (!dmodelConv) continue; 552 snprintf (name, 128, "dpar.%01d.%03d.fits", n, Npass); psphotSaveImage (NULL, dmodelConv, name); 553 } 554 Npass ++; 482 555 # endif 483 556 -
trunk/psModules/src/objects/pmPCMdata.c
r35768 r36085 173 173 } 174 174 175 int pmPCMsetParams (psMinConstraint *constraint, pmSourceFitMode mode) { 176 177 // set parameter mask based on fitting mode 178 int nParams = 0; 179 180 switch (mode) { 181 case PM_SOURCE_FIT_NORM: 182 // fits only source normalization (Io) 183 nParams = 1; 184 psVectorInit (constraint->paramMask, 1); 185 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0; 186 break; 187 188 case PM_SOURCE_FIT_PSF: 189 // fits only x,y,Io 190 nParams = 3; 191 psVectorInit (constraint->paramMask, 1); 192 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0; 193 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_XPOS] = 0; 194 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_YPOS] = 0; 195 break; 196 197 case PM_SOURCE_FIT_EXT: 198 // fits all params except sky 199 nParams = params->n - 1; 200 psVectorInit (constraint->paramMask, 0); 201 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1; 202 break; 203 204 case PM_SOURCE_FIT_EXT_AND_SKY: 205 // fits all params including sky 206 nParams = params->n; 207 psVectorInit (constraint->paramMask, 0); 208 break; 209 210 case PM_SOURCE_FIT_SHAPE: 211 // fits shape (Sxx, Sxy, Syy) and Io 212 nParams = 5; 213 psVectorInit (constraint->paramMask, 1); 214 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 0; 215 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0; 216 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SXX] = 0; 217 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SXY] = 0; 218 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SYY] = 0; 219 break; 220 221 case PM_SOURCE_FIT_INDEX: 222 // fits only Io, index (PAR7) -- only Io for models with < 8 params 223 psVectorInit (constraint->paramMask, 1); 224 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0; 225 if (params->n == 7) { 226 nParams = 1; 227 } else { 228 nParams = 2; 229 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 0; 230 } 231 break; 232 233 case PM_SOURCE_FIT_NO_INDEX: 234 // fits all but index (PAR7) including sky 235 psVectorInit (constraint->paramMask, 0); 236 if (params->n == 7) { 237 nParams = params->n; 238 } else { 239 nParams = params->n - 1; 240 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 1; 241 } 242 break; 243 default: 244 psAbort("invalid fitting mode"); 245 } 246 return nParams; 247 } 248 175 249 pmPCMdata *pmPCMinit(pmSource *source, pmSourceFitOptions *fitOptions, pmModel *model, psImageMaskType maskVal, float psfSize) { 176 250 … … 219 293 constraint->checkLimits = model->modelLimits; 220 294 221 // set parameter mask based on fitting mode 222 int nParams = 0; 223 switch (fitOptions->mode) { 224 case PM_SOURCE_FIT_NORM: 225 // NORM-only model fits only source normalization (Io) 226 nParams = 1; 227 psVectorInit (constraint->paramMask, 1); 228 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0; 229 break; 230 case PM_SOURCE_FIT_PSF: 231 // PSF model only fits x,y,Io 232 nParams = 3; 233 psVectorInit (constraint->paramMask, 1); 234 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0; 235 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_XPOS] = 0; 236 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_YPOS] = 0; 237 break; 238 case PM_SOURCE_FIT_EXT: 239 // EXT model fits all params (except sky) 240 nParams = params->n - 1; 241 psVectorInit (constraint->paramMask, 0); 242 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1; 243 break; 244 case PM_SOURCE_FIT_INDEX: 245 // PSF model only fits Io, index (PAR7) -- only Io for models with < 8 params 246 psVectorInit (constraint->paramMask, 1); 247 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0; 248 if (params->n == 7) { 249 nParams = 1; 250 } else { 251 nParams = 2; 252 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 0; 253 } 254 break; 255 case PM_SOURCE_FIT_NO_INDEX: 256 // PSF model only fits Io, index (PAR7) -- only Io for models with < 8 params 257 psVectorInit (constraint->paramMask, 0); 258 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1; 259 if (params->n == 7) { 260 nParams = params->n - 1; 261 } else { 262 nParams = params->n - 2; 263 constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 1; 264 } 265 break; 266 default: 267 psAbort("invalid fitting mode"); 268 } 295 int nParams = pmPCMsetParams (constraint, fitOptions->mode); 269 296 270 297 if (nPix < nParams + 1) { … … 341 368 } 342 369 343 // if we changed the fit mode, we need to update nDOF 344 int nParams = 0; 345 // set parameter mask based on fitting mode 346 switch (fitOptions->mode) { 347 case PM_SOURCE_FIT_NORM: 348 // NORM-only model fits only source normalization (Io) 349 nParams = 1; 350 psVectorInit (pcm->constraint->paramMask, 1); 351 pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0; 352 break; 353 case PM_SOURCE_FIT_PSF: 354 // PSF model only fits x,y,Io 355 nParams = 3; 356 psVectorInit (pcm->constraint->paramMask, 1); 357 pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0; 358 pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_XPOS] = 0; 359 pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_YPOS] = 0; 360 break; 361 case PM_SOURCE_FIT_EXT: 362 // EXT model fits all params (except sky) 363 nParams = model->params->n - 1; 364 psVectorInit (pcm->constraint->paramMask, 0); 365 pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1; 366 break; 367 case PM_SOURCE_FIT_INDEX: 368 // PSF model only fits Io, index (PAR7) -- only Io for models with < 8 params 369 psVectorInit (pcm->constraint->paramMask, 1); 370 pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_I0] = 0; 371 if (model->params->n == 7) { 372 nParams = 1; 373 } else { 374 nParams = 2; 375 pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 0; 376 } 377 break; 378 case PM_SOURCE_FIT_NO_INDEX: 379 // PSF model only fits Io, index (PAR7) -- only Io for models with < 8 params 380 psVectorInit (pcm->constraint->paramMask, 0); 381 pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_SKY] = 1; 382 if (model->params->n == 7) { 383 nParams = model->params->n - 1; 384 } else { 385 nParams = model->params->n - 2; 386 pcm->constraint->paramMask->data.PS_TYPE_VECTOR_MASK_DATA[PM_PAR_7] = 1; 387 } 388 break; 389 default: 390 psAbort("invalid fitting mode"); 391 } 370 int nParams = pmPCMsetParams (pcm->constraint, fitOptions->mode); 392 371 393 372 if (pcm->nPix < nParams + 1) { … … 478 457 } 479 458 459 // construct a realization of the source model 460 bool pmPCMMakeModel (pmSource *source, pmModel *model, psImageMaskType maskVal, int psfSize) { 461 462 PS_ASSERT_PTR_NON_NULL(source, false); 463 464 // if we already have a cached image, re-use that memory 465 source->modelFlux = psImageCopy (source->modelFlux, source->pixels, PS_TYPE_F32); 466 psImageInit (source->modelFlux, 0.0); 467 468 // modelFlux always has unity normalization (I0 = 1.0) 469 pmModelAdd (source->modelFlux, source->maskObj, model, PM_MODEL_OP_FULL | PM_MODEL_OP_NORM, maskVal); 470 471 // convolve the model image with the PSF 472 if (USE_1D_GAUSS) { 473 // do not use the threaded, mask-aware version of this code (psImageSmoothMaskPixelsThread): 474 // * the model flux is not masked 475 // * threading takes place above this level 476 477 // define the Gauss parameters from the psf 478 pmModel *modelPSF = source->modelPSF; 479 psAssert (modelPSF, "psf model must be defined"); 480 481 psEllipseAxes axes; 482 bool useReff = pmModelUseReff (modelPSF->type); 483 psF32 *PAR = modelPSF->params->data.F32; 484 pmModelParamsToAxes (&axes, PAR[PM_PAR_SXX], PAR[PM_PAR_SXY], PAR[PM_PAR_SYY], useReff); 485 486 float FWHM_MAJOR = 2*modelPSF->modelRadius (modelPSF->params, 0.5*PAR[PM_PAR_I0]); 487 float FWHM_MINOR = FWHM_MAJOR * (axes.minor / axes.major); 488 489 float sigma = 0.5 * (FWHM_MAJOR + FWHM_MINOR) / 2.35; 490 float nsigma = 2.0; 491 492 psImageSmooth (source->modelFlux, sigma, nsigma); 493 } else { 494 // make sure we save a cached copy of the psf flux 495 pmSourceCachePSF (source, maskVal); 496 497 // convert the cached cached psf model for this source to a psKernel 498 psKernel *psf = pmPCMkernelFromPSF (source, psfSize); 499 if (!psf) { 500 // NOTE: this only happens if the source is too close to an edge 501 model->flags |= PM_MODEL_STATUS_BADARGS; 502 return NULL; 503 } 504 505 // XXX not sure if I can place the output on top of the input 506 psImageConvolveFFT (source->modelFlux, source->modelFlux, NULL, 0, psf); 507 } 508 return true; 509 } 510 -
trunk/psModules/src/objects/pmPCMdata.h
r32725 r36085 98 98 bool pmPCMCacheModel (pmSource *source, psImageMaskType maskVal, int psfSize); 99 99 100 bool pmPCMMakeModel (pmSource *source, pmModel *model, psImageMaskType maskVal, int psfSize); 101 100 102 /// @} 101 103 # endif /* PM_PCM_DATA_H */ -
trunk/psModules/src/objects/pmSourceFitModel.c
r35768 r36085 66 66 opt->gainFactorMode = 0; 67 67 opt->chisqConvergence = true; 68 opt->isInteractive = false; 68 69 69 70 return opt; … … 247 248 myMin->gainFactorMode = options->gainFactorMode; 248 249 myMin->chisqConvergence = options->chisqConvergence; 250 myMin->isInteractive = options->isInteractive; 249 251 250 252 psImage *covar = psImageAlloc (params->n, params->n, PS_TYPE_F32); -
trunk/psModules/src/objects/pmSourceFitModel.h
r35768 r36085 21 21 PM_SOURCE_FIT_EXT_AND_SKY, 22 22 PM_SOURCE_FIT_INDEX, 23 PM_SOURCE_FIT_SHAPE, 23 24 PM_SOURCE_FIT_NO_INDEX, 24 25 PM_SOURCE_FIT_TRAIL, … … 37 38 int gainFactorMode; 38 39 bool chisqConvergence; 40 bool isInteractive; 39 41 } pmSourceFitOptions; 40 42 -
trunk/psModules/src/objects/pmSourceFitPCM.c
r35768 r36085 68 68 myMin->chisqConvergence = fitOptions->chisqConvergence; 69 69 myMin->gainFactorMode = fitOptions->gainFactorMode; 70 myMin->isInteractive = fitOptions->isInteractive; 70 71 71 72 psImage *covar = psImageAlloc (params->n, params->n, PS_TYPE_F32); -
trunk/psModules/src/objects/pmSourceFitSet.c
r35768 r36085 570 570 myMin->gainFactorMode = options->gainFactorMode; 571 571 myMin->chisqConvergence = options->chisqConvergence; 572 myMin->isInteractive = options->isInteractive; 572 573 573 574 psImage *covar = psImageAlloc (params->n, params->n, PS_TYPE_F32); -
trunk/psModules/src/psmodules.h
r35768 r36085 129 129 #include <pmModelFuncs.h> 130 130 #include <pmModel.h> 131 #include <pmModel_CentralPixel.h> 131 132 132 133 #include <pmSourceMasks.h> -
trunk/psModules/test/objects
- Property svn:ignore
-
old new 8 8 tap_pmSourceFitModel_Delta 9 9 tap_pmSourcePhotometry 10 tap_pmModel_CentralPixel 11 tap_pmModel_CentralPixel_v2
-
- Property svn:ignore
-
trunk/psModules/test/objects/Makefile.am
r29547 r36085 19 19 tap_pmModelUtils \ 20 20 tap_pmModelClass \ 21 tap_pmModel_CentralPixel \ 22 tap_pmModel_CentralPixel_v2 \ 21 23 tap_pmPSF \ 22 24 tap_pmTrend2D \
Note:
See TracChangeset
for help on using the changeset viewer.
