Changeset 10262 for trunk/psModules/src/objects/models/pmModel_QGAUSS.c
- Timestamp:
- Nov 28, 2006, 4:55:24 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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.
