Changeset 5130
- Timestamp:
- Sep 25, 2005, 9:26:46 PM (21 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/models/pmModel_TGAUSS.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/models/pmModel_TGAUSS.c
r4954 r5130 12 12 params->data.F32[6] = Sxy; 13 13 params->data.F32[7] = 14 params->data.F32[8] = 14 15 *****************************************************************************/ 15 16 16 psF64 psModelFunc_TGAUSS(psVector *deriv, 17 /* XXX EAM : we need a way to have user-set values for fix parameters */ 18 # define TG_S 2.60 19 # define dTG_S 1.60 20 # define TRF 0.50 21 /* dTG_S is TG_S - 1.0 */ 22 23 psF32 pmModelFunc_TGAUSS(psVector *deriv, 17 24 const psVector *params, 18 25 const psVector *x) … … 25 32 psF32 py = PAR[5]*Y; 26 33 psF32 z = 0.5*PS_SQR(px) + 0.5*PS_SQR(py) + PAR[6]*X*Y; 27 28 psF32 p = pow(z, 1.2); 29 psF32 r = 1.0 / ( 1 + z + PAR[7]*z*p);34 psF32 er = exp(TRF*z); 35 36 psF32 r = 1.0 / (er + PAR[7]*z + pow(z, TG_S)); // (1/R) 30 37 psF32 f = PAR[1]*r + PAR[0]; 31 38 32 39 if (deriv != NULL) { 33 // note difference from a pure gaussian: q = params->data.F32[1]*r 34 psF32 t = PAR[1]*r*r; 35 psF32 q = t*(1 + PAR[7]*2.2*p); 40 psF32 t = PAR[1]*r*r; // df/dR 41 psF32 q = t*(TRF*er + PAR[7] + TG_S*pow(z, dTG_S)); // (df/dR)(dR/dz) 36 42 37 43 deriv->data.F32[0] = +1.0; 38 44 deriv->data.F32[1] = +r; 39 45 deriv->data.F32[2] = q*(2.0*px*PAR[4] + PAR[6]*Y); 40 deriv->data.F32[3] = q*(2.0*py*PAR[5] + PAR[6]*X);46 deriv->data.F32[3] = q*(2.0*py*PAR[5] + PAR[6]*X); 41 47 deriv->data.F32[4] = -2.0*q*px*X; 42 48 deriv->data.F32[5] = -2.0*q*py*Y; 43 49 deriv->data.F32[6] = -q*X*Y; 44 deriv->data.F32[7] = -t*z *p;50 deriv->data.F32[7] = -t*z; 45 51 } 46 52 return(f); 47 53 } 48 54 49 psF64 psModelFlux_TGAUSS(const psVector *params) 55 bool pmModelLimits_TGAUSS (psVector **beta_lim, psVector **params_min, psVector **params_max) { 56 57 *beta_lim = psVectorAlloc (8, PS_TYPE_F32); 58 *params_min = psVectorAlloc (8, PS_TYPE_F32); 59 *params_max = psVectorAlloc (8, PS_TYPE_F32); 60 61 beta_lim[0][0].data.F32[0] = 1000; 62 beta_lim[0][0].data.F32[1] = 10000; 63 beta_lim[0][0].data.F32[2] = 5; 64 beta_lim[0][0].data.F32[3] = 5; 65 beta_lim[0][0].data.F32[4] = 0.5; 66 beta_lim[0][0].data.F32[5] = 0.5; 67 beta_lim[0][0].data.F32[6] = 0.5; 68 beta_lim[0][0].data.F32[7] = 0.5; 69 70 params_min[0][0].data.F32[0] = -1000; 71 params_min[0][0].data.F32[1] = 0; 72 params_min[0][0].data.F32[2] = -100; 73 params_min[0][0].data.F32[3] = -100; 74 params_min[0][0].data.F32[4] = 0.01; 75 params_min[0][0].data.F32[5] = 0.01; 76 params_min[0][0].data.F32[6] = -5.0; 77 params_min[0][0].data.F32[7] = 0.1; 78 79 params_max[0][0].data.F32[0] = 1e5; 80 params_max[0][0].data.F32[1] = 1e6; 81 params_max[0][0].data.F32[2] = 1e4; // this should be set by image dimensions! 82 params_max[0][0].data.F32[3] = 1e4; // this should be set by image dimensions! 83 params_max[0][0].data.F32[4] = 2.0; 84 params_max[0][0].data.F32[5] = 2.0; 85 params_max[0][0].data.F32[6] = +5.0; 86 params_max[0][0].data.F32[7] = 10.0; 87 88 return (TRUE); 89 } 90 91 bool pmModelGuess_TGAUSS (pmModel *model, pmSource *source) { 92 93 pmMoments *moments = source->moments; 94 pmPeak *peak = source->peak; 95 psF32 *params = model->params->data.F32; 96 97 params[0] = moments->Sky; 98 params[1] = moments->Peak - moments->Sky; 99 params[2] = peak->x; 100 params[3] = peak->y; 101 params[4] = 1.2 / moments->Sx; 102 params[5] = 1.2 / moments->Sy; 103 params[6] = 0.0; 104 params[7] = 1.0; 105 return(true); 106 } 107 108 psF64 pmModelFlux_TGAUSS(const psVector *params) 50 109 { 51 psF64 A1 = 1 / PS_SQR(params->data.F32[4]); 52 psF64 A2 = 1 / PS_SQR(params->data.F32[5]); 53 psF64 A3 = params->data.F32[6]; 54 psF64 Area = 2.0 * M_PI / sqrt(A1*A2 - PS_SQR(A3)); 110 float f, norm, z; 111 112 psF32 *PAR = params->data.F32; 113 114 psF64 A1 = PS_SQR(PAR[4]); 115 psF64 A2 = PS_SQR(PAR[5]); 116 psF64 A3 = PS_SQR(PAR[6]); 117 psF64 Area = 2.0 * M_PI / sqrt(A1*A2 - A3); 55 118 // Area is equivalent to 2 pi sigma^2 56 119 57 psF64 Flux = params->data.F32[1] * Area; 120 // the area needs to be multiplied by the integral of f(z) 121 norm = 0.0; 122 for (z = 0.005; z < 50; z += 0.01) { 123 psF32 er = exp(TRF*z); 124 f = 1.0 / (er + PAR[7]*z + pow(z, TG_S)); 125 norm += f; 126 } 127 norm *= 0.01; 128 129 psF64 Flux = PAR[1] * Area * norm; 58 130 59 131 return(Flux); … … 62 134 // define this function so it never returns Inf or NaN 63 135 // return the radius which yields the requested flux 64 psF64 p sModelRadius_TGAUSS (const psVector *params, psF64 flux)136 psF64 pmModelRadius_TGAUSS (const psVector *params, psF64 flux) 65 137 { 138 psF64 z, f; 139 psF32 *PAR = params->data.F32; 140 66 141 if (flux <= 0) return (1.0); 67 if (params->data.F32[1] <= 0) return (1.0); 68 if (flux >= params->data.F32[1]) return (1.0); 69 70 psF64 sigma = sqrt(2.0) * hypot (1.0 / params->data.F32[4], 1.0 / params->data.F32[5]); 71 psF64 radius = sigma * sqrt (2.0 * log(params->data.F32[1] / flux)); 142 if (PAR[1] <= 0) return (1.0); 143 if (flux >= PAR[1]) return (1.0); 144 145 // if Sx == Sy, sigma = Sx == Sy 146 psF64 sigma = hypot (1.0 / PAR[4], 1.0 / PAR[5]) / sqrt(2.0); 147 psF64 dz = 1.0 / (2.0 * sigma*sigma); 148 psF64 limit = flux / PAR[1]; 149 150 // we can do this much better with intelligent choices here 151 for (z = 0.0; z < 20.0; z += dz) { 152 psF32 er = exp(TRF*z); 153 f = 1.0 / (er + PAR[7]*z + pow(z, TG_S)); 154 if (f < limit) break; 155 } 156 psF64 radius = sigma * sqrt (2.0 * z); 72 157 if (isnan(radius)) { 73 158 fprintf (stderr, "error in code\n"); … … 76 161 } 77 162 78 bool psModelGuess_TGAUSS (psModel *model, psSource *source) { 79 80 psVector *params = model->params; 81 82 params->data.F32[0] = source->moments->Sky; 83 params->data.F32[1] = source->peak->counts - source->moments->Sky; 84 params->data.F32[2] = source->moments->x; 85 params->data.F32[3] = source->moments->y; 86 params->data.F32[4] = 1.0/source->moments->Sx; 87 params->data.F32[5] = 1.0/source->moments->Sy; 88 // params->data.F32[6] = source->moments->Sxy; 89 params->data.F32[6] = 0.0; 90 params->data.F32[7] = 5.0; 91 return(true); 92 } 93 94 bool psModelFromPSF_TGAUSS (psModel *modelPSF, psModel *modelFLT, pmPSF *psf) { 163 bool pmModelFromPSF_TGAUSS (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf) { 95 164 96 165 psF32 *out = modelPSF->params->data.F32; … … 104 173 for (int i = 4; i < 8; i++) { 105 174 psPolynomial2D *poly = psf->params->data[i-4]; 106 out[i] = Polynomial2DEval (poly, out[2], out[3]);175 out[i] = Polynomial2DEval_EAM (poly, out[2], out[3]); 107 176 } 108 177 return(true); 109 178 } 179 180 bool pmModelFitStatus_TGAUSS (pmModel *model) { 181 182 psF32 dP; 183 bool status; 184 185 psF32 *PAR = model->params->data.F32; 186 psF32 *dPAR = model->dparams->data.F32; 187 188 dP = 0; 189 dP += PS_SQR(dPAR[4] / PAR[4]); 190 dP += PS_SQR(dPAR[5] / PAR[5]); 191 dP = sqrt (dP); 192 193 status = true; 194 status &= (dP < 0.5); 195 status &= (PAR[1] > 0); 196 status &= ((dPAR[1]/PAR[1]) < 0.5); 197 198 if (status) return true; 199 return false; 200 }
Note:
See TracChangeset
for help on using the changeset viewer.
