Changeset 10262
- Timestamp:
- Nov 28, 2006, 4:55:24 PM (20 years ago)
- Location:
- trunk/psModules/src/objects/models
- Files:
-
- 3 edited
-
pmModel_GAUSS.c (modified) (6 diffs)
-
pmModel_PGAUSS.c (modified) (5 diffs)
-
pmModel_QGAUSS.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/objects/models/pmModel_GAUSS.c
r10181 r10262 33 33 psF32 *PAR = params->data.F32; 34 34 35 // XXX this is fitting sqrt(2)/sigma_x, sqrt(2)/sigma_y36 35 psF32 X = pixcoord->data.F32[0] - PAR[PM_PAR_XPOS]; 37 36 psF32 Y = pixcoord->data.F32[1] - PAR[PM_PAR_YPOS]; … … 58 57 59 58 // define the parameter limits 60 bool PM_MODEL_LIMITS (psVector **beta_lim, psVector **params_min, psVector **params_max) 61 { 62 63 *beta_lim = psVectorAlloc (7, PS_TYPE_F32); 64 *params_min = psVectorAlloc (7, PS_TYPE_F32); 65 *params_max = psVectorAlloc (7, PS_TYPE_F32); 66 67 beta_lim[0][0].data.F32[PM_PAR_SKY] = 1000; 68 beta_lim[0][0].data.F32[PM_PAR_I0] = 3e6; 69 beta_lim[0][0].data.F32[PM_PAR_XPOS] = 5; 70 beta_lim[0][0].data.F32[PM_PAR_YPOS] = 5; 71 beta_lim[0][0].data.F32[PM_PAR_SXX] = 0.5; 72 beta_lim[0][0].data.F32[PM_PAR_SYY] = 0.5; 73 beta_lim[0][0].data.F32[PM_PAR_SXY] = 0.5; 74 75 params_min[0][0].data.F32[PM_PAR_SKY] = -1000; 76 params_min[0][0].data.F32[PM_PAR_I0] = 0; 77 params_min[0][0].data.F32[PM_PAR_XPOS] = -100; 78 params_min[0][0].data.F32[PM_PAR_YPOS] = -100; 79 params_min[0][0].data.F32[PM_PAR_SXX] = 0.5; 80 params_min[0][0].data.F32[PM_PAR_SYY] = 0.5; 81 params_min[0][0].data.F32[PM_PAR_SXY] = -5.0; 82 83 params_max[0][0].data.F32[PM_PAR_SKY] = 1e5; 84 params_max[0][0].data.F32[PM_PAR_I0] = 1e8; 85 params_max[0][0].data.F32[PM_PAR_XPOS] = 1e4; // this should be set by image dimensions! 86 params_max[0][0].data.F32[PM_PAR_YPOS] = 1e4; // this should be set by image dimensions! 87 params_max[0][0].data.F32[PM_PAR_SXX] = 100.0; 88 params_max[0][0].data.F32[PM_PAR_SYY] = 100.0; 89 params_max[0][0].data.F32[PM_PAR_SXY] = +5.0; 90 91 return (TRUE); 59 // AR_MAX is the maximum allowed axis ratio 60 // AR_RATIO is ((1-R)/(1+R))^2 where R = AR_MAX^(-2) 61 # define AR_MAX 20.0 62 # define AR_RATIO 0.99 63 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 64 { 65 float beta_lim, params_min, params_max; 66 float f1, f2, q1, q2; 67 68 // we need to calculate the limits for SXY specially 69 if (nParam == PM_PAR_SXY) { 70 f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 71 f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 72 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 73 assert (q1 > 0); 74 q2 = 0.5*sqrt (q1); 75 } 76 77 switch (mode) { 78 case PS_MINIMIZE_BETA_LIMIT: 79 switch (nParam) { 80 case PM_PAR_SKY: 81 beta_lim = 1000; 82 break; 83 case PM_PAR_I0: 84 beta_lim = 3e6; 85 break; 86 case PM_PAR_XPOS: 87 beta_lim = 5; 88 break; 89 case PM_PAR_YPOS: 90 beta_lim = 5; 91 break; 92 case PM_PAR_SXX: 93 beta_lim = 0.5; 94 break; 95 case PM_PAR_SYY: 96 beta_lim = 0.5; 97 break; 98 case PM_PAR_SXY: 99 beta_lim = q2; 100 break; 101 default: 102 psAbort ("psModules.pmModel_GAUSS", "invalid parameter %d for beta test", nParam); 103 } 104 if (fabs(beta[nParam]) > fabs(beta_lim)) { 105 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 106 return false; 107 } 108 return true; 109 case PS_MINIMIZE_PARAM_MIN: 110 switch (nParam) { 111 case PM_PAR_SKY: 112 params_min = -1000; 113 break; 114 case PM_PAR_I0: 115 params_min = 0; 116 break; 117 case PM_PAR_XPOS: 118 params_min = -100; 119 break; 120 case PM_PAR_YPOS: 121 params_min = -100; 122 break; 123 case PM_PAR_SXX: 124 params_min = 0.5; 125 break; 126 case PM_PAR_SYY: 127 params_min = 0.5; 128 break; 129 case PM_PAR_SXY: 130 params_min = -q2; 131 break; 132 default: 133 psAbort ("psModules.pmModel_GAUSS", "invalid parameter %d for param min test", nParam); 134 } 135 if (params[nParam] < params_min) { 136 params[nParam] = params_min; 137 return false; 138 } 139 return true; 140 case PS_MINIMIZE_PARAM_MAX: 141 switch (nParam) { 142 case PM_PAR_SKY: 143 params_max = 1e5; 144 break; 145 case PM_PAR_I0: 146 params_max = 1e8; 147 break; 148 case PM_PAR_XPOS: 149 params_max = 1e4; 150 break; 151 case PM_PAR_YPOS: 152 params_max = 1e4; 153 break; 154 case PM_PAR_SXX: 155 params_max = 100; 156 break; 157 case PM_PAR_SYY: 158 params_max = 100; 159 break; 160 case PM_PAR_SXY: 161 params_max = +q2; 162 break; 163 default: 164 psAbort ("psModules.pmModel_GAUSS", "invalid parameter %d for param max test", nParam); 165 } 166 if (params[nParam] > params_max) { 167 params[nParam] = params_max; 168 return false; 169 } 170 return true; 171 default: 172 psAbort ("psModules.pmModel_GAUSS", "invalid choice for limits"); 173 } 174 psAbort ("psModules.pmModel_GAUSS", "should not reach here"); 175 return false; 92 176 } 93 177 … … 98 182 psF32 *PAR = model->params->data.F32; 99 183 100 # if (0) 101 102 psEllipseMoments emoments; 184 psEllipseMoments emoments; 103 185 emoments.x2 = moments->Sx; 104 emoments.y2 = moments->S x;186 emoments.y2 = moments->Sy; 105 187 emoments.xy = moments->Sxy; 106 188 107 psEllipseAxes axes = psEllipseMomentsToAxes (emoments); 189 // force the axis ratio to be < 20.0 190 psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0); 108 191 psEllipseShape shape = psEllipseAxesToShape (axes); 109 # endif 110 111 PAR[PM_PAR_SKY] = moments->Sky; 112 PAR[PM_PAR_I0] = moments->Peak - moments->Sky; 192 193 PAR[PM_PAR_SKY] = moments->Sky; 194 PAR[PM_PAR_I0] = moments->Peak - moments->Sky; 113 195 PAR[PM_PAR_XPOS] = moments->x; 114 196 PAR[PM_PAR_YPOS] = moments->y; 115 PAR[PM_PAR_SXX] = PS_MAX(0.5, M_SQRT2*moments->Sx); 116 PAR[PM_PAR_SYY] = PS_MAX(0.5, M_SQRT2*moments->Sy); 117 PAR[PM_PAR_SXY] = 0.0; 118 # if (0) 119 120 PAR[PM_PAR_SXX] = PS_MAX(0.5, M_SQRT2*shape.sx); 197 PAR[PM_PAR_SXX] = PS_MAX(0.5, M_SQRT2*shape.sx); 121 198 PAR[PM_PAR_SYY] = PS_MAX(0.5, M_SQRT2*shape.sy); 122 199 PAR[PM_PAR_SXY] = shape.sxy; 123 # endif124 125 200 return(true); 126 201 } … … 138 213 139 214 // Area is equivalent to 2 pi sigma^2 140 psEllipseAxes axes = psEllipseShapeToAxes (shape); 215 // axes ratio < 20 216 psEllipseAxes axes = psEllipseShapeToAxes (shape, 20.0); 141 217 psF64 Area = 2.0 * M_PI * axes.major * axes.minor; 142 218 … … 165 241 shape.sxy = PAR[PM_PAR_SXY]; 166 242 167 psEllipseAxes axes = psEllipseShapeToAxes (shape );243 psEllipseAxes axes = psEllipseShapeToAxes (shape, 20.0); 168 244 psF64 radius = axes.major * sqrt (2.0 * log(PAR[PM_PAR_I0] / flux)); 169 245 return (radius); … … 194 270 out[PM_PAR_SXY] = pmPSF_SXYtoModel (out); 195 271 272 // apply the model limits here: this truncates excessive extrapolation 273 for (int i = 0; i < psf->params_NEW->n; i++) { 274 // apply the limits to all components or just the psf-model parameters? 275 if (psf->params_NEW->data[i] == NULL) 276 continue; 277 PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, out, NULL); 278 PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, out, NULL); 279 } 196 280 return(true); 197 281 } -
trunk/psModules/src/objects/models/pmModel_PGAUSS.c
r10195 r10262 58 58 } 59 59 60 bool PM_MODEL_LIMITS (psVector **beta_lim, psVector **params_min, psVector **params_max) 61 { 62 63 *beta_lim = psVectorAlloc (7, PS_TYPE_F32); 64 *params_min = psVectorAlloc (7, PS_TYPE_F32); 65 *params_max = psVectorAlloc (7, PS_TYPE_F32); 66 67 beta_lim[0][0].data.F32[PM_PAR_SKY] = 1000; 68 beta_lim[0][0].data.F32[PM_PAR_I0] = 3e6; 69 beta_lim[0][0].data.F32[PM_PAR_XPOS] = 5; 70 beta_lim[0][0].data.F32[PM_PAR_YPOS] = 5; 71 beta_lim[0][0].data.F32[PM_PAR_SXX] = 0.5; 72 beta_lim[0][0].data.F32[PM_PAR_SYY] = 0.5; 73 beta_lim[0][0].data.F32[PM_PAR_SXY] = 0.5; 74 75 params_min[0][0].data.F32[PM_PAR_SKY] = -1000; 76 params_min[0][0].data.F32[PM_PAR_I0] = 0; 77 params_min[0][0].data.F32[PM_PAR_XPOS] = -100; 78 params_min[0][0].data.F32[PM_PAR_YPOS] = -100; 79 params_min[0][0].data.F32[PM_PAR_SXX] = 0.5; 80 params_min[0][0].data.F32[PM_PAR_SYY] = 0.5; 81 params_min[0][0].data.F32[PM_PAR_SXY] = -5.0; 82 83 params_max[0][0].data.F32[PM_PAR_SKY] = 1e5; 84 params_max[0][0].data.F32[PM_PAR_I0] = 1e8; 85 params_max[0][0].data.F32[PM_PAR_XPOS] = 1e4; // this should be set by image dimensions! 86 params_max[0][0].data.F32[PM_PAR_YPOS] = 1e4; // this should be set by image dimensions! 87 params_max[0][0].data.F32[PM_PAR_SXX] = 100.0; 88 params_max[0][0].data.F32[PM_PAR_SYY] = 100.0; 89 params_max[0][0].data.F32[PM_PAR_SXY] = +5.0; 90 91 return (TRUE); 60 // define the parameter limits 61 // AR_MAX is the maximum allowed axis ratio 62 // AR_RATIO is ((1-R)/(1+R))^2 where R = AR_MAX^(-2) 63 # define AR_MAX 20.0 64 # define AR_RATIO 0.99 65 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 66 { 67 float beta_lim, params_min, params_max; 68 float f1, f2, q1, q2; 69 70 // we need to calculate the limits for SXY specially 71 if (nParam == PM_PAR_SXY) { 72 f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 73 f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 74 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 75 assert (q1 > 0); 76 q2 = 0.5*sqrt (q1); 77 } 78 79 switch (mode) { 80 case PS_MINIMIZE_BETA_LIMIT: 81 switch (nParam) { 82 case PM_PAR_SKY: 83 beta_lim = 1000; 84 break; 85 case PM_PAR_I0: 86 beta_lim = 3e6; 87 break; 88 case PM_PAR_XPOS: 89 beta_lim = 5; 90 break; 91 case PM_PAR_YPOS: 92 beta_lim = 5; 93 break; 94 case PM_PAR_SXX: 95 beta_lim = 0.5; 96 break; 97 case PM_PAR_SYY: 98 beta_lim = 0.5; 99 break; 100 case PM_PAR_SXY: 101 beta_lim = q2; 102 break; 103 default: 104 psAbort ("psModules.pmModel_GAUSS", "invalid parameter %d for beta test", nParam); 105 } 106 if (fabs(beta[nParam]) > fabs(beta_lim)) { 107 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 108 return false; 109 } 110 return true; 111 case PS_MINIMIZE_PARAM_MIN: 112 switch (nParam) { 113 case PM_PAR_SKY: 114 params_min = -1000; 115 break; 116 case PM_PAR_I0: 117 params_min = 0; 118 break; 119 case PM_PAR_XPOS: 120 params_min = -100; 121 break; 122 case PM_PAR_YPOS: 123 params_min = -100; 124 break; 125 case PM_PAR_SXX: 126 params_min = 0.5; 127 break; 128 case PM_PAR_SYY: 129 params_min = 0.5; 130 break; 131 case PM_PAR_SXY: 132 params_min = -q2; 133 break; 134 default: 135 psAbort ("psModules.pmModel_GAUSS", "invalid parameter %d for param min test", nParam); 136 } 137 if (params[nParam] < params_min) { 138 params[nParam] = params_min; 139 return false; 140 } 141 return true; 142 case PS_MINIMIZE_PARAM_MAX: 143 switch (nParam) { 144 case PM_PAR_SKY: 145 params_max = 1e5; 146 break; 147 case PM_PAR_I0: 148 params_max = 1e8; 149 break; 150 case PM_PAR_XPOS: 151 params_max = 1e4; 152 break; 153 case PM_PAR_YPOS: 154 params_max = 1e4; 155 break; 156 case PM_PAR_SXX: 157 params_max = 100; 158 break; 159 case PM_PAR_SYY: 160 params_max = 100; 161 break; 162 case PM_PAR_SXY: 163 params_max = +q2; 164 break; 165 default: 166 psAbort ("psModules.pmModel_GAUSS", "invalid parameter %d for param max test", nParam); 167 } 168 if (params[nParam] > params_max) { 169 params[nParam] = params_max; 170 return false; 171 } 172 return true; 173 default: 174 psAbort ("psModules.pmModel_GAUSS", "invalid choice for limits"); 175 } 176 psAbort ("psModules.pmModel_GAUSS", "should not reach here"); 177 return false; 92 178 } 93 179 … … 98 184 psF32 *PAR = model->params->data.F32; 99 185 100 # if (0) 101 102 psEllipseMoments emoments; 186 psEllipseMoments emoments; 103 187 emoments.x2 = moments->Sx; 104 188 emoments.y2 = moments->Sx; 105 189 emoments.xy = moments->Sxy; 106 190 107 psEllipseAxes axes = psEllipseMomentsToAxes (emoments );191 psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0); 108 192 psEllipseShape shape = psEllipseAxesToShape (axes); 109 # endif110 193 111 194 PAR[PM_PAR_SKY] = moments->Sky; … … 113 196 PAR[PM_PAR_XPOS] = moments->x; // XXX use peak->xf, peak->yf? 114 197 PAR[PM_PAR_YPOS] = moments->y; 115 PAR[PM_PAR_SXX] = PS_MAX(0.5, M_SQRT2*moments->Sx); 116 PAR[PM_PAR_SYY] = PS_MAX(0.5, M_SQRT2*moments->Sy); 117 PAR[PM_PAR_SXY] = 0.0; 118 119 # if (0) 120 121 PAR[PM_PAR_SXX] = PS_MAX(0.5, M_SQRT2*shape.sx); 198 PAR[PM_PAR_SXX] = PS_MAX(0.5, M_SQRT2*shape.sx); 122 199 PAR[PM_PAR_SYY] = PS_MAX(0.5, M_SQRT2*shape.sy); 123 200 PAR[PM_PAR_SXY] = shape.sxy; 124 # endif125 126 201 return(true); 127 202 } … … 139 214 140 215 // Area is equivalent to 2 pi sigma^2 141 psEllipseAxes axes = psEllipseShapeToAxes (shape );216 psEllipseAxes axes = psEllipseShapeToAxes (shape, 20.0); 142 217 psF64 Area = 2.0 * M_PI * axes.major * axes.minor; 143 218 … … 183 258 184 259 // this estimates the radius assuming f(z) is roughly exp(-z) 185 psEllipseAxes axes = psEllipseShapeToAxes (shape );260 psEllipseAxes axes = psEllipseShapeToAxes (shape, 20.0); 186 261 psF64 radius = axes.major * sqrt (2.0 * log(PAR[PM_PAR_I0] / flux)); 187 262 -
trunk/psModules/src/objects/models/pmModel_QGAUSS.c
r10078 r10262 43 43 // other models (like PGAUSS) don't use fractional powers, and thus do not have NaN values 44 44 // for negative values of z 45 if (z < 0) 46 z = 0; 45 // XXX use an assert here to force the elliptical parameters to be correctly determined 46 // if (z < 0) z = 0; 47 assert (z > 0); 47 48 48 49 psF32 zp = pow(z,1.25); … … 72 73 } 73 74 74 bool PM_MODEL_LIMITS (psVector **beta_lim, psVector **params_min, psVector **params_max) 75 { 76 77 *beta_lim = psVectorAlloc (8, PS_TYPE_F32); 78 *params_min = psVectorAlloc (8, PS_TYPE_F32); 79 *params_max = psVectorAlloc (8, PS_TYPE_F32); 80 81 beta_lim[0][0].data.F32[PM_PAR_SKY] = 1000; 82 beta_lim[0][0].data.F32[PM_PAR_I0] = 3e6; 83 beta_lim[0][0].data.F32[PM_PAR_XPOS] = 5; 84 beta_lim[0][0].data.F32[PM_PAR_YPOS] = 5; 85 beta_lim[0][0].data.F32[PM_PAR_SXX] = 0.5; 86 beta_lim[0][0].data.F32[PM_PAR_SYY] = 0.5; 87 beta_lim[0][0].data.F32[PM_PAR_SXY] = 0.5; 88 beta_lim[0][0].data.F32[PM_PAR_7] = 0.5; 89 90 params_min[0][0].data.F32[PM_PAR_SKY] = -1000; 91 params_min[0][0].data.F32[PM_PAR_I0] = 0; 92 params_min[0][0].data.F32[PM_PAR_XPOS] = -100; 93 params_min[0][0].data.F32[PM_PAR_YPOS] = -100; 94 params_min[0][0].data.F32[PM_PAR_SXX] = 0.5; 95 params_min[0][0].data.F32[PM_PAR_SYY] = 0.5; 96 params_min[0][0].data.F32[PM_PAR_SXY] = -5.0; 97 params_min[0][0].data.F32[PM_PAR_7] = 0.1; 98 99 params_max[0][0].data.F32[PM_PAR_SKY] = 1e5; 100 params_max[0][0].data.F32[PM_PAR_I0] = 1e8; 101 params_max[0][0].data.F32[PM_PAR_XPOS] = 1e4; // this should be set by image dimensions! 102 params_max[0][0].data.F32[PM_PAR_YPOS] = 1e4; // this should be set by image dimensions! 103 params_max[0][0].data.F32[PM_PAR_SXX] = 100.0; 104 params_max[0][0].data.F32[PM_PAR_SYY] = 100.0; 105 params_max[0][0].data.F32[PM_PAR_SXY] = +5.0; 106 params_max[0][0].data.F32[PM_PAR_7] = 10.0; 107 108 return (TRUE); 109 } 75 // define the parameter limits 76 // AR_MAX is the maximum allowed axis ratio 77 // AR_RATIO is ((1-R)/(1+R))^2 where R = AR_MAX^(-2) 78 # define AR_MAX 20.0 79 # define AR_RATIO 0.99 80 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 81 { 82 float beta_lim, params_min, params_max; 83 float f1, f2, q1, q2; 84 85 // we need to calculate the limits for SXY specially 86 if (nParam == PM_PAR_SXY) { 87 f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 88 f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 89 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 90 assert (q1 > 0); 91 q2 = 0.5*sqrt (q1); 92 } 93 94 switch (mode) { 95 case PS_MINIMIZE_BETA_LIMIT: 96 switch (nParam) { 97 case PM_PAR_SKY: 98 beta_lim = 1000; 99 break; 100 case PM_PAR_I0: 101 beta_lim = 3e6; 102 break; 103 case PM_PAR_XPOS: 104 beta_lim = 5; 105 break; 106 case PM_PAR_YPOS: 107 beta_lim = 5; 108 break; 109 case PM_PAR_SXX: 110 beta_lim = 0.5; 111 break; 112 case PM_PAR_SYY: 113 beta_lim = 0.5; 114 break; 115 case PM_PAR_SXY: 116 beta_lim = q2; 117 break; 118 case PM_PAR_7: 119 beta_lim = 0.5; 120 break; 121 default: 122 psAbort ("psModules.pmModel_GAUSS", "invalid parameter %d for beta test", nParam); 123 } 124 if (fabs(beta[nParam]) > fabs(beta_lim)) { 125 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 126 return false; 127 } 128 return true; 129 case PS_MINIMIZE_PARAM_MIN: 130 switch (nParam) { 131 case PM_PAR_SKY: 132 params_min = -1000; 133 break; 134 case PM_PAR_I0: 135 params_min = 0; 136 break; 137 case PM_PAR_XPOS: 138 params_min = -100; 139 break; 140 case PM_PAR_YPOS: 141 params_min = -100; 142 break; 143 case PM_PAR_SXX: 144 params_min = 0.5; 145 break; 146 case PM_PAR_SYY: 147 params_min = 0.5; 148 break; 149 case PM_PAR_SXY: 150 params_min = -q2; 151 break; 152 case PM_PAR_7: 153 params_min = 0.1; 154 break; 155 default: 156 psAbort ("psModules.pmModel_GAUSS", "invalid parameter %d for param min test", nParam); 157 } 158 if (params[nParam] < params_min) { 159 params[nParam] = params_min; 160 return false; 161 } 162 return true; 163 case PS_MINIMIZE_PARAM_MAX: 164 switch (nParam) { 165 case PM_PAR_SKY: 166 params_max = 1e5; 167 break; 168 case PM_PAR_I0: 169 params_max = 1e8; 170 break; 171 case PM_PAR_XPOS: 172 params_max = 1e4; 173 break; 174 case PM_PAR_YPOS: 175 params_max = 1e4; 176 break; 177 case PM_PAR_SXX: 178 params_max = 100; 179 break; 180 case PM_PAR_SYY: 181 params_max = 100; 182 break; 183 case PM_PAR_SXY: 184 params_max = +q2; 185 break; 186 case PM_PAR_7: 187 params_max = 10.0; 188 break; 189 default: 190 psAbort ("psModules.pmModel_GAUSS", "invalid parameter %d for param max test", nParam); 191 } 192 if (params[nParam] > params_max) { 193 params[nParam] = params_max; 194 return false; 195 } 196 return true; 197 default: 198 psAbort ("psModules.pmModel_GAUSS", "invalid choice for limits"); 199 } 200 psAbort ("psModules.pmModel_GAUSS", "should not reach here"); 201 return false; 202 } 203 110 204 111 205 // make an initial guess for parameters 112 206 bool PM_MODEL_GUESS (pmModel *model, pmSource *source) 113 207 { 114 115 208 pmMoments *moments = source->moments; 116 209 pmPeak *peak = source->peak; 117 210 psF32 *PAR = model->params->data.F32; 211 212 psEllipseMoments emoments; 213 emoments.x2 = moments->Sx; 214 emoments.y2 = moments->Sy; 215 emoments.xy = moments->Sxy; 216 217 // force the axis ratio to be < 20.0 218 psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0); 219 psEllipseShape shape = psEllipseAxesToShape (axes); 118 220 119 221 PAR[PM_PAR_SKY] = moments->Sky; … … 121 223 PAR[PM_PAR_XPOS] = peak->x; 122 224 PAR[PM_PAR_YPOS] = peak->y; 123 PAR[PM_PAR_SXX] = PS_MAX(0.5, moments->Sx);124 PAR[PM_PAR_SYY] = PS_MAX(0.5, moments->Sy);125 PAR[PM_PAR_SXY] = 0.0;225 PAR[PM_PAR_SXX] = PS_MAX(0.5, M_SQRT2*shape.sx); 226 PAR[PM_PAR_SYY] = PS_MAX(0.5, M_SQRT2*shape.sy); 227 PAR[PM_PAR_SXY] = shape.sxy; 126 228 PAR[PM_PAR_7] = 1.0; 127 229 … … 141 243 142 244 // Area is equivalent to 2 pi sigma^2 143 psEllipseAxes axes = psEllipseShapeToAxes (shape );245 psEllipseAxes axes = psEllipseShapeToAxes (shape, 20.0); 144 246 psF64 Area = 2.0 * M_PI * axes.major * axes.minor; 145 247 … … 186 288 shape.sxy = PAR[PM_PAR_SXY]; 187 289 188 psEllipseAxes axes = psEllipseShapeToAxes (shape );290 psEllipseAxes axes = psEllipseShapeToAxes (shape, 20.0); 189 291 psF64 sigma = axes.major; 190 292
Note:
See TracChangeset
for help on using the changeset viewer.
