Changeset 23672
- Timestamp:
- Apr 1, 2009, 5:17:21 PM (17 years ago)
- Location:
- branches/pap/ppSub/src
- Files:
-
- 1 added
- 9 edited
-
Makefile.am (modified) (1 diff)
-
ppSub.h (modified) (7 diffs)
-
ppSubCamera.c (modified) (1 diff)
-
ppSubData.c (added)
-
ppSubLoop.c (modified) (15 diffs)
-
ppSubMakePSF.c (modified) (2 diffs)
-
ppSubMatchPSFs.c (modified) (3 diffs)
-
ppSubReadout.c (modified) (4 diffs)
-
ppSubReadoutPhotometry.c (modified) (4 diffs)
-
ppSubReadoutUpdate.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/pap/ppSub/src/Makefile.am
r23229 r23672 19 19 ppSubBackground.c \ 20 20 ppSubCamera.c \ 21 ppSubData.c \ 21 22 ppSubLoop.c \ 22 23 ppSubReadout.c \ -
branches/pap/ppSub/src/ppSub.h
r23599 r23672 22 22 #define PPSUB_RECIPE "PPSUB" /// Name of the recipe to use 23 23 24 // Output files, for activation/deactivation 25 typedef enum { 26 PPSUB_FILES_IMAGE = 0x01, // Image files 27 PPSUB_FILES_PHOT = 0x02, // Photometry files 28 PPSUB_FILES_ALL = 0xFF, // All files 29 } ppSubFiles; 30 31 /// Data for processing 32 typedef struct { 33 psErrorCode quality; /// Quality code; 0 for no problem 34 psMetadata *stats; /// Statistics 35 } ppSubData; 36 37 /// Constructor 38 ppSubData *ppSubDataAlloc(void); 39 24 40 /// Setup the arguments parsing 25 41 bool ppSubArgumentsSetup(int argc, char *argv[], ///< Command-line arguments … … 41 57 /// Perform PSF-matched image subtraction on the readout 42 58 bool ppSubReadout(pmConfig *config, ///< Configuration 43 p sMetadata *stats, ///< Statistics, for output59 ppSubData *data, ///< Processing data 44 60 const pmFPAview *view ///< View of readout to subtract 45 61 ); … … 53 69 /// looking up the parameters in the recipe and supplying them to the function pmSubtractionMatch() 54 70 bool ppSubMatchPSFs(pmConfig *config, ///< Configuration 71 ppSubData *data, ///< Processing data 55 72 const pmFPAview *view ///< View of active readout 56 73 ); … … 63 80 /// Photometry stage 1: measure the PSF from the minuend image 64 81 bool ppSubMakePSF(pmConfig *config, ///< Configuration 65 p sMetadata *stats, ///< Statistics, for output82 ppSubData *data, ///< Processing data 66 83 const pmFPAview *view ///< View of active readout 67 84 ); … … 75 92 /// Photometry stage 2: find and measure sources on the subtracted image 76 93 bool ppSubReadoutPhotometry(pmConfig *config, ///< Configuration 77 p sMetadata *stats, ///< Statistics, for output94 ppSubData *data, ///< Processing data 78 95 const pmFPAview *view ///< View of active readout 79 96 ); … … 81 98 /// Renormalize, update headers and generate JPEGs 82 99 bool ppSubReadoutUpdate(pmConfig *config, ///< Configuration 83 p sMetadata *stats, ///< Statistics for output, or NULL100 ppSubData *data, ///< Processing data 84 101 const pmFPAview *view ///< View of active readout 85 102 ); … … 97 114 void ppSubVersionPrint(void); 98 115 116 /// Mark the data quality as bad and prepare to suspend processing 117 void ppSubDataQuality(pmConfig *config, ///< Configuration 118 ppSubData *data, ///< Processing data 119 psErrorCode error,///< Error code 120 ppSubFiles files ///< Files to deactivate 121 ); 99 122 100 123 // Copy every instance of a single keyword from one metadata to another -
branches/pap/ppSub/src/ppSubCamera.c
r23449 r23672 285 285 return true; 286 286 } 287 288 -
branches/pap/ppSub/src/ppSubLoop.c
r23315 r23672 28 28 pmConfigRecipesCull(config, "PPSUB,PPSTATS,PSPHOT,MASKS,JPEG"); 29 29 30 ppSubData *data = ppSubDataAlloc(); // Processing data 31 30 32 bool mdok; // Status of MD lookup 31 33 const char *statsName = psMetadataLookupStr(&mdok, config->arguments, "STATS"); // Filename for statistics 32 psMetadata *stats = NULL; // Container for statistics33 34 FILE *statsFile = NULL; // File stream for statistics 34 35 if (statsName && strlen(statsName) > 0) { … … 38 39 psError(PS_ERR_IO, true, "Unable to open statistics file %s for writing.\n", resolved); 39 40 psFree(resolved); 40 return false; 41 } else { 42 stats = psMetadataAlloc(); 41 goto ERROR; 43 42 } 44 43 psFree(resolved); … … 48 47 if (!input) { 49 48 psError(PS_ERR_UNEXPECTED_NULL, false, "Can't find input data!\n"); 50 return false;49 goto ERROR; 51 50 } 52 51 … … 54 53 if (!reference) { 55 54 psError(PS_ERR_UNEXPECTED_NULL, false, "Can't find reference data!\n"); 56 return false;55 goto ERROR; 57 56 } 58 57 … … 60 59 if (!output) { 61 60 psError(PS_ERR_UNEXPECTED_NULL, false, "Can't find output data!\n"); 62 return false;61 goto ERROR; 63 62 } 64 63 … … 67 66 // Iterate over the FPA hierarchy 68 67 if (!pmFPAfileIOChecks(config, view, PM_FPA_BEFORE)) { 69 return false;68 goto ERROR; 70 69 } 71 70 … … 77 76 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "FPA format discrepency between input and reference"); 78 77 psFree(view); 79 return false;78 goto ERROR; 80 79 } 81 80 … … 85 84 86 85 if (!pmFPAfileIOChecks(config, view, PM_FPA_BEFORE)) { 87 return false;86 goto ERROR; 88 87 } 89 88 … … 96 95 "FPA format discrepency between input and reference"); 97 96 psFree(view); 98 return false;97 goto ERROR; 99 98 } 100 99 if (!inCell->file_exists) { … … 102 101 } 103 102 if (!pmFPAfileIOChecks(config, view, PM_FPA_BEFORE)) { 104 return false;103 goto ERROR; 105 104 } 106 105 … … 108 107 while ((inRO = pmFPAviewNextReadout(view, input->fpa, 1))) { 109 108 if (!pmFPAfileIOChecks(config, view, PM_FPA_BEFORE)) { 110 return false;109 goto ERROR; 111 110 } 112 111 pmReadout *refRO = pmFPAviewThisReadout(view, reference->fpa);// Reference readout of interest … … 116 115 "FPA format discrepency between input and reference"); 117 116 psFree(view); 118 return false;117 goto ERROR; 119 118 } 120 119 if (!inRO->data_exists) { … … 123 122 124 123 // Perform the analysis 125 if (!ppSubReadout(config, stats, view)) {124 if (!ppSubReadout(config, data, view)) { 126 125 psError(PS_ERR_UNKNOWN, false, "Unable to subtract images.\n"); 127 return false;126 goto ERROR; 128 127 } 129 128 130 129 if (!pmFPAfileIOChecks(config, view, PM_FPA_BEFORE)) { 131 return false;130 goto ERROR; 132 131 } 133 132 } 134 133 135 134 // Perform statistics on the cell 136 if (stats ) {135 if (statsFile) { 137 136 pmFPAfile *output = psMetadataLookupPtr(NULL, config->files, "PPSUB.OUTPUT"); // Output file 138 137 if (!output) { 139 138 psError(PS_ERR_UNEXPECTED_NULL, true, "Unable to find file PPSUB.OUTPUT.\n"); 140 return false;139 goto ERROR; 141 140 } 142 141 psImageMaskType maskValue = pmConfigMaskGet("MASK.VALUE", config); 143 ppStatsFPA( stats, output->fpa, view, maskValue, config);142 ppStatsFPA(data->stats, output->fpa, view, maskValue, config); 144 143 } 145 144 146 145 if (!pmFPAfileIOChecks(config, view, PM_FPA_AFTER)) { 147 return false;146 goto ERROR; 148 147 } 149 148 } 150 149 151 150 if (!pmFPAfileIOChecks(config, view, PM_FPA_AFTER)) { 152 return false;151 goto ERROR; 153 152 } 154 153 } 155 154 156 155 if (!pmFPAfileIOChecks(config, view, PM_FPA_AFTER)) { 157 return false;156 goto ERROR; 158 157 } 159 158 … … 161 160 162 161 // Write out summary statistics 163 if (stats ) {164 psMetadataAddF32( stats, PS_LIST_TAIL, "TIME_SUB", 0, "Time for subtraction completion",162 if (statsFile) { 163 psMetadataAddF32(data->stats, PS_LIST_TAIL, "TIME_SUB", 0, "Time for subtraction completion", 165 164 psTimerMark("ppSub")); 166 165 167 const char *statsMDC = psMetadataConfigFormat( stats);166 const char *statsMDC = psMetadataConfigFormat(data->stats); 168 167 if (!statsMDC || strlen(statsMDC) == 0) { 169 168 psWarning("Unable to generate statistics MDC file.\n"); … … 173 172 psFree((void *)statsMDC); 174 173 fclose(statsFile); 175 176 psFree(stats);177 174 } 178 175 179 176 psString dump_file = psMetadataLookupStr(&mdok, config->arguments, "-dumpconfig"); 180 177 if (dump_file) { 181 182 178 pmFPAfile *input = psMetadataLookupPtr(NULL, config->files, "PPSUB.INPUT"); // Input file 183 179 pmConfigDump(config, input->fpa, dump_file); 184 180 } 185 181 182 psFree(data); 186 183 return true; 184 185 ERROR: 186 psFree(data); 187 return false; 187 188 } -
branches/pap/ppSub/src/ppSubMakePSF.c
r23599 r23672 22 22 #include "ppSub.h" 23 23 24 bool ppSubMakePSF(pmConfig *config, p sMetadata *stats, const pmFPAview *view)24 bool ppSubMakePSF(pmConfig *config, ppSubData *data, const pmFPAview *view) 25 25 { 26 26 psAssert(config, "Require configuration"); … … 87 87 psErrorStackPrint(stderr, "Unable to determine PSF"); 88 88 psWarning("Unable to determine PSF --- suspect bad data quality."); 89 if (stats && psMetadataLookupS32(NULL, stats, "QUALITY") == 0) { 90 psMetadataAddS32(stats, PS_LIST_TAIL, "QUALITY", PS_META_REPLACE, 91 "Unable to determine PSF", psErrorCodeLast()); 92 } 93 psErrorClear(); 94 psphotFilesActivate(config, false); 89 ppSubDataQuality(config, data, psErrorCodeLast(), PPSUB_FILES_PHOT); 90 return true; 95 91 } 96 92 -
branches/pap/ppSub/src/ppSubMatchPSFs.c
r23505 r23672 22 22 #include "ppSub.h" 23 23 24 bool ppSubMatchPSFs(pmConfig *config, const pmFPAview *view)24 bool ppSubMatchPSFs(pmConfig *config, ppSubData *data, const pmFPAview *view) 25 25 { 26 26 psAssert(config, "Require configuration"); … … 136 136 137 137 // Match the PSFs 138 bool success = false; // Operation was successful? 138 139 if (kernelRO) { 139 if (!pmSubtractionMatchPrecalc(inConv, refConv, inRO, refRO, kernelRO->analysis, 140 stride, sys, maskVal, maskBad, maskPoor, poorFrac, badFrac)) { 141 psError(PS_ERR_UNKNOWN, false, "Unable to convolve images."); 142 return false; 143 } 140 success = pmSubtractionMatchPrecalc(inConv, refConv, inRO, refRO, kernelRO->analysis, 141 stride, sys, maskVal, maskBad, maskPoor, poorFrac, badFrac); 144 142 } else { 145 if (!pmSubtractionMatch(inConv, refConv, inRO, refRO, footprint, stride, regionSize, spacing, 146 threshold, sources, stampsName, type, size, order, widths, orders, inner, 147 ringsOrder, binning, penalty, optimum, optWidths, optOrder, optThresh, iter, 148 rej, sys, maskVal, maskBad, maskPoor, poorFrac, badFrac, subMode)) { 143 success = pmSubtractionMatch(inConv, refConv, inRO, refRO, footprint, stride, regionSize, 144 spacing, threshold, sources, stampsName, type, size, order, 145 widths, orders, inner, ringsOrder, binning, penalty, optimum, 146 optWidths, optOrder, optThresh, iter, rej, sys, maskVal, 147 maskBad, maskPoor, poorFrac, badFrac, subMode); 148 } 149 150 psFree(optWidths); 151 pmSubtractionThreadsFinalize(inRO, refRO); 152 153 if (!success) { 154 psErrorCode error = psErrorCodeLast(); // Error code 155 if (error == PM_ERR_STAMPS) { 156 psErrorStackPrint(stderr, "Unable to find stamps"); 157 psWarning("Unable to find stamps --- suspect bad data quality."); 158 ppSubDataQuality(config, data, error, PPSUB_FILES_ALL); 159 return true; 160 } else { 149 161 psError(PS_ERR_UNKNOWN, false, "Unable to match images."); 150 162 return false; … … 152 164 } 153 165 154 psFree(optWidths);155 156 pmSubtractionThreadsFinalize(inRO, refRO);157 158 166 psImageCovarianceTransfer(inConv->variance, inConv->covariance); 159 167 psImageCovarianceTransfer(refConv->variance, refConv->covariance); 160 168 161 // XXX drop the pixels associated with inRO and refRO (now that we have inConv and refConf)162 #ifdef TESTING163 psphotSaveImage (NULL, inRO->image, "inRO.fits");164 psphotSaveImage (NULL, refRO->image, "refRO.fits");165 psphotSaveImage (NULL, inConv->image, "inConv.fits");166 psphotSaveImage (NULL, refConv->image, "refConv.fits");167 #endif168 169 169 return true; 170 170 } -
branches/pap/ppSub/src/ppSubReadout.c
r23599 r23672 21 21 #include "ppSub.h" 22 22 23 bool ppSubReadout(pmConfig *config, p sMetadata *stats, const pmFPAview *view)23 bool ppSubReadout(pmConfig *config, ppSubData *data, const pmFPAview *view) 24 24 { 25 25 psTimerStart("PPSUB_MATCH"); … … 30 30 } 31 31 32 if (!ppSubMatchPSFs(config, view)) {32 if (!ppSubMatchPSFs(config, data, view)) { 33 33 psError(PS_ERR_UNKNOWN, false, "Unable to match PSFs."); 34 34 return false; … … 40 40 } 41 41 42 if (! ppSubMakePSF(config, stats, view)) {42 if (!data->quality && !ppSubMakePSF(config, data, view)) { 43 43 psError(PS_ERR_UNKNOWN, false, "Unable to generate PSF."); 44 44 return false; … … 56 56 } 57 57 58 if (! ppSubReadoutPhotometry(config, stats, view)) {58 if (!data->quality && !ppSubReadoutPhotometry(config, data, view)) { 59 59 psError(PS_ERR_UNKNOWN, false, "Unable to perform photometry."); 60 60 return false; 61 61 } 62 62 63 if (!ppSubReadoutUpdate(config, stats, view)) {63 if (!ppSubReadoutUpdate(config, data, view)) { 64 64 psError(PS_ERR_UNKNOWN, false, "Unable to update."); 65 65 return false; -
branches/pap/ppSub/src/ppSubReadoutPhotometry.c
r23597 r23672 22 22 #include "ppSub.h" 23 23 24 bool ppSubReadoutPhotometry (pmConfig *config, p sMetadata *stats, const pmFPAview *view)24 bool ppSubReadoutPhotometry (pmConfig *config, ppSubData *data, const pmFPAview *view) 25 25 { 26 26 psAssert(config, "Require configuration"); … … 45 45 pmPSF *psf = psMetadataLookupPtr(NULL, psfInputChip->analysis, "PSPHOT.PSF"); // PSF for photometry 46 46 if (!psf) { 47 psErrorStackPrint(stderr, "No PSF available"); 47 48 psWarning("No PSF available --- suspect bad data quality."); 48 if (stats && psMetadataLookupBool(NULL, stats, "QUALITY")) { 49 psError(PS_ERR_UNEXPECTED_NULL, false, "Bad or unset QUALITY flag"); 50 return false; 51 } 52 psErrorClear(); 53 psphotFilesActivate(config, false); 49 ppSubDataQuality(config, data, psErrorCodeLast(), PPSUB_FILES_PHOT); 50 return true; 54 51 } 55 52 psMetadataAddPtr(psfLoadChip->analysis, PS_LIST_TAIL, "PSPHOT.PSF", PS_DATA_UNKNOWN | PS_META_REPLACE, … … 85 82 } 86 83 87 #if 088 psMetadataAddPtr(config->files, PS_LIST_TAIL, "PSPHOT.INPUT", PS_DATA_UNKNOWN | PS_META_REPLACE,89 "psphot input: view on another pmFPAfile", photFile);90 #endif91 92 84 if (!psphotReadoutMinimal(config, view)) { 93 85 // This is likely a data quality issue … … 95 87 psErrorStackPrint(stderr, "Unable to perform photometry on image"); 96 88 psWarning("Unable to perform photometry on image --- suspect bad data quality."); 97 if (stats && psMetadataLookupS32(NULL, stats, "QUALITY") == 0) { 98 psMetadataAddS32(stats, PS_LIST_TAIL, "QUALITY", PS_META_REPLACE, 99 "Unable to perform photometry on image", psErrorCodeLast()); 100 } 101 psErrorClear(); 102 psphotFilesActivate(config, false); 89 ppSubDataQuality(config, data, psErrorCodeLast(), PPSUB_FILES_PHOT); 103 90 } 104 #if 1 91 105 92 photRO->data_exists = true; 106 93 photRO->parent->data_exists = true; 107 94 photRO->parent->parent->data_exists = true; 108 #endif109 95 110 if ( stats) {96 if (data->stats) { 111 97 psArray *sources = psMetadataLookupPtr(NULL, photRO->analysis, "PSPHOT.SOURCES"); // Sources 112 psMetadataAddS32( stats, PS_LIST_TAIL, "NUM_SOURCES", 0, "Number of sources detected",98 psMetadataAddS32(data->stats, PS_LIST_TAIL, "NUM_SOURCES", 0, "Number of sources detected", 113 99 sources ? sources->n : 0); 114 psMetadataAddF32( stats, PS_LIST_TAIL, "TIME_PHOT", 0, "Time to do photometry",100 psMetadataAddF32(data->stats, PS_LIST_TAIL, "TIME_PHOT", 0, "Time to do photometry", 115 101 psTimerClear("PPSUB_PHOT")); 116 102 } -
branches/pap/ppSub/src/ppSubReadoutUpdate.c
r23173 r23672 21 21 #include "ppSub.h" 22 22 23 bool ppSubReadoutUpdate(pmConfig *config, p sMetadata *stats, const pmFPAview *view)23 bool ppSubReadoutUpdate(pmConfig *config, ppSubData *data, const pmFPAview *view) 24 24 { 25 25 psAssert(config, "Require configuration"); … … 47 47 48 48 // Statistics on the matching 49 if ( stats) {50 psMetadataCopySingle( stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_MODE);51 psMetadataCopySingle( stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_STAMPS);52 psMetadataCopySingle( stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_DEV_MEAN);53 psMetadataCopySingle( stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_DEV_RMS);54 psMetadataCopySingle( stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_NORM);55 psMetadataCopySingle( stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_BGDIFF);56 psMetadataCopySingle( stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_MX);57 psMetadataCopySingle( stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_MY);58 psMetadataCopySingle( stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_MXX);59 psMetadataCopySingle( stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_MXY);60 psMetadataCopySingle( stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_MYY);49 if (data->stats) { 50 psMetadataCopySingle(data->stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_MODE); 51 psMetadataCopySingle(data->stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_STAMPS); 52 psMetadataCopySingle(data->stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_DEV_MEAN); 53 psMetadataCopySingle(data->stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_DEV_RMS); 54 psMetadataCopySingle(data->stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_NORM); 55 psMetadataCopySingle(data->stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_BGDIFF); 56 psMetadataCopySingle(data->stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_MX); 57 psMetadataCopySingle(data->stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_MY); 58 psMetadataCopySingle(data->stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_MXX); 59 psMetadataCopySingle(data->stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_MXY); 60 psMetadataCopySingle(data->stats, outRO->analysis, PM_SUBTRACTION_ANALYSIS_MYY); 61 61 62 psMetadataAddF32( stats, PS_LIST_TAIL, "TIME_MATCH", 0, "Time to match PSFs",62 psMetadataAddF32(data->stats, PS_LIST_TAIL, "TIME_MATCH", 0, "Time to match PSFs", 63 63 psTimerClear("PPSUB_MATCH")); 64 64 }
Note:
See TracChangeset
for help on using the changeset viewer.
