Changeset 26894 for trunk/psphot/src/psphotReadout.c
- Timestamp:
- Feb 10, 2010, 7:36:29 PM (16 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/psphotReadout.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/psphotReadout.c
r25755 r26894 3 3 // this should be called by every program that links against libpsphot 4 4 bool psphotInit (void) { 5 6 5 psphotErrorRegister(); // register our error codes/messages 7 6 psphotModelClassInit (); // load implementation-specific models … … 12 11 bool psphotReadout(pmConfig *config, const pmFPAview *view) { 13 12 14 // measure the total elapsed time in psphotReadout. XXX the current threading plan 15 // for psphot envisions threading within psphotReadout, not multiple threads calling 16 // the same psphotReadout. In the current plan, this dtime is the elapsed time used 17 // jointly by the multiple threads, not the total time used by all threads. 13 // measure the total elapsed time in psphotReadout. dtime is the elapsed time used jointly 14 // by the multiple threads, not the total time used by all threads. 18 15 psTimerStart ("psphotReadout"); 19 16 … … 26 23 return false; 27 24 } 25 // optional break-point for processing 26 char *breakPt = psMetadataLookupStr (NULL, recipe, "BREAK_POINT"); 27 psAssert (breakPt, "configuration error: set BREAK_POINT"); 28 28 29 29 // set the photcode for this image 30 if (!psphotAddPhotcode ( recipe, config, view, "PSPHOT.INPUT")) {30 if (!psphotAddPhotcode (config, view)) { 31 31 psError (PSPHOT_ERR_CONFIG, false, "trouble defining the photcode"); 32 32 return false; 33 33 } 34 34 35 // find the currently selected readout36 pmReadout *readout = pmFPAfileThisReadout (config->files, view, "PSPHOT.INPUT");37 PS_ASSERT_PTR_NON_NULL (readout, false);38 39 // optional break-point for processing40 char *breakPt = psMetadataLookupStr (NULL, recipe, "BREAK_POINT");41 PS_ASSERT_PTR_NON_NULL (breakPt, false);42 43 35 // Generate the mask and weight images, including the user-defined analysis region of interest 44 psphotSetMaskAndVariance (config, readout, recipe);36 psphotSetMaskAndVariance (config, view); 45 37 if (!strcasecmp (breakPt, "NOTHING")) { 46 return psphotReadoutCleanup(config, readout, recipe, NULL, NULL, NULL); 47 } 48 49 // display the image, weight, mask (ch 1,2,3) 50 psphotVisualShowImage (readout); 38 return psphotReadoutCleanup(config, view); 39 } 51 40 52 41 // generate a background model (median, smoothed image) 53 if (!psphotModelBackground (config, view , "PSPHOT.INPUT")) {54 return psphotReadoutCleanup (config, readout, recipe, NULL, NULL, NULL);55 } 56 if (!psphotSubtractBackground (config, view , "PSPHOT.INPUT")) {57 return psphotReadoutCleanup (config, readout, recipe, NULL, NULL, NULL);42 if (!psphotModelBackground (config, view)) { 43 return psphotReadoutCleanup (config, view); 44 } 45 if (!psphotSubtractBackground (config, view)) { 46 return psphotReadoutCleanup (config, view); 58 47 } 59 48 if (!strcasecmp (breakPt, "BACKMDL")) { 60 return psphotReadoutCleanup (config, readout, recipe, NULL, NULL, NULL); 61 } 62 63 // display the backsub and backgnd images 64 psphotVisualShowBackground (config, view, readout); 65 66 // run a single-model test if desired (exits from here if test is run) 67 psphotModelTest (config, view, recipe); 68 69 // load the psf model, if suppled. FWHM_X,FWHM_Y,etc are saved in the recipe 70 pmPSF *psf = psphotLoadPSF (config, view, recipe); 71 72 // several functions below behave differently if we have a PSF model already 73 bool havePSF = (psf != NULL); 49 return psphotReadoutCleanup (config, view); 50 } 51 52 // load the psf model, if suppled. FWHM_X,FWHM_Y,etc are determined and saved on 53 // readout->analysis XXX this function currently only works with a single PSPHOT.INPUT 54 if (!psphotLoadPSF (config, view)) { 55 psError (PSPHOT_ERR_UNKNOWN, false, "error loading psf model"); 56 return psphotReadoutCleanup (config, view); 57 } 74 58 75 59 // find the detections (by peak and/or footprint) in the image. 76 pmDetections *detections = psphotFindDetections (NULL, readout, recipe); 77 if (!detections) { 78 psLogMsg ("psphot", 3, "unable to find detections in this image"); 79 return psphotReadoutCleanup (config, readout, recipe, detections, psf, NULL); 80 } 81 82 // construct sources and measure basic stats 83 psArray *sources = psphotSourceStats (config, readout, detections, true); 84 if (!sources) return false; 60 if (!psphotFindDetections (config, view, true)) { // pass 1 61 // this only happens if we had an error in psphotFindDetections 62 psError (PSPHOT_ERR_UNKNOWN, false, "failure in peak analysis"); 63 return psphotReadoutCleanup (config, view); 64 } 65 66 // construct sources and measure basic stats (saved on detections->newSources) 67 if (!psphotSourceStats (config, view, true)) { // pass 1 68 psError(PSPHOT_ERR_UNKNOWN, false, "failure to generate sources"); 69 return psphotReadoutCleanup (config, view); 70 } 85 71 if (!strcasecmp (breakPt, "PEAKS")) { 86 return psphotReadoutCleanup(config, readout, recipe, detections, psf, sources); 87 } 88 89 // find blended neighbors of very saturated stars 90 // XXX merge this with Basic Deblend? 91 psphotDeblendSatstars (readout, sources, recipe); 92 93 // mark blended peaks PS_SOURCE_BLEND 94 if (!psphotBasicDeblend (sources, recipe)) { 95 psLogMsg ("psphot", 3, "failed on deblend analysis"); 96 return psphotReadoutCleanup (config, readout, recipe, detections, psf, sources); 97 } 98 99 // classify sources based on moments, brightness 100 if (!psphotRoughClass (readout, sources, recipe, havePSF)) { 101 psLogMsg ("psphot", 3, "failed to find a valid PSF clump for image"); 102 return psphotReadoutCleanup (config, readout, recipe, detections, psf, sources); 72 return psphotReadoutCleanup(config, view); 73 } 74 75 // find blended neighbors of very saturated stars (detections->newSources) 76 if (!psphotDeblendSatstars (config, view)) { 77 psError (PSPHOT_ERR_UNKNOWN, false, "failed on satstar deblend analysis"); 78 return psphotReadoutCleanup (config, view); 79 } 80 81 // mark blended peaks PS_SOURCE_BLEND (detections->newSources) 82 if (!psphotBasicDeblend (config, view)) { 83 psError (PSPHOT_ERR_UNKNOWN, false, "failed on deblend analysis"); 84 return psphotReadoutCleanup (config, view); 85 } 86 87 // classify sources based on moments, brightness. if a PSF model has been loaded, the PSF 88 // clump defined for it is used not measured (detections->newSources) 89 if (!psphotRoughClass (config, view)) { // pass 1 90 psError (PSPHOT_ERR_UNKNOWN, false, "failed to determine rough classifications"); 91 return psphotReadoutCleanup (config, view); 103 92 } 104 93 if (!strcasecmp (breakPt, "MOMENTS")) { 105 return psphotReadoutCleanup(config, readout, recipe, detections, psf, sources); 106 } 107 108 if (!havePSF && !psphotImageQuality (recipe, sources)) { 109 psLogMsg("psphot", 3, "failed to measure image quality"); 110 return psphotReadoutCleanup(config, readout, recipe, detections, psf, sources); 111 } 112 113 // if we were not supplied a PSF, choose one here 114 if (psf == NULL) { 115 // use bright stellar objects to measure PSF 116 // XXX if we do not have enough stars to generate the PSF, build one 117 // from the SEEING guess and model class 118 psf = psphotChoosePSF (readout, sources, recipe); 119 if (psf == NULL) { 120 psLogMsg ("psphot", 3, "failure to construct a psf model"); 121 return psphotReadoutCleanup (config, readout, recipe, detections, psf, sources); 122 } 123 havePSF = true; 94 return psphotReadoutCleanup(config, view); 95 } 96 97 // if we were not supplied a PSF model, determine the IQ stats here (detections->newSources) 98 if (!psphotImageQuality (config, view)) { // pass 1 99 psError (PSPHOT_ERR_UNKNOWN, false, "failed to measure image quality"); 100 return psphotReadoutCleanup(config, view); 101 } 102 103 // use bright stellar objects to measure PSF if we were supplied a PSF for any input file, 104 // this step is skipped 105 if (!psphotChoosePSF (config, view)) { // pass 1 106 psLogMsg ("psphot", 3, "failure to construct a psf model"); 107 return psphotReadoutCleanup (config, view); 124 108 } 125 109 if (!strcasecmp (breakPt, "PSFMODEL")) { 126 return psphotReadoutCleanup (config, readout, recipe, detections, psf, sources); 127 } 128 psphotVisualShowPSFModel (readout, psf); 110 return psphotReadoutCleanup (config, view); 111 } 129 112 130 113 // include externally-supplied sources 131 psphotLoadExtSources (config, view, sources); 132 133 // construct an initial model for each object, set the radius to fitRadius, set circular fit mask 134 psphotGuessModels (config, readout, sources, psf); 114 // XXX fix this in the new multi-input context 115 // psphotLoadExtSources (config, view); // pass 1 116 117 // construct an initial model for each object, set the radius to fitRadius, set circular 118 // fit mask (detections->newSources) 119 psphotGuessModels (config, view); // pass 1 120 121 // merge the newly selected sources into the existing list 122 // NOTE: merge OLD and NEW 123 psphotMergeSources (config, view); 135 124 136 125 // linear PSF fit to source peaks, subtract the models from the image (in PSF mask) 137 psphotFitSourcesLinear (readout, sources, recipe, psf, FALSE); 138 139 // We have to place these visualizations here because the models are not realized until 140 // psphotGuessModels or fitted until psphotFitSourcesLinear. 141 psphotVisualShowPSFStars (recipe, psf, sources); 142 143 // identify CRs and extended sources 144 psphotSourceSize (config, readout, sources, recipe, psf, 0); 126 psphotFitSourcesLinear (config, view, false); // pass 1 (detections->allSources) 127 128 // identify CRs and extended sources (only unmeasured sources are measured) 129 psphotSourceSize (config, view, true); // pass 1 (detections->allSources) 145 130 if (!strcasecmp (breakPt, "ENSEMBLE")) { 146 131 goto finish; 147 132 } 148 psphotVisualShowSatStars (recipe, psf, sources);149 133 150 134 // non-linear PSF and EXT fit to brighter sources 151 135 // replace model flux, adjust mask as needed, fit, subtract the models (full stamp) 152 psphotBlendFit (config, readout, sources, psf);136 psphotBlendFit (config, view); // pass 1 (detections->allSources) 153 137 154 138 // replace all sources 155 psphotReplaceAllSources ( sources, recipe);139 psphotReplaceAllSources (config, view); // pass 1 (detections->allSources) 156 140 157 141 // linear fit to include all sources (subtract again) 158 psphotFitSourcesLinear (readout, sources, recipe, psf, TRUE); 142 // NOTE : apply to ALL sources (extended + psf) 143 psphotFitSourcesLinear (config, view, true); // pass 2 (detections->allSources) 159 144 160 145 // if we only do one pass, skip to extended source analysis 161 if (!strcasecmp (breakPt, "PASS1")) { 162 goto pass1finish; 163 } 164 // NOTE: possibly re-measure background model here with objects subtracted 146 if (!strcasecmp (breakPt, "PASS1")) goto pass1finish; 147 148 // NOTE: possibly re-measure background model here with objects subtracted / or masked 165 149 166 150 // add noise for subtracted objects 167 psphotAddNoise (readout, sources, recipe); 168 169 // find fainter sources (pass 2) 170 detections = psphotFindDetections (detections, readout, recipe); 151 psphotAddNoise (config, view); // pass 1 (detections->allSources) 152 153 // find fainter sources 154 // NOTE: finds new peaks and new footprints, OLD and FULL set are saved on detections 155 psphotFindDetections (config, view, false); // pass 2 (detections->peaks, detections->footprints) 171 156 172 157 // remove noise for subtracted objects (ie, return to normal noise level) 173 psphotSubNoise (readout, sources, recipe); 158 // NOTE: this needs to operate only on the OLD sources 159 psphotSubNoise (config, view); // pass 1 (detections->allSources) 174 160 175 161 // define new sources based on only the new peaks 176 psArray *newSources = psphotSourceStats (config, readout, detections, false); 162 // NOTE: new sources are saved on detections->newSources 163 psphotSourceStats (config, view, false); // pass 2 (detections->newSources) 177 164 178 165 // set source type 179 if (!psphotRoughClass (readout, newSources, recipe, havePSF)) { 166 // NOTE: apply only to detections->newSources 167 if (!psphotRoughClass (config, view)) { // pass 2 (detections->newSources) 180 168 psLogMsg ("psphot", 3, "failed to find a valid PSF clump for image"); 181 return psphotReadoutCleanup (config, readout, recipe, detections, psf, sources);169 return psphotReadoutCleanup (config, view); 182 170 } 183 171 184 172 // create full input models, set the radius to fitRadius, set circular fit mask 185 psphotGuessModels (config, readout, newSources, psf); 173 // NOTE: apply only to detections->newSources 174 psphotGuessModels (config, view); // pass 2 (detections->newSources) 186 175 187 176 // replace all sources so fit below applies to all at once 188 psphotReplaceAllSources (sources, recipe); 177 // NOTE: apply only to OLD sources (which have been subtracted) 178 psphotReplaceAllSources (config, view); // pass 2 189 179 190 180 // merge the newly selected sources into the existing list 191 psphotMergeSources (sources, newSources); 192 psFree (newSources); 193 194 // linear fit to all sources 195 psphotFitSourcesLinear (readout, sources, recipe, psf, TRUE); 181 // NOTE: merge OLD and NEW 182 // XXX check on free of sources... 183 psphotMergeSources (config, view); // (detections->newSources + detections->allSources -> detections->allSources) 184 185 // NOTE: apply to ALL sources 186 psphotFitSourcesLinear (config, view, true); // pass 3 (detections->allSources) 196 187 197 188 pass1finish: 198 189 199 190 // measure source size for the remaining sources 200 psphotSourceSize (config, readout, sources, recipe, psf, 0);201 202 psphotExtendedSourceAnalysis (readout, sources, recipe); 203 204 psphotExtendedSourceFits ( readout, sources, recipe);191 // NOTE: applies only to NEW (unmeasured) sources 192 psphotSourceSize (config, view, false); // pass 2 (detections->allSources) 193 194 psphotExtendedSourceAnalysis (config, view); // pass 1 (detections->allSources) 195 psphotExtendedSourceFits (config, view); // pass 1 (detections->allSources) 205 196 206 197 finish: … … 210 201 211 202 // measure aperture photometry corrections 212 if (!psphotApResid (config, readout, sources, psf)) {203 if (!psphotApResid (config, view)) { // pass 1 (detections->allSources) 213 204 psLogMsg ("psphot", 3, "failed on psphotApResid"); 214 return psphotReadoutCleanup (config, readout, recipe, detections, psf, sources);205 return psphotReadoutCleanup (config, view); 215 206 } 216 207 217 208 // calculate source magnitudes 218 psphotMagnitudes(config, readout, view, sources, psf);219 220 if (!psphotEfficiency(config, readout, view, psf, recipe, sources)) {209 psphotMagnitudes(config, view); // pass 1 (detections->allSources) 210 211 if (!psphotEfficiency(config, view)) { // pass 1 221 212 psErrorStackPrint(stderr, "Unable to determine detection efficiencies from fake sources"); 222 213 psErrorClear(); … … 227 218 228 219 // replace background in residual image 229 psphotSkyReplace (config, view); 220 psphotSkyReplace (config, view); // pass 1 230 221 231 222 // drop the references to the image pixels held by each source 232 psphotSourceFreePixels ( sources);223 psphotSourceFreePixels (config, view); // pass 1 233 224 234 225 // create the exported-metadata and free local data 235 return psphotReadoutCleanup(config, readout, recipe, detections, psf, sources);226 return psphotReadoutCleanup(config, view); 236 227 } 237
Note:
See TracChangeset
for help on using the changeset viewer.
