Changeset 6481 for trunk/psphot/src/pmSourceFitSet.c
- Timestamp:
- Feb 23, 2006, 6:16:11 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/pmSourceFitSet.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/pmSourceFitSet.c
r6441 r6481 74 74 int nPar = model->params->n - 1; // number of object parameters (excluding sky) 75 75 76 // define parameter vectors for source set 76 77 psVector *params = psVectorAlloc (nSrc*nPar + 1, PS_TYPE_F32); 77 78 psVector *dparams = psVectorAlloc (nSrc*nPar + 1, PS_TYPE_F32); 78 psVector *paramMask = PSF ? psVectorAlloc (nSrc*nPar + 1, PS_TYPE_U8) : NULL; 79 80 pmModelLimits modelLimits = pmModelLimits_GetFunction (model->type); 81 82 // define limits for single-source model 83 psVector *oneDelta; 84 psVector *oneParMin; 85 psVector *oneParMax; 86 modelLimits (&oneDelta, &oneParMin, &oneParMax); 87 88 psMinConstrain *constrain = psMinConstrainAlloc(); 89 constrain->paramDelta = psVectorAlloc (nSrc*nPar + 1, PS_TYPE_F32); 90 constrain->paramMin = psVectorAlloc (nSrc*nPar + 1, PS_TYPE_F32); 91 constrain->paramMax = psVectorAlloc (nSrc*nPar + 1, PS_TYPE_F32); 92 constrain->paramMask = PSF ? psVectorAlloc (nSrc*nPar + 1, PS_TYPE_U8) : NULL; 79 93 80 94 // all but the sky are allowed to vary independently (subject to PSF) 95 // set the parameters from the multiple models 96 // also, set limits based on single-source limits 81 97 params->data.F32[0] = model->params->data.F32[0]; 98 constrain->paramDelta->data.F32[0] = oneDelta->data.F32[0]; 99 constrain->paramMin->data.F32[0] = oneParMin->data.F32[0]; 100 constrain->paramMax->data.F32[0] = oneParMax->data.F32[0]; 101 constrain->paramMask->data.U8[0] = 0; 82 102 for (int i = 0; i < nSrc; i++) { 83 103 model = modelSet->data[i]; … … 85 105 params->data.F32[i*nPar + n] = model->params->data.F32[n]; 86 106 dparams->data.F32[i*nPar + n] = model->dparams->data.F32[n]; 107 constrain->paramDelta->data.F32[i*nPar + n] = oneDelta->data.F32[n]; 108 constrain->paramMin->data.F32[i*nPar + n] = oneParMin->data.F32[n]; 109 constrain->paramMax->data.F32[i*nPar + n] = oneParMax->data.F32[n]; 87 110 if (PSF) { 88 paramMask->data.U8[i*nPar + n] = (n < 4) ? 0 : 1;111 constrain->paramMask->data.U8[i*nPar + n] = (n < 4) ? 0 : 1; 89 112 } 90 113 } 114 } 115 psFree (oneDelta); 116 psFree (oneParMin); 117 psFree (oneParMax); 118 119 if (psTraceGetLevel(__func__) >= 5) { 120 for (int i = 0; i < params->n; i++) { 121 fprintf (stderr, "%d %f %d\n", i, params->data.F32[i], constrain->paramMask->data.U8[i]); 122 } 91 123 } 92 124 … … 126 158 } 127 159 if (nPix < nParams + 1) { 128 psTrace ( ".pmObjects.pmSourceFitModel", 4, "insufficient valid pixels\n");129 psTrace(__func__, 3, "---- %s( false) end----\n", __func__);160 psTrace (__func__, 4, "insufficient valid pixels\n"); 161 psTrace(__func__, 3, "---- %s() end : fail pixels ----\n", __func__); 130 162 model->status = PM_MODEL_BADARGS; 131 163 psFree (x); … … 134 166 psFree (params); 135 167 psFree (dparams); 136 psFree (paramMask); 168 psFree(constrain->paramMask); 169 psFree(constrain->paramMin); 170 psFree(constrain->paramMax); 171 psFree(constrain->paramDelta); 172 psFree(constrain); 137 173 return(false); 138 174 } … … 143 179 psMinimization *myMin = psMinimizationAlloc(PM_SOURCE_FIT_MODEL_NUM_ITERATIONS, 144 180 PM_SOURCE_FIT_MODEL_TOLERANCE); 145 psMinConstrain *constrain = psMinConstrainAlloc();146 constrain->paramMask = paramMask;147 148 // Set the parameter range checks149 pmModelLimits modelLimits = pmModelLimits_GetFunction (model->type);150 modelLimits (&constrain->paramDelta, &constrain->paramMin, &constrain->paramMax);151 181 152 182 psImage *covar = psImageAlloc (params->n, params->n, PS_TYPE_F64); 153 183 154 psTrace ( ".pmObjects.pmSourceFitSet", 5, "fitting function\n");184 psTrace (__func__, 5, "fitting function\n"); 155 185 fitStatus = psMinimizeLMChi2(myMin, covar, params, constrain, x, y, yErr, pmModelFitSet); 156 186 157 187 // parameter errors from the covariance matrix 158 188 for (int i = 0; i < dparams->n; i++) { 159 if (( paramMask != NULL) &¶mMask->data.U8[i])189 if ((constrain->paramMask != NULL) && constrain->paramMask->data.U8[i]) 160 190 continue; 161 191 dparams->data.F32[i] = sqrt(covar->data.F64[i][i]); … … 163 193 164 194 // get the Gauss-Newton distance for fixed model parameters 165 if ( paramMask != NULL) {195 if (constrain->paramMask != NULL) { 166 196 psVector *delta = psVectorAlloc (params->n, PS_TYPE_F64); 167 197 psMinimizeGaussNewtonDelta(delta, params, NULL, x, y, yErr, pmModelFitSet); 168 198 for (int i = 0; i < dparams->n; i++) { 169 if (! paramMask->data.U8[i])199 if (!constrain->paramMask->data.U8[i]) 170 200 continue; 171 201 dparams->data.F32[i] = delta->data.F64[i]; … … 220 250 221 251 rc = (onPic && fitStatus); 222 psTrace(__func__, 3, "---- %s(%d) end ----\n", __func__, rc); 252 psTrace (__func__, 5, "onPic: %d, fitStatus: %d, nIter: %d, chisq: %f, nDof: %d\n", onPic, fitStatus, model->nIter, model->chisq, model->nDOF); 253 psTrace(__func__, 3, "---- %s end : status %d ----\n", __func__, rc); 223 254 return(rc); 224 255 }
Note:
See TracChangeset
for help on using the changeset viewer.
