Changeset 27838 for branches/tap_branches/psphot/src/psphotReadout.c
- Timestamp:
- May 3, 2010, 8:41:49 AM (16 years ago)
- Location:
- branches/tap_branches
- Files:
-
- 4 edited
-
. (modified) (1 prop)
-
psphot (modified) (1 prop)
-
psphot/src (modified) (1 prop)
-
psphot/src/psphotReadout.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/tap_branches
- Property svn:mergeinfo changed
-
branches/tap_branches/psphot
-
Property svn:mergeinfo
set to (toggle deleted branches)
/trunk/psphot merged eligible /branches/eam_branches/stackphot.20100406/psphot 27622-27655 /branches/pap_delete/psphot 27530-27595
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
branches/tap_branches/psphot/src
- Property svn:ignore
-
old new 19 19 psphotMomentsStudy 20 20 psphotPetrosianStudy 21 psphotForced 22 psphotMakePSF 23 psphotStack
-
- Property svn:ignore
-
branches/tap_branches/psphot/src/psphotReadout.c
r25755 r27838 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 if (!psphotSetMaskAndVariance (config, view)) { 37 return psphotReadoutCleanup(config, view); 38 } 45 39 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); 40 return psphotReadoutCleanup(config, view); 41 } 51 42 52 43 // 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);44 if (!psphotModelBackground (config, view)) { 45 return psphotReadoutCleanup (config, view); 46 } 47 if (!psphotSubtractBackground (config, view)) { 48 return psphotReadoutCleanup (config, view); 58 49 } 59 50 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); 51 return psphotReadoutCleanup (config, view); 52 } 53 54 // load the psf model, if suppled. FWHM_X,FWHM_Y,etc are determined and saved on 55 // readout->analysis XXX this function currently only works with a single PSPHOT.INPUT 56 if (!psphotLoadPSF (config, view)) { 57 psError (PSPHOT_ERR_UNKNOWN, false, "error loading psf model"); 58 return psphotReadoutCleanup (config, view); 59 } 74 60 75 61 // 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; 62 if (!psphotFindDetections (config, view, true)) { // pass 1 63 // this only happens if we had an error in psphotFindDetections 64 psError (PSPHOT_ERR_UNKNOWN, false, "failure in peak analysis"); 65 return psphotReadoutCleanup (config, view); 66 } 67 68 // construct sources and measure basic stats (saved on detections->newSources) 69 if (!psphotSourceStats (config, view, true)) { // pass 1 70 psError(PSPHOT_ERR_UNKNOWN, false, "failure to generate sources"); 71 return psphotReadoutCleanup (config, view); 72 } 85 73 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); 74 return psphotReadoutCleanup(config, view); 75 } 76 77 // find blended neighbors of very saturated stars (detections->newSources) 78 if (!psphotDeblendSatstars (config, view)) { 79 psError (PSPHOT_ERR_UNKNOWN, false, "failed on satstar deblend analysis"); 80 return psphotReadoutCleanup (config, view); 81 } 82 83 // mark blended peaks PS_SOURCE_BLEND (detections->newSources) 84 if (!psphotBasicDeblend (config, view)) { 85 psError (PSPHOT_ERR_UNKNOWN, false, "failed on deblend analysis"); 86 return psphotReadoutCleanup (config, view); 87 } 88 89 // classify sources based on moments, brightness. if a PSF model has been loaded, the PSF 90 // clump defined for it is used not measured (detections->newSources) 91 if (!psphotRoughClass (config, view)) { // pass 1 92 psError (PSPHOT_ERR_UNKNOWN, false, "failed to determine rough classifications"); 93 return psphotReadoutCleanup (config, view); 94 } 95 // if we were not supplied a PSF model, determine the IQ stats here (detections->newSources) 96 if (!psphotImageQuality (config, view)) { // pass 1 97 psError (PSPHOT_ERR_UNKNOWN, false, "failed to measure image quality"); 98 return psphotReadoutCleanup(config, view); 103 99 } 104 100 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; 101 return psphotReadoutCleanup(config, view); 102 } 103 104 // use bright stellar objects to measure PSF if we were supplied a PSF for any input file, 105 // this step is skipped 106 if (!psphotChoosePSF (config, view)) { // pass 1 107 psLogMsg ("psphot", 3, "failure to construct a psf model"); 108 return psphotReadoutCleanup (config, view); 124 109 } 125 110 if (!strcasecmp (breakPt, "PSFMODEL")) { 126 return psphotReadoutCleanup (config, readout, recipe, detections, psf, sources); 127 } 128 psphotVisualShowPSFModel (readout, psf); 111 return psphotReadoutCleanup (config, view); 112 } 129 113 130 114 // 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); 115 // XXX fix this in the new multi-input context 116 // psphotLoadExtSources (config, view); // pass 1 117 118 // construct an initial model for each object, set the radius to fitRadius, set circular 119 // fit mask (detections->newSources) 120 psphotGuessModels (config, view); // pass 1 121 122 // merge the newly selected sources into the existing list 123 // NOTE: merge OLD and NEW 124 psphotMergeSources (config, view); 135 125 136 126 // 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); 127 psphotFitSourcesLinear (config, view, false); // pass 1 (detections->allSources) 128 129 // identify CRs and extended sources (only unmeasured sources are measured) 130 psphotSourceSize (config, view, true); // pass 1 (detections->allSources) 145 131 if (!strcasecmp (breakPt, "ENSEMBLE")) { 146 132 goto finish; 147 133 } 148 psphotVisualShowSatStars (recipe, psf, sources);149 134 150 135 // non-linear PSF and EXT fit to brighter sources 151 136 // replace model flux, adjust mask as needed, fit, subtract the models (full stamp) 152 psphotBlendFit (config, readout, sources, psf);137 psphotBlendFit (config, view); // pass 1 (detections->allSources) 153 138 154 139 // replace all sources 155 psphotReplaceAllSources ( sources, recipe);140 psphotReplaceAllSources (config, view); // pass 1 (detections->allSources) 156 141 157 142 // linear fit to include all sources (subtract again) 158 psphotFitSourcesLinear (readout, sources, recipe, psf, TRUE); 143 // NOTE : apply to ALL sources (extended + psf) 144 psphotFitSourcesLinear (config, view, true); // pass 2 (detections->allSources) 159 145 160 146 // 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 147 if (!strcasecmp (breakPt, "PASS1")) goto pass1finish; 148 149 // NOTE: possibly re-measure background model here with objects subtracted / or masked 165 150 166 151 // add noise for subtracted objects 167 psphotAddNoise (readout, sources, recipe); 168 169 // find fainter sources (pass 2) 170 detections = psphotFindDetections (detections, readout, recipe); 152 psphotAddNoise (config, view); // pass 1 (detections->allSources) 153 154 // find fainter sources 155 // NOTE: finds new peaks and new footprints, OLD and FULL set are saved on detections 156 psphotFindDetections (config, view, false); // pass 2 (detections->peaks, detections->footprints) 171 157 172 158 // remove noise for subtracted objects (ie, return to normal noise level) 173 psphotSubNoise (readout, sources, recipe); 159 // NOTE: this needs to operate only on the OLD sources 160 psphotSubNoise (config, view); // pass 1 (detections->allSources) 174 161 175 162 // define new sources based on only the new peaks 176 psArray *newSources = psphotSourceStats (config, readout, detections, false); 163 // NOTE: new sources are saved on detections->newSources 164 psphotSourceStats (config, view, false); // pass 2 (detections->newSources) 177 165 178 166 // set source type 179 if (!psphotRoughClass (readout, newSources, recipe, havePSF)) { 167 // NOTE: apply only to detections->newSources 168 if (!psphotRoughClass (config, view)) { // pass 2 (detections->newSources) 180 169 psLogMsg ("psphot", 3, "failed to find a valid PSF clump for image"); 181 return psphotReadoutCleanup (config, readout, recipe, detections, psf, sources);170 return psphotReadoutCleanup (config, view); 182 171 } 183 172 184 173 // create full input models, set the radius to fitRadius, set circular fit mask 185 psphotGuessModels (config, readout, newSources, psf); 174 // NOTE: apply only to detections->newSources 175 psphotGuessModels (config, view); // pass 2 (detections->newSources) 186 176 187 177 // replace all sources so fit below applies to all at once 188 psphotReplaceAllSources (sources, recipe); 178 // NOTE: apply only to OLD sources (which have been subtracted) 179 psphotReplaceAllSources (config, view); // pass 2 189 180 190 181 // 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); 182 // NOTE: merge OLD and NEW 183 // XXX check on free of sources... 184 psphotMergeSources (config, view); // (detections->newSources + detections->allSources -> detections->allSources) 185 186 // NOTE: apply to ALL sources 187 psphotFitSourcesLinear (config, view, true); // pass 3 (detections->allSources) 196 188 197 189 pass1finish: 198 190 199 191 // 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);192 // NOTE: applies only to NEW (unmeasured) sources 193 psphotSourceSize (config, view, false); // pass 2 (detections->allSources) 194 195 psphotExtendedSourceAnalysis (config, view); // pass 1 (detections->allSources) 196 psphotExtendedSourceFits (config, view); // pass 1 (detections->allSources) 205 197 206 198 finish: … … 210 202 211 203 // measure aperture photometry corrections 212 if (!psphotApResid (config, readout, sources, psf)) {204 if (!psphotApResid (config, view)) { // pass 1 (detections->allSources) 213 205 psLogMsg ("psphot", 3, "failed on psphotApResid"); 214 return psphotReadoutCleanup (config, readout, recipe, detections, psf, sources);206 return psphotReadoutCleanup (config, view); 215 207 } 216 208 217 209 // calculate source magnitudes 218 psphotMagnitudes(config, readout, view, sources, psf);219 220 if (!psphotEfficiency(config, readout, view, psf, recipe, sources)) {210 psphotMagnitudes(config, view); // pass 1 (detections->allSources) 211 212 if (!psphotEfficiency(config, view)) { // pass 1 221 213 psErrorStackPrint(stderr, "Unable to determine detection efficiencies from fake sources"); 222 214 psErrorClear(); … … 227 219 228 220 // replace background in residual image 229 psphotSkyReplace (config, view); 221 psphotSkyReplace (config, view); // pass 1 230 222 231 223 // drop the references to the image pixels held by each source 232 psphotSourceFreePixels ( sources);224 psphotSourceFreePixels (config, view); // pass 1 233 225 234 226 // create the exported-metadata and free local data 235 return psphotReadoutCleanup(config, readout, recipe, detections, psf, sources);227 return psphotReadoutCleanup(config, view); 236 228 } 237
Note:
See TracChangeset
for help on using the changeset viewer.
