Changeset 9775 for trunk/psModules/src/objects/models/pmModel_TGAUSS.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_TGAUSS.c
r9621 r9775 1 #ifdef HAVE_CONFIG_H2 #include <config.h>3 #endif4 5 1 /****************************************************************************** 6 one component, two slopes: 7 1 / (1 + z^M + z^N) 2 * this file defines the TGAUSS 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 8 9 params->data.F32[0] = So; 10 params->data.F32[1] = Zo; 11 params->data.F32[2] = Xo; 12 params->data.F32[3] = Yo; 13 params->data.F32[4] = sqrt(2.0) / SigmaX; 14 params->data.F32[5] = sqrt(2.0) / SigmaY; 15 params->data.F32[6] = Sxy; 16 params->data.F32[7] = 17 *****************************************************************************/ 18 19 psF64 psModelFunc_TGAUSS(psVector *deriv, 20 const psVector *params, 21 const psVector *x) 9 power-law with fixed slope and fitted amplitude 10 1 / (1 + z + kz^2.2) 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 (sqrt(2) / SigmaX) 17 * PM_PAR_SYY 5 - Y^2 term of elliptical contour (sqrt(2) / SigmaY) 18 * PM_PAR_SXY 6 - X*Y term of elliptical contour 19 * PM_PAR_7 7 - amplitude of high-order component (k) 20 *****************************************************************************/ 21 22 /*** 23 XXXX the model in this file needs to be tested more carefully. 24 fix up the code to follow conventions in the other model function files. 25 ***/ 26 27 XXX broken code 28 29 # define PM_MODEL_FUNC pmModelFunc_TGAUSS 30 # define PM_MODEL_FLUX pmModelFlux_TGAUSS 31 # define PM_MODEL_GUESS pmModelGuess_TGAUSS 32 # define PM_MODEL_LIMITS pmModelLimits_TGAUSS 33 # define PM_MODEL_RADIUS pmModelRadius_TGAUSS 34 # define PM_MODEL_FROM_PSF pmModelFromPSF_TGAUSS 35 # define PM_MODEL_FIT_STATUS pmModelFitStatus_TGAUSS 36 37 psF64 PS_MODEL_FUNC (psVector *deriv, 38 const psVector *params, 39 const psVector *x) 22 40 { 23 41 psF32 *PAR = params->data.F32; … … 50 68 } 51 69 52 psF64 psModelFlux_TGAUSS(const psVector *params) 53 { 54 psF64 A1 = 1 / PS_SQR(params->data.F32[4]); 55 psF64 A2 = 1 / PS_SQR(params->data.F32[5]); 56 psF64 A3 = params->data.F32[6]; 57 psF64 Area = 2.0 * M_PI / sqrt(A1*A2 - PS_SQR(A3)); 58 // Area is equivalent to 2 pi sigma^2 59 60 psF64 Flux = params->data.F32[1] * Area; 61 62 return(Flux); 63 } 64 65 // define this function so it never returns Inf or NaN 66 // return the radius which yields the requested flux 67 psF64 psModelRadius_TGAUSS (const psVector *params, psF64 flux) 68 { 69 if (flux <= 0) 70 return (1.0); 71 if (params->data.F32[1] <= 0) 72 return (1.0); 73 if (flux >= params->data.F32[1]) 74 return (1.0); 75 76 psF64 sigma = sqrt(2.0) * hypot (1.0 / params->data.F32[4], 1.0 / params->data.F32[5]); 77 psF64 radius = sigma * sqrt (2.0 * log(params->data.F32[1] / flux)); 78 if (isnan(radius)) { 79 fprintf (stderr, "error in code\n"); 80 } 81 return (radius); 82 } 83 84 bool psModelGuess_TGAUSS (psModel *model, psSource *source) 70 bool PM_MODEL_LIMITS (psVector **beta_lim, psVector **params_min, psVector **params_max) 71 { 72 73 *beta_lim = psVectorAlloc (8, PS_TYPE_F32); 74 *params_min = psVectorAlloc (8, PS_TYPE_F32); 75 *params_max = psVectorAlloc (8, PS_TYPE_F32); 76 77 beta_lim[0][0].data.F32[PM_PAR_SKY] = 1000; 78 beta_lim[0][0].data.F32[PM_PAR_I0] = 3e6; 79 beta_lim[0][0].data.F32[PM_PAR_XPOS] = 5; 80 beta_lim[0][0].data.F32[PM_PAR_YPOS] = 5; 81 beta_lim[0][0].data.F32[PM_PAR_SXX] = 0.5; 82 beta_lim[0][0].data.F32[PM_PAR_SYY] = 0.5; 83 beta_lim[0][0].data.F32[PM_PAR_SXY] = 0.5; 84 beta_lim[0][0].data.F32[PM_PAR_7] = 0.5; 85 86 params_min[0][0].data.F32[PM_PAR_SKY] = -1000; 87 params_min[0][0].data.F32[PM_PAR_I0] = 0; 88 params_min[0][0].data.F32[PM_PAR_XPOS] = -100; 89 params_min[0][0].data.F32[PM_PAR_YPOS] = -100; 90 params_min[0][0].data.F32[PM_PAR_SXX] = 0.5; 91 params_min[0][0].data.F32[PM_PAR_SYY] = 0.5; 92 params_min[0][0].data.F32[PM_PAR_SXY] = -5.0; 93 params_min[0][0].data.F32[PM_PAR_7] = 0.1; 94 95 params_max[0][0].data.F32[PM_PAR_SKY] = 1e5; 96 params_max[0][0].data.F32[PM_PAR_I0] = 1e8; 97 params_max[0][0].data.F32[PM_PAR_XPOS] = 1e4; // this should be set by image dimensions! 98 params_max[0][0].data.F32[PM_PAR_YPOS] = 1e4; // this should be set by image dimensions! 99 params_max[0][0].data.F32[PM_PAR_SXX] = 100.0; 100 params_max[0][0].data.F32[PM_PAR_SYY] = 100.0; 101 params_max[0][0].data.F32[PM_PAR_SXY] = +5.0; 102 params_max[0][0].data.F32[PM_PAR_7] = 10.0; 103 104 return (TRUE); 105 } 106 107 bool PS_MODEL_GUESS (psModel *model, psSource *source) 85 108 { 86 109 … … 99 122 } 100 123 101 bool psModelFromPSF_TGAUSS (psModel *modelPSF, psModel *modelFLT, pmPSF *psf) 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 // define this function so it never returns Inf or NaN 138 // return the radius which yields the requested flux 139 psF64 PS_MODEL_RADIUS (const psVector *params, psF64 flux) 140 { 141 if (flux <= 0) 142 return (1.0); 143 if (params->data.F32[1] <= 0) 144 return (1.0); 145 if (flux >= params->data.F32[1]) 146 return (1.0); 147 148 psF64 sigma = sqrt(2.0) * hypot (1.0 / params->data.F32[4], 1.0 / params->data.F32[5]); 149 psF64 radius = sigma * sqrt (2.0 * log(params->data.F32[1] / flux)); 150 if (isnan(radius)) { 151 fprintf (stderr, "error in code\n"); 152 } 153 return (radius); 154 } 155 156 bool PS_MODEL_FROM_PSF (psModel *modelPSF, psModel *modelFLT, pmPSF *psf) 102 157 { 103 158 … … 116 171 return(true); 117 172 } 173 174 bool PM_MODEL_FIT_STATUS (pmModel *model) 175 { 176 177 psF32 dP; 178 bool status; 179 180 psF32 *PAR = model->params->data.F32; 181 psF32 *dPAR = model->dparams->data.F32; 182 183 dP = 0; 184 dP += PS_SQR(dPAR[PM_PAR_SXX] / PAR[PM_PAR_SXX]); 185 dP += PS_SQR(dPAR[PM_PAR_SYY] / PAR[PM_PAR_SYY]); 186 dP = sqrt (dP); 187 188 status = true; 189 status &= (dP < 0.5); 190 status &= (PAR[PM_PAR_I0] > 0); 191 status &= ((dPAR[PM_PAR_I0]/PAR[PM_PAR_I0]) < 0.5); 192 193 return status; 194 } 195 196 # undef PM_MODEL_FUNC 197 # undef PM_MODEL_FLUX 198 # undef PM_MODEL_GUESS 199 # undef PM_MODEL_LIMITS 200 # undef PM_MODEL_RADIUS 201 # undef PM_MODEL_FROM_PSF 202 # undef PM_MODEL_FIT_STATUS
Note:
See TracChangeset
for help on using the changeset viewer.
