Changeset 9526 for trunk/psModules/src/objects/models/pmModel_QGAUSS.c
- Timestamp:
- Oct 12, 2006, 4:23:55 PM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/objects/models/pmModel_QGAUSS.c
r6947 r9526 4 4 1 / (1 + z^M + z^N) 5 5 6 params->data.F32[ 0] = So;7 params->data.F32[ 1] = Zo;8 params->data.F32[ 2] = Xo;9 params->data.F32[ 3] = Yo;10 params->data.F32[ 4] = sqrt(2.0) / SigmaX;11 params->data.F32[ 5] = sqrt(2.0) / SigmaY;12 params->data.F32[ 6] = Sxy;13 params->data.F32[ 7] =14 params->data.F32[ 8] =6 params->data.F32[PM_PAR_SKY] = So; 7 params->data.F32[PM_PAR_FLUX] = Zo; 8 params->data.F32[PM_PAR_XPOS] = Xo; 9 params->data.F32[PM_PAR_YPOS] = Yo; 10 params->data.F32[PM_PAR_SXX] = sqrt(2.0) / SigmaX; 11 params->data.F32[PM_PAR_SYY] = sqrt(2.0) / SigmaY; 12 params->data.F32[PM_PAR_SXY] = Sxy; 13 params->data.F32[PM_PAR_7] = 14 params->data.F32[PM_PAR_8] = 15 15 *****************************************************************************/ 16 16 … … 21 21 psF32 *PAR = params->data.F32; 22 22 23 psF32 X = x->data.F32[0] - PAR[ 2];24 psF32 Y = x->data.F32[1] - PAR[ 3];25 psF32 px = PAR[ 4]*X;26 psF32 py = PAR[ 5]*Y;27 psF32 z = 0.5*PS_SQR(px) + 0.5*PS_SQR(py) + PAR[ 6]*X*Y;23 psF32 X = x->data.F32[0] - PAR[PM_PAR_XPOS]; 24 psF32 Y = x->data.F32[1] - PAR[PM_PAR_YPOS]; 25 psF32 px = PAR[PM_PAR_SXX]*X; 26 psF32 py = PAR[PM_PAR_SYY]*Y; 27 psF32 z = 0.5*PS_SQR(px) + 0.5*PS_SQR(py) + PAR[PM_PAR_SXY]*X*Y; 28 28 if (z < 0) 29 29 z = 0; 30 30 31 31 psF32 zp = pow(z,1.25); 32 psF32 r = 1.0 / (1 + PAR[ 7]*z + z*zp);33 34 psF32 r1 = PAR[ 1]*r;35 psF32 f = r1 + PAR[ 0];32 psF32 r = 1.0 / (1 + PAR[PM_PAR_7]*z + z*zp); 33 34 psF32 r1 = PAR[PM_PAR_FLUX]*r; 35 psF32 f = r1 + PAR[PM_PAR_SKY]; 36 36 37 37 if (deriv != NULL) { 38 38 psF32 *dPAR = deriv->data.F32; 39 39 40 // note difference from a pure gaussian: q = params->data.F32[ 1]*r40 // note difference from a pure gaussian: q = params->data.F32[PM_PAR_FLUX]*r 41 41 psF32 t = r1*r; 42 psF32 q = t*(PAR[ 7] + 2.25*zp);43 44 dPAR[ 0] = +1.0;45 dPAR[ 1] = +r;46 dPAR[ 2] = q*(2.0*px*PAR[4] + PAR[6]*Y);47 dPAR[ 3] = q*(2.0*py*PAR[5] + PAR[6]*X);48 dPAR[ 4] = -2.0*q*px*X;49 dPAR[ 5] = -2.0*q*py*Y;50 dPAR[ 6] = -q*X*Y;51 dPAR[ 7] = -t*z;42 psF32 q = t*(PAR[PM_PAR_7] + 2.25*zp); 43 44 dPAR[PM_PAR_SKY] = +1.0; 45 dPAR[PM_PAR_FLUX] = +r; 46 dPAR[PM_PAR_XPOS] = q*(2.0*px*PAR[PM_PAR_SXX] + PAR[PM_PAR_SXY]*Y); 47 dPAR[PM_PAR_YPOS] = q*(2.0*py*PAR[PM_PAR_SYY] + PAR[PM_PAR_SXY]*X); 48 dPAR[PM_PAR_SXX] = -2.0*q*px*X; 49 dPAR[PM_PAR_SYY] = -2.0*q*py*Y; 50 dPAR[PM_PAR_SXY] = -q*X*Y; 51 dPAR[PM_PAR_7] = -t*z; 52 52 } 53 53 return(f); … … 64 64 (*params_max)->n = (*params_max)->nalloc; 65 65 66 beta_lim[0][0].data.F32[ 0] = 1000;67 beta_lim[0][0].data.F32[ 1] = 3e6;68 beta_lim[0][0].data.F32[ 2] = 5;69 beta_lim[0][0].data.F32[ 3] = 5;70 beta_lim[0][0].data.F32[ 4] = 0.5;71 beta_lim[0][0].data.F32[ 5] = 0.5;72 beta_lim[0][0].data.F32[ 6] = 0.5;73 beta_lim[0][0].data.F32[ 7] = 0.5;74 75 params_min[0][0].data.F32[ 0] = -1000;76 params_min[0][0].data.F32[ 1] = 0;77 params_min[0][0].data.F32[ 2] = -100;78 params_min[0][0].data.F32[ 3] = -100;79 params_min[0][0].data.F32[ 4] = 0.01;80 params_min[0][0].data.F32[ 5] = 0.01;81 params_min[0][0].data.F32[ 6] = -5.0;82 params_min[0][0].data.F32[ 7] = 0.1;83 84 params_max[0][0].data.F32[ 0] = 1e5;85 params_max[0][0].data.F32[ 1] = 1e8;86 params_max[0][0].data.F32[ 2] = 1e4; // this should be set by image dimensions!87 params_max[0][0].data.F32[ 3] = 1e4; // this should be set by image dimensions!88 params_max[0][0].data.F32[ 4] = 2.0;89 params_max[0][0].data.F32[ 5] = 2.0;90 params_max[0][0].data.F32[ 6] = +5.0;91 params_max[0][0].data.F32[ 7] = 10.0;66 beta_lim[0][0].data.F32[PM_PAR_SKY] = 1000; 67 beta_lim[0][0].data.F32[PM_PAR_FLUX] = 3e6; 68 beta_lim[0][0].data.F32[PM_PAR_XPOS] = 5; 69 beta_lim[0][0].data.F32[PM_PAR_YPOS] = 5; 70 beta_lim[0][0].data.F32[PM_PAR_SXX] = 0.5; 71 beta_lim[0][0].data.F32[PM_PAR_SYY] = 0.5; 72 beta_lim[0][0].data.F32[PM_PAR_SXY] = 0.5; 73 beta_lim[0][0].data.F32[PM_PAR_7] = 0.5; 74 75 params_min[0][0].data.F32[PM_PAR_SKY] = -1000; 76 params_min[0][0].data.F32[PM_PAR_FLUX] = 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.01; 80 params_min[0][0].data.F32[PM_PAR_SYY] = 0.01; 81 params_min[0][0].data.F32[PM_PAR_SXY] = -5.0; 82 params_min[0][0].data.F32[PM_PAR_7] = 0.1; 83 84 params_max[0][0].data.F32[PM_PAR_SKY] = 1e5; 85 params_max[0][0].data.F32[PM_PAR_FLUX] = 1e8; 86 params_max[0][0].data.F32[PM_PAR_XPOS] = 1e4; // this should be set by image dimensions! 87 params_max[0][0].data.F32[PM_PAR_YPOS] = 1e4; // this should be set by image dimensions! 88 params_max[0][0].data.F32[PM_PAR_SXX] = 2.0; 89 params_max[0][0].data.F32[PM_PAR_SYY] = 2.0; 90 params_max[0][0].data.F32[PM_PAR_SXY] = +5.0; 91 params_max[0][0].data.F32[PM_PAR_7] = 10.0; 92 92 93 93 return (TRUE); … … 102 102 psF32 *params = model->params->data.F32; 103 103 104 params[ 0] = moments->Sky;105 params[ 1] = moments->Peak - moments->Sky;106 params[ 2] = peak->x;107 params[ 3] = peak->y;108 params[ 4] = (moments->Sx < (1.2 / 2.0)) ? 2.0 : (1.2 / moments->Sx);109 params[ 5] = (moments->Sy < (1.2 / 2.0)) ? 2.0 : (1.2 / moments->Sy);110 params[ 6] = 0.0;111 params[ 7] = 1.0;104 params[PM_PAR_SKY] = moments->Sky; 105 params[PM_PAR_FLUX] = moments->Peak - moments->Sky; 106 params[PM_PAR_XPOS] = peak->x; 107 params[PM_PAR_YPOS] = peak->y; 108 params[PM_PAR_SXX] = (moments->Sx < (1.2 / 2.0)) ? 2.0 : (1.2 / moments->Sx); 109 params[PM_PAR_SYY] = (moments->Sy < (1.2 / 2.0)) ? 2.0 : (1.2 / moments->Sy); 110 params[PM_PAR_SXY] = 0.0; 111 params[PM_PAR_7] = 1.0; 112 112 113 113 return(true); … … 121 121 psF32 *PAR = params->data.F32; 122 122 123 psF64 A1 = PS_SQR(PAR[ 4]);124 psF64 A2 = PS_SQR(PAR[ 5]);125 psF64 A3 = PS_SQR(PAR[ 6]);123 psF64 A1 = PS_SQR(PAR[PM_PAR_SXX]); 124 psF64 A2 = PS_SQR(PAR[PM_PAR_SYY]); 125 psF64 A3 = PS_SQR(PAR[PM_PAR_SXY]); 126 126 psF64 Area = 2.0 * M_PI / sqrt(A1*A2 - A3); 127 127 // Area is equivalent to 2 pi sigma^2 … … 135 135 float f1, f2; 136 136 for (z = DZ; z < 50; z += DZ) { 137 f1 = 1.0 / (1 + PAR[ 7]*z + pow(z, 2.25));137 f1 = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, 2.25)); 138 138 z += DZ; 139 f2 = 1.0 / (1 + PAR[ 7]*z + pow(z, 2.25));139 f2 = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, 2.25)); 140 140 norm += f0 + 4*f1 + f2; 141 141 f0 = f2; … … 143 143 norm *= DZ / 3.0; 144 144 145 psF64 Flux = PAR[ 1] * Area * norm;145 psF64 Flux = PAR[PM_PAR_FLUX] * Area * norm; 146 146 147 147 return(Flux); … … 158 158 if (flux <= 0) 159 159 return (1.0); 160 if (PAR[ 1] <= 0)160 if (PAR[PM_PAR_FLUX] <= 0) 161 161 return (1.0); 162 if (flux >= PAR[ 1])162 if (flux >= PAR[PM_PAR_FLUX]) 163 163 return (1.0); 164 164 165 165 // if Sx == Sy, sigma = Sx == Sy 166 psF64 sigma = hypot (1.0 / PAR[ 4], 1.0 / PAR[5]) / sqrt(2.0);167 psF64 limit = flux / PAR[ 1];166 psF64 sigma = hypot (1.0 / PAR[PM_PAR_SXX], 1.0 / PAR[PM_PAR_SYY]) / sqrt(2.0); 167 psF64 limit = flux / PAR[PM_PAR_FLUX]; 168 168 169 169 # if 0 … … 174 174 for (z = 0.0; z < 30.0; z += dz) { 175 175 Nstep ++; 176 f = 1.0 / (1 + PAR[ 7]*z + pow(z, 2.25));177 // test: f = 1.0 / (1 + PAR[ 7]*z + PS_SQR(z));176 f = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, 2.25)); 177 // test: f = 1.0 / (1 + PAR[PM_PAR_7]*z + PS_SQR(z)); 178 178 if (f < limit) 179 179 break; … … 189 189 // choose a z value guaranteed to be beyond our limit 190 190 float z0 = pow((1.0 / limit), (1.0 / 2.25)); 191 float z1 = (1.0 / limit) / PAR[ 7];191 float z1 = (1.0 / limit) / PAR[PM_PAR_7]; 192 192 z1 = PS_MAX (z0, z1); 193 193 z0 = 0.0; 194 194 195 float f0 = 1.0 / (1 + PAR[ 7]*z0 + pow(z0, 2.25));196 float f1 = 1.0 / (1 + PAR[ 7]*z1 + pow(z1, 2.25));195 float f0 = 1.0 / (1 + PAR[PM_PAR_7]*z0 + pow(z0, 2.25)); 196 float f1 = 1.0 / (1 + PAR[PM_PAR_7]*z1 + pow(z1, 2.25)); 197 197 while ((Nstep < 10) && (fabs(z1 - z0) > 0.5)) { 198 198 z = 0.5*(z0 + z1); 199 f = 1.0 / (1 + PAR[ 7]*z + pow(z, 2.25));199 f = 1.0 / (1 + PAR[PM_PAR_7]*z + pow(z, 2.25)); 200 200 // fprintf (stderr, "%f %f %f : %f %f %f\n", f0, f, f1, z0, z, z1); 201 201 if (f > limit) { … … 224 224 psF32 *in = modelFLT->params->data.F32; 225 225 226 out[0] = in[0]; 227 out[1] = in[1]; 228 out[2] = in[2]; 229 out[3] = in[3]; 230 226 out[PM_PAR_SKY] = in[PM_PAR_SKY]; 227 out[PM_PAR_FLUX] = in[PM_PAR_FLUX]; 228 out[PM_PAR_XPOS] = in[PM_PAR_XPOS]; 229 out[PM_PAR_YPOS] = in[PM_PAR_YPOS]; 230 231 assert (PM_PAR_YPOS == 4); // so that we copy the rest of the params 231 232 for (int i = 4; i < 8; i++) { 232 233 psPolynomial2D *poly = psf->params->data[i-4]; 233 234 // XXX: Verify this (from EAM change) 234 //out[i] = Polynomial2DEval_EAM(poly, out[ 2], out[3]);235 out[i] = psPolynomial2DEval(poly, out[ 2], out[3]);235 //out[i] = Polynomial2DEval_EAM(poly, out[PM_PAR_XPOS], out[PM_PAR_YPOS]); 236 out[i] = psPolynomial2DEval(poly, out[PM_PAR_XPOS], out[PM_PAR_YPOS]); 236 237 } 237 238 return(true); … … 248 249 249 250 dP = 0; 250 dP += PS_SQR(dPAR[ 4] / PAR[4]);251 dP += PS_SQR(dPAR[ 5] / PAR[5]);251 dP += PS_SQR(dPAR[PM_PAR_SXX] / PAR[PM_PAR_SXX]); 252 dP += PS_SQR(dPAR[PM_PAR_SYY] / PAR[PM_PAR_SYY]); 252 253 dP = sqrt (dP); 253 254 254 255 status = true; 255 256 status &= (dP < 0.5); 256 status &= (PAR[ 1] > 0);257 status &= ((dPAR[ 1]/PAR[1]) < 0.5);257 status &= (PAR[PM_PAR_FLUX] > 0); 258 status &= ((dPAR[PM_PAR_FLUX]/PAR[PM_PAR_FLUX]) < 0.5); 258 259 259 260 if (!status)
Note:
See TracChangeset
for help on using the changeset viewer.
