Changeset 4216
- Timestamp:
- Jun 12, 2005, 3:49:21 PM (21 years ago)
- Location:
- trunk/psphot/src
- Files:
-
- 11 edited
-
LocalSky.c (modified) (3 diffs)
-
apply_psf_model.c (modified) (4 diffs)
-
choose_psf_model.c (modified) (2 diffs)
-
find_peaks.c (modified) (2 diffs)
-
image_stats.c (modified) (1 diff)
-
psphot-utils.c (modified) (4 diffs)
-
psphot.c (modified) (3 diffs)
-
psphot.h (modified) (1 diff)
-
pspsf.c (modified) (4 diffs)
-
setup.c (modified) (4 diffs)
-
source_moments.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/LocalSky.c
r4215 r4216 1 1 # include "psphot.h" 2 2 3 psSource *pmSourceDefinePixels(const psImageData *imdata, 4 const psPeak *peak, 5 psF32 Radius) 3 bool pmSourceDefinePixels(psSource *mySource, 4 const psImageData *imdata, 5 psF32 x, 6 psF32 y, 7 psF32 Radius) 6 8 { 7 // XXX EAM : EndRow is *exclusive* of pixel region (ie, last pixel + 1) 8 psS32 SubImageStartRow = PS_MAX (0, peak->y - Radius); 9 psS32 SubImageEndRow = PS_MIN (image->numRows, peak->y + Radius + 1); 10 psS32 SubImageStartCol = PS_MAX (0, peak->x - Radius); 11 psS32 SubImageEndCol = PS_MIN (image->numCols, peak->x + Radius + 1); 9 // Grab a subimage of the original image of size (2 * outerRadius). 10 srcRegion = psRegionSquare (x, y, Radius); 11 srcRegion = psRegionForImage (srcRegion, imdata->image); 12 12 13 // Grab a subimage of the original image of size (2 * outerRadius). 14 psImage *subImage = psImageSubset(imdata->image, 15 SubImageStartCol, 16 SubImageStartRow, 17 SubImageEndCol, 18 SubImageEndRow); 13 psImage *subImage = psImageSubset(imdata->image, srcRegion); 14 psImage *subImageMask = psImageSubset(imdata->mask, srcRegion); 15 psImage *subImageNoise = psImageSubset(imdata->noise, srcRegion); 19 16 20 psImage *subImageMask = psImageSubset(imdata->mask,21 SubImageStartCol,22 SubImageStartRow,23 SubImageEndCol,24 SubImageEndRow);25 26 psImage *subImageNoise = psImageSubset(imdata->noise,27 SubImageStartCol,28 SubImageStartRow,29 SubImageEndCol,30 SubImageEndRow);31 32 psSource *mySource = pmSourceAlloc();33 mySource->peak = peak;34 17 mySource->pixels = subImage; 35 18 mySource->mask = subImageMask; … … 49 32 psImage *peak = source->peak; 50 33 51 // Loop through the subimage, mask off pixels in the inner square. 52 // this uses a static mask value of 0x08 53 psS32 StartCol = PS_MAX (0, peak->x - mask->col0 - Radius); 54 psS32 StartRow = PS_MAX (0, peak->y - mask->row0 - Radius); 55 psS32 EndCol = PS_MIN (mask->numCols, peak->x - mask->col0 + Radius + 1); 56 psS32 EndRow = PS_MIN (mask->numRows, peak->y - mask->row0 + Radius + 1); 57 for (psS32 row = StartRow; row < EndRow; row++) { 58 for (psS32 col = StartCol; col < EndCol; col++) { 59 mask->data.U8[row][col] |= 0x80; 60 } 61 } 34 srcRegion = psRegionSquare (peak->x, peak->y, Radius); 35 srcRegion = psRegionForImage (srcRegion, imdata->mask); 36 psImageMaskRegion (imdata->mask, region, OR, 0x80); 62 37 63 38 psStats *myStats = psStatsAlloc(statsOptions); 64 39 myStats = psImageStats(myStats, image, mask, 0xff); 65 66 // clear the mask on the inner pixels 67 for (psS32 row = StartRow; row < EndRow; row++) { 68 for (psS32 col = StartCol; col < EndCol; col++) { 69 mask->data.U8[row][col] &= 0x7f; 70 } 71 } 40 psImageMaskRegion (imdata->mask, region, AND, 0x7f); 72 41 73 42 mySource->moments = pmMomentsAlloc(); … … 79 48 } 80 49 81 // set mask pixels within the circle 82 bool psImageMaskCircle(psImage *mask, 83 psF32 x, 84 psF32 y, 85 psF32 radius, 86 int maskValue) 87 { 88 // XXX EAM : for the circle to stay on the image 89 // XXX EAM : EndRow is *exclusive* of pixel region (ie, last pixel + 1) 90 psS32 SubImageStartRow = PS_MAX (0, x + mask->row0 - radiusS32); 91 psS32 SubImageEndRow = PS_MIN (mask->numRows, SubImageCenterRow + radiusS32 + 1); 92 psS32 SubImageStartCol = PS_MAX (0, SubImageCenterCol - radiusS32); 93 psS32 SubImageEndCol = PS_MIN (mask->numCols, SubImageCenterCol + radiusS32 + 1); 94 95 // Loop through the subimage mask, set maskValue bits 96 for (psS32 row = 0 ; row < source->mask->numRows; row++) { 97 for (psS32 col = 0 ; col < source->mask->numCols; col++) { 98 99 if (CheckRadius2((psF32) radiusS32, 100 (psF32) radiusS32, 101 radius, 102 (psF32) col, 103 (psF32) row)) { 104 source->mask->data.U8[row][col] = 0; 105 } else { 106 source->mask->data.U8[row][col] = 1; 107 } 108 } 109 } 110 return(true); 50 // define a square region centered on the given coordinate 51 psRegion *psRegionSquare (psF32 x, psF32 y, psF32 radius) { 52 region = psRegionAlloc (x - Radius, y - Radius, x + Radius + 1, y + Radius + 1); 53 return (region); 111 54 } 112 -
trunk/psphot/src/apply_psf_model.c
r4129 r4216 4 4 // PSFSTAR objects will be refitted 5 5 // run this function to a specific flux limit? 6 7 6 8 7 bool apply_psf_model (psImage *image, psMetadata *config, psArray *sources, pmPSF *psf, psStats *sky) … … 18 17 float FIT_NSIGMA = psMetadataLookupF32 (&status, config, "FIT_NSIGMA"); 19 18 float FIT_PADDING = psMetadataLookupF32 (&status, config, "FIT_PADDING"); 20 21 float XBORDER = psMetadataLookupF32 (&status, config, "XBORDER");22 float YBORDER = psMetadataLookupF32 (&status, config, "YBORDER");23 psRegion *keep = psRegionAlloc (XBORDER, -XBORDER, YBORDER, -YBORDER);24 keep = psRegionForImage (keep, image, keep);25 26 19 float shapeNsigma = psMetadataLookupF32 (&status, config, "PSF_SHAPE_NSIGMA"); 27 // float snFaint = psMetadataLookupF32 (&status, config, "FAINT_SN_LIM"); 20 float snFaint = psMetadataLookupF32 (&status, config, "FAINT_SN_LIM"); 21 float OUTER = psMetadataLookupF32 (&status, config, "OUTER_RADIUS"); 28 22 29 23 // set the object surface-brightness limit for fitted pixels … … 46 40 // set PSF parameters for this model 47 41 model = psModelFromPSF (model, psf); 42 x = model->params->data.F32[2]; 43 y = model->params->data.F32[3]; 48 44 49 45 // set the fit radius based on the object flux limit and the model … … 54 50 continue; 55 51 } 56 57 // set the valid/invalid pixel mask 58 pmSourceSetPixelCircle (source, image, model->radius); 59 pmSourceMaskRegion (source, keep); 52 53 // mask off saturated pixels (move this to setup?) 60 54 pmSourceMaskSaturated (source, SATURATE); 61 55 62 // fit as PSF, not FLT (skip poor fits) 63 if (!pmSourceFitModel (source, model, true)) continue; 56 // check if we need to redefine the pixels 57 if (model->radius > OUTER) { 58 // allocate image, noise, mask arrays for each peak (square of radius OUTER) 59 pmSourceDefinePixels (source, imdata, x, y, OUTER); 60 } 61 62 // set the valid/invalid pixel mask 63 psImageKeepCircle (source->mask, x, y, model->radius, OR, 0x80); 64 status = pmSourceFitModel (source, model, true); 65 psImageKeepCircle (source->mask, x, y, model->radius, AND, 0x7f); 66 if (!status) continue; 67 64 68 source->modelPSF = model; 65 69 Niter += model[0].nIter; -
trunk/psphot/src/choose_psf_model.c
r4215 r4216 23 23 24 24 // define model fit pixels 25 // XXX use a different radius - PSF_FIT_RADIUS?25 // check that FIT_RADIUS < OUTER_RADIUS 26 26 float RADIUS = psMetadataLookupF32 (&status, config, "FIT_RADIUS"); 27 28 for (int i = 0; i < stars->n; i++) {29 psSource *source = stars->data[i];30 pmSourceSetPixelCircle (source, image, RADIUS);31 }32 27 33 28 // the user specifies 1 or more PSF model options … … 38 33 sprintf (key, "PSF_MODEL_%d", i); 39 34 modelName = psMetadataLookupPtr (&status, config, key); 40 tests->data[i] = pmPSF_TestModel (stars, modelName );35 tests->data[i] = pmPSF_TestModel (stars, modelName, RADIUS); 41 36 } 42 37 -
trunk/psphot/src/find_peaks.c
r4215 r4216 16 16 NSIGMA = psMetadataLookupF32 (&status, config, "SMOOTH_NSIGMA"); 17 17 18 psImage *image = imdata->image; 19 psImage *smooth = psImageCopy (NULL, image, PS_TYPE_F32); 18 psImage *smooth = psImageCopy (NULL, imdata->image, PS_TYPE_F32); 20 19 psImageSmooth (smooth, SIGMA, NSIGMA); 21 20 22 21 psLogMsg ("psphot", 4, "smooth: %f sec\n", psTimerMark ("psphot")); 23 24 22 25 23 // find the peaks in the smoothed image … … 33 31 psArray *peaks = pmFindImagePeaks (smooth, threshold); 34 32 if (peaks == NULL) psAbort ("find peaks", "no peaks found"); 33 psFree (smooth); 35 34 // XXX Need to gracefully handle no source detections 36 35 -
trunk/psphot/src/image_stats.c
r4215 r4216 42 42 float GAIN = psMetadataLookupF32 (&status, config, "GAIN"); 43 43 44 // convert instrumental background to poisson stats 44 45 sky = psStatsAlloc (PS_STAT_SAMPLE_MEAN | PS_STAT_SAMPLE_STDEV); 45 46 sky->sampleMean = stats->sampleMedian; -
trunk/psphot/src/psphot-utils.c
r4215 r4216 129 129 } 130 130 131 bool DumpImage (psImage *image, char *filename) { 132 133 unlink (filename); 134 psFits *fits = psFitsAlloc (filename); 135 psFitsWriteImage (fits, NULL, image, 0, NULL); 136 psFree (fits); 137 return; 138 } 139 131 140 void pmSourceMaskSaturated (psSource *source, float saturate) { 132 141 … … 142 151 } 143 152 144 void pmSourceMaskRegion (psSource *source, psRegion *region) { 145 146 psImage *image = source->pixels; 147 psImage *mask = source->mask; 153 // mask the area contained by the region 154 // the region is defined wrt the parent image 155 void psImageMaskRegion (psImage *image, psRegion *region, bool logical_and, int maskValue) { 156 157 for (int iy = 0; iy < image->numRows; iy++) { 158 for (int ix = 0; ix < image->numCols; ix++) { 159 if (ix + image->col0 < region->x0) continue; 160 if (ix + image->col0 >= region->x1) continue; 161 if (iy + image->row0 < region->y0) continue; 162 if (iy + image->row0 >= region->y1) continue; 163 if (logical_and) { 164 image->data.U8[iy][ix] &= maskValue; 165 } else { 166 image->data.U8[iy][ix] |= maskValue; 167 } 168 } 169 } 170 } 171 172 // mask the area not contained by the region 173 // the region is defined wrt the parent image 174 void psImageKeepRegion (psImage *image, psRegion *region, bool logical_and, int maskValue) { 148 175 149 176 for (int iy = 0; iy < image->numRows; iy++) { … … 155 182 continue; 156 183 maskit: 157 mask->data.U8[iy][ix] |= 0x02; 184 if (logical_and) { 185 image->data.U8[iy][ix] &= maskValue; 186 } else { 187 image->data.U8[iy][ix] |= maskValue; 188 } 158 189 } 159 190 } … … 161 192 162 193 // mask the area contained by the region 163 void psImageMaskRegion (psImage *image, psRegion *region, int maskValue) { 164 165 for (int iy = 0; iy < image->numRows; iy++) { 166 for (int ix = 0; ix < image->numCols; ix++) { 167 if (ix + image->col0 < region->x0) continue; 168 if (ix + image->col0 >= region->x1) continue; 169 if (iy + image->row0 < region->y0) continue; 170 if (iy + image->row0 >= region->y1) continue; 171 image->data.U8[iy][ix] |= maskValue; 172 } 173 } 174 } 175 176 // mask the area not contained by the region 177 void psImageKeepRegion (psImage *image, psRegion *region, int maskValue) { 178 179 for (int iy = 0; iy < image->numRows; iy++) { 180 for (int ix = 0; ix < image->numCols; ix++) { 181 if (ix + image->col0 < region->x0) goto maskit; 182 if (ix + image->col0 >= region->x1) goto maskit; 183 if (iy + image->row0 < region->y0) goto maskit; 184 if (iy + image->row0 >= region->y1) goto maskit; 185 continue; 186 maskit: 187 image->data.U8[iy][ix] |= maskValue; 194 // the region is defined wrt the parent image 195 void psImageMaskCircle (psImage *image, double x, double y, double radius, bool logical_and, int maskValue) { 196 197 double R2 = PS_SQR(radius); 198 199 for (int iy = 0; iy < image->numRows; iy++) { 200 for (int ix = 0; ix < image->numCols; ix++) { 201 dx = ix + image->col0 - x; 202 dy = iy + image->row0 - y; 203 r2 = PS_SQR(dx) + PS_SQR(dy); 204 if (r2 > R2) continue; 205 if (logical_and) { 206 image->data.U8[iy][ix] &= maskValue; 207 } else { 208 image->data.U8[iy][ix] |= maskValue; 209 } 210 } 211 } 212 } 213 214 // mask the area contained by the region 215 // the region is defined wrt the parent image 216 void psImageKeepCircle (psImage *image, double x, double y, double radius, bool logical_and, int maskValue) { 217 218 double R2 = PS_SQR(radius); 219 220 for (int iy = 0; iy < image->numRows; iy++) { 221 for (int ix = 0; ix < image->numCols; ix++) { 222 dx = ix + image->col0 - x; 223 dy = iy + image->row0 - y; 224 r2 = PS_SQR(dx) + PS_SQR(dy); 225 if (r2 < R2) continue; 226 if (logical_and) { 227 image->data.U8[iy][ix] &= maskValue; 228 } else { 229 image->data.U8[iy][ix] |= maskValue; 230 } 188 231 } 189 232 } -
trunk/psphot/src/psphot.c
r4215 r4216 1 1 # include "psphot.h" 2 void dump_image (psImage *image, char *filename);3 2 4 3 int main (int argc, char **argv) { … … 32 31 33 32 // use stellar objects SN > PSF_SN_LIM 34 psf = choose_psf_model (im age, config, sources);33 psf = choose_psf_model (imdata, config, sources); 35 34 36 35 if (0) { 37 psImage *zap = psImageAlloc (im age->numCols,image->numRows, PS_TYPE_F32);36 psImage *zap = psImageAlloc (imdata->image->numCols, imdata->image->numRows, PS_TYPE_F32); 38 37 psImageInit (zap, 0); 39 38 find_defects (zap, sources, config, psf); 40 dump_image (zap, argv[2]);39 DumpImage (zap, argv[2]); 41 40 exit (0); 42 41 } 43 42 44 43 // test PSF on all except SATURATE and DEFECT (artifacts) 45 apply_psf_model (im age, config, sources, psf, sky);44 apply_psf_model (imdata, config, sources, psf, sky); 46 45 47 46 // XXX this test compares dSx,dSy distribution with model. … … 49 48 // test_psf_scatter (sources); 50 49 51 // fit_galaxies (im age, config, sources);50 // fit_galaxies (imdata, config, sources); 52 51 53 52 // subtract_galaxies (sources, config); 54 53 55 dump_image (image, argv[2]);54 DumpImage (imdata->image, argv[2]); 56 55 DumpModelPSF (sources, "sources.dat"); 57 56 exit (0); 58 57 } 59 60 void dump_image (psImage *image, char *filename) {61 62 unlink (filename);63 psFits *fits = psFitsAlloc (filename);64 psFitsWriteImage (fits, NULL, image, 0, NULL);65 psFree (fits);66 return;67 }68 -
trunk/psphot/src/psphot.h
r4215 r4216 36 36 bool DumpModelFits (psArray *models, char *filename); 37 37 bool DumpModelPSF (psArray *sources, char *filename); 38 bool DumpImage (psImage *image, char *filename); 38 39 39 40 int usage (); -
trunk/psphot/src/pspsf.c
r4129 r4216 46 46 } 47 47 48 pmPSF_Test *pmPSF_TestModel (psArray *sources, char *modelName ) {48 pmPSF_Test *pmPSF_TestModel (psArray *sources, char *modelName, float RADIUS) { 49 49 50 50 int Nflt = 0; … … 58 58 psSource *source = test->sources->data[i]; 59 59 psModel *model = pmSourceModelGuess (source, test->modelType); 60 60 x = source->peak->x; 61 y = source->peak->y; 62 63 // set temporary object mask and fit object 61 64 // fit model as FLT, not PSF (mask & skip poor fits) 62 if (!pmSourceFitModel (source, model, false)) { 65 psImageKeepCircle (source->mask, x, y, RADIUS, OR, 0x80); 66 status = pmSourceFitModel (source, model, false); 67 psImageKeepCircle (source->mask, x, y, RADIUS, AND, 0x7f); 68 69 if (!status) { 63 70 test->mask->data.U8[i] = 1; 64 71 continue; … … 96 103 psModel *modelPSF = psModelFromPSF (modelFLT, test->psf); // set shape for this model 97 104 98 // fit model as PSF, not FLT (skip poor fits) 99 if (!pmSourceFitModel (source, modelPSF, true)) { 105 psImageKeepCircle (source->mask, RADIUS, OR, 0x80); 106 status = pmSourceFitModel (source, modelPSF, true); 107 psImageKeepCircle (source->mask, RADIUS, AND, 0x7f); 108 109 // skip poor fits 110 if (!status) { 100 111 test->mask->data.U8[i] = 1; 101 112 continue; … … 224 235 } 225 236 226 // this was an attempt to measure ap-fit using image stats. it was giving227 // strangely wrong answers.228 # if (0)229 psImage *pixels = psImageCopy (NULL, source->pixels, source->pixels->type.type);230 pixels->col0 = source->pixels->col0;231 pixels->row0 = source->pixels->row0;232 // psImageCopy does not retain the parent offset233 // this copy is relative to the parent array.234 235 pmSourceSubModel (pixels, source->mask, model, false);236 237 // use a robust statistic or not?238 psStats *stats = psStatsAlloc (PS_STAT_SAMPLE_MEAN);239 psImageStats (stats, pixels, NULL, 0);240 // psImageStats (stats, pixels, source->mask, 0);241 // XXX this should be the SUM, but we don't have such a statistic242 // XXX given the mask, we need stat functions to return Npixels used243 # endif -
trunk/psphot/src/setup.c
r4215 r4216 1 1 # include "psphot.h" 2 3 // load the image 4 // load or construct the mask 5 // apply X/Y border info 6 // apply the SATURATE mask? 7 // load or construct the noise 2 8 3 9 psImageData *setup (psMetadata *config) 4 10 { 11 psMetadata *header = NULL; 12 psImage *image = NULL; 13 psImage *noise = NULL; 14 psImage *mask = NULL; 15 5 16 psRegion region = {0,0,0,0}; // a region representing the entire array 6 17 7 18 psTimerStart ("psphot"); 8 19 20 // setup header template, specify COMMENT and HISTORY as multis 21 header = psMetadataAlloc (); 22 psMetadataAdd (header, PS_LIST_HEAD, "COMMENT", PS_META_MULTI, "folder for comment", NULL); 23 psMetadataAdd (header, PS_LIST_HEAD, "HISTORY", PS_META_MULTI, "folder for history", NULL); 24 25 // read header and image data from INPUT 9 26 char *input = psMetadataLookupSTR (&status, config, "INPUT"); 10 27 psFits *file = psFitsAlloc (input); 11 12 psImageData *imdata = psAlloc(sizeof(psImageData));13 psMetadata *header = psMetadataAlloc ();14 psMetadataAdd (header, PS_LIST_HEAD, "COMMENT", PS_META_MULTI, "folder for comment", NULL);15 psMetadataAdd (header, PS_LIST_HEAD, "HISTORY", PS_META_MULTI, "folder for history", NULL);16 28 header = psFitsReadHeader (header, file); 17 psImage *image = psFitsReadImage (NULL, file, region, 0);29 image = psFitsReadImage (NULL, file, region, 0); 18 30 psFree (file); 19 31 … … 25 37 psMetadataAdd (config, PS_LIST_TAIL, "GAIN", PS_META_F32 | PS_META_REPLACE, "gain value used", GAIN); 26 38 27 imdata->image = image;28 imdata->header = header;29 30 39 // load the noise image if it is supplied, otherwise build from input 31 40 char *noiseName = psMetadataLookupSTR (&status, config, "NOISE"); 32 41 if (status == true) { 33 42 file = psFitsAlloc (noiseName); 34 imdata->noise = psFitsReadImage (NULL, file, region, 0);43 noise = psFitsReadImage (NULL, file, region, 0); 35 44 psFree (file); 36 45 } else { 37 46 psScalar *value = psScalarAlloc (1.0 / GAIN, PS_TYPE_F64); 38 imdata->noise = BinaryOp (NULL, imdata->image, '/', value);47 noise = BinaryOp (NULL, image, '/', value); 39 48 psFree (value); 40 49 41 50 psScalar *value = psScalarAlloc (PS_SQR(RDNOISE/GAIN), PS_TYPE_F64); 42 imdata->noise = BinaryOp (imdata->noise, imdata->noise, '+', value);51 noise = BinaryOp (noise, noise, '+', value); 43 52 psFree (value); 44 53 } … … 47 56 if (status == true) { 48 57 file = psFitsAlloc (maskName); 49 imdata->mask = psFitsReadImage (NULL, file, region, 0);50 // check if U8 & force?58 mask = psFitsReadImage (NULL, file, region, 0); 59 // require U8 51 60 psFree (file); 52 61 } else { 53 imdata->mask = psImageAlloc (image->numCols, image->numRows, PS_TYPE_U8);62 mask = psImageAlloc (image->numCols, image->numRows, PS_TYPE_U8); 54 63 } 55 64 … … 58 67 psRegion *keep = psRegionAlloc (XBORDER, -XBORDER, YBORDER, -YBORDER); 59 68 keep = psRegionForImage (keep, image, keep); 60 psImageKeepRegion (imdata->mask, keep, 0x01); 69 psImageKeepRegion (mask, keep, 0x01); 70 71 // mask the saturated pixels 72 float SATURATE = psMetadataLookupF32 (&status, config, "SATURATE"); 73 for (int i = 0; i < image->numRows; i++) { 74 for (int j = 0; j < image->numCols; j++) { 75 if (image->data.F32[i][j] >= SATURATE) { 76 mask->data.U8[i][j] |= 0x02; 77 } 78 } 79 } 61 80 62 81 psLogMsg ("psphot", 3, "load data: %f sec\n", psTimerMark ("psphot")); 63 82 83 psImageData *imdata = psAlloc(sizeof(psImageData)); 84 imdata->image = image; 85 imdata->header = header; 86 imdata->noise = noise; 87 imdata->mask = mask; 88 64 89 return (true); 65 90 } -
trunk/psphot/src/source_moments.c
r4215 r4216 17 17 sources->n = 0; 18 18 19 // this should use ROBUST not SAMPLE median, but it is broken20 19 for (int i = 0; i < peaks->n; i++) { 21 // provide the user arguments as metadata?22 psSource *source = pmSourceDefinePixels (imdata, (psPeak *)peaks->data[i], OUTER);23 if (source == NULL) continue;20 // create a new source, add peak 21 psSource *source = pmSourceAlloc(); 22 source->peak = (psPeak *)peaks->data[i]; 24 23 24 // allocate image, noise, mask arrays for each peak (square of radius OUTER) 25 pmSourceDefinePixels (source, imdata, source->peak->x, source->peak->y, OUTER); 26 27 // this should use ROBUST not SAMPLE median, but it is broken 25 28 pmSourceLocalSky_EAM (source, PS_STAT_SAMPLE_MEDIAN, INNER); 26 29 pmSourceMoments (source, RADIUS);
Note:
See TracChangeset
for help on using the changeset viewer.
