Changeset 9775 for trunk/psModules/src/objects/models/pmModel_WAUSS.c
- Timestamp:
- Oct 29, 2006, 5:02:59 PM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/objects/models/pmModel_WAUSS.c
r9621 r9775 1 #ifdef HAVE_CONFIG_H 2 #include <config.h> 3 #endif 1 /****************************************************************************** 2 * this file defines the WAUSS source shape model (XXX need a better name!). Note that these 3 * model functions are loaded by pmModelGroup.c using 'include', and thus need no 'include' 4 * statements of their own. The models use a psVector to represent the set of parameters, with 5 * the sequence used to specify the meaning of the parameter. The meaning of the parameters 6 * may thus vary depending on the specifics of the model. All models which are used a PSF 7 * representations share a few parameters, for which # define names are listed in pmModel.h: 8 9 power-law with fitted linear term 10 1 / (1 + Az + Bz^2 + z^3/6) 11 12 * PM_PAR_SKY 0 - local sky : note that this is unused and may be dropped in the future 13 * PM_PAR_I0 1 - central intensity 14 * PM_PAR_XPOS 2 - X center of object 15 * PM_PAR_YPOS 3 - Y center of object 16 * PM_PAR_SXX 4 - X^2 term of elliptical contour (SigmaX / sqrt(2)) 17 * PM_PAR_SYY 5 - Y^2 term of elliptical contour (SigmaY / sqrt(2)) 18 * PM_PAR_SXY 6 - X*Y term of elliptical contour 19 * PM_PAR_7 7 - amplitude of the linear component (A) 20 * PM_PAR_8 8 - amplitude of the quadratic component (B) 21 *****************************************************************************/ 4 22 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 *****************************************************************************/ 23 /*** 24 XXXX the model in this file needs to be tested more carefully. 25 fix up the code to follow conventions in the other model function files. 26 ***/ 14 27 15 psF64 psModelFunc_WAUSS(psVector *deriv, 16 const psVector *params, 17 const psVector *x) 28 XXX broken code 29 30 # define PM_MODEL_FUNC pmModelFunc_WAUSS 31 # define PM_MODEL_FLUX pmModelFlux_WAUSS 32 # define PM_MODEL_GUESS pmModelGuess_WAUSS 33 # define PM_MODEL_LIMITS pmModelLimits_WAUSS 34 # define PM_MODEL_RADIUS pmModelRadius_WAUSS 35 # define PM_MODEL_FROM_PSF pmModelFromPSF_WAUSS 36 # define PM_MODEL_FIT_STATUS pmModelFitStatus_WAUSS 37 38 psF64 PS_MODEL_FUNC (psVector *deriv, 39 const psVector *params, 40 const psVector *x) 18 41 { 19 42 psF32 X = x->data.F32[0] - params->data.F32[2]; … … 43 66 } 44 67 45 // this is probably wrong since it uses the gauss integral 2 pi sigma^2 46 psF64 psModelFlux_WAUSS(const psVector *params) 68 bool PM_MODEL_LIMITS (psVector **beta_lim, psVector **params_min, psVector **params_max) 47 69 { 48 psF64 A1 = 1 / PS_SQR(params->data.F32[4]);49 psF64 A2 = 1 / PS_SQR(params->data.F32[5]);50 psF64 A3 = params->data.F32[6];51 psF64 Area = 2.0 * M_PI / sqrt(A1*A2 - PS_SQR(A3));52 // Area is equivalent to 2 pi sigma^253 70 54 psF64 Flux = params->data.F32[1] * Area; 71 *beta_lim = psVectorAlloc (8, PS_TYPE_F32); 72 *params_min = psVectorAlloc (8, PS_TYPE_F32); 73 *params_max = psVectorAlloc (8, PS_TYPE_F32); 55 74 56 return(Flux); 75 beta_lim[0][0].data.F32[PM_PAR_SKY] = 1000; 76 beta_lim[0][0].data.F32[PM_PAR_I0] = 3e6; 77 beta_lim[0][0].data.F32[PM_PAR_XPOS] = 5; 78 beta_lim[0][0].data.F32[PM_PAR_YPOS] = 5; 79 beta_lim[0][0].data.F32[PM_PAR_SXX] = 0.5; 80 beta_lim[0][0].data.F32[PM_PAR_SYY] = 0.5; 81 beta_lim[0][0].data.F32[PM_PAR_SXY] = 0.5; 82 beta_lim[0][0].data.F32[PM_PAR_7] = 0.5; 83 84 params_min[0][0].data.F32[PM_PAR_SKY] = -1000; 85 params_min[0][0].data.F32[PM_PAR_I0] = 0; 86 params_min[0][0].data.F32[PM_PAR_XPOS] = -100; 87 params_min[0][0].data.F32[PM_PAR_YPOS] = -100; 88 params_min[0][0].data.F32[PM_PAR_SXX] = 0.5; 89 params_min[0][0].data.F32[PM_PAR_SYY] = 0.5; 90 params_min[0][0].data.F32[PM_PAR_SXY] = -5.0; 91 params_min[0][0].data.F32[PM_PAR_7] = 0.1; 92 93 params_max[0][0].data.F32[PM_PAR_SKY] = 1e5; 94 params_max[0][0].data.F32[PM_PAR_I0] = 1e8; 95 params_max[0][0].data.F32[PM_PAR_XPOS] = 1e4; // this should be set by image dimensions! 96 params_max[0][0].data.F32[PM_PAR_YPOS] = 1e4; // this should be set by image dimensions! 97 params_max[0][0].data.F32[PM_PAR_SXX] = 100.0; 98 params_max[0][0].data.F32[PM_PAR_SYY] = 100.0; 99 params_max[0][0].data.F32[PM_PAR_SXY] = +5.0; 100 params_max[0][0].data.F32[PM_PAR_7] = 10.0; 101 102 return (TRUE); 57 103 } 58 104 59 // return the radius which yields the requested flux 60 psF64 psModelRadius_WAUSS (const psVector *params, psF64 flux) 61 { 62 if (flux <= 0) 63 return (1.0); 64 if (params->data.F32[1] <= 0) 65 return (1.0); 66 if (flux >= params->data.F32[1] <= 0) 67 return (1.0); 68 69 psF64 sigma = sqrt(2.0) * hypot (1.0 / params->data.F32[4], 1.0 / params->data.F32[5]); 70 psF64 radius = sigma * sqrt (2.0 * log(params->data.F32[1] / flux)); 71 return (radius); 72 } 73 74 bool psModelGuess_WAUSS (psModel *model, psSource *source) 105 bool PS_MODEL_GUESS (psModel *model, psSource *source) 75 106 { 76 107 … … 90 121 } 91 122 92 bool psModelFromPSF_WAUSS (psModel *modelPSF, psModel *modelFLT, pmPSF *psf) 123 // this is probably wrong since it uses the gauss integral 2 pi sigma^2 124 psF64 PS_MODEL_FLUX (const psVector *params) 125 { 126 psF64 A1 = 1 / PS_SQR(params->data.F32[4]); 127 psF64 A2 = 1 / PS_SQR(params->data.F32[5]); 128 psF64 A3 = params->data.F32[6]; 129 psF64 Area = 2.0 * M_PI / sqrt(A1*A2 - PS_SQR(A3)); 130 // Area is equivalent to 2 pi sigma^2 131 132 psF64 Flux = params->data.F32[1] * Area; 133 134 return(Flux); 135 } 136 137 // return the radius which yields the requested flux 138 psF64 PS_MODEL_RADIUS (const psVector *params, psF64 flux) 139 { 140 if (flux <= 0) 141 return (1.0); 142 if (params->data.F32[1] <= 0) 143 return (1.0); 144 if (flux >= params->data.F32[1] <= 0) 145 return (1.0); 146 147 psF64 sigma = sqrt(2.0) * hypot (1.0 / params->data.F32[4], 1.0 / params->data.F32[5]); 148 psF64 radius = sigma * sqrt (2.0 * log(params->data.F32[1] / flux)); 149 return (radius); 150 } 151 152 bool PS_MODEL_FROM_PSF (psModel *modelPSF, psModel *modelFLT, pmPSF *psf) 93 153 { 94 154 … … 107 167 return(true); 108 168 } 169 170 bool PM_MODEL_FIT_STATUS (pmModel *model) 171 { 172 173 psF32 dP; 174 bool status; 175 176 psF32 *PAR = model->params->data.F32; 177 psF32 *dPAR = model->dparams->data.F32; 178 179 dP = 0; 180 dP += PS_SQR(dPAR[PM_PAR_SXX] / PAR[PM_PAR_SXX]); 181 dP += PS_SQR(dPAR[PM_PAR_SYY] / PAR[PM_PAR_SYY]); 182 dP = sqrt (dP); 183 184 status = true; 185 status &= (dP < 0.5); 186 status &= (PAR[PM_PAR_I0] > 0); 187 status &= ((dPAR[PM_PAR_I0]/PAR[PM_PAR_I0]) < 0.5); 188 189 return status; 190 } 191 192 # undef PM_MODEL_FUNC 193 # undef PM_MODEL_FLUX 194 # undef PM_MODEL_GUESS 195 # undef PM_MODEL_LIMITS 196 # undef PM_MODEL_RADIUS 197 # undef PM_MODEL_FROM_PSF 198 # undef PM_MODEL_FIT_STATUS
Note:
See TracChangeset
for help on using the changeset viewer.
