Changeset 25738
- Timestamp:
- Oct 1, 2009, 4:03:58 PM (17 years ago)
- Location:
- trunk
- Files:
-
- 35 edited
- 6 copied
-
. (modified) (1 prop)
-
archive/ducttape (modified) (1 prop)
-
catalyst (modified) (1 prop)
-
catalyst/2007.0-specs (modified) (1 prop)
-
catalyst/2008.0-specs (modified) (1 prop)
-
catalyst/2008.0-specs/hardened (modified) (1 prop)
-
doc/misc/docgen.pl (modified) (1 prop)
-
hardware (modified) (1 prop)
-
ippScripts/scripts/magic_destreak_revert.pl (modified) (1 prop)
-
ippTests/tap (modified) (1 prop)
-
ippTools/share/disttool_revertcomponent.sql (modified) (1 prop)
-
ippTools/share/disttool_revertrun.sql (modified) (1 prop)
-
ppStack/src/ppStackLoop.c (modified) (6 diffs)
-
psModules/src/camera/pmReadoutFake.c (modified) (1 prop)
-
psModules/src/config/pmConfigMask.c (modified) (1 diff)
-
psModules/src/imcombine/pmPSFEnvelope.c (modified) (1 diff)
-
psModules/src/objects/Makefile.am (modified) (2 diffs)
-
psModules/src/objects/models/pmModel_GAUSS.c (modified) (5 diffs)
-
psModules/src/objects/models/pmModel_GAUSS.h (copied) (copied from branches/pap/psModules/src/objects/models/pmModel_GAUSS.h )
-
psModules/src/objects/models/pmModel_PGAUSS.c (modified) (6 diffs)
-
psModules/src/objects/models/pmModel_PGAUSS.h (copied) (copied from branches/pap/psModules/src/objects/models/pmModel_PGAUSS.h )
-
psModules/src/objects/models/pmModel_PS1_V1.c (modified) (6 diffs)
-
psModules/src/objects/models/pmModel_PS1_V1.h (copied) (copied from branches/pap/psModules/src/objects/models/pmModel_PS1_V1.h )
-
psModules/src/objects/models/pmModel_QGAUSS.c (modified) (5 diffs)
-
psModules/src/objects/models/pmModel_QGAUSS.h (copied) (copied from branches/pap/psModules/src/objects/models/pmModel_QGAUSS.h )
-
psModules/src/objects/models/pmModel_RGAUSS.c (modified) (6 diffs)
-
psModules/src/objects/models/pmModel_RGAUSS.h (copied) (copied from branches/pap/psModules/src/objects/models/pmModel_RGAUSS.h )
-
psModules/src/objects/models/pmModel_SERSIC.c (modified) (6 diffs)
-
psModules/src/objects/models/pmModel_SERSIC.h (copied) (copied from branches/pap/psModules/src/objects/models/pmModel_SERSIC.h )
-
psModules/src/objects/pmModel.c (modified) (4 diffs)
-
psModules/src/objects/pmModel.h (modified) (6 diffs)
-
psModules/src/objects/pmModelClass.c (modified) (2 diffs)
-
psModules/src/objects/pmModelClass.h (modified) (3 diffs)
-
psphot/doc/efficiency.txt (modified) (1 prop)
-
psphot/src/psphotEfficiency.c (modified) (1 prop)
-
psphot/src/psphotFake.c (modified) (1 prop)
-
psphot/src/psphotModelGroupInit.c (modified) (3 diffs)
-
psphot/src/psphotReadout.c (modified) (1 diff)
-
psphot/src/psphotReadoutMinimal.c (modified) (1 diff)
-
psphot/src/psphotVersion.c (modified) (1 diff)
-
pswarp/src/pswarpLoop.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/pap merged: 25508,25521,25548,25553,25556,25559-25561,25563-25565,25568-25569,25695,25697,25715,25717-25718
- Property svn:mergeinfo changed
-
trunk/archive/ducttape
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/catalyst
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/catalyst/2007.0-specs
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/catalyst/2008.0-specs
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/catalyst/2008.0-specs/hardened
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/doc/misc/docgen.pl
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/hardware
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/ippScripts/scripts/magic_destreak_revert.pl
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/ippTests/tap
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/ippTools/share/disttool_revertcomponent.sql
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/ippTools/share/disttool_revertrun.sql
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/ppStack/src/ppStackLoop.c
r23576 r25738 80 80 return false; 81 81 } 82 psLogMsg("ppStack", PS_LOG_INFO, "Stage 2: Generate Convolutions and Save: %f sec",83 psTimerClear("PPSTACK_STEPS"));84 82 ppStackMemDump("convolve"); 85 psLogMsg("ppStack", PS_LOG_INFO, "Stage 4: Make Initial Stack: %f sec", psTimerClear("PPSTACK_STEPS"));83 psLogMsg("ppStack", PS_LOG_INFO, "Stage 3: Make Initial Stack: %f sec", psTimerClear("PPSTACK_STEPS")); 86 84 87 85 … … 94 92 return false; 95 93 } 96 psLogMsg("ppStack", PS_LOG_INFO, "Stage 5: Pixel Rejection: %f sec", psTimerClear("PPSTACK_STEPS"));94 psLogMsg("ppStack", PS_LOG_INFO, "Stage 4: Pixel Rejection: %f sec", psTimerClear("PPSTACK_STEPS")); 97 95 ppStackMemDump("reject"); 98 96 … … 106 104 return false; 107 105 } 108 psLogMsg("ppStack", PS_LOG_INFO, "Stage 6: Final Stack: %f sec", psTimerClear("PPSTACK_STEPS"));106 psLogMsg("ppStack", PS_LOG_INFO, "Stage 5: Final Stack: %f sec", psTimerClear("PPSTACK_STEPS")); 109 107 ppStackMemDump("final"); 110 108 … … 118 116 return false; 119 117 } 120 psLogMsg("ppStack", PS_LOG_INFO, "Stage 7: WCS & JPEGS: %f sec", psTimerClear("PPSTACK_STEPS"));118 psLogMsg("ppStack", PS_LOG_INFO, "Stage 6: WCS & JPEGS: %f sec", psTimerClear("PPSTACK_STEPS")); 121 119 ppStackMemDump("cleanup"); 122 120 … … 131 129 return false; 132 130 } 133 psLogMsg("ppStack", PS_LOG_INFO, "Stage 8: Photometry Analysis: %f sec", psTimerClear("PPSTACK_STEPS"));131 psLogMsg("ppStack", PS_LOG_INFO, "Stage 7: Photometry Analysis: %f sec", psTimerClear("PPSTACK_STEPS")); 134 132 ppStackMemDump("photometry"); 135 133 … … 142 140 return false; 143 141 } 144 psLogMsg("ppStack", PS_LOG_INFO, "Stage 9: Final output: %f sec", psTimerClear("PPSTACK_STEPS"));142 psLogMsg("ppStack", PS_LOG_INFO, "Stage 8: Final output: %f sec", psTimerClear("PPSTACK_STEPS")); 145 143 ppStackMemDump("finish"); 146 144 -
trunk/psModules/src/camera/pmReadoutFake.c
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/psModules/src/config/pmConfigMask.c
r23498 r25738 22 22 // Non-astronomical structures 23 23 { "CR", NULL, 0x08, true }, // Pixel contains a cosmic ray 24 { "SPIKE", NULL, 0x08, true }, // Pixel contains a diffraction spike25 { "GHOST", NULL, 0x08, true }, // Pixel contains an optical ghost26 { "STREAK", NULL, 0x08, true }, // Pixel contains streak data27 { "STARCORE", NULL, 0x08, true }, // Pixel contains a bright star core24 { "SPIKE", NULL, 0x08, false }, // Pixel contains a diffraction spike 25 { "GHOST", NULL, 0x08, false }, // Pixel contains an optical ghost 26 { "STREAK", NULL, 0x08, false }, // Pixel contains streak data 27 { "STARCORE", NULL, 0x08, false }, // Pixel contains a bright star core 28 28 // Effects of convolution and interpolation 29 29 { "CONV.BAD", NULL, 0x02, true }, // Pixel is bad after convolution with a bad pixel -
trunk/psModules/src/imcombine/pmPSFEnvelope.c
r25491 r25738 149 149 } 150 150 151 // Test PSF 152 { 153 bool goodPSF = true; // Good PSF? 154 pmModelClassSetLimits(PM_MODEL_LIMITS_IGNORE); 155 pmModel *model = pmModelFromPSFforXY(psf, numCols / 2.0, numRows / 2.0, PEAK_FLUX); // Test model 156 model->modelSetLimits(PM_MODEL_LIMITS_STRICT); 157 for (int j = 0; j < model->params->n && goodPSF; j++) { 158 if (!model->modelLimits(PS_MINIMIZE_PARAM_MIN, j, model->params->data.F32, NULL) || 159 !model->modelLimits(PS_MINIMIZE_PARAM_MAX, j, model->params->data.F32, NULL)) { 160 goodPSF = false; 161 } 162 } 163 psFree(model); 164 if (!goodPSF) { 165 psWarning("PSF %d is bad --- not including in envelope calculation.", i); 166 continue; 167 } 168 } 169 151 170 pmResiduals *resid = psf->residuals;// PSF residuals 152 171 psf->residuals = NULL; 153 172 if (!pmReadoutFakeFromSources(fakeRO, fakeSize, fakeSize, fakes, 0, xOffset, yOffset, psf, 154 NAN, radius, true, true)) {173 NAN, radius, true, false)) { 155 174 psError(PS_ERR_UNKNOWN, false, "Unable to generate fake readout."); 156 175 psFree(envelope); -
trunk/psModules/src/objects/Makefile.am
r25383 r25738 54 54 pmGrowthCurve.c \ 55 55 pmSourceMatch.c \ 56 pmDetEff.c 57 58 EXTRA_DIST = \ 56 pmDetEff.c \ 59 57 models/pmModel_GAUSS.c \ 60 58 models/pmModel_PGAUSS.c \ 59 models/pmModel_PS1_V1.c \ 61 60 models/pmModel_QGAUSS.c \ 62 models/pmModel_SGAUSS.c \63 61 models/pmModel_RGAUSS.c \ 64 62 models/pmModel_SERSIC.c … … 92 90 pmGrowthCurve.h \ 93 91 pmSourceMatch.h \ 94 pmDetEff.h 92 pmDetEff.h \ 93 models/pmModel_GAUSS.h \ 94 models/pmModel_PGAUSS.h \ 95 models/pmModel_PS1_V1.h \ 96 models/pmModel_QGAUSS.h \ 97 models/pmModel_RGAUSS.h \ 98 models/pmModel_SERSIC.h 95 99 96 100 CLEANFILES = *~ -
trunk/psModules/src/objects/models/pmModel_GAUSS.c
r20001 r25738 19 19 *****************************************************************************/ 20 20 21 #include <stdio.h> 22 #include <pslib.h> 23 24 #include "pmMoments.h" 25 #include "pmPeaks.h" 26 #include "pmSource.h" 27 #include "pmModel.h" 28 #include "pmModel_GAUSS.h" 29 21 30 # define PM_MODEL_FUNC pmModelFunc_GAUSS 22 31 # define PM_MODEL_FLUX pmModelFlux_GAUSS … … 27 36 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_GAUSS 28 37 # define PM_MODEL_FIT_STATUS pmModelFitStatus_GAUSS 38 # define PM_MODEL_SET_LIMITS pmModelSetLimits_GAUSS 39 40 // Lax parameter limits 41 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0 }; 42 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0 }; 43 44 // Strict parameter limits 45 static float *paramsMinStrict = paramsMinLax; 46 static float *paramsMaxStrict = paramsMaxLax; 47 48 // Parameter limits to use 49 static float *paramsMinUse = paramsMinLax; 50 static float *paramsMaxUse = paramsMaxLax; 51 static float betaUse[] = { 1000, 3e6, 5, 5, 2.0, 2.0, 0.5 }; 52 53 static bool limitsApply = true; // Apply limits? 29 54 30 55 // the model is a function of the pixel coordinate (pixcoord[0,1] = x,y) … … 68 93 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 69 94 { 70 float beta_lim = 0, params_min = 0, params_max = 0; 71 float f1 = 0, f2 = 0, q1 = 0, q2 = 0; 95 if (!limitsApply) { 96 return true; 97 } 98 psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds"); 72 99 73 100 // we need to calculate the limits for SXY specially 101 float q2 = NAN; 74 102 if (nParam == PM_PAR_SXY) { 75 f 1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);76 f 2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);77 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);78 q1 = PS_MAX (0.0, q1);103 float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 104 float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 105 float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 106 q1 = (q1 < 0.0) ? 0.0 : q1; 79 107 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 80 108 // angle and let f2,f1 fight it out 81 q2 = 0.5*sqrt(q1);109 q2 = 0.5*sqrtf(q1); 82 110 } 83 111 84 112 switch (mode) { 85 case PS_MINIMIZE_BETA_LIMIT: 86 switch (nParam) { 87 case PM_PAR_SKY: 88 beta_lim = 1000; 89 break; 90 case PM_PAR_I0: 91 beta_lim = 3e6; 92 break; 93 case PM_PAR_XPOS: 94 beta_lim = 5; 95 break; 96 case PM_PAR_YPOS: 97 beta_lim = 5; 98 break; 99 case PM_PAR_SXX: 100 beta_lim = 2.0; 101 break; 102 case PM_PAR_SYY: 103 beta_lim = 2.0; 104 break; 105 case PM_PAR_SXY: 106 beta_lim = 0.5*q2; 107 break; 108 default: 109 psAbort("invalid parameter %d for beta test", nParam); 110 } 111 if (fabs(beta[nParam]) > fabs(beta_lim)) { 112 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 113 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 114 nParam, beta[nParam], beta_lim); 115 return false; 116 } 117 return true; 118 case PS_MINIMIZE_PARAM_MIN: 119 switch (nParam) { 120 case PM_PAR_SKY: 121 params_min = -1000; 122 break; 123 case PM_PAR_I0: 124 params_min = 0.01; 125 break; 126 case PM_PAR_XPOS: 127 params_min = -100; 128 break; 129 case PM_PAR_YPOS: 130 params_min = -100; 131 break; 132 case PM_PAR_SXX: 133 params_min = 0.5; 134 break; 135 case PM_PAR_SYY: 136 params_min = 0.5; 137 break; 138 case PM_PAR_SXY: 139 params_min = -q2; 140 break; 141 default: 142 psAbort("invalid parameter %d for param min test", nParam); 143 } 144 if (params[nParam] < params_min) { 145 params[nParam] = params_min; 146 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 147 nParam, params[nParam], params_min); 148 return false; 149 } 150 return true; 151 case PS_MINIMIZE_PARAM_MAX: 152 switch (nParam) { 153 case PM_PAR_SKY: 154 params_max = 1e5; 155 break; 156 case PM_PAR_I0: 157 params_max = 1e8; 158 break; 159 case PM_PAR_XPOS: 160 params_max = 1e4; 161 break; 162 case PM_PAR_YPOS: 163 params_max = 1e4; 164 break; 165 case PM_PAR_SXX: 166 params_max = 100; 167 break; 168 case PM_PAR_SYY: 169 params_max = 100; 170 break; 171 case PM_PAR_SXY: 172 params_max = +q2; 173 break; 174 default: 175 psAbort("invalid parameter %d for param max test", nParam); 176 } 177 if (params[nParam] > params_max) { 178 params[nParam] = params_max; 179 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 180 nParam, params[nParam], params_max); 181 return false; 182 } 183 return true; 113 case PS_MINIMIZE_BETA_LIMIT: { 114 psAssert(beta, "Require beta to limit beta"); 115 float limit = betaUse[nParam]; 116 if (nParam == PM_PAR_SXY) { 117 limit *= q2; 118 } 119 if (fabs(beta[nParam]) > fabs(limit)) { 120 beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit); 121 psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 122 nParam, beta[nParam], limit); 123 return false; 124 } 125 return true; 126 } 127 case PS_MINIMIZE_PARAM_MIN: { 128 psAssert(params, "Require parameters to limit parameters"); 129 psAssert(paramsMinUse, "Require parameter limits to limit parameters"); 130 float limit = paramsMinUse[nParam]; 131 if (nParam == PM_PAR_SXY) { 132 limit *= q2; 133 } 134 if (params[nParam] < limit) { 135 params[nParam] = limit; 136 psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 137 nParam, params[nParam], limit); 138 return false; 139 } 140 return true; 141 } 142 case PS_MINIMIZE_PARAM_MAX: { 143 psAssert(params, "Require parameters to limit parameters"); 144 psAssert(paramsMaxUse, "Require parameter limits to limit parameters"); 145 float limit = paramsMaxUse[nParam]; 146 if (nParam == PM_PAR_SXY) { 147 limit *= q2; 148 } 149 if (params[nParam] > limit) { 150 params[nParam] = limit; 151 psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 152 nParam, params[nParam], limit); 153 return false; 154 } 155 return true; 156 } 184 157 default: 185 158 psAbort("invalid choice for limits"); … … 388 361 } 389 362 363 void PM_MODEL_SET_LIMITS(pmModelLimitsType type) 364 { 365 switch (type) { 366 case PM_MODEL_LIMITS_NONE: 367 paramsMinUse = NULL; 368 paramsMaxUse = NULL; 369 limitsApply = true; 370 break; 371 case PM_MODEL_LIMITS_IGNORE: 372 paramsMinUse = NULL; 373 paramsMaxUse = NULL; 374 limitsApply = false; 375 break; 376 case PM_MODEL_LIMITS_LAX: 377 paramsMinUse = paramsMinLax; 378 paramsMaxUse = paramsMaxLax; 379 limitsApply = true; 380 break; 381 case PM_MODEL_LIMITS_STRICT: 382 paramsMinUse = paramsMinStrict; 383 paramsMaxUse = paramsMaxStrict; 384 limitsApply = true; 385 break; 386 default: 387 psAbort("Unrecognised model limits type: %x", type); 388 } 389 return; 390 } 391 390 392 # undef PM_MODEL_FUNC 391 393 # undef PM_MODEL_FLUX … … 396 398 # undef PM_MODEL_PARAMS_FROM_PSF 397 399 # undef PM_MODEL_FIT_STATUS 400 # undef PM_MODEL_SET_LIMITS -
trunk/psModules/src/objects/models/pmModel_PGAUSS.c
r20001 r25738 19 19 *****************************************************************************/ 20 20 21 #include <stdio.h> 22 #include <pslib.h> 23 24 #include "pmMoments.h" 25 #include "pmPeaks.h" 26 #include "pmSource.h" 27 #include "pmModel.h" 28 #include "pmModel_PGAUSS.h" 29 21 30 # define PM_MODEL_FUNC pmModelFunc_PGAUSS 22 31 # define PM_MODEL_FLUX pmModelFlux_PGAUSS … … 27 36 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_PGAUSS 28 37 # define PM_MODEL_FIT_STATUS pmModelFitStatus_PGAUSS 38 # define PM_MODEL_SET_LIMITS pmModelSetLimits_PGAUSS 39 40 // Lax parameter limits 41 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0 }; 42 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0 }; 43 44 // Strict parameter limits 45 static float *paramsMinStrict = paramsMinLax; 46 static float *paramsMaxStrict = paramsMaxLax; 47 48 // Parameter limits to use 49 static float *paramsMinUse = paramsMinLax; 50 static float *paramsMaxUse = paramsMaxLax; 51 static float betaUse[] = { 1000, 3e6, 5, 5, 2.0, 2.0, 0.5 }; 52 53 static bool limitsApply = true; // Apply limits? 29 54 30 55 // the model is a function of the pixel coordinate (pixcoord[0,1] = x,y) … … 69 94 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 70 95 { 71 float beta_lim = 0, params_min = 0, params_max = 0; 72 float f1 = 0, f2 = 0, q1 = 0, q2 = 0; 96 if (!limitsApply) { 97 return true; 98 } 99 psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds"); 73 100 74 101 // we need to calculate the limits for SXY specially 102 float q2 = NAN; 75 103 if (nParam == PM_PAR_SXY) { 76 f 1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);77 f 2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);78 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);79 q1 = PS_MAX (0.0, q1);104 float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 105 float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 106 float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 107 q1 = (q1 < 0.0) ? 0.0 : q1; 80 108 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 81 109 // angle and let f2,f1 fight it out 82 q2 = 0.5*sqrt(q1);110 q2 = 0.5*sqrtf(q1); 83 111 } 84 112 85 113 switch (mode) { 86 case PS_MINIMIZE_BETA_LIMIT: 87 switch (nParam) { 88 case PM_PAR_SKY: 89 beta_lim = 1000; 90 break; 91 case PM_PAR_I0: 92 beta_lim = 3e6; 93 break; 94 case PM_PAR_XPOS: 95 beta_lim = 5; 96 break; 97 case PM_PAR_YPOS: 98 beta_lim = 5; 99 break; 100 case PM_PAR_SXX: 101 beta_lim = 2.0; 102 break; 103 case PM_PAR_SYY: 104 beta_lim = 2.0; 105 break; 106 case PM_PAR_SXY: 107 beta_lim = 0.5*q2; 108 break; 109 default: 110 psAbort("invalid parameter %d for beta test", nParam); 111 } 112 if (fabs(beta[nParam]) > fabs(beta_lim)) { 113 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 114 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 115 nParam, beta[nParam], beta_lim); 116 return false; 117 } 118 return true; 119 case PS_MINIMIZE_PARAM_MIN: 120 switch (nParam) { 121 case PM_PAR_SKY: 122 params_min = -1000; 123 break; 124 case PM_PAR_I0: 125 params_min = 0.01; 126 break; 127 case PM_PAR_XPOS: 128 params_min = -100; 129 break; 130 case PM_PAR_YPOS: 131 params_min = -100; 132 break; 133 case PM_PAR_SXX: 134 params_min = 0.5; 135 break; 136 case PM_PAR_SYY: 137 params_min = 0.5; 138 break; 139 case PM_PAR_SXY: 140 params_min = -q2; 141 break; 142 default: 143 psAbort("invalid parameter %d for param min test", nParam); 144 } 145 if (params[nParam] < params_min) { 146 params[nParam] = params_min; 147 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 148 nParam, params[nParam], params_min); 149 return false; 150 } 151 return true; 152 case PS_MINIMIZE_PARAM_MAX: 153 switch (nParam) { 154 case PM_PAR_SKY: 155 params_max = 1e5; 156 break; 157 case PM_PAR_I0: 158 params_max = 1e8; 159 break; 160 case PM_PAR_XPOS: 161 params_max = 1e4; 162 break; 163 case PM_PAR_YPOS: 164 params_max = 1e4; 165 break; 166 case PM_PAR_SXX: 167 params_max = 100; 168 break; 169 case PM_PAR_SYY: 170 params_max = 100; 171 break; 172 case PM_PAR_SXY: 173 params_max = +q2; 174 break; 175 default: 176 psAbort("invalid parameter %d for param max test", nParam); 177 } 178 if (params[nParam] > params_max) { 179 params[nParam] = params_max; 180 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 181 nParam, params[nParam], params_max); 182 return false; 183 } 184 return true; 185 default: 114 case PS_MINIMIZE_BETA_LIMIT: { 115 psAssert(beta, "Require beta to limit beta"); 116 float limit = betaUse[nParam]; 117 if (nParam == PM_PAR_SXY) { 118 limit *= q2; 119 } 120 if (fabs(beta[nParam]) > fabs(limit)) { 121 beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit); 122 psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 123 nParam, beta[nParam], limit); 124 return false; 125 } 126 return true; 127 } 128 case PS_MINIMIZE_PARAM_MIN: { 129 psAssert(params, "Require parameters to limit parameters"); 130 psAssert(paramsMinUse, "Require parameter limits to limit parameters"); 131 float limit = paramsMinUse[nParam]; 132 if (nParam == PM_PAR_SXY) { 133 limit *= q2; 134 } 135 if (params[nParam] < limit) { 136 params[nParam] = limit; 137 psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 138 nParam, params[nParam], limit); 139 return false; 140 } 141 return true; 142 } 143 case PS_MINIMIZE_PARAM_MAX: { 144 psAssert(params, "Require parameters to limit parameters"); 145 psAssert(paramsMaxUse, "Require parameter limits to limit parameters"); 146 float limit = paramsMaxUse[nParam]; 147 if (nParam == PM_PAR_SXY) { 148 limit *= q2; 149 } 150 if (params[nParam] > limit) { 151 params[nParam] = limit; 152 psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 153 nParam, params[nParam], limit); 154 return false; 155 } 156 return true; 157 } 158 default: 186 159 psAbort("invalid choice for limits"); 187 160 } … … 189 162 return false; 190 163 } 164 191 165 192 166 // make an initial guess for parameters … … 434 408 } 435 409 410 411 void PM_MODEL_SET_LIMITS(pmModelLimitsType type) 412 { 413 switch (type) { 414 case PM_MODEL_LIMITS_NONE: 415 paramsMinUse = NULL; 416 paramsMaxUse = NULL; 417 limitsApply = true; 418 break; 419 case PM_MODEL_LIMITS_IGNORE: 420 paramsMinUse = NULL; 421 paramsMaxUse = NULL; 422 limitsApply = false; 423 break; 424 case PM_MODEL_LIMITS_LAX: 425 paramsMinUse = paramsMinLax; 426 paramsMaxUse = paramsMaxLax; 427 limitsApply = true; 428 break; 429 case PM_MODEL_LIMITS_STRICT: 430 paramsMinUse = paramsMinStrict; 431 paramsMaxUse = paramsMaxStrict; 432 limitsApply = true; 433 break; 434 default: 435 psAbort("Unrecognised model limits type: %x", type); 436 } 437 return; 438 } 439 436 440 # undef PM_MODEL_FUNC 437 441 # undef PM_MODEL_FLUX … … 442 446 # undef PM_MODEL_PARAMS_FROM_PSF 443 447 # undef PM_MODEL_FIT_STATUS 448 # undef PM_MODEL_SET_LIMITS -
trunk/psModules/src/objects/models/pmModel_PS1_V1.c
r23962 r25738 20 20 *****************************************************************************/ 21 21 22 #include <stdio.h> 23 #include <pslib.h> 24 25 #include "pmMoments.h" 26 #include "pmPeaks.h" 27 #include "pmSource.h" 28 #include "pmModel.h" 29 #include "pmModel_PS1_V1.h" 30 22 31 # define PM_MODEL_FUNC pmModelFunc_PS1_V1 23 32 # define PM_MODEL_FLUX pmModelFlux_PS1_V1 … … 28 37 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_PS1_V1 29 38 # define PM_MODEL_FIT_STATUS pmModelFitStatus_PS1_V1 39 # define PM_MODEL_SET_LIMITS pmModelSetLimits_PS1_V1 30 40 31 41 # define ALPHA 1.666 32 42 # define ALPHA_M 0.666 43 44 // Lax parameter limits 45 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, -1.0 }; 46 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 }; 47 48 // Strict parameter limits 49 // k = PAR_7 < 0 is very undesirable (big divot in the middle) 50 static float paramsMinStrict[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, 0.0 }; 51 static float paramsMaxStrict[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 }; 52 53 // Parameter limits to use 54 static float *paramsMinUse = paramsMinLax; 55 static float *paramsMaxUse = paramsMaxLax; 56 static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5, 2.0 }; 57 58 static bool limitsApply = true; // Apply limits? 59 33 60 34 61 psF32 PM_MODEL_FUNC (psVector *deriv, … … 84 111 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 85 112 { 86 float beta_lim = 0, params_min = 0, params_max = 0; 87 float f1 = 0, f2 = 0, q1 = 0, q2 = 0; 113 if (!limitsApply) { 114 return true; 115 } 116 psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds"); 88 117 89 118 // we need to calculate the limits for SXY specially 119 float q2 = NAN; 90 120 if (nParam == PM_PAR_SXY) { 91 f 1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);92 f 2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);93 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);121 float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 122 float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 123 float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 94 124 q1 = (q1 < 0.0) ? 0.0 : q1; 95 125 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 96 126 // angle and let f2,f1 fight it out 97 q2 = 0.5*sqrt(q1);127 q2 = 0.5*sqrtf(q1); 98 128 } 99 129 100 130 switch (mode) { 101 case PS_MINIMIZE_BETA_LIMIT: 102 switch (nParam) { 103 case PM_PAR_SKY: 104 beta_lim = 1000; 105 break; 106 case PM_PAR_I0: 107 beta_lim = 3e6; 108 break; 109 case PM_PAR_XPOS: 110 beta_lim = 5; 111 break; 112 case PM_PAR_YPOS: 113 beta_lim = 5; 114 break; 115 case PM_PAR_SXX: 116 beta_lim = 1.0; 117 break; 118 case PM_PAR_SYY: 119 beta_lim = 1.0; 120 break; 121 case PM_PAR_SXY: 122 beta_lim = 0.5*q2; 123 break; 124 case PM_PAR_7: 125 beta_lim = 2.0; 126 break; 127 default: 128 psAbort("invalid parameter %d for beta test", nParam); 129 } 130 if (fabs(beta[nParam]) > fabs(beta_lim)) { 131 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 132 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 133 nParam, beta[nParam], beta_lim); 134 return false; 135 } 136 return true; 137 case PS_MINIMIZE_PARAM_MIN: 138 switch (nParam) { 139 case PM_PAR_SKY: 140 params_min = -1000; 141 break; 142 case PM_PAR_I0: 143 params_min = 0.01; 144 break; 145 case PM_PAR_XPOS: 146 params_min = -100; 147 break; 148 case PM_PAR_YPOS: 149 params_min = -100; 150 break; 151 case PM_PAR_SXX: 152 params_min = 0.5; 153 break; 154 case PM_PAR_SYY: 155 params_min = 0.5; 156 break; 157 case PM_PAR_SXY: 158 params_min = -q2; 159 break; 160 case PM_PAR_7: 161 params_min = -1.0; 162 break; 163 default: 164 psAbort("invalid parameter %d for param min test", nParam); 165 } 166 if (params[nParam] < params_min) { 167 params[nParam] = params_min; 168 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 169 nParam, params[nParam], params_min); 170 return false; 171 } 172 return true; 173 case PS_MINIMIZE_PARAM_MAX: 174 switch (nParam) { 175 case PM_PAR_SKY: 176 params_max = 1e5; 177 break; 178 case PM_PAR_I0: 179 params_max = 1e8; 180 break; 181 case PM_PAR_XPOS: 182 params_max = 1e4; 183 break; 184 case PM_PAR_YPOS: 185 params_max = 1e4; 186 break; 187 case PM_PAR_SXX: 188 params_max = 100; 189 break; 190 case PM_PAR_SYY: 191 params_max = 100; 192 break; 193 case PM_PAR_SXY: 194 params_max = +q2; 195 break; 196 case PM_PAR_7: 197 params_max = 20.0; 198 break; 199 default: 200 psAbort("invalid parameter %d for param max test", nParam); 201 } 202 if (params[nParam] > params_max) { 203 params[nParam] = params_max; 204 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 205 nParam, params[nParam], params_max); 206 return false; 207 } 208 return true; 209 default: 131 case PS_MINIMIZE_BETA_LIMIT: { 132 psAssert(beta, "Require beta to limit beta"); 133 float limit = betaUse[nParam]; 134 if (nParam == PM_PAR_SXY) { 135 limit *= q2; 136 } 137 if (fabs(beta[nParam]) > fabs(limit)) { 138 beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit); 139 psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 140 nParam, beta[nParam], limit); 141 return false; 142 } 143 return true; 144 } 145 case PS_MINIMIZE_PARAM_MIN: { 146 psAssert(params, "Require parameters to limit parameters"); 147 psAssert(paramsMinUse, "Require parameter limits to limit parameters"); 148 float limit = paramsMinUse[nParam]; 149 if (nParam == PM_PAR_SXY) { 150 limit *= q2; 151 } 152 if (params[nParam] < limit) { 153 params[nParam] = limit; 154 psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 155 nParam, params[nParam], limit); 156 return false; 157 } 158 return true; 159 } 160 case PS_MINIMIZE_PARAM_MAX: { 161 psAssert(params, "Require parameters to limit parameters"); 162 psAssert(paramsMaxUse, "Require parameter limits to limit parameters"); 163 float limit = paramsMaxUse[nParam]; 164 if (nParam == PM_PAR_SXY) { 165 limit *= q2; 166 } 167 if (params[nParam] > limit) { 168 params[nParam] = limit; 169 psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 170 nParam, params[nParam], limit); 171 return false; 172 } 173 return true; 174 } 175 default: 210 176 psAbort("invalid choice for limits"); 211 177 } … … 299 265 psF32 *PAR = params->data.F32; 300 266 301 if (flux <= 0) 302 return (1.0); 303 if (PAR[PM_PAR_I0] <= 0) 304 return (1.0); 305 if (flux >= PAR[PM_PAR_I0]) 306 return (1.0); 267 if (flux <= 0) { 268 return 1.0; 269 } 270 if (PAR[PM_PAR_I0] <= 0) { 271 return 1.0; 272 } 273 if (flux >= PAR[PM_PAR_I0]) { 274 return 1.0; 275 } 276 if (PAR[PM_PAR_7] == 0.0) { 277 return powf(PAR[PM_PAR_I0] / flux - 1.0, 1.0 / ALPHA); 278 } 307 279 308 280 shape.sx = PAR[PM_PAR_SXX] / M_SQRT2; … … 468 440 } 469 441 442 443 void PM_MODEL_SET_LIMITS(pmModelLimitsType type) 444 { 445 switch (type) { 446 case PM_MODEL_LIMITS_NONE: 447 paramsMinUse = NULL; 448 paramsMaxUse = NULL; 449 limitsApply = true; 450 break; 451 case PM_MODEL_LIMITS_IGNORE: 452 paramsMinUse = NULL; 453 paramsMaxUse = NULL; 454 limitsApply = false; 455 break; 456 case PM_MODEL_LIMITS_LAX: 457 paramsMinUse = paramsMinLax; 458 paramsMaxUse = paramsMaxLax; 459 limitsApply = true; 460 break; 461 case PM_MODEL_LIMITS_STRICT: 462 paramsMinUse = paramsMinStrict; 463 paramsMaxUse = paramsMaxStrict; 464 limitsApply = true; 465 break; 466 default: 467 psAbort("Unrecognised model limits type: %x", type); 468 } 469 return; 470 } 471 472 470 473 # undef PM_MODEL_FUNC 471 474 # undef PM_MODEL_FLUX … … 476 479 # undef PM_MODEL_PARAMS_FROM_PSF 477 480 # undef PM_MODEL_FIT_STATUS 481 # undef PM_MODEL_SET_LIMITS 478 482 # undef ALPHA 479 483 # undef ALPHA_M -
trunk/psModules/src/objects/models/pmModel_QGAUSS.c
r20001 r25738 20 20 *****************************************************************************/ 21 21 22 #include <stdio.h> 23 #include <pslib.h> 24 25 #include "pmMoments.h" 26 #include "pmPeaks.h" 27 #include "pmSource.h" 28 #include "pmModel.h" 29 #include "pmModel_QGAUSS.h" 30 22 31 # define PM_MODEL_FUNC pmModelFunc_QGAUSS 23 32 # define PM_MODEL_FLUX pmModelFlux_QGAUSS … … 28 37 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_QGAUSS 29 38 # define PM_MODEL_FIT_STATUS pmModelFitStatus_QGAUSS 39 # define PM_MODEL_SET_LIMITS pmModelSetLimits_QGAUSS 40 41 // Lax parameter limits 42 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, 0.1 }; 43 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 }; 44 45 // Strict parameter limits 46 static float *paramsMinStrict = paramsMinLax; 47 static float *paramsMaxStrict = paramsMaxLax; 48 49 // Parameter limits to use 50 static float *paramsMinUse = paramsMinLax; 51 static float *paramsMaxUse = paramsMaxLax; 52 static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5 }; 53 54 static bool limitsApply = true; // Apply limits? 30 55 31 56 psF32 PM_MODEL_FUNC (psVector *deriv, … … 79 104 # define AR_MAX 20.0 80 105 # define AR_RATIO 0.99 106 81 107 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 82 108 { 83 float beta_lim = 0, params_min = 0, params_max = 0; 84 float f1 = 0, f2 = 0, q1 = 0, q2 = 0; 109 if (!limitsApply) { 110 return true; 111 } 112 psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds"); 85 113 86 114 // we need to calculate the limits for SXY specially 115 float q2 = NAN; 87 116 if (nParam == PM_PAR_SXY) { 88 f 1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);89 f 2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);90 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);117 float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 118 float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 119 float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 91 120 q1 = (q1 < 0.0) ? 0.0 : q1; 92 121 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 93 122 // angle and let f2,f1 fight it out 94 q2 = 0.5*sqrt(q1);123 q2 = 0.5*sqrtf(q1); 95 124 } 96 125 97 126 switch (mode) { 98 case PS_MINIMIZE_BETA_LIMIT: 99 switch (nParam) { 100 case PM_PAR_SKY: 101 beta_lim = 1000; 102 break; 103 case PM_PAR_I0: 104 beta_lim = 3e6; 105 break; 106 case PM_PAR_XPOS: 107 beta_lim = 5; 108 break; 109 case PM_PAR_YPOS: 110 beta_lim = 5; 111 break; 112 case PM_PAR_SXX: 113 beta_lim = 1.0; 114 break; 115 case PM_PAR_SYY: 116 beta_lim = 1.0; 117 break; 118 case PM_PAR_SXY: 119 beta_lim = 0.5*q2; 120 break; 121 case PM_PAR_7: 122 beta_lim = 2.0; 123 break; 124 default: 125 psAbort("invalid parameter %d for beta test", nParam); 126 } 127 if (fabs(beta[nParam]) > fabs(beta_lim)) { 128 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 129 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 130 nParam, beta[nParam], beta_lim); 131 return false; 132 } 133 return true; 134 case PS_MINIMIZE_PARAM_MIN: 135 switch (nParam) { 136 case PM_PAR_SKY: 137 params_min = -1000; 138 break; 139 case PM_PAR_I0: 140 params_min = 0.01; 141 break; 142 case PM_PAR_XPOS: 143 params_min = -100; 144 break; 145 case PM_PAR_YPOS: 146 params_min = -100; 147 break; 148 case PM_PAR_SXX: 149 params_min = 0.5; 150 break; 151 case PM_PAR_SYY: 152 params_min = 0.5; 153 break; 154 case PM_PAR_SXY: 155 params_min = -q2; 156 break; 157 case PM_PAR_7: 158 params_min = 0.1; 159 break; 160 default: 161 psAbort("invalid parameter %d for param min test", nParam); 162 } 163 if (params[nParam] < params_min) { 164 params[nParam] = params_min; 165 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 166 nParam, params[nParam], params_min); 167 return false; 168 } 169 return true; 170 case PS_MINIMIZE_PARAM_MAX: 171 switch (nParam) { 172 case PM_PAR_SKY: 173 params_max = 1e5; 174 break; 175 case PM_PAR_I0: 176 params_max = 1e8; 177 break; 178 case PM_PAR_XPOS: 179 params_max = 1e4; 180 break; 181 case PM_PAR_YPOS: 182 params_max = 1e4; 183 break; 184 case PM_PAR_SXX: 185 params_max = 100; 186 break; 187 case PM_PAR_SYY: 188 params_max = 100; 189 break; 190 case PM_PAR_SXY: 191 params_max = +q2; 192 break; 193 case PM_PAR_7: 194 params_max = 20.0; 195 break; 196 default: 197 psAbort("invalid parameter %d for param max test", nParam); 198 } 199 if (params[nParam] > params_max) { 200 params[nParam] = params_max; 201 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 202 nParam, params[nParam], params_max); 203 return false; 204 } 205 return true; 127 case PS_MINIMIZE_BETA_LIMIT: { 128 psAssert(beta, "Require beta to limit beta"); 129 float limit = betaUse[nParam]; 130 if (nParam == PM_PAR_SXY) { 131 limit *= q2; 132 } 133 if (fabs(beta[nParam]) > fabs(limit)) { 134 beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit); 135 psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 136 nParam, beta[nParam], limit); 137 return false; 138 } 139 return true; 140 } 141 case PS_MINIMIZE_PARAM_MIN: { 142 psAssert(params, "Require parameters to limit parameters"); 143 psAssert(paramsMinUse, "Require parameter limits to limit parameters"); 144 float limit = paramsMinUse[nParam]; 145 if (nParam == PM_PAR_SXY) { 146 limit *= q2; 147 } 148 if (params[nParam] < limit) { 149 params[nParam] = limit; 150 psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 151 nParam, params[nParam], limit); 152 return false; 153 } 154 return true; 155 } 156 case PS_MINIMIZE_PARAM_MAX: { 157 psAssert(params, "Require parameters to limit parameters"); 158 psAssert(paramsMaxUse, "Require parameter limits to limit parameters"); 159 float limit = paramsMaxUse[nParam]; 160 if (nParam == PM_PAR_SXY) { 161 limit *= q2; 162 } 163 if (params[nParam] > limit) { 164 params[nParam] = limit; 165 psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 166 nParam, params[nParam], limit); 167 return false; 168 } 169 return true; 170 } 206 171 default: 207 172 psAbort("invalid choice for limits"); … … 464 429 } 465 430 431 432 void PM_MODEL_SET_LIMITS(pmModelLimitsType type) 433 { 434 switch (type) { 435 case PM_MODEL_LIMITS_NONE: 436 paramsMinUse = NULL; 437 paramsMaxUse = NULL; 438 limitsApply = true; 439 break; 440 case PM_MODEL_LIMITS_IGNORE: 441 paramsMinUse = NULL; 442 paramsMaxUse = NULL; 443 limitsApply = false; 444 break; 445 case PM_MODEL_LIMITS_LAX: 446 paramsMinUse = paramsMinLax; 447 paramsMaxUse = paramsMaxLax; 448 limitsApply = true; 449 break; 450 case PM_MODEL_LIMITS_STRICT: 451 paramsMinUse = paramsMinStrict; 452 paramsMaxUse = paramsMaxStrict; 453 limitsApply = true; 454 break; 455 default: 456 psAbort("Unrecognised model limits type: %x", type); 457 } 458 return; 459 } 460 466 461 # undef PM_MODEL_FUNC 467 462 # undef PM_MODEL_FLUX … … 472 467 # undef PM_MODEL_PARAMS_FROM_PSF 473 468 # undef PM_MODEL_FIT_STATUS 469 # undef PM_MODEL_SET_LIMITS -
trunk/psModules/src/objects/models/pmModel_RGAUSS.c
r20001 r25738 20 20 *****************************************************************************/ 21 21 22 #include <stdio.h> 23 #include <pslib.h> 24 25 #include "pmMoments.h" 26 #include "pmPeaks.h" 27 #include "pmSource.h" 28 #include "pmModel.h" 29 #include "pmModel_RGAUSS.h" 30 22 31 # define PM_MODEL_FUNC pmModelFunc_RGAUSS 23 32 # define PM_MODEL_FLUX pmModelFlux_RGAUSS … … 28 37 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_RGAUSS 29 38 # define PM_MODEL_FIT_STATUS pmModelFitStatus_RGAUSS 39 # define PM_MODEL_SET_LIMITS pmModelSetLimits_RGAUSS 40 41 // Lax parameter limits 42 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, 1.25 }; 43 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 4.0 }; 44 45 // Strict parameter limits 46 static float *paramsMinStrict = paramsMinLax; 47 static float *paramsMaxStrict = paramsMaxLax; 48 49 // Parameter limits to use 50 static float *paramsMinUse = paramsMinLax; 51 static float *paramsMaxUse = paramsMaxLax; 52 static float betaUse[] = { 1000, 3e6, 5, 5, 0.5, 0.5, 0.5, 0.5 }; 53 54 static bool limitsApply = true; // Apply limits? 30 55 31 56 psF32 PM_MODEL_FUNC (psVector *deriv, … … 73 98 # define AR_MAX 20.0 74 99 # define AR_RATIO 0.99 100 75 101 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 76 102 { 77 float beta_lim = 0, params_min = 0, params_max = 0; 78 float f1 = 0, f2 = 0, q1 = 0, q2 = 0; 103 if (!limitsApply) { 104 return true; 105 } 106 psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds"); 79 107 80 108 // we need to calculate the limits for SXY specially 109 float q2 = NAN; 81 110 if (nParam == PM_PAR_SXY) { 82 f 1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);83 f 2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);84 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);111 float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 112 float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 113 float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 85 114 q1 = (q1 < 0.0) ? 0.0 : q1; 86 115 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 87 116 // angle and let f2,f1 fight it out 88 q2 = 0.5*sqrt(q1);117 q2 = 0.5*sqrtf(q1); 89 118 } 90 119 91 120 switch (mode) { 92 case PS_MINIMIZE_BETA_LIMIT: 93 switch (nParam) { 94 case PM_PAR_SKY: 95 beta_lim = 1000; 96 break; 97 case PM_PAR_I0: 98 beta_lim = 3e6; 99 break; 100 case PM_PAR_XPOS: 101 beta_lim = 5; 102 break; 103 case PM_PAR_YPOS: 104 beta_lim = 5; 105 break; 106 case PM_PAR_SXX: 107 beta_lim = 0.5; 108 break; 109 case PM_PAR_SYY: 110 beta_lim = 0.5; 111 break; 112 case PM_PAR_SXY: 113 beta_lim = 0.5*q2; 114 break; 115 case PM_PAR_7: 116 beta_lim = 0.5; 117 break; 118 default: 119 psAbort("invalid parameter %d for beta test", nParam); 120 } 121 if (fabs(beta[nParam]) > fabs(beta_lim)) { 122 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 123 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 124 nParam, beta[nParam], beta_lim); 125 return false; 126 } 127 return true; 128 case PS_MINIMIZE_PARAM_MIN: 129 switch (nParam) { 130 case PM_PAR_SKY: 131 params_min = -1000; 132 break; 133 case PM_PAR_I0: 134 params_min = 0.01; 135 break; 136 case PM_PAR_XPOS: 137 params_min = -100; 138 break; 139 case PM_PAR_YPOS: 140 params_min = -100; 141 break; 142 case PM_PAR_SXX: 143 params_min = 0.5; 144 break; 145 case PM_PAR_SYY: 146 params_min = 0.5; 147 break; 148 case PM_PAR_SXY: 149 params_min = -q2; 150 break; 151 case PM_PAR_7: 152 params_min = 1.25; 153 break; 154 default: 155 psAbort("invalid parameter %d for param min test", nParam); 156 } 157 if (params[nParam] < params_min) { 158 params[nParam] = params_min; 159 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 160 nParam, params[nParam], params_min); 161 return false; 162 } 163 return true; 164 case PS_MINIMIZE_PARAM_MAX: 165 switch (nParam) { 166 case PM_PAR_SKY: 167 params_max = 1e5; 168 break; 169 case PM_PAR_I0: 170 params_max = 1e8; 171 break; 172 case PM_PAR_XPOS: 173 params_max = 1e4; 174 break; 175 case PM_PAR_YPOS: 176 params_max = 1e4; 177 break; 178 case PM_PAR_SXX: 179 params_max = 100; 180 break; 181 case PM_PAR_SYY: 182 params_max = 100; 183 break; 184 case PM_PAR_SXY: 185 params_max = +q2; 186 break; 187 case PM_PAR_7: 188 params_max = 4.0; 189 break; 190 default: 191 psAbort("invalid parameter %d for param max test", nParam); 192 } 193 if (params[nParam] > params_max) { 194 params[nParam] = params_max; 195 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 196 nParam, params[nParam], params_max); 197 return false; 198 } 199 return true; 200 default: 121 case PS_MINIMIZE_BETA_LIMIT: { 122 psAssert(beta, "Require beta to limit beta"); 123 float limit = betaUse[nParam]; 124 if (nParam == PM_PAR_SXY) { 125 limit *= q2; 126 } 127 if (fabs(beta[nParam]) > fabs(limit)) { 128 beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit); 129 psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 130 nParam, beta[nParam], limit); 131 return false; 132 } 133 return true; 134 } 135 case PS_MINIMIZE_PARAM_MIN: { 136 psAssert(params, "Require parameters to limit parameters"); 137 psAssert(paramsMinUse, "Require parameter limits to limit parameters"); 138 float limit = paramsMinUse[nParam]; 139 if (nParam == PM_PAR_SXY) { 140 limit *= q2; 141 } 142 if (params[nParam] < limit) { 143 params[nParam] = limit; 144 psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 145 nParam, params[nParam], limit); 146 return false; 147 } 148 return true; 149 } 150 case PS_MINIMIZE_PARAM_MAX: { 151 psAssert(params, "Require parameters to limit parameters"); 152 psAssert(paramsMaxUse, "Require parameter limits to limit parameters"); 153 float limit = paramsMaxUse[nParam]; 154 if (nParam == PM_PAR_SXY) { 155 limit *= q2; 156 } 157 if (params[nParam] > limit) { 158 params[nParam] = limit; 159 psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 160 nParam, params[nParam], limit); 161 return false; 162 } 163 return true; 164 } 165 default: 201 166 psAbort("invalid choice for limits"); 202 167 } … … 204 169 return false; 205 170 } 171 206 172 207 173 // make an initial guess for parameters … … 456 422 } 457 423 424 425 void PM_MODEL_SET_LIMITS(pmModelLimitsType type) 426 { 427 switch (type) { 428 case PM_MODEL_LIMITS_NONE: 429 paramsMinUse = NULL; 430 paramsMaxUse = NULL; 431 limitsApply = true; 432 break; 433 case PM_MODEL_LIMITS_IGNORE: 434 paramsMinUse = NULL; 435 paramsMaxUse = NULL; 436 limitsApply = false; 437 break; 438 case PM_MODEL_LIMITS_LAX: 439 paramsMinUse = paramsMinLax; 440 paramsMaxUse = paramsMaxLax; 441 limitsApply = true; 442 break; 443 case PM_MODEL_LIMITS_STRICT: 444 paramsMinUse = paramsMinStrict; 445 paramsMaxUse = paramsMaxStrict; 446 limitsApply = true; 447 break; 448 default: 449 psAbort("Unrecognised model limits type: %x", type); 450 } 451 return; 452 } 453 458 454 # undef PM_MODEL_FUNC 459 455 # undef PM_MODEL_FLUX … … 464 460 # undef PM_MODEL_PARAMS_FROM_PSF 465 461 # undef PM_MODEL_FIT_STATUS 462 # undef PM_MODEL_SET_LIMITS -
trunk/psModules/src/objects/models/pmModel_SERSIC.c
r20001 r25738 23 23 *****************************************************************************/ 24 24 25 #include <stdio.h> 26 #include <pslib.h> 27 28 #include "pmMoments.h" 29 #include "pmPeaks.h" 30 #include "pmSource.h" 31 #include "pmModel.h" 32 #include "pmModel_SERSIC.h" 33 25 34 # define PM_MODEL_FUNC pmModelFunc_SERSIC 26 35 # define PM_MODEL_FLUX pmModelFlux_SERSIC … … 31 40 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_SERSIC 32 41 # define PM_MODEL_FIT_STATUS pmModelFitStatus_SERSIC 42 # define PM_MODEL_SET_LIMITS pmModelSetLimits_SERSIC 43 44 // Lax parameter limits 45 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.05, 0.05, -1.0, 0.05 }; 46 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 4.0 }; 47 48 // Strict parameter limits 49 static float *paramsMinStrict = paramsMinLax; 50 static float *paramsMaxStrict = paramsMaxLax; 51 52 // Parameter limits to use 53 static float *paramsMinUse = paramsMinLax; 54 static float *paramsMaxUse = paramsMaxLax; 55 static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5, 2.0 }; 56 57 static bool limitsApply = true; // Apply limits? 33 58 34 59 psF32 PM_MODEL_FUNC (psVector *deriv, … … 91 116 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 92 117 { 93 float beta_lim = 0, params_min = 0, params_max = 0; 94 float f1 = 0, f2 = 0, q1 = 0, q2 = 0; 118 if (!limitsApply) { 119 return true; 120 } 121 psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds"); 95 122 96 123 // we need to calculate the limits for SXY specially 124 float q2 = NAN; 97 125 if (nParam == PM_PAR_SXY) { 98 f 1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);99 f 2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);100 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);126 float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 127 float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 128 float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 101 129 q1 = (q1 < 0.0) ? 0.0 : q1; 102 130 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 103 131 // angle and let f2,f1 fight it out 104 q2 = 0.5*sqrt(q1);132 q2 = 0.5*sqrtf(q1); 105 133 } 106 134 107 135 switch (mode) { 108 case PS_MINIMIZE_BETA_LIMIT: 109 switch (nParam) { 110 case PM_PAR_SKY: 111 beta_lim = 1000; 112 break; 113 case PM_PAR_I0: 114 beta_lim = 3e6; 115 break; 116 case PM_PAR_XPOS: 117 beta_lim = 5; 118 break; 119 case PM_PAR_YPOS: 120 beta_lim = 5; 121 break; 122 case PM_PAR_SXX: 123 beta_lim = 1.0; 124 break; 125 case PM_PAR_SYY: 126 beta_lim = 1.0; 127 break; 128 case PM_PAR_SXY: 129 beta_lim = 0.5*q2; 130 break; 131 case PM_PAR_7: 132 beta_lim = 2.0; 133 break; 134 default: 135 psAbort("invalid parameter %d for beta test", nParam); 136 } 137 if (fabs(beta[nParam]) > fabs(beta_lim)) { 138 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 139 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 140 nParam, beta[nParam], beta_lim); 141 return false; 142 } 143 return true; 144 case PS_MINIMIZE_PARAM_MIN: 145 switch (nParam) { 146 case PM_PAR_SKY: 147 params_min = -1000; 148 break; 149 case PM_PAR_I0: 150 params_min = 0.01; 151 break; 152 case PM_PAR_XPOS: 153 params_min = -100; 154 break; 155 case PM_PAR_YPOS: 156 params_min = -100; 157 break; 158 case PM_PAR_SXX: 159 params_min = 0.05; 160 break; 161 case PM_PAR_SYY: 162 params_min = 0.05; 163 break; 164 case PM_PAR_SXY: 165 params_min = -q2; 166 break; 167 case PM_PAR_7: 168 params_min = 0.05; 169 break; 170 default: 171 psAbort("invalid parameter %d for param min test", nParam); 172 } 173 if (params[nParam] < params_min) { 174 params[nParam] = params_min; 175 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 176 nParam, params[nParam], params_min); 177 return false; 178 } 179 return true; 180 case PS_MINIMIZE_PARAM_MAX: 181 switch (nParam) { 182 case PM_PAR_SKY: 183 params_max = 1e5; 184 break; 185 case PM_PAR_I0: 186 params_max = 1e8; 187 break; 188 case PM_PAR_XPOS: 189 params_max = 1e4; 190 break; 191 case PM_PAR_YPOS: 192 params_max = 1e4; 193 break; 194 case PM_PAR_SXX: 195 params_max = 100; 196 break; 197 case PM_PAR_SYY: 198 params_max = 100; 199 break; 200 case PM_PAR_SXY: 201 params_max = +q2; 202 break; 203 case PM_PAR_7: 204 params_max = 4.0; 205 break; 206 default: 207 psAbort("invalid parameter %d for param max test", nParam); 208 } 209 if (params[nParam] > params_max) { 210 params[nParam] = params_max; 211 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 212 nParam, params[nParam], params_max); 213 return false; 214 } 215 return true; 216 default: 136 case PS_MINIMIZE_BETA_LIMIT: { 137 psAssert(beta, "Require beta to limit beta"); 138 float limit = betaUse[nParam]; 139 if (nParam == PM_PAR_SXY) { 140 limit *= q2; 141 } 142 if (fabs(beta[nParam]) > fabs(limit)) { 143 beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit); 144 psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 145 nParam, beta[nParam], limit); 146 return false; 147 } 148 return true; 149 } 150 case PS_MINIMIZE_PARAM_MIN: { 151 psAssert(params, "Require parameters to limit parameters"); 152 psAssert(paramsMinUse, "Require parameter limits to limit parameters"); 153 float limit = paramsMinUse[nParam]; 154 if (nParam == PM_PAR_SXY) { 155 limit *= q2; 156 } 157 if (params[nParam] < limit) { 158 params[nParam] = limit; 159 psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 160 nParam, params[nParam], limit); 161 return false; 162 } 163 return true; 164 } 165 case PS_MINIMIZE_PARAM_MAX: { 166 psAssert(params, "Require parameters to limit parameters"); 167 psAssert(paramsMaxUse, "Require parameter limits to limit parameters"); 168 float limit = paramsMaxUse[nParam]; 169 if (nParam == PM_PAR_SXY) { 170 limit *= q2; 171 } 172 if (params[nParam] > limit) { 173 params[nParam] = limit; 174 psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 175 nParam, params[nParam], limit); 176 return false; 177 } 178 return true; 179 } 180 default: 217 181 psAbort("invalid choice for limits"); 218 182 } … … 220 184 return false; 221 185 } 222 223 186 224 187 // make an initial guess for parameters … … 447 410 448 411 fprintf (stderr, "SERSIC status pars: dP: %f, I0: %f, S/N: %f\n", 449 dP, PAR[PM_PAR_I0], (dPAR[PM_PAR_I0]/PAR[PM_PAR_I0]));412 dP, PAR[PM_PAR_I0], (dPAR[PM_PAR_I0]/PAR[PM_PAR_I0])); 450 413 451 414 return status; 415 } 416 417 418 void PM_MODEL_SET_LIMITS(pmModelLimitsType type) 419 { 420 switch (type) { 421 case PM_MODEL_LIMITS_NONE: 422 paramsMinUse = NULL; 423 paramsMaxUse = NULL; 424 limitsApply = true; 425 break; 426 case PM_MODEL_LIMITS_IGNORE: 427 paramsMinUse = NULL; 428 paramsMaxUse = NULL; 429 limitsApply = false; 430 break; 431 case PM_MODEL_LIMITS_LAX: 432 paramsMinUse = paramsMinLax; 433 paramsMaxUse = paramsMaxLax; 434 limitsApply = true; 435 break; 436 case PM_MODEL_LIMITS_STRICT: 437 paramsMinUse = paramsMinStrict; 438 paramsMaxUse = paramsMaxStrict; 439 limitsApply = true; 440 break; 441 default: 442 psAbort("Unrecognised model limits type: %x", type); 443 } 444 return; 452 445 } 453 446 … … 460 453 # undef PM_MODEL_PARAMS_FROM_PSF 461 454 # undef PM_MODEL_FIT_STATUS 455 # undef PM_MODEL_SET_LIMITS -
trunk/psModules/src/objects/pmModel.c
r23187 r25738 86 86 tmp->modelParamsFromPSF = class->modelParamsFromPSF; 87 87 tmp->modelFitStatus = class->modelFitStatus; 88 tmp->modelSetLimits = class->modelSetLimits; 88 89 89 90 psTrace("psModules.objects", 10, "---- %s() end ----\n", __func__); … … 235 236 236 237 if (model->residuals) { 237 DX = xBin*(image->col0 - xCenter - dx) + model->residuals->xCenter + 0.5;238 DY = yBin*(image->row0 - yCenter - dy) + model->residuals->yCenter + 0.5;239 Ro = (model->residuals->Ro) ? model->residuals->Ro->data.F32 : NULL;240 Rx = (model->residuals->Rx) ? model->residuals->Rx->data.F32 : NULL;241 Ry = (model->residuals->Ry) ? model->residuals->Ry->data.F32 : NULL;242 Rm = (model->residuals->mask) ? model->residuals->mask->data.PS_TYPE_IMAGE_MASK_DATA : NULL;243 if (Ro) {244 NX = model->residuals->Ro->numCols;245 NY = model->residuals->Ro->numRows;246 } 238 DX = xBin*(image->col0 - xCenter - dx) + model->residuals->xCenter + 0.5; 239 DY = yBin*(image->row0 - yCenter - dy) + model->residuals->yCenter + 0.5; 240 Ro = (model->residuals->Ro) ? model->residuals->Ro->data.F32 : NULL; 241 Rx = (model->residuals->Rx) ? model->residuals->Rx->data.F32 : NULL; 242 Ry = (model->residuals->Ry) ? model->residuals->Ry->data.F32 : NULL; 243 Rm = (model->residuals->mask) ? model->residuals->mask->data.PS_TYPE_IMAGE_MASK_DATA : NULL; 244 if (Ro) { 245 NX = model->residuals->Ro->numCols; 246 NY = model->residuals->Ro->numRows; 247 } 247 248 } 248 249 … … 256 257 257 258 // XXX should we use using 0.5 pixel offset? 258 // Convert to coordinate in parent image, with offset (dx,dy)259 // Convert to coordinate in parent image, with offset (dx,dy) 259 260 imageCol = ix + image->col0 - dx; 260 261 imageRow = iy + image->row0 - dy; … … 276 277 float rx = xBin*ix + DX; 277 278 278 int rx0 = rx - 0.5;279 int rx1 = rx + 0.5;280 int ry0 = ry - 0.5;281 int ry1 = ry + 0.5;282 283 if (rx0 < 0) goto skip;284 if (ry0 < 0) goto skip;285 if (rx1 >= NX) goto skip;286 if (ry1 >= NY) goto skip;287 288 // these go from 0.0 to 1.0 between the centers of the pixels 289 float fx = rx - 0.5 - rx0;290 float Fx = 1.0 - fx;291 float fy = ry - 0.5 - ry0;292 float Fy = 1.0 - fy;293 294 // check the residual image mask (if set). give up if any of the 4 pixels are masked.295 if (Rm) {296 if (Rm[ry0][rx0]) goto skip;297 if (Rm[ry0][rx1]) goto skip;298 if (Rm[ry1][rx0]) goto skip;299 if (Rm[ry1][rx1]) goto skip;300 }301 302 // a possible further optimization if we re-use these values303 // XXX allow for masked pixels, and add pixel weights304 float V0 = (Ro[ry0][rx0]*Fx + Ro[ry0][rx1]*fx);305 float V1 = (Ro[ry1][rx0]*Fx + Ro[ry1][rx1]*fx);306 float Vo = V0*Fy + V1*fy;307 if (!isfinite(Vo)) goto skip;308 309 float Vx = 0.0;310 float Vy = 0.0;311 312 // skip Rx,Ry if Ro is masked313 if (Rx && Ry && (mode & PM_MODEL_OP_RES1)) {314 V0 = (Rx[ry0][rx0]*Fx + Rx[ry0][rx1]*fx);315 V1 = (Rx[ry1][rx0]*Fx + Rx[ry1][rx1]*fx);316 Vx = V0*Fy + V1*fy;317 318 V0 = (Ry[ry0][rx0]*Fx + Ry[ry0][rx1]*fx);319 V1 = (Ry[ry1][rx0]*Fx + Ry[ry1][rx1]*fx);320 Vy = V0*Fy + V1*fy;321 }322 if (!isfinite(Vx)) goto skip;323 if (!isfinite(Vy)) goto skip;324 325 // 2D residual variations are set for the true source position326 pixelValue += Io*(Vo + XoSave*Vx + XoSave*Vy);279 int rx0 = rx - 0.5; 280 int rx1 = rx + 0.5; 281 int ry0 = ry - 0.5; 282 int ry1 = ry + 0.5; 283 284 if (rx0 < 0) goto skip; 285 if (ry0 < 0) goto skip; 286 if (rx1 >= NX) goto skip; 287 if (ry1 >= NY) goto skip; 288 289 // these go from 0.0 to 1.0 between the centers of the pixels 290 float fx = rx - 0.5 - rx0; 291 float Fx = 1.0 - fx; 292 float fy = ry - 0.5 - ry0; 293 float Fy = 1.0 - fy; 294 295 // check the residual image mask (if set). give up if any of the 4 pixels are masked. 296 if (Rm) { 297 if (Rm[ry0][rx0]) goto skip; 298 if (Rm[ry0][rx1]) goto skip; 299 if (Rm[ry1][rx0]) goto skip; 300 if (Rm[ry1][rx1]) goto skip; 301 } 302 303 // a possible further optimization if we re-use these values 304 // XXX allow for masked pixels, and add pixel weights 305 float V0 = (Ro[ry0][rx0]*Fx + Ro[ry0][rx1]*fx); 306 float V1 = (Ro[ry1][rx0]*Fx + Ro[ry1][rx1]*fx); 307 float Vo = V0*Fy + V1*fy; 308 if (!isfinite(Vo)) goto skip; 309 310 float Vx = 0.0; 311 float Vy = 0.0; 312 313 // skip Rx,Ry if Ro is masked 314 if (Rx && Ry && (mode & PM_MODEL_OP_RES1)) { 315 V0 = (Rx[ry0][rx0]*Fx + Rx[ry0][rx1]*fx); 316 V1 = (Rx[ry1][rx0]*Fx + Rx[ry1][rx1]*fx); 317 Vx = V0*Fy + V1*fy; 318 319 V0 = (Ry[ry0][rx0]*Fx + Ry[ry0][rx1]*fx); 320 V1 = (Ry[ry1][rx0]*Fx + Ry[ry1][rx1]*fx); 321 Vy = V0*Fy + V1*fy; 322 } 323 if (!isfinite(Vx)) goto skip; 324 if (!isfinite(Vy)) goto skip; 325 326 // 2D residual variations are set for the true source position 327 pixelValue += Io*(Vo + XoSave*Vx + XoSave*Vy); 327 328 } 328 329 329 skip:330 skip: 330 331 // add or subtract the value 331 332 if (add) { -
trunk/psModules/src/objects/pmModel.h
r21516 r25738 44 44 } pmModelOpMode; 45 45 46 /// Parameter limit types 47 typedef enum { 48 PM_MODEL_LIMITS_NONE, ///< Apply no limits: suitable for debugging 49 PM_MODEL_LIMITS_IGNORE, ///< Ignore all limits: fit can go to town 50 PM_MODEL_LIMITS_LAX, ///< Lax limits: attempting to reproduce mildly bad data 51 PM_MODEL_LIMITS_STRICT, ///< Strict limits: good quality data 52 } pmModelLimitsType; 53 46 54 typedef struct pmModel pmModel; 47 55 typedef struct pmSource pmSource; … … 74 82 // This function returns the success / failure status of the given model fit 75 83 typedef bool (*pmModelFitStatusFunc)(pmModel *model); 84 85 // This function sets the parameter limits for the given model 86 typedef bool (*pmModelSetLimitsFunc)(pmModelLimitsType type); 76 87 77 88 /** pmModel data structure … … 108 119 pmModelParamsFromPSF modelParamsFromPSF; 109 120 pmModelFitStatusFunc modelFitStatus; 121 pmModelSetLimitsFunc modelSetLimits; 110 122 }; 111 123 … … 151 163 pmModel *model, ///< The input pmModel 152 164 pmModelOpMode mode, ///< mode to control how the model is added into the image 153 psImageMaskType maskVal ///< Value to mask165 psImageMaskType maskVal ///< Value to mask 154 166 ); 155 167 … … 169 181 pmModel *model, ///< The input pmModel 170 182 pmModelOpMode mode, ///< mode to control how the model is added into the image 171 psImageMaskType maskVal ///< Value to mask183 psImageMaskType maskVal ///< Value to mask 172 184 ); 173 185 … … 202 214 ); 203 215 216 217 /// Set the model parameter limits for the given model 218 /// 219 /// Wraps the model-specific pmModelSetLimitsFunc function. 220 bool pmModelSetLimits( 221 const pmModel *model, ///< Model of interest 222 pmModelLimits type ///< Type of limits 223 ); 224 225 204 226 /// @} 205 227 # endif /* PM_MODEL_H */ -
trunk/psModules/src/objects/pmModelClass.c
r20937 r25738 40 40 double sqrt (double x); 41 41 42 # include "models/pmModel_GAUSS. c"43 # include "models/pmModel_PGAUSS. c"44 # include "models/pmModel_QGAUSS. c"45 # include "models/pmModel_PS1_V1. c"46 # include "models/pmModel_RGAUSS. c"47 # include "models/pmModel_SERSIC. c"42 # include "models/pmModel_GAUSS.h" 43 # include "models/pmModel_PGAUSS.h" 44 # include "models/pmModel_QGAUSS.h" 45 # include "models/pmModel_PS1_V1.h" 46 # include "models/pmModel_RGAUSS.h" 47 # include "models/pmModel_SERSIC.h" 48 48 49 49 static pmModelClass defaultModels[] = { 50 {"PS_MODEL_GAUSS", 7, pmModelFunc_GAUSS, pmModelFlux_GAUSS, pmModelRadius_GAUSS, pmModelLimits_GAUSS, pmModelGuess_GAUSS, pmModelFromPSF_GAUSS, pmModelParamsFromPSF_GAUSS, pmModelFitStatus_GAUSS},51 {"PS_MODEL_PGAUSS", 7, pmModelFunc_PGAUSS, pmModelFlux_PGAUSS, pmModelRadius_PGAUSS, pmModelLimits_PGAUSS, pmModelGuess_PGAUSS, pmModelFromPSF_PGAUSS, pmModelParamsFromPSF_PGAUSS, pmModelFitStatus_PGAUSS},52 {"PS_MODEL_QGAUSS", 8, pmModelFunc_QGAUSS, pmModelFlux_QGAUSS, pmModelRadius_QGAUSS, pmModelLimits_QGAUSS, pmModelGuess_QGAUSS, pmModelFromPSF_QGAUSS, pmModelParamsFromPSF_QGAUSS, pmModelFitStatus_QGAUSS},53 {"PS_MODEL_PS1_V1", 8, pmModelFunc_PS1_V1, pmModelFlux_PS1_V1, pmModelRadius_PS1_V1, pmModelLimits_PS1_V1, pmModelGuess_PS1_V1, pmModelFromPSF_PS1_V1, pmModelParamsFromPSF_PS1_V1, pmModelFitStatus_PS1_V1},54 {"PS_MODEL_RGAUSS", 8, pmModelFunc_RGAUSS, pmModelFlux_RGAUSS, pmModelRadius_RGAUSS, pmModelLimits_RGAUSS, pmModelGuess_RGAUSS, pmModelFromPSF_RGAUSS, pmModelParamsFromPSF_RGAUSS, pmModelFitStatus_RGAUSS},55 {"PS_MODEL_SERSIC", 8, pmModelFunc_SERSIC, pmModelFlux_SERSIC, pmModelRadius_SERSIC, pmModelLimits_SERSIC, pmModelGuess_SERSIC, pmModelFromPSF_SERSIC, pmModelParamsFromPSF_SERSIC, pmModelFitStatus_SERSIC}50 {"PS_MODEL_GAUSS", 7, (pmModelFunc)pmModelFunc_GAUSS, (pmModelFlux)pmModelFlux_GAUSS, (pmModelRadius)pmModelRadius_GAUSS, (pmModelLimits)pmModelLimits_GAUSS, (pmModelGuessFunc)pmModelGuess_GAUSS, (pmModelFromPSFFunc)pmModelFromPSF_GAUSS, (pmModelParamsFromPSF)pmModelParamsFromPSF_GAUSS, (pmModelFitStatusFunc)pmModelFitStatus_GAUSS, (pmModelSetLimitsFunc)pmModelSetLimits_GAUSS }, 51 {"PS_MODEL_PGAUSS", 7, (pmModelFunc)pmModelFunc_PGAUSS, (pmModelFlux)pmModelFlux_PGAUSS, (pmModelRadius)pmModelRadius_PGAUSS, (pmModelLimits)pmModelLimits_PGAUSS, (pmModelGuessFunc)pmModelGuess_PGAUSS, (pmModelFromPSFFunc)pmModelFromPSF_PGAUSS, (pmModelParamsFromPSF)pmModelParamsFromPSF_PGAUSS, (pmModelFitStatusFunc)pmModelFitStatus_PGAUSS, (pmModelSetLimitsFunc)pmModelSetLimits_PGAUSS }, 52 {"PS_MODEL_QGAUSS", 8, (pmModelFunc)pmModelFunc_QGAUSS, (pmModelFlux)pmModelFlux_QGAUSS, (pmModelRadius)pmModelRadius_QGAUSS, (pmModelLimits)pmModelLimits_QGAUSS, (pmModelGuessFunc)pmModelGuess_QGAUSS, (pmModelFromPSFFunc)pmModelFromPSF_QGAUSS, (pmModelParamsFromPSF)pmModelParamsFromPSF_QGAUSS, (pmModelFitStatusFunc)pmModelFitStatus_QGAUSS, (pmModelSetLimitsFunc)pmModelSetLimits_QGAUSS }, 53 {"PS_MODEL_PS1_V1", 8, (pmModelFunc)pmModelFunc_PS1_V1, (pmModelFlux)pmModelFlux_PS1_V1, (pmModelRadius)pmModelRadius_PS1_V1, (pmModelLimits)pmModelLimits_PS1_V1, (pmModelGuessFunc)pmModelGuess_PS1_V1, (pmModelFromPSFFunc)pmModelFromPSF_PS1_V1, (pmModelParamsFromPSF)pmModelParamsFromPSF_PS1_V1, (pmModelFitStatusFunc)pmModelFitStatus_PS1_V1, (pmModelSetLimitsFunc)pmModelSetLimits_PS1_V1 }, 54 {"PS_MODEL_RGAUSS", 8, (pmModelFunc)pmModelFunc_RGAUSS, (pmModelFlux)pmModelFlux_RGAUSS, (pmModelRadius)pmModelRadius_RGAUSS, (pmModelLimits)pmModelLimits_RGAUSS, (pmModelGuessFunc)pmModelGuess_RGAUSS, (pmModelFromPSFFunc)pmModelFromPSF_RGAUSS, (pmModelParamsFromPSF)pmModelParamsFromPSF_RGAUSS, (pmModelFitStatusFunc)pmModelFitStatus_RGAUSS, (pmModelSetLimitsFunc)pmModelSetLimits_RGAUSS }, 55 {"PS_MODEL_SERSIC", 8, (pmModelFunc)pmModelFunc_SERSIC, (pmModelFlux)pmModelFlux_SERSIC, (pmModelRadius)pmModelRadius_SERSIC, (pmModelLimits)pmModelLimits_SERSIC, (pmModelGuessFunc)pmModelGuess_SERSIC, (pmModelFromPSFFunc)pmModelFromPSF_SERSIC, (pmModelParamsFromPSF)pmModelParamsFromPSF_SERSIC, (pmModelFitStatusFunc)pmModelFitStatus_SERSIC, (pmModelSetLimitsFunc)pmModelSetLimits_SERSIC } 56 56 }; 57 57 … … 168 168 return (models[type].name); 169 169 } 170 171 172 void pmModelClassSetLimits(pmModelLimitsType type) 173 { 174 if (!models) { 175 pmModelClassInit(); 176 } 177 178 for (int i = 0; i < Nmodels; i++) { 179 if (models[i].modelSetLimits) { 180 models[i].modelSetLimits(type); 181 } 182 } 183 184 } 185 -
trunk/psModules/src/objects/pmModelClass.h
r15697 r25738 29 29 # define PM_MODEL_CLASS_H 30 30 31 #include <pmModel.h> 32 31 33 /// @addtogroup Objects Object Detection / Analysis Functions 32 34 /// @{ 33 35 34 typedef struct 35 { 36 typedef struct { 36 37 char *name; 37 38 int nParams; … … 44 45 pmModelParamsFromPSF modelParamsFromPSF; 45 46 pmModelFitStatusFunc modelFitStatus; 47 pmModelSetLimitsFunc modelSetLimits; 46 48 } pmModelClass; 47 49 … … 73 75 pmModelType pmModelClassGetType (const char *name); 74 76 77 /// Set parameter limits for all models 78 void pmModelClassSetLimits(pmModelLimitsType type); 79 80 75 81 /// @} 76 82 # endif /* PM_MODEL_CLASS_H */ -
trunk/psphot/doc/efficiency.txt
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/psphot/src/psphotEfficiency.c
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/psphot/src/psphotFake.c
- Property svn:mergeinfo changed (with no actual effect on merging)
-
trunk/psphot/src/psphotModelGroupInit.c
r14655 r25738 1 1 # include "psphotInternal.h" 2 2 3 // Add locally-defined models here. As these mature, they can be moved to 3 // Add locally-defined models here. As these mature, they can be moved to 4 4 // psModule/src/objects/models 5 5 … … 8 8 9 9 static pmModelClass userModels[] = { 10 {"PS_MODEL_TEST1", 7, pmModelFunc_TEST1, pmModelFlux_TEST1, pmModelRadius_TEST1, pmModelLimits_TEST1, pmModelGuess_TEST1, pmModelFromPSF_TEST1, pmModelParamsFromPSF_TEST1, pmModelFitStatus_TEST1 },11 {"PS_MODEL_STRAIL", 9, pmModelFunc_STRAIL, pmModelFlux_STRAIL, pmModelRadius_STRAIL, pmModelLimits_STRAIL, pmModelGuess_STRAIL, pmModelFromPSF_STRAIL, pmModelParamsFromPSF_STRAIL, pmModelFitStatus_STRAIL },10 {"PS_MODEL_TEST1", 7, pmModelFunc_TEST1, pmModelFlux_TEST1, pmModelRadius_TEST1, pmModelLimits_TEST1, pmModelGuess_TEST1, pmModelFromPSF_TEST1, pmModelParamsFromPSF_TEST1, pmModelFitStatus_TEST1, NULL}, 11 {"PS_MODEL_STRAIL", 9, pmModelFunc_STRAIL, pmModelFlux_STRAIL, pmModelRadius_STRAIL, pmModelLimits_STRAIL, pmModelGuess_STRAIL, pmModelFromPSF_STRAIL, pmModelParamsFromPSF_STRAIL, pmModelFitStatus_STRAIL, NULL}, 12 12 }; 13 13 14 void psphotModelClassInit (void) 15 { 14 void psphotModelClassInit (void) 15 { 16 16 17 17 // if pmModelClassInit returns false, we have already init'ed … … 20 20 int Nmodels = sizeof (userModels) / sizeof (pmModelClass); 21 21 for (int i = 0; i < Nmodels; i++) { 22 pmModelClassAdd (&userModels[i]);22 pmModelClassAdd (&userModels[i]); 23 23 } 24 24 return; -
trunk/psphot/src/psphotReadout.c
r25383 r25738 17 17 // jointly by the multiple threads, not the total time used by all threads. 18 18 psTimerStart ("psphotReadout"); 19 20 pmModelClassSetLimits(PM_MODEL_LIMITS_LAX); 19 21 20 22 // select the current recipe -
trunk/psphot/src/psphotReadoutMinimal.c
r25383 r25738 14 14 // jointly by the multiple threads, not the total time used by all threads. 15 15 psTimerStart ("psphotReadout"); 16 17 pmModelClassSetLimits(PM_MODEL_LIMITS_LAX); 16 18 17 19 // select the current recipe -
trunk/psphot/src/psphotVersion.c
r23805 r25738 30 30 psString psphotVersionLong(void) 31 31 { 32 psString version = ps LibVersion(); // Version, to return33 psString source = ps LibSource(); // Source32 psString version = psphotVersion(); // Version, to return 33 psString source = psphotSource(); // Source 34 34 35 35 psStringPrepend(&version, "psphot "); -
trunk/pswarp/src/pswarpLoop.c
r25518 r25738 397 397 } 398 398 399 pmModelClassSetLimits(PM_MODEL_LIMITS_STRICT); 400 399 401 // measure the PSF using these sources 400 402 if (!psphotReadoutFindPSF(config, view, sources)) {
Note:
See TracChangeset
for help on using the changeset viewer.
