Changeset 23688 for trunk/ppSub/src
- Timestamp:
- Apr 2, 2009, 2:51:37 PM (17 years ago)
- Location:
- trunk
- Files:
-
- 11 edited
- 1 copied
-
. (modified) (1 prop)
-
ppSub (modified) (1 prop)
-
ppSub/src/Makefile.am (modified) (1 diff)
-
ppSub/src/ppSub.h (modified) (7 diffs)
-
ppSub/src/ppSubCamera.c (modified) (1 diff)
-
ppSub/src/ppSubData.c (copied) (copied from branches/pap/ppSub/src/ppSubData.c )
-
ppSub/src/ppSubLoop.c (modified) (15 diffs)
-
ppSub/src/ppSubMakePSF.c (modified) (3 diffs)
-
ppSub/src/ppSubMatchPSFs.c (modified) (3 diffs)
-
ppSub/src/ppSubReadout.c (modified) (4 diffs)
-
ppSub/src/ppSubReadoutPhotometry.c (modified) (3 diffs)
-
ppSub/src/ppSubReadoutUpdate.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/pap (added) merged: 23511,23520-23521,23532,23578-23581,23596-23599,23603-23604,23606-23608,23619-23621,23638-23639,23641,23646-23648,23651-23653,23656,23672-23674,23677-23684
- Property svn:mergeinfo changed
-
trunk/ppSub
- Property svn:mergeinfo changed
/branches/pap/ppSub (added) merged: 23580,23597,23599,23672-23674,23684
- Property svn:mergeinfo changed
-
trunk/ppSub/src/Makefile.am
r23229 r23688 19 19 ppSubBackground.c \ 20 20 ppSubCamera.c \ 21 ppSubData.c \ 21 22 ppSubLoop.c \ 22 23 ppSubReadout.c \ -
trunk/ppSub/src/ppSub.h
r23195 r23688 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 82 ppSubData *data, ///< Processing data 65 83 const pmFPAview *view ///< View of active readout 66 84 ); … … 74 92 /// Photometry stage 2: find and measure sources on the subtracted image 75 93 bool ppSubReadoutPhotometry(pmConfig *config, ///< Configuration 76 p sMetadata *stats, ///< Statistics, for output94 ppSubData *data, ///< Processing data 77 95 const pmFPAview *view ///< View of active readout 78 96 ); … … 80 98 /// Renormalize, update headers and generate JPEGs 81 99 bool ppSubReadoutUpdate(pmConfig *config, ///< Configuration 82 p sMetadata *stats, ///< Statistics for output, or NULL100 ppSubData *data, ///< Processing data 83 101 const pmFPAview *view ///< View of active readout 84 102 ); … … 96 114 void ppSubVersionPrint(void); 97 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 ); 98 122 99 123 // Copy every instance of a single keyword from one metadata to another -
trunk/ppSub/src/ppSubCamera.c
r23449 r23688 285 285 return true; 286 286 } 287 288 -
trunk/ppSub/src/ppSubLoop.c
r23315 r23688 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 } -
trunk/ppSub/src/ppSubMakePSF.c
r23235 r23688 22 22 #include "ppSub.h" 23 23 24 bool ppSubMakePSF(pmConfig *config, const pmFPAview *view)24 bool ppSubMakePSF(pmConfig *config, ppSubData *data, const pmFPAview *view) 25 25 { 26 26 psAssert(config, "Require configuration"); … … 83 83 psArray *sources = psMetadataLookupPtr(&mdok, minuend->analysis, "PSPHOT.SOURCES"); 84 84 if (!psphotReadoutFindPSF(config, view, sources)) { 85 psError(PS_ERR_UNKNOWN, false, "Unable to perform photometry on subtracted image."); 86 return false; 85 // This is likely a data quality issue 86 // XXX Split into multiple cases using error codes? 87 psErrorStackPrint(stderr, "Unable to determine PSF"); 88 psWarning("Unable to determine PSF --- suspect bad data quality."); 89 ppSubDataQuality(config, data, PSPHOT_ERR_PSF, PPSUB_FILES_PHOT); 90 return true; 87 91 } 88 92 … … 98 102 return true; 99 103 } 100 101 // XXX we used to need this, is it still needed?102 103 // pmCell *photCell = pmFPAfileThisCell(config->files, view, "PSPHOT.INPUT");104 // pmCellFreeReadouts(photCell);105 106 // if (!pmFPAfileDropInternal(config->files, "PSPHOT.BACKMDL") ||107 // !pmFPAfileDropInternal (config->files, "PSPHOT.BACKMDL.STDEV") ||108 // !pmFPAfileDropInternal (config->files, "PSPHOT.BACKGND")) {109 // psError(PS_ERR_UNKNOWN, false, "Unable to drop PSPHOT internal files.");110 // return false;111 // }112 113 // Blow away the sources psphot found --- they're irrelevant for the subtraction114 // XXX is this still needed? These are now probably not being set115 // pmReadout *photRO = pmFPAviewThisReadout(view, photFile->fpa); // Readout with sources116 // psMetadataRemoveKey(photRO->analysis, "PSPHOT.SOURCES");117 // psMetadataRemoveKey(photRO->analysis, "PSPHOT.HEADER");118 -
trunk/ppSub/src/ppSubMatchPSFs.c
r23505 r23688 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 } -
trunk/ppSub/src/ppSubReadout.c
r21524 r23688 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; 35 } else if (data->quality) { 36 // Can't do anything at all 37 return true; 35 38 } 36 39 … … 40 43 } 41 44 42 if (! ppSubMakePSF(config, view)) {45 if (!data->quality && !ppSubMakePSF(config, data, view)) { 43 46 psError(PS_ERR_UNKNOWN, false, "Unable to generate PSF."); 44 47 return false; … … 56 59 } 57 60 58 if (! ppSubReadoutPhotometry(config, stats, view)) {61 if (!data->quality && !ppSubReadoutPhotometry(config, data, view)) { 59 62 psError(PS_ERR_UNKNOWN, false, "Unable to perform photometry."); 60 63 return false; 61 64 } 62 65 63 if (!ppSubReadoutUpdate(config, stats, view)) {66 if (!ppSubReadoutUpdate(config, data, view)) { 64 67 psError(PS_ERR_UNKNOWN, false, "Unable to update."); 65 68 return false; -
trunk/ppSub/src/ppSubReadoutPhotometry.c
r21524 r23688 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 psError(PS_ERR_UNEXPECTED_NULL, true, "Unable to find PSF from psphot"); 48 return false; 47 psErrorStackPrint(stderr, "No PSF available"); 48 psWarning("No PSF available --- suspect bad data quality."); 49 ppSubDataQuality(config, data, psErrorCodeLast(), PPSUB_FILES_PHOT); 50 return true; 49 51 } 50 52 psMetadataAddPtr(psfLoadChip->analysis, PS_LIST_TAIL, "PSPHOT.PSF", PS_DATA_UNKNOWN | PS_META_REPLACE, … … 80 82 } 81 83 82 #if 0 83 psMetadataAddPtr(config->files, PS_LIST_TAIL, "PSPHOT.INPUT", PS_DATA_UNKNOWN | PS_META_REPLACE, 84 "psphot input: view on another pmFPAfile", photFile); 85 #endif 84 if (!psphotReadoutMinimal(config, view)) { 85 // This is likely a data quality issue 86 // XXX Split into multiple cases using error codes? 87 psErrorStackPrint(stderr, "Unable to perform photometry on image"); 88 psWarning("Unable to perform photometry on image --- suspect bad data quality."); 89 ppSubDataQuality(config, data, psErrorCodeLast(), PPSUB_FILES_PHOT); 90 } 86 91 87 if (!psphotReadoutMinimal(config, view)) {88 psWarning("Unable to perform photometry on subtracted image.");89 psErrorStackPrint(stderr, "Error stack from photometry:");90 psErrorClear();91 }92 #if 193 92 photRO->data_exists = true; 94 93 photRO->parent->data_exists = true; 95 94 photRO->parent->parent->data_exists = true; 96 #endif97 95 98 if ( stats) {96 if (data->stats) { 99 97 psArray *sources = psMetadataLookupPtr(NULL, photRO->analysis, "PSPHOT.SOURCES"); // Sources 100 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", 101 99 sources ? sources->n : 0); 102 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", 103 101 psTimerClear("PPSUB_PHOT")); 104 102 } -
trunk/ppSub/src/ppSubReadoutUpdate.c
r23173 r23688 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.
