Changeset 10262 for trunk/psModules/src/objects/models/pmModel_PGAUSS.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_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
Note:
See TracChangeset
for help on using the changeset viewer.
