Changeset 14338 for trunk/psphot/src/psphotModelTest.c
- Timestamp:
- Jul 20, 2007, 10:34:30 AM (19 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/psphotModelTest.c (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/psphotModelTest.c
r14326 r14338 1 1 # include "psphotInternal.h" 2 static char DEFAULT_MODE[] = "EXT"; 3 4 // XXX consider this function :add more test information?5 bool psphotModelTest (pm Readout *readout, psMetadata *recipe, psMaskType maskVal, psMaskType mark) {2 # define PM_SOURCE_FIT_PSF_X_EXT PM_SOURCE_FIT_PSF_AND_SKY 3 4 // XXX add more test information? 5 bool psphotModelTest (pmConfig *config, const pmFPAview *view, psMetadata *recipe, psMaskType maskVal, psMaskType mark) { 6 6 7 7 bool status; 8 8 int modelType; 9 unsigned int Nfail;10 9 float obsMag, fitMag, value; 11 10 char name[64]; … … 13 12 pmSourceFitMode fitMode; 14 13 15 psMetadataItem *item = NULL; 14 // run model fitting tests on a single source? 15 if (!psMetadataLookupBool (&status, recipe, "TEST_FIT")) return false; 16 17 // find the currently selected readout 18 pmReadout *readout = pmFPAfileThisReadout (config->files, view, "PSPHOT.INPUT"); 19 PS_ASSERT_PTR_NON_NULL (readout, false); 16 20 17 21 // use poissonian errors or local-sky errors … … 20 24 pmSourceFitModelInit (15, 0.1, 1.0, POISSON_ERRORS); 21 25 22 // run model fitting tests on a single source 23 if (!psMetadataLookupBool (&status, recipe, "TEST_FIT")) return false; 26 // find the various fitting parameters (try test values first) 27 float INNER = psMetadataLookupF32 (&status, recipe, "TEST_FIT_INNER_RADIUS"); 28 if (!status || !isfinite(INNER)) { 29 INNER = psMetadataLookupF32 (&status, recipe, "SKY_INNER_RADIUS"); 30 } 31 float OUTER = psMetadataLookupF32 (&status, recipe, "TEST_FIT_OUTER_RADIUS"); 32 if (!status || !isfinite(OUTER)) { 33 OUTER = psMetadataLookupF32 (&status, recipe, "SKY_OUTER_RADIUS"); 34 } 35 float RADIUS = psMetadataLookupF32 (&status, recipe, "TEST_FIT_RADIUS"); 36 if (!status || !isfinite(RADIUS)) { 37 RADIUS = psMetadataLookupF32 (&status, recipe, "PSF_FIT_RADIUS"); 38 } 39 float mRADIUS = psMetadataLookupF32 (&status, recipe, "TEST_MOMENTS_RADIUS"); 40 if (!status || !isfinite(mRADIUS)) { 41 mRADIUS = psMetadataLookupF32 (&status, recipe, "PSF_MOMENTS_RADIUS"); 42 } 43 44 // define the source of interest 45 float xObj = psMetadataLookupF32 (&status, recipe, "TEST_FIT_X"); 46 float yObj = psMetadataLookupF32 (&status, recipe, "TEST_FIT_Y"); 47 if (!isfinite(xObj) || !isfinite(yObj)) psAbort ("object position is not defined"); 24 48 25 49 // what fitting mode to use? 50 fitMode = PM_SOURCE_FIT_EXT; 26 51 char *fitModeWord = psMetadataLookupStr (&status, recipe, "TEST_FIT_MODE"); 27 if (!status || !strcasecmp (fitModeWord, "DEFAULT")) { 28 fitModeWord = DEFAULT_MODE; 29 } 30 fitMode = PM_SOURCE_FIT_EXT; 31 if (!strcasecmp (fitModeWord, "PSF")) fitMode = PM_SOURCE_FIT_PSF; 52 if (fitModeWord && !strcasecmp (fitModeWord, "PSF")) fitMode = PM_SOURCE_FIT_PSF; 53 if (fitModeWord && !strcasecmp (fitModeWord, "CONV")) fitMode = PM_SOURCE_FIT_PSF_X_EXT; 54 if (fitModeWord && !strcasecmp (fitModeWord, "DEFAULT")) fitMode = PM_SOURCE_FIT_EXT; 32 55 33 56 // in fitMode, psf sets the model type 34 57 if (fitMode == PM_SOURCE_FIT_PSF) { 35 // XXX load psf using psphotLoadPSF 36 char *psfFile = psMetadataLookupStr (&status, recipe, "PSF_INPUT_FILE"); 37 if (!status) psAbort("PSF_INPUT_FILE not supplied"); 38 psMetadata *psfData = psMetadataConfigRead(NULL, &Nfail, psfFile, FALSE); 39 psf = pmPSFfromMetadata (psfData); 58 psf = psphotLoadPSF (config, view, recipe); 59 if (!psf) psAbort("PSF_INPUT_FILE not supplied"); 40 60 modelType = psf->type; 41 } else { 61 } 62 if (fitMode == PM_SOURCE_FIT_EXT) { 42 63 // find the model: supplied by user or first in the PSF_MODEL list 43 64 char *modelName = psMetadataLookupStr (&status, recipe, "TEST_FIT_MODEL"); … … 57 78 58 79 // take the first list element 59 item = psListGet (list, PS_LIST_HEAD);80 psMetadataItem *item = psListGet (list, PS_LIST_HEAD); 60 81 modelName = item->data.V; 61 82 } … … 63 84 if (modelType < 0) psAbort("unknown model %s", modelName); 64 85 } 65 66 // find the fitting parameters (try test values first) 67 float INNER = psMetadataLookupF32 (&status, recipe, "TEST_FIT_INNER_RADIUS"); 68 if (!status || !isfinite(INNER)) { 69 INNER = psMetadataLookupF32 (&status, recipe, "SKY_INNER_RADIUS"); 70 } 71 72 float OUTER = psMetadataLookupF32 (&status, recipe, "TEST_FIT_OUTER_RADIUS"); 73 if (!status || !isfinite(OUTER)) { 74 OUTER = psMetadataLookupF32 (&status, recipe, "SKY_OUTER_RADIUS"); 75 } 76 77 float RADIUS = psMetadataLookupF32 (&status, recipe, "TEST_FIT_RADIUS"); 78 if (!status || !isfinite(RADIUS)) { 79 RADIUS = psMetadataLookupF32 (&status, recipe, "PSF_FIT_RADIUS"); 80 } 81 82 float mRADIUS = psMetadataLookupF32 (&status, recipe, "TEST_MOMENTS_RADIUS"); 83 if (!status || !isfinite(mRADIUS)) { 84 mRADIUS = psMetadataLookupF32 (&status, recipe, "PSF_MOMENTS_RADIUS"); 85 } 86 87 // define the source of interest 88 float xObj = psMetadataLookupF32 (&status, recipe, "TEST_FIT_X"); 89 float yObj = psMetadataLookupF32 (&status, recipe, "TEST_FIT_Y"); 86 if (fitMode == PM_SOURCE_FIT_PSF_X_EXT) { 87 // we need to load BOTH a psf and an ext model 88 psf = psphotLoadPSF (config, view, recipe); 89 if (!psf) psAbort("PSF_INPUT_FILE not supplied"); 90 91 // find the model: supplied by user or first in the PSF_MODEL list 92 char *modelName = psMetadataLookupStr (&status, recipe, "TEST_FIT_MODEL"); 93 if (!status || !strcasecmp (modelName, "DEFAULT")) { 94 // get the list pointers for the PSF_MODEL entries 95 96 psList *list = NULL; 97 psMetadataItem *mdi = psMetadataLookup (recipe, "PSF_MODEL"); 98 if (mdi == NULL) psAbort("missing PSF_MODEL selection"); 99 if (mdi->type == PS_DATA_STRING) { 100 list = psListAlloc(NULL); 101 psListAdd (list, PS_LIST_HEAD, mdi); 102 } else { 103 if (mdi->type != PS_DATA_METADATA_MULTI) psAbort("missing PSF_MODEL selection"); 104 list = psMemIncrRefCounter(mdi->data.list); 105 } 106 107 // take the first list element 108 psMetadataItem *item = psListGet (list, PS_LIST_HEAD); 109 modelName = item->data.V; 110 } 111 modelType = pmModelSetType (modelName); 112 if (modelType < 0) psAbort("unknown model %s", modelName); 113 } 90 114 91 115 // construct the source structures … … 100 124 // get the source moments 101 125 status = pmSourceMoments (source, mRADIUS); 102 if (!status) psAbort("p mSourceLocalSkyerror");126 if (!status) psAbort("psSourceMoments error"); 103 127 source->peak->value = source->moments->Peak; 104 128 … … 116 140 // get the initial model parameter guess 117 141 pmModel *model = pmSourceModelGuess (source, modelType); 118 // if any parameters are defined, use those values 142 143 // if any parameters are defined by the user, take those values 119 144 int nParams = pmModelParameterCount (modelType); 120 145 psF32 *params = model->params->data.F32; 146 params[PM_PAR_XPOS] = xObj; // XXX use the user-supplied value, 147 params[PM_PAR_YPOS] = yObj; // XXX or use the centroid 121 148 for (int i = 0; i < nParams; i++) { 122 if (i == 2) { 123 params[i] = xObj; 124 continue; 125 } 126 if (i == 3) { 127 params[i] = yObj; 128 continue; 129 } 149 if (i == PM_PAR_XPOS) continue; 150 if (i == PM_PAR_YPOS) continue; 151 130 152 sprintf (name, "TEST_FIT_PAR%d", i); 131 153 value = psMetadataLookupF32 (&status, recipe, name); … … 138 160 fprintf (stderr, "peak: %f @ (%f, %f)\n", source->moments->Sum*area, (double)source->peak->x, (double)source->peak->y); 139 161 162 // for PSF fitting, set the shape parameters based on the PSF & source position 140 163 if (fitMode == PM_SOURCE_FIT_PSF) { 141 164 pmModel *modelPSF = pmModelFromPSF (model, psf); … … 154 177 fprintf (stderr, "guess: %f @ (%f, %f)\n", axes.theta*180/M_PI, axes.major, axes.minor); 155 178 156 157 179 fprintf (stderr, "input parameters: \n"); 158 180 for (int i = 0; i < nParams; i++) { … … 162 184 // define the pixels used for the fit 163 185 psImageKeepCircle (source->maskObj, xObj, yObj, RADIUS, "OR", mark); 186 psphotSaveImage (NULL, source->maskObj, "mask1.fits"); 164 187 165 188 char *fitset = psMetadataLookupStr (&status, recipe, "TEST_FIT_SET"); … … 169 192 } 170 193 171 status = pmSourceFitModel (source, model, fitMode, maskVal); 194 if (fitMode == PM_SOURCE_FIT_PSF_X_EXT) { 195 // build the psf for the object 196 source->modelPSF = pmModelFromPSF (model, psf); 197 source->modelEXT = model; 198 status = psphotPSFConvModel (source, recipe, maskVal); 199 model = source->modelConv; 200 params = model->params->data.F32; 201 } else { 202 status = pmSourceFitModel (source, model, fitMode, maskVal); 203 } 172 204 173 205 // measure the source mags
Note:
See TracChangeset
for help on using the changeset viewer.
