Changeset 9952
- Timestamp:
- Nov 13, 2006, 12:26:09 PM (19 years ago)
- Location:
- trunk/ppImage/src
- Files:
-
- 7 edited
-
Makefile.am (modified) (3 diffs)
-
ppImageArguments.c (modified) (2 diffs)
-
ppImageDetrendFringe.c (modified) (7 diffs)
-
ppImageDetrendFringe.h (modified) (1 diff)
-
ppImageDetrendReadout.c (modified) (2 diffs)
-
ppImageLoop.c (modified) (6 diffs)
-
ppImageParseCamera.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ppImage/src/Makefile.am
r9857 r9952 5 5 ppImageOptions.h \ 6 6 ppImageDetrendFringe.h \ 7 ppImagePreserve.h \ 7 8 ppMem.h 8 9 … … 20 21 ppImageDetrendNonLinear.c \ 21 22 ppImageDetrendFringe.c \ 23 ppImagePreserve.c \ 22 24 ppImageRebinReadout.c \ 23 25 ppImageMosaic.c \ … … 41 43 ppImageDetrendNonLinear.c \ 42 44 ppImageDetrendFringe.c \ 45 ppImagePreserve.c \ 43 46 ppImageRebinReadout.c \ 44 47 ppImageMosaic.c \ -
trunk/ppImage/src/ppImageArguments.c
r9342 r9952 33 33 "Filename for summary statistics", argv[N]); 34 34 psArgumentRemove(N, &argc, argv); 35 } 36 37 if ((N = psArgumentGet(argc, argv, "-fringeimage"))) { 38 psArgumentRemove(N, &argc, argv); 39 psMetadataAddBool(options, PS_LIST_TAIL, "INPUT_IS_FRINGE", PS_META_REPLACE, 40 "Input is fringe image", true); 35 41 } 36 42 … … 73 79 if ((N = psArgumentGet(argc, argv, "-norm"))) { 74 80 psArgumentRemove(N, &argc, argv); 75 psMetadataAddStr(config->arguments, PS_LIST_TAIL, "NORMALISATION", PS_TYPE_F32, 76 "Normalisation to apply", argv[N]); 81 float norm = atof(argv[N]); 82 psMetadataAddF32(config->arguments, PS_LIST_TAIL, "NORMALISATION", 0, 83 "Normalisation to apply", norm); 77 84 psArgumentRemove(N, &argc, argv); 78 85 } -
trunk/ppImage/src/ppImageDetrendFringe.c
r9857 r9952 5 5 #include "ppImageDetrendFringe.h" 6 6 7 bool ppImageDetrendFringeMeasure(pmFringeStats **science, // (Ptr to) science fringe measurements 8 psArray *references, // Array of reference fringe measurements 9 const pmReadout *readout, // Readout to measure 7 bool ppImageDetrendFringeMeasure(pmReadout *readout, // Readout to measure 8 pmCell *fringe, // Fringe cell (each readout is a different component) 10 9 const ppImageOptions *options // Options 11 10 ) 12 11 { 13 assert(science); 14 PS_ASSERT_ARRAY_NON_NULL(references, false); 12 PS_ASSERT_PTR_NON_NULL(readout, false); 13 PS_ASSERT_PTR_NON_NULL(fringe, false); 14 PS_ASSERT_PTR_NON_NULL(options, false); 15 16 // Reference fringe measurements 17 psArray *references = psMemIncrRefCounter(psMetadataLookupPtr(NULL, fringe->analysis, 18 "FRINGE.MEASUREMENTS")); 19 if (!references) { 20 references = pmFringesParse(fringe); // Reference fringes 21 if (!references) { 22 psError(PS_ERR_IO, false, "Unable to find fringe references.\n"); 23 return false; 24 } 25 psMetadataAdd(fringe->analysis, PS_LIST_TAIL, "FRINGE.MEASUREMENTS", PS_DATA_UNKNOWN, 26 "Fringe measurements", references); 27 } 15 28 16 29 pmFringeStats *reference = references->data[0]; // Take the first as representative 17 30 pmFringeRegions *regions = reference->regions; // Regions to measure 18 pmFringeStats * fringe= pmFringeStatsMeasure(regions, readout, options->maskValue); // Fringe stats31 pmFringeStats *measurements = pmFringeStatsMeasure(regions, readout, options->maskValue); // Fringe stats 19 32 20 33 // Normalise measurements by the exposure time … … 23 36 if (!mdok || !isfinite(expTime)) { 24 37 psError(PS_ERR_UNKNOWN, false, "CELL.EXPOSURE is not set for --- can't normalise fringes\n"); 25 psFree( fringe);38 psFree(measurements); 26 39 return false; 27 40 } … … 30 43 expTime = 1.0; 31 44 } 32 psBinaryOp( fringe->f, fringe->f, "*", psScalarAlloc(1.0 / expTime, PS_TYPE_F32));33 psBinaryOp( fringe->df, fringe->df, "*", psScalarAlloc(1.0 / expTime, PS_TYPE_F32));45 psBinaryOp(measurements->f, measurements->f, "*", psScalarAlloc(1.0 / expTime, PS_TYPE_F32)); 46 psBinaryOp(measurements->df, measurements->df, "*", psScalarAlloc(1.0 / expTime, PS_TYPE_F32)); 34 47 35 if (!*science) { 36 // Only a single readout 37 *science = fringe; 38 } else { 48 // Science fringe measurements 49 pmFringeStats *previous = psMetadataLookupPtr(NULL, readout->parent->analysis, "FRINGE.MEASUREMENTS"); 50 if (previous) { 39 51 // Multiple readouts: concatenate 40 52 psArray *concatenate = psArrayAlloc(2); // Array to hold fringes 41 53 42 54 // Concatenate science measurements 43 concatenate->data[0] = *science;44 concatenate->data[1] = fringe;45 pmFringeStats * sciNew = pmFringeStatsConcatenate(concatenate, NULL, NULL); // New measurements46 psFree( *science);47 *science = sciNew;55 concatenate->data[0] = previous; 56 concatenate->data[1] = measurements; 57 pmFringeStats *new = pmFringeStatsConcatenate(concatenate, NULL, NULL); // New measurements 58 psFree(measurements); 59 measurements = new; 48 60 49 // Concatenate reference measurements 61 // Concatenate reference measurements (duplication, so the science and reference line up) 50 62 for (int i = 0; i < references->n; i++) { 51 63 concatenate->data[0] = concatenate->data[1] = references->data[i]; … … 54 66 references->data[i] = refNew; 55 67 } 56 57 68 concatenate->data[0] = concatenate->data[1] = NULL; 58 69 psFree(concatenate); 59 70 } 71 72 psMetadataAdd(readout->parent->analysis, PS_LIST_TAIL, "FRINGE.MEASUREMENTS", 73 PS_DATA_UNKNOWN | PS_META_REPLACE, "Fringe measurements", measurements); 74 psFree(measurements); 75 76 psFree(references); 60 77 61 78 return true; … … 63 80 64 81 82 // Pull the fringes out of the cell analysis FRINGE.MEASUREMENTS for a chip 83 static psArray *getFringes(const pmChip *chip // Chip of interest 84 ) 85 { 86 psArray *cells = chip->cells; // Component cells 87 psArray *fringes = psArrayAlloc(cells->n); // Fringes, to return 88 for (int i = 0; i < cells->n; i++) { 89 pmCell *cell = cells->data[i]; // Cell of interest 90 fringes->data[i] = psMemIncrRefCounter(psMetadataLookupPtr(NULL, cell->analysis, 91 "FRINGE.MEASUREMENTS")); 92 } 93 94 return fringes; 95 } 96 65 97 66 98 // Solve the fringe system: we have science fringe measurements for each cell, and an array of reference 67 99 // fringe measurements for each cell. Need to concatenate these together first, and then solve. 68 pmFringeScale *ppImageDetrendFringeSolve(psArray *science, // Science fringe measurements (per cell) 69 psArray *references, // Array of array of fringe measurements70 const ppImageOptions *options // Options100 bool ppImageDetrendFringeSolve(pmChip *scienceChip, // Chip with science 101 const pmChip *refChip, // Chip with reference fringes 102 const ppImageOptions *options // Options 71 103 ) 72 104 { 105 PS_ASSERT_PTR_NON_NULL(scienceChip, NULL); 106 PS_ASSERT_PTR_NON_NULL(refChip, NULL); 107 PS_ASSERT_PTR_NON_NULL(options, NULL); 108 109 psArray *science = getFringes(scienceChip); // Fringe measurements on science chip 73 110 pmFringeStats *scienceCat = pmFringeStatsConcatenate(science, NULL, NULL); // Science fringes 111 psFree(science); 74 112 75 113 // Need to transform the array of cells each with an array of fringes --> array of fringes for the chip as 76 114 // a whole 115 psArray *references = getFringes(refChip); // Fringe measurements on reference chip 77 116 int numRefs = ((psArray*)references->data[0])->n; // Number of reference fringes 78 117 psArray *referencesCat = psArrayAlloc(numRefs); // Reference fringes … … 86 125 psFree(refs); 87 126 } 127 psFree(references); 88 128 89 129 // Now we can solve … … 92 132 options->fringeIter, options->fringeKeep); 93 133 134 psMetadataAdd(scienceChip->analysis, PS_LIST_TAIL, "FRINGE.SOLUTION", PS_DATA_UNKNOWN, 135 "Fringe solution", solution); 136 psFree(solution); 94 137 psFree(scienceCat); 95 138 psFree(referencesCat); 96 139 97 return solution;140 return true; 98 141 } 99 142 100 143 101 144 psImage *ppImageDetrendFringeGenerate(pmCell *science, // Science cell 102 pmCell *fringes, // Fringe cell, one readout per fringe component 103 const pmFringeScale *solution // Fringe solution to apply 145 pmCell *fringes // Fringe cell, one readout per fringe component 104 146 ) 105 147 { 106 148 PS_ASSERT_PTR_NON_NULL(science, false); 107 PS_ASSERT_PTR_NON_NULL(solution, false); 149 PS_ASSERT_PTR_NON_NULL(fringes, false); 150 151 pmFringeScale *solution = psMetadataLookupPtr(NULL, science->parent->analysis, "FRINGE.SOLUTION"); 108 152 assert(fringes->readouts->n == solution->nFringeFrames); 109 153 -
trunk/ppImage/src/ppImageDetrendFringe.h
r9857 r9952 6 6 #include "ppImageOptions.h" 7 7 8 bool ppImageDetrendFringeMeasure(pmFringeStats **science, // (Ptr to) science fringe measurements 9 psArray *references, // Array of reference fringe measurements 10 const pmReadout *readout, // Readout to measure 8 bool ppImageDetrendFringeMeasure(pmReadout *readout, // Readout to measure 9 pmCell *fringe, // Fringe cell (each readout is a different component) 11 10 const ppImageOptions *options // Options 12 11 ); 13 12 14 pmFringeScale *ppImageDetrendFringeSolve(psArray *science, // Science fringe measurements (per cell) 15 psArray *references, // Array of array of fringe measurements16 const ppImageOptions *options // Options13 bool ppImageDetrendFringeSolve(pmChip *scienceChip, // Chip with science 14 const pmChip *refChip, // Chip with reference fringes 15 const ppImageOptions *options // Options 17 16 ); 18 17 18 19 19 psImage *ppImageDetrendFringeGenerate(pmCell *science, // Science cell 20 pmCell *fringes, // Fringe cell, one readout per fringe component 21 const pmFringeScale *solution // Fringe solution to apply 20 pmCell *fringes // Fringe cell, one readout per fringe component 22 21 ); 23 22 23 24 24 #endif -
trunk/ppImage/src/ppImageDetrendReadout.c
r9342 r9952 4 4 5 5 #include "ppImage.h" 6 #include "ppImageDetrendFringe.h" 6 7 7 8 bool ppImageDetrendReadout (pmConfig *config, ppImageOptions *options, pmFPAview *view) … … 72 73 } 73 74 75 if (options->doFringe) { 76 pmCell *fringe = pmFPAfileThisCell(config->files, detview, "PPIMAGE.FRINGE"); 77 if (!ppImageDetrendFringeMeasure(input, fringe, options)) { 78 return false; 79 } 80 } 81 74 82 psFree (detview); 75 83 return true; -
trunk/ppImage/src/ppImageLoop.c
r9871 r9952 6 6 #include "ppImage.h" 7 7 #include "ppImageDetrendFringe.h" 8 8 9 9 10 bool ppImageLoop (pmConfig *config, ppImageOptions *options) { … … 45 46 if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) return false; 46 47 47 const char *chipName = psMetadataLookupStr(NULL, chip->concepts, "CHIP.NAME"); // Name of chip48 psArray *fringeRef = NULL; // Array of array of fringe statistics for reference --- for each cell49 psArray *fringeSci = NULL; // Array of fringe statistics for science --- for each cell50 if (options->doFringe) {51 fringeRef = psArrayAlloc(chip->cells->n);52 fringeSci = psArrayAlloc(chip->cells->n);53 }54 55 48 while ((cell = pmFPAviewNextCell (view, input->fpa, 1)) != NULL) { 56 49 psLogMsg ("ppImageLoop", 4, "Cell %d: %x %x\n", view->cell, cell->file_exists, cell->process); 57 50 if (!cell->process || !cell->file_exists) { continue; } 58 51 if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) return false; 59 const char *cellName = psMetadataLookupStr(NULL, cell->concepts, "CELL.NAME"); // Name of cell60 61 if (options->doFringe) {62 pmFPAfile *fringeFile = psMetadataLookupPtr(&status, config->files, "PPIMAGE.FRINGE");63 if (!status || !fringeFile) {64 psErrorStackPrint(stderr, "Can't find fringe data!\n");65 exit(EXIT_FAILURE);66 }67 68 psString fringeExt = NULL; // Fringe extension name69 psStringAppend(&fringeExt, "FRINGE_%s_%s", chipName, cellName);70 fringeRef->data[view->cell] = pmFringesReadFits(NULL, fringeFile->fits, fringeExt);71 psFree(fringeExt);72 }73 52 74 53 // process each of the readouts … … 80 59 if (!ppImageDetrendReadout (config, options, view)) return false; 81 60 82 if (options->doFringe) {83 ppImageDetrendFringeMeasure((pmFringeStats**)(&fringeSci->data[view->cell]),84 fringeRef->data[view->cell], readout, options);85 }86 61 } 87 62 } 88 63 89 64 // Solve the fringe system 90 pmFringeScale *fringeSoln = NULL; // Solution for the fringes91 65 if (options->doFringe) { 92 fringeSoln = ppImageDetrendFringeSolve(fringeSci, fringeRef, options); 93 psFree(fringeSci); 94 psFree(fringeRef); 66 pmChip *fringe = pmFPAfileThisChip(config->files, view, "PPIMAGE.FRINGE"); 67 if (!ppImageDetrendFringeSolve(chip, fringe, options)) { 68 return false; 69 } 95 70 } 96 71 … … 103 78 if (options->doFringe) { 104 79 psTrace("ppImage", 3, "Applying fringe correction...\n"); 105 bool mdok; // Status of MD lookup 106 pmFPAfile *fringeFile = psMetadataLookupPtr(&mdok, config->files, "PPIMAGE.FRINGE"); 107 pmCell *fringeCell = pmFPAviewThisCell(view, fringeFile->fpa); 108 psImage *fringe = ppImageDetrendFringeGenerate(cell, fringeCell, fringeSoln); 80 pmCell *fringeCell = pmFPAfileThisCell(config->files, view, "PPIMAGE.FRINGE"); 81 psImage *fringe = ppImageDetrendFringeGenerate(cell, fringeCell); 109 82 while ((readout = pmFPAviewNextReadout (view, input->fpa, 1)) != NULL) { 110 83 if (!readout->data_exists) { continue; } … … 125 98 if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) return false; 126 99 } 127 psFree(fringeSoln);128 100 129 101 ppImageMosaicChip (config, view, "PPIMAGE.OUTPUT.CHIP", "PPIMAGE.OUTPUT"); … … 163 135 if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) return false; 164 136 165 psFree (view); 137 psFree(view); 138 166 139 return true; 167 140 } -
trunk/ppImage/src/ppImageParseCamera.c
r9857 r9952 12 12 // the input image defines the camera, and all recipes and options the follow 13 13 pmFPAfile *input = pmFPAfileDefineFromArgs (&status, config, "PPIMAGE.INPUT", "INPUT"); 14 if (!status ) {14 if (!status || !input) { 15 15 psError(PS_ERR_IO, false, "Failed to build FPA from PPIMAGE.INPUT"); 16 16 return NULL; … … 177 177 psFree (chips); 178 178 179 if (psMetadataLookupBool(NULL, recipe, "INPUT_IS_FRINGE")) { 180 // It's a fringe file, so change the file type 181 input->type = PM_FPA_FILE_FRINGE; 182 output->type = PM_FPA_FILE_FRINGE; 183 } 184 179 185 return (options); 180 186 }
Note:
See TracChangeset
for help on using the changeset viewer.
