Changeset 21484
- Timestamp:
- Feb 15, 2009, 9:51:40 AM (17 years ago)
- Location:
- branches/eam_branch_20090208/psModules/src/detrend
- Files:
-
- 5 edited
-
pmDetrendThreads.c (modified) (2 diffs)
-
pmFlatField.c (modified) (4 diffs)
-
pmFlatField.h (modified) (2 diffs)
-
pmShutterCorrection.c (modified) (5 diffs)
-
pmShutterCorrection.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branch_20090208/psModules/src/detrend/pmDetrendThreads.c
r18960 r21484 47 47 48 48 { 49 psThreadTask *task = psThreadTaskAlloc("PSMODULES_DETREND_SHUTTER", 7);49 psThreadTask *task = psThreadTaskAlloc("PSMODULES_DETREND_SHUTTER", 8); 50 50 task->function = &pmShutterCorrectionApplyScan_Threaded; 51 51 psThreadTaskAdd(task); … … 54 54 55 55 { 56 psThreadTask *task = psThreadTaskAlloc("PSMODULES_DETREND_FLAT", 9);56 psThreadTask *task = psThreadTaskAlloc("PSMODULES_DETREND_FLAT", 10); 57 57 task->function = &pmFlatFieldScan_Threaded; 58 58 psThreadTaskAdd(task); -
branches/eam_branch_20090208/psModules/src/detrend/pmFlatField.c
r21183 r21484 17 17 PS_ASSERT_THREAD_JOB_NON_NULL(job, false); 18 18 19 psImage *inImage = job->args->data[0]; // Input image 20 psImage *inMask = job->args->data[1]; // Input mask 21 const psImage *flatImage = job->args->data[2]; // Flat-field image 22 const psImage *flatMask = job->args->data[3]; // Flat-field mask 19 psImage *inImage = job->args->data[0]; // Input image 20 psImage *inMask = job->args->data[1]; // Input mask 21 psImage *inVar = job->args->data[2]; // Input variance 22 const psImage *flatImage = job->args->data[3]; // Flat-field image 23 const psImage *flatMask = job->args->data[4]; // Flat-field mask 23 24 24 psImageMaskType badFlat = PS_SCALAR_VALUE(job->args->data[4],PS_TYPE_IMAGE_MASK_DATA); 25 int xOffset = PS_SCALAR_VALUE(job->args->data[5],S32); 26 int yOffset = PS_SCALAR_VALUE(job->args->data[6],S32); 27 int rowStart = PS_SCALAR_VALUE(job->args->data[7],S32); 28 int rowStop = PS_SCALAR_VALUE(job->args->data[8],S32); 29 return pmFlatFieldScan(inImage, inMask, flatImage, flatMask, badFlat, 25 psImageMaskType badFlat = PS_SCALAR_VALUE(job->args->data[5], PS_TYPE_IMAGE_MASK_DATA); 26 int xOffset = PS_SCALAR_VALUE(job->args->data[6], S32); 27 int yOffset = PS_SCALAR_VALUE(job->args->data[7], S32); 28 int rowStart = PS_SCALAR_VALUE(job->args->data[8], S32); 29 int rowStop = PS_SCALAR_VALUE(job->args->data[9], S32); 30 31 return pmFlatFieldScan(inImage, inMask, inVar, flatImage, flatMask, badFlat, 30 32 xOffset, yOffset, rowStart, rowStop); 31 33 } 32 34 33 // Macro for all PS types34 #define FLAT_DIVISION_CASE(TYPE, SPECIAL) \35 case PS_TYPE_##TYPE: \36 for (int j = rowStart; j < rowStop; j++) { \37 for (int i = 0; i < inImage->numCols; i++) { \38 ps##TYPE flatValue = flatImage->data.TYPE[j + yOffset][i + xOffset]; \39 if (!isfinite(flatValue) || flatValue <= 0.0 || \40 (flatMask && flatMask->data.PS_TYPE_IMAGE_MASK_DATA[j + yOffset][i + xOffset])) { \41 if (inMask) { \42 inMask->data.PS_TYPE_IMAGE_MASK_DATA[j][i] |= badFlat; \43 } \44 inImage->data.TYPE[j][i] = SPECIAL; \45 } else { \46 inImage->data.TYPE[j][i] /= flatValue; \47 } \48 } \49 } \50 break;51 35 52 bool pmFlatFieldScan(psImage *inImage, psImage *inMask, const psImage *flatImage, const psImage *flatMask, 53 psImageMaskType badFlat, int xOffset, int yOffset, int rowStart, int rowStop) 36 bool pmFlatFieldScan(psImage *inImage, psImage *inMask, psImage *inVar, const psImage *flatImage, 37 const psImage *flatMask, psImageMaskType badFlat, 38 int xOffset, int yOffset, int rowStart, int rowStop) 54 39 { 55 switch (inImage->type.type) { 56 FLAT_DIVISION_CASE(U8, 0); 57 FLAT_DIVISION_CASE(U16, 0); 58 FLAT_DIVISION_CASE(U32, 0); 59 FLAT_DIVISION_CASE(U64, 0); 60 FLAT_DIVISION_CASE(S8, 0); 61 FLAT_DIVISION_CASE(S16, 0); 62 FLAT_DIVISION_CASE(S32, 0); 63 FLAT_DIVISION_CASE(S64, 0); 64 FLAT_DIVISION_CASE(F32, NAN); 65 FLAT_DIVISION_CASE(F64, NAN); 66 default: 67 psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unsupported type for input image: %x\n", 68 inImage->type.type); 69 return false; 40 // Neglecting asserts, because inputs should have been checked already 41 42 int numCols = inImage->numCols; // Number of columns 43 44 // Using i,j for image; x,y for flat. 45 for (int j = rowStart, y = yOffset; j < rowStop; j++, y++) { 46 for (int i = 0, x = xOffset; i < numCols; i++, x++) { 47 float flatValue = 1.0 / flatImage->data.F32[y][x]; 48 if (!isfinite(flatValue) || flatValue <= 0.0 || 49 (flatMask && flatMask->data.PS_TYPE_IMAGE_MASK_DATA[y][x])) { 50 if (inMask) { 51 inMask->data.PS_TYPE_IMAGE_MASK_DATA[j][i] |= badFlat; 52 } 53 inImage->data.F32[j][i] = NAN; 54 if (inVar) { 55 inVar->data.F32[j][i] = NAN; 56 } 57 } else { 58 inImage->data.F32[j][i] *= flatValue; 59 if (inVar) { 60 inVar->data.F32[j][i] *= PS_SQR(flatValue); 61 } 62 } 63 } 70 64 } 65 71 66 return true; 72 67 } … … 74 69 bool pmFlatField(pmReadout *in, const pmReadout *flat, psImageMaskType badFlat) 75 70 { 76 PS_ASSERT_PTR_NON_NULL(in, false); 77 PS_ASSERT_PTR_NON_NULL(in->image, false); 78 PS_ASSERT_IMAGE_NON_EMPTY(in->image, false); 79 PS_ASSERT_PTR_NON_NULL(flat, false); 80 PS_ASSERT_PTR_NON_NULL(flat->image, false); 81 PS_ASSERT_IMAGE_NON_EMPTY(flat->image, false); 71 PM_ASSERT_READOUT_NON_NULL(in, false); 72 PM_ASSERT_READOUT_IMAGE(in, false); 73 PM_ASSERT_READOUT_NON_NULL(flat, false); 74 PM_ASSERT_READOUT_IMAGE(flat, false); 82 75 if (in->mask) { 83 PS_ASSERT_IMAGE_TYPE(in->mask, PS_TYPE_IMAGE_MASK, false); 84 PS_ASSERT_IMAGES_SIZE_EQUAL(in->mask, in->image, false); 76 PM_ASSERT_READOUT_MASK(in, false); 85 77 } 86 PS_ASSERT_IMAGE_TYPE(flat->image, in->image->type.type, false); 78 if (in->variance) { 79 PM_ASSERT_READOUT_VARIANCE(in, false); 80 } 87 81 if (flat->mask) { 88 PS_ASSERT_IMAGE_TYPE(flat->mask, PS_TYPE_IMAGE_MASK, false); 89 PS_ASSERT_IMAGES_SIZE_EQUAL(flat->mask, flat->image, false); 82 PM_ASSERT_READOUT_MASK(flat, false); 90 83 } 91 84 92 85 psImage *inImage = in->image; // Input image 93 86 psImage *inMask = in->mask; // Mask for input image 87 psImage *inVar = in->variance; // Variance for input image 94 88 psImage *flatImage = flat->image; // Flat-field image 95 89 psImage *flatMask = flat->mask; // Mask for flat-field image … … 146 140 psArrayAdd(job->args, 1, inImage); 147 141 psArrayAdd(job->args, 1, inMask); 142 psArrayAdd(job->args, 1, inVar); 148 143 psArrayAdd(job->args, 1, flatImage); 149 144 psArrayAdd(job->args, 1, flatMask); … … 159 154 } 160 155 psFree(job); 161 } else if (!pmFlatFieldScan(inImage, inMask, flatImage, flatMask, badFlat,156 } else if (!pmFlatFieldScan(inImage, inMask, inVar, flatImage, flatMask, badFlat, 162 157 xOffset, yOffset, rowStart, rowStop)) { 163 158 psError(PS_ERR_UNKNOWN, false, "Unable to flat-field image."); -
branches/eam_branch_20090208/psModules/src/detrend/pmFlatField.h
r21183 r21484 5 5 * @author Paul Price, IfA 6 6 * 7 * @version $Revision: 1.15 $ $Name: not supported by cvs2svn $8 * @date $Date: 2009-0 1-27 06:39:38$7 * @version $Revision: 1.15.6.1 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2009-02-15 19:51:40 $ 9 9 * Copyright 2004-2006 Institute for Astronomy, University of Hawaii 10 10 */ … … 36 36 psImage *inImage, ///< Input image to correct 37 37 psImage *inMask, ///< Input mask image 38 psImage *inVar, ///< Input variance image 38 39 const psImage *flatImage, ///< Flat-field image 39 40 const psImage *flatMask, ///< Flat-field mask 40 psImageMaskType badFlag, ///< Mask value to give bad pixels41 psImageMaskType badFlag, ///< Mask value to give bad pixels 41 42 int xOffset, int yOffset, ///< Offset between input and flat-field 42 43 int rowStart, int rowStop ///< Scan range -
branches/eam_branch_20090208/psModules/src/detrend/pmShutterCorrection.c
r21363 r21484 659 659 PS_ASSERT_THREAD_JOB_NON_NULL(job, false); 660 660 661 psImage *image = job->args->data[0]; 662 const psImage *shutterImage = job->args->data[1]; 663 psImage *mask = job->args->data[2]; 664 665 float exptime = PS_SCALAR_VALUE(job->args->data[3],F32); 666 psImageMaskType blank = PS_SCALAR_VALUE(job->args->data[4],PS_TYPE_IMAGE_MASK_DATA); 667 int rowStart = PS_SCALAR_VALUE(job->args->data[5],S32); 668 int rowStop = PS_SCALAR_VALUE(job->args->data[6],S32); 669 return pmShutterCorrectionApplyScan (image, shutterImage, mask, exptime, blank, rowStart, rowStop); 670 } 671 672 bool pmShutterCorrectionApplyScan(psImage *image, const psImage *shutterImage, psImage *mask, float exptime, 661 psImage *image = job->args->data[0]; 662 psImage *mask = job->args->data[1]; 663 psImage *var = job->args->data[2]; 664 const psImage *shutterImage = job->args->data[3]; 665 666 float exptime = PS_SCALAR_VALUE(job->args->data[4], F32); 667 psImageMaskType blank = PS_SCALAR_VALUE(job->args->data[5], PS_TYPE_IMAGE_MASK_DATA); 668 int rowStart = PS_SCALAR_VALUE(job->args->data[6], S32); 669 int rowStop = PS_SCALAR_VALUE(job->args->data[7], S32); 670 return pmShutterCorrectionApplyScan(image, mask, var, shutterImage, exptime, blank, rowStart, rowStop); 671 } 672 673 bool pmShutterCorrectionApplyScan(psImage *image, psImage *mask, psImage *var, 674 const psImage *shutterImage, float exptime, 673 675 psImageMaskType blank, int rowStart, int rowStop) 674 676 { 677 // Neglecting asserts because inputs should have been checked already 678 679 int numCols = image->numCols; // Number of columns 680 675 681 for (int y = rowStart; y < rowStop; y++) { 676 for (int x = 0; x < image->numCols; x++) {682 for (int x = 0; x < numCols; x++) { 677 683 if (mask && !isfinite(shutterImage->data.F32[y][x])) { 678 684 mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= blank; 679 685 image->data.F32[y][x] = NAN; 686 if (var) { 687 var->data.F32[y][x] = NAN; 688 } 680 689 continue; 681 690 } 682 image->data.F32[y][x] *= exptime / (exptime + shutterImage->data.F32[y][x]); 691 float correction = exptime / (exptime + shutterImage->data.F32[y][x]); // Correction factor 692 image->data.F32[y][x] *= correction; 693 if (var) { 694 var->data.F32[y][x] *= PS_SQR(correction); 695 } 683 696 } 684 697 } … … 688 701 bool pmShutterCorrectionApply(pmReadout *readout, const pmReadout *shutter, psImageMaskType blank) 689 702 { 690 PS_ASSERT_PTR_NON_NULL(readout, false); 691 PS_ASSERT_PTR_NON_NULL(shutter, false); 692 PS_ASSERT_IMAGE_NON_NULL(readout->image, false); 693 PS_ASSERT_IMAGE_NON_NULL(shutter->image, false); 694 PS_ASSERT_IMAGE_TYPE(readout->image, PS_TYPE_F32, false); 695 PS_ASSERT_IMAGE_TYPE(shutter->image, PS_TYPE_F32, false); 703 PM_ASSERT_READOUT_NON_NULL(readout, false); 704 PM_ASSERT_READOUT_NON_NULL(shutter, false); 705 PM_ASSERT_READOUT_IMAGE(readout, false); 706 PM_ASSERT_READOUT_IMAGE(shutter, false); 696 707 697 708 psRegion region = psRegionSet(readout->col0, readout->col0 + readout->image->numCols, … … 731 742 psImage *image = readout->image; // Image to correct 732 743 psImage *mask = readout->mask; // Corresponding mask 744 psImage *var = readout->variance; // Corresponding variance map 733 745 734 746 bool threaded = true; … … 766 778 psThreadJob *job = psThreadJobAlloc("PSMODULES_DETREND_SHUTTER"); 767 779 psArrayAdd(job->args, 1, image); 780 psArrayAdd(job->args, 1, mask); 781 psArrayAdd(job->args, 1, var); 768 782 psArrayAdd(job->args, 1, shutterImage); 769 psArrayAdd(job->args, 1, mask);770 783 PS_ARRAY_ADD_SCALAR(job->args, exptime, PS_TYPE_F32); 771 784 PS_ARRAY_ADD_SCALAR(job->args, blank, PS_TYPE_IMAGE_MASK); … … 778 791 } 779 792 psFree(job); 780 } else if (!pmShutterCorrectionApplyScan(image, shutterImage, mask, exptime, blank,793 } else if (!pmShutterCorrectionApplyScan(image, mask, var, shutterImage, exptime, blank, 781 794 rowStart, rowStop)) { 782 795 psError(PS_ERR_UNKNOWN, false, "Unable to apply shutter correction."); -
branches/eam_branch_20090208/psModules/src/detrend/pmShutterCorrection.h
r21183 r21484 5 5 * @author Paul Price, IfA 6 6 * 7 * @version $Revision: 1.22 $ $Name: not supported by cvs2svn $8 * @date $Date: 2009-0 1-27 06:39:38$7 * @version $Revision: 1.22.6.1 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2009-02-15 19:51:40 $ 9 9 * Copyright 2006 Institute for Astronomy, University of Hawaii 10 10 */ … … 91 91 float offref, ///< Reference time offset 92 92 int nIter, ///< Number of iterations 93 float rej ///< Rejection threshold (sigma)93 float rej ///< Rejection threshold (sigma) 94 94 ); 95 95 … … 131 131 bool pmShutterCorrectionApplyScan( 132 132 psImage *image, ///< Input image to correct 133 psImage *mask, ///< Input mask image 134 psImage *var, ///< Input variance image 133 135 const psImage *shutterImage, ///< Shutter correction image 134 psImage *mask, ///< Input mask image135 136 float exptime, ///< Exposure time to which to correct 136 137 psImageMaskType blank, ///< Mask value to give blank pixels
Note:
See TracChangeset
for help on using the changeset viewer.
