Changeset 10829
- Timestamp:
- Dec 24, 2006, 3:49:50 PM (19 years ago)
- Location:
- trunk/psModules/src
- Files:
-
- 5 edited
-
astrom/pmAstrometryDistortion.c (modified) (8 diffs)
-
astrom/pmAstrometryObjects.c (modified) (8 diffs)
-
astrom/pmAstrometryObjects.h (modified) (5 diffs)
-
astrom/pmAstrometryWCS.c (modified) (8 diffs)
-
objects/pmSourceIO.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/astrom/pmAstrometryDistortion.c
r10825 r10829 7 7 * @author EAM, IfA 8 8 * 9 * @version $Revision: 1. 8$ $Name: not supported by cvs2svn $10 * @date $Date: 2006-12-2 2 21:23:06$9 * @version $Revision: 1.9 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2006-12-25 01:49:49 $ 11 11 * 12 12 * Copyright 2006 Institute for Astronomy, University of Hawaii … … 50 50 } 51 51 52 psArray *pmAstromMeasureGradients(psArray *grad s, psArray *rawstars, psArray *refstars, psArray *matches, psMetadata *config)52 psArray *pmAstromMeasureGradients(psArray *gradients, psArray *rawstars, psArray *refstars, psArray *matches, psMetadata *config) 53 53 { 54 54 55 if (grad s == NULL) {56 grad s = psArrayAllocEmpty (100);55 if (gradients == NULL) { 56 gradients = psArrayAllocEmpty (100); 57 57 } 58 58 … … 141 141 grad->dTPdM.y = local->coeff[0][1]; 142 142 143 psArrayAdd (grad s, 100, grad);144 } 145 } 146 return grad s;143 psArrayAdd (gradients, 100, grad); 144 } 145 } 146 return gradients; 147 147 } 148 148 149 bool pmAstromFitDistortion(pmFPA *fpa, psArray *grad s, psMetadata *config)149 bool pmAstromFitDistortion(pmFPA *fpa, psArray *gradients, psMetadata *config) 150 150 { 151 151 … … 154 154 155 155 // assign the gradient elements to psVectors for fitting 156 psVector *dPdL = psVectorAlloc (grad s->n, PS_TYPE_F32);157 psVector *dQdL = psVectorAlloc (grad s->n, PS_TYPE_F32);158 psVector *dPdM = psVectorAlloc (grad s->n, PS_TYPE_F32);159 psVector *dQdM = psVectorAlloc (grad s->n, PS_TYPE_F32);160 psVector *L = psVectorAlloc (grad s->n, PS_TYPE_F32);161 psVector *M = psVectorAlloc (grad s->n, PS_TYPE_F32);162 163 for (int i = 0; i < grad s->n; i++) {164 165 pmAstromGradient *grad = grad s->data[i];156 psVector *dPdL = psVectorAlloc (gradients->n, PS_TYPE_F32); 157 psVector *dQdL = psVectorAlloc (gradients->n, PS_TYPE_F32); 158 psVector *dPdM = psVectorAlloc (gradients->n, PS_TYPE_F32); 159 psVector *dQdM = psVectorAlloc (gradients->n, PS_TYPE_F32); 160 psVector *L = psVectorAlloc (gradients->n, PS_TYPE_F32); 161 psVector *M = psVectorAlloc (gradients->n, PS_TYPE_F32); 162 163 for (int i = 0; i < gradients->n; i++) { 164 165 pmAstromGradient *grad = gradients->data[i]; 166 166 167 167 dPdL->data.F32[i] = grad->dTPdL.x; … … 176 176 177 177 psStats *stats = psStatsAlloc (PS_STAT_SAMPLE_MEDIAN | PS_STAT_SAMPLE_STDEV); 178 psVector *mask = psVectorAlloc (grad s->n, PS_TYPE_MASK);178 psVector *mask = psVectorAlloc (gradients->n, PS_TYPE_MASK); 179 179 psVectorInit (mask, 0); 180 180 … … 185 185 186 186 // set masks based on fpa->toTP 187 for (int i = 0; i < fpa->toTPA->x->nX; i++) {188 for (int j = 0; j < fpa->toTPA->x->nY; j++) {187 for (int i = 0; i <= fpa->toTPA->x->nX; i++) { 188 for (int j = 0; j <= fpa->toTPA->x->nY; j++) { 189 189 if (fpa->toTPA->x->mask[i][j]) { 190 localX->mask[i-1][j] = 1; 191 localY->mask[i][j-1] = 1; 190 if ((i > 0) && (i < fpa->toTPA->x->nX)) { 191 localX->mask[i-1][j] = 1; 192 } 193 if ((j > 0) && (j < fpa->toTPA->y->nY)) { 194 localY->mask[i][j-1] = 1; 195 } 192 196 } 193 197 } … … 247 251 psVector *dQdMf = psPolynomial2DEvalVector (localY, L, M); 248 252 249 FILE *f = fopen ("grad s.dat", "w");253 FILE *f = fopen ("gradients.dat", "w"); 250 254 for (int i = 0; i < dPdLf->n; i++) { 251 255 fprintf (f, "%f %f | %f %f %f %f | %f %f %f %f\n", … … 290 294 psFree (mask); 291 295 296 // XXX need to reset the fromFPA terms here 297 298 292 299 return true; 293 300 } -
trunk/psModules/src/astrom/pmAstrometryObjects.c
r10780 r10829 8 8 * @author EAM, IfA 9 9 * 10 * @version $Revision: 1. 19$ $Name: not supported by cvs2svn $11 * @date $Date: 2006-12- 17 09:45:20$10 * @version $Revision: 1.20 $ $Name: not supported by cvs2svn $ 11 * @date $Date: 2006-12-25 01:49:49 $ 12 12 * 13 13 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 121 121 122 122 /************************************************************************************************************/ 123 123 // macro to generate code for radius match function based on desired member 124 // radius is in units of matching member (eg, pixels for chip, microns for FP, etc) 124 125 #define MAKE_ASTROM_RADIUS(FUNC, MEMBER) \ 125 126 psArray *FUNC( \ 126 127 const psArray *st1, \ 127 128 const psArray *st2, \ 128 const psMetadata *config) \129 double RADIUS) \ 129 130 { \ 130 131 PS_ASSERT_PTR_NON_NULL(st1, NULL); \ 131 132 PS_ASSERT_PTR_NON_NULL(st2, NULL); \ 132 PS_ASSERT_PTR_NON_NULL(config, NULL); \133 133 \ 134 134 assert(st1->n == 0 || pmIsAstromObj(st1->data[0])); \ 135 135 assert(st2->n == 0 || pmIsAstromObj(st2->data[0])); \ 136 136 \ 137 bool status = false; \138 double RADIUS = psMetadataLookupF32 (&status, config, "PSASTRO.MATCH.RADIUS"); \139 if (!status) { \140 psError(PS_ERR_IO, false, "Failed to lookup matching radius"); \141 return NULL; \142 } \143 137 /* sort both lists by X coord; st1 first */ \ 144 138 psVector *x1 = psVectorAlloc(st1->n, PS_TYPE_F64); \ … … 186 180 */ 187 181 MAKE_ASTROM_RADIUS(pmAstromRadiusMatch, FP) 182 MAKE_ASTROM_RADIUS(pmAstromRadiusMatchFP, FP) 188 183 MAKE_ASTROM_RADIUS(pmAstromRadiusMatchTP, TP) 189 184 MAKE_ASTROM_RADIUS(pmAstromRadiusMatchChip, chip) 190 185 191 186 /****************************************************************************** 192 pmAstromMatchFit(map, raw, ref, match, config): take two matched star lists187 pmAstromMatchFit(map, raw, ref, match, stats): take two matched star lists 193 188 and fit a psPlaneTransform between them 194 189 ******************************************************************************/ 195 boolpmAstromMatchFit(190 pmAstromFitResults *pmAstromMatchFit( 196 191 psPlaneTransform *map, 197 192 psArray *raw, 198 193 psArray *ref, 199 194 psArray *match, 200 psMetadata *config, 201 psMetadata *updates) 195 psStats *stats) 202 196 { 203 197 PS_ASSERT_PTR_NON_NULL(map, NULL); … … 205 199 PS_ASSERT_PTR_NON_NULL(ref, NULL); 206 200 PS_ASSERT_PTR_NON_NULL(match, NULL); 207 PS_ASSERT_PTR_NON_NULL(config, NULL); 208 209 bool status; 210 pmAstromObj *rawStar, *refStar; 211 pmAstromMatch *pair; 212 213 // XXX EAM : clip fit seems to only work for F32! 214 // XXX EAM : clip fit fails to handle NULL error 201 PS_ASSERT_PTR_NON_NULL(stats, NULL); 202 203 // reassign values for clip fit 204 // XXX set wt based on mag error? 215 205 psVector *X = psVectorAlloc (match->n, PS_TYPE_F32); 216 206 psVector *Y = psVectorAlloc (match->n, PS_TYPE_F32); … … 220 210 // take the matched stars, first fit 221 211 for (int i = 0; i < match->n; i++) { 222 223 pair = match->data[i]; 224 rawStar = raw->data[pair->raw]; 225 refStar = ref->data[pair->ref]; 212 pmAstromMatch *pair = match->data[i]; 213 pmAstromObj *rawStar = raw->data[pair->raw]; 214 pmAstromObj *refStar = ref->data[pair->ref]; 226 215 227 216 X->data.F32[i] = rawStar->chip->x; … … 238 227 psVectorInit (mask, 0); 239 228 240 double dX, dY;241 242 psStats *stats = psStatsAlloc (PS_STAT_CLIPPED_MEAN | PS_STAT_CLIPPED_STDEV);243 stats->clipSigma = psMetadataLookupF32 (&status, config, "PSASTRO.CHIP.NSIGMA");244 stats->clipIter = 1;245 int clipIter = psMetadataLookupS32 (&status, config, "PSASTRO.CHIP.NITER");246 // we run 'clipIter' cycles clipping in each of x and y229 pmAstromFitResults *results = pmAstromFitResultsAlloc(); 230 results->xStats = psStatsAlloc (PS_STAT_NONE); 231 results->yStats = psStatsAlloc (PS_STAT_NONE); 232 *results->xStats = *stats; 233 *results->yStats = *stats; 234 results->xStats->clipIter = 1; 235 results->yStats->clipIter = 1; 247 236 248 237 // fit chip-to-FPA transformation 249 // XXX should force x->n and y->n to be the same 250 for (int i = 0; i < clipIter; i++) { 251 psVectorClipFitPolynomial2D (map->x, stats, mask, 0xff, x, wt, X, Y); 252 psLogMsg ("psModules.astrom", 3, "x resid: %f +/- %f (%ld of %ld)\n", stats->clippedMean, stats->clippedStdev, stats->clippedNvalues, x->n); 253 dX = stats->clippedStdev; 254 255 psVectorClipFitPolynomial2D (map->y, stats, mask, 0xff, y, wt, X, Y); 256 psLogMsg ("psModules.astrom", 3, "y resid: %f +/- %f (%ld of %ld)\n", stats->clippedMean, stats->clippedStdev, stats->clippedNvalues, y->n); 257 dY = stats->clippedStdev; 258 } 259 260 // XXXX test dump output code 261 # if (0) 262 psVector *xfit = psPolynomial2DEvalVector(map->x, X, Y); 263 psVector *yfit = psPolynomial2DEvalVector(map->y, X, Y); 264 FILE *f = fopen ("match.dat", "w"); 265 for (int i = 0; i < x->n; i++) { 266 fprintf (f, "%3d %1d %1d %f %f %f %f %f %f\n", 267 i, mask->data.U8[i], mask->data.U8[i], 268 X->data.F32[i], Y->data.F32[i], 269 xfit->data.F32[i], yfit->data.F32[i], 270 x->data.F32[i], y->data.F32[i]); 271 } 272 fclose (f); 273 psFree (xfit); 274 psFree (yfit); 275 # endif 276 277 // XXX this is somewhat ad-hoc: we need to be sure these values are in arcsec 278 // and we need to set NASTRO = 0 if we have a failure, etc 279 // XXX this is a somewhat silly place to write these updates... 280 if (updates) { 281 psMetadataAddF32 (updates, PS_LIST_TAIL, "NASTRO", PS_META_REPLACE, "", stats->clippedNvalues); 282 psMetadataAddF32 (updates, PS_LIST_TAIL, "CERROR", PS_META_REPLACE, "", hypot(dX, dY)); 283 psMetadataAddF32 (updates, PS_LIST_TAIL, "CPRECISE", PS_META_REPLACE, "", hypot(dX, dY)/sqrt(PS_MIN(x->n, y->n))); 284 psMetadataAddF32 (updates, PS_LIST_TAIL, "EQUINOX", PS_META_REPLACE, "", 2000.0); // XXX this is bogus: must be defined somewhere 285 } 286 287 float maxError = psMetadataLookupF32 (&status, config, "PSASTRO.MAX.ERROR"); 288 float astError = hypot(dX, dY); 289 int minNstar = psMetadataLookupS32 (&status, config, "PSASTRO.MIN.NSTAR"); 290 int astNstar = stats->clippedNvalues; 291 292 if (astError > maxError) { 293 psError(PS_ERR_UNKNOWN, true, "residual error is too large, failed to find a solution: %f > %f", astError, maxError); 294 return NULL; 295 } 296 if (stats->clippedNvalues < minNstar) { 297 psError(PS_ERR_UNKNOWN, true, "solution uses too few stars: %d < %d", astNstar, minNstar); 298 return NULL; 299 } 300 psLogMsg ("psModules.astrom", 3, "astrometry solution: error: %f, Nstars: %d", astError, astNstar); 238 // we run 'clipIter' cycles clipping in each of x and y, with only one iteration each 239 for (int i = 0; i < stats->clipIter; i++) { 240 psVectorClipFitPolynomial2D (map->x, results->xStats, mask, 0xff, x, wt, X, Y); 241 psTrace ("psModules.astrom", 3, "x resid: %f +/- %f (%ld of %ld)\n", stats->clippedMean, stats->clippedStdev, stats->clippedNvalues, x->n); 242 243 psVectorClipFitPolynomial2D (map->y, results->yStats, mask, 0xff, y, wt, X, Y); 244 psTrace ("psModules.astrom", 3, "y resid: %f +/- %f (%ld of %ld)\n", stats->clippedMean, stats->clippedStdev, stats->clippedNvalues, y->n); 245 } 246 results->xStats->clipIter = stats->clipIter; 247 results->yStats->clipIter = stats->clipIter; 301 248 302 249 psFree (x); … … 305 252 psFree (Y); 306 253 psFree (wt); 307 psFree (stats);308 254 psFree (mask); 309 255 310 return ( map);256 return (results); 311 257 } 312 258 … … 377 323 378 324 return (stats); 325 } 326 327 /****************************************************************************** 328 pmAstromFitResultsFree(stats) 329 ******************************************************************************/ 330 static void pmAstromFitResultsFree(pmAstromFitResults *results) 331 { 332 if (results == NULL) 333 return; 334 psFree (results->xStats); 335 psFree (results->yStats); 336 return; 337 } 338 339 /****************************************************************************** 340 pmAstromFitResultsAlloc() 341 ******************************************************************************/ 342 pmAstromFitResults *pmAstromFitResultsAlloc(void) 343 { 344 pmAstromFitResults *results = psAlloc (sizeof(pmAstromFitResults)); 345 psMemSetDeallocator (results, (psFreeFunc)pmAstromFitResultsFree); 346 347 results->xStats = NULL; 348 results->yStats = NULL; 349 results->nMatch = 0; 350 results->nSigma = 0; 351 352 return (results); 379 353 } 380 354 -
trunk/psModules/src/astrom/pmAstrometryObjects.h
r10780 r10829 8 8 * @author EAM, IfA 9 9 * 10 * @version $Revision: 1.1 3$ $Name: not supported by cvs2svn $11 * @date $Date: 2006-12- 17 09:45:20$10 * @version $Revision: 1.14 $ $Name: not supported by cvs2svn $ 11 * @date $Date: 2006-12-25 01:49:49 $ 12 12 * 13 13 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 79 79 pmAstromStats; 80 80 81 /* 82 * 83 * If the two sets of coordinates are expected to agree very well (ie, the 84 * current best-guess astrometric solution is quite close to the radius. The 85 * following function accepts two sets of pmAstromObj sources and determines the 86 * matched objects between the two lists. The input sources must have been 87 * projected to the Focal Plane coordinates (pmAstromObj.FP), and the supplied 88 * options entry must contain the desired match radius (keyword: 89 * ASTROM.MATCH.RADIUS). The output consists an array of pmAstromMatch values, 90 * defined below. 81 typedef struct 82 { 83 psStats *xStats; 84 psStats *yStats; 85 int nMatch; ///< 86 double nSigma; ///< 87 } 88 pmAstromFitResults; 89 90 /* 91 * 92 * If the two sets of coordinates are expected to agree very well (ie, the current best-guess 93 * astrometric solution is quite close to reality), perform a match based on a simple radius 94 * test. The following functions accept two sets of pmAstromObj sources and determines the 95 * matched objects between the two lists using coordinates of the desired depth (depending on 96 * the function). The input and reference sources must have been projected to the desired depth 97 * (eg, for Focal Plane coordinates, to pmAstromObj.FP). The specified radius must be in the 98 * units for the matching depth (chip: pixels, focal plane: microns, tangent plane: 99 * degrees. The output consists an array of pmAstromMatch values, defined above. 91 100 * 92 101 */ … … 94 103 const psArray *st1, 95 104 const psArray *st2, 96 const psMetadata *config 105 double RADIUS 106 ); 107 psArray *pmAstromRadiusMatchFP( 108 const psArray *st1, 109 const psArray *st2, 110 double RADIUS 97 111 ); 98 112 psArray *pmAstromRadiusMatchTP( 99 113 const psArray *st1, 100 114 const psArray *st2, 101 const psMetadata *config115 double RADIUS 102 116 ); 103 117 psArray *pmAstromRadiusMatchChip( 104 118 const psArray *st1, 105 119 const psArray *st2, 106 const psMetadata *config120 double RADIUS 107 121 ); 108 122 … … 270 284 */ 271 285 286 pmAstromFitResults *pmAstromFitResultsAlloc(void); 272 287 273 288 /* … … 312 327 * 313 328 */ 314 boolpmAstromMatchFit(329 pmAstromFitResults *pmAstromMatchFit( 315 330 psPlaneTransform *map, 316 psArray * st1,317 psArray * st2,331 psArray *raw, 332 psArray *ref, 318 333 psArray *match, 319 psMetadata *config, 320 psMetadata *updates 334 psStats *stats 321 335 ); 322 336 -
trunk/psModules/src/astrom/pmAstrometryWCS.c
r10825 r10829 7 7 * @author EAM, IfA 8 8 * 9 * @version $Revision: 1.1 1$ $Name: not supported by cvs2svn $10 * @date $Date: 2006-12-2 2 21:23:06$9 * @version $Revision: 1.12 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2006-12-25 01:49:49 $ 11 11 * 12 12 * Copyright 2006 Institute for Astronomy, University of Hawaii … … 32 32 33 33 // interpret header WCS (only handles traditional WCS for the moment) 34 // p lateScale is nominal physical scale on tangent plane (radians / TPA physical units)35 bool pmAstromReadWCS (pmFPA *fpa, pmChip *chip, const psMetadata *header, double p lateScale)34 // pixelScale is microns per pixel 35 bool pmAstromReadWCS (pmFPA *fpa, pmChip *chip, const psMetadata *header, double pixelScale) 36 36 { 37 37 pmAstromWCS *wcs = pmAstromWCSfromHeader (header); … … 40 40 } 41 41 42 bool status = pmAstromWCStoFPA (fpa, chip, wcs, p lateScale);42 bool status = pmAstromWCStoFPA (fpa, chip, wcs, pixelScale); 43 43 44 44 psFree (wcs); … … 67 67 68 68 // interpret chip header WCS as bilevel chip components 69 // plateScale is nominal physical scale on tangent plane (radians / TPA physical units)70 69 bool pmAstromReadBilevelChip (pmChip *chip, const psMetadata *header) 71 70 { … … 82 81 83 82 // convert toFPA / toSky components to traditional WCS 84 // plateScale is nominal physical scale on tangent plane (microns / arcsecond)85 83 bool pmAstromReadBilevelMosaic (pmFPA *fpa, const psMetadata *header) 86 84 { … … 359 357 360 358 // interpret header WCS (only handles traditional WCS for the moment) 361 // p lateScale is nominal physical scale on tangent plane (radians / TPA physical units)362 bool pmAstromWCStoFPA (pmFPA *fpa, pmChip *chip, const pmAstromWCS *wcs, double p lateScale)359 // pixelScale is the pixel size in microns per pixel 360 bool pmAstromWCStoFPA (pmFPA *fpa, pmChip *chip, const pmAstromWCS *wcs, double pixelScale) 363 361 { 364 362 psPlaneTransform *toFPA; … … 367 365 * wcs->trans, which will convert X,Y in pixels to L,M in degrees. we also have the following 368 366 * elements defined: 369 * type ( CTYPE)367 * type (projection type) 370 368 * crval1,2 (in RA,DEC degrees) 371 369 * crpix1,2 372 370 * cdelt1,2 (in degrees / pixel) 373 * p lateScale (radians / physical TPA units)371 * pixelScale (microns / pixel) 374 372 * 375 373 * now we convert wcs->trans to toFPA, which is different from wcs->trans in 3 important ways: 376 * 1) the output is in pixels (not degrees): divide by cdelt1,2 raised to an appropriate power374 * 1) the output is in microns (not degrees): divide by cdelt1,2 377 375 * 2) X,Y are applied directly, without an applied Xo,Yo offset 378 376 * 3) there is an allowed Lo,Mo term ([0][0] coefficients) 379 377 */ 380 378 381 // convert wcs->trans to a matrix which yields L,M in pixels382 double cdelt1 = hypot (wcs->trans->x->coeff[1][0], wcs->trans->x->coeff[0][1]);383 double cdelt2 = hypot (wcs->trans->y->coeff[1][0], wcs->trans->y->coeff[0][1]);384 for (int i = 0; i <= wcs->trans->x->nX; i++) {385 for (int j = 0; j <= wcs->trans->x->nX; j++) {386 wcs->trans->x->coeff[i][j] /= cdelt1;387 wcs->trans->y->coeff[i][j] /= cdelt2;388 }389 }390 391 379 // create transformation with 0,0 reference pixel 392 380 toFPA = psPlaneTransformSetCenter (NULL, wcs->trans, -wcs->crpix1, -wcs->crpix2); 393 381 394 // scale from FPA to TPA (microns / pixel) 395 double pdelt1 = cdelt1*PM_RAD_DEG / plateScale; 396 double pdelt2 = cdelt2*PM_RAD_DEG / plateScale; 382 // modify scale of toFPA to yield L,M in microns 383 double cdelt1 = hypot (toFPA->x->coeff[1][0], toFPA->x->coeff[0][1]); 384 double cdelt2 = hypot (toFPA->y->coeff[1][0], toFPA->y->coeff[0][1]); 385 for (int i = 0; i <= toFPA->x->nX; i++) { 386 for (int j = 0; j <= toFPA->x->nX; j++) { 387 toFPA->x->coeff[i][j] *= pixelScale/cdelt1; 388 toFPA->y->coeff[i][j] *= pixelScale/cdelt2; 389 } 390 } 391 392 // scale from FPA to TPA (degrees / micron) 393 double pdelt1 = cdelt1 / pixelScale; 394 double pdelt2 = cdelt2 / pixelScale; 397 395 float rX = 1.0; 398 396 float rY = 1.0; 399 397 400 // projection from TPA to SKY401 psProjection *toSky = psProjectionAlloc (wcs->toSky->R, wcs->toSky->D, plateScale, plateScale, wcs->toSky->type);398 // projection from TPA ("linear" degrees) to SKY (radians) 399 psProjection *toSky = psProjectionAlloc (wcs->toSky->R, wcs->toSky->D, PM_RAD_DEG, PM_RAD_DEG, wcs->toSky->type); 402 400 403 401 if (fpa->toSky == NULL) { … … 558 556 559 557 // cdelt1,2 convert from pixels->degrees 560 double cdelt1 = fpa->toTPA->x->coeff[1][0] *fpa->toSky->Xs*PM_DEG_RAD;561 double cdelt2 = fpa->toTPA->y->coeff[0][1] *fpa->toSky->Ys*PM_DEG_RAD;558 double cdelt1 = fpa->toTPA->x->coeff[1][0]; 559 double cdelt2 = fpa->toTPA->y->coeff[0][1]; 562 560 wcs->cdelt1 = cdelt1; 563 561 wcs->cdelt2 = cdelt2; -
trunk/psModules/src/objects/pmSourceIO.c
r10421 r10829 3 3 * @author EAM, IfA 4 4 * 5 * @version $Revision: 1.1 4$ $Name: not supported by cvs2svn $6 * @date $Date: 2006-12- 03 18:48:10 $5 * @version $Revision: 1.15 $ $Name: not supported by cvs2svn $ 6 * @date $Date: 2006-12-25 01:49:50 $ 7 7 * 8 8 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 256 256 if (phu) { 257 257 outhead = psMetadataCopy (NULL, phu->header); 258 259 // if we have mosaic-level astrometry information, add it here: 260 updates = psMetadataLookupPtr (&status, file->fpa->analysis, "PSASTRO.HEADER"); 261 if (updates) { 262 psMetadataCopy (outhead, updates); 263 } 264 258 265 psMetadataAddBool (outhead, PS_LIST_TAIL, "EXTEND", PS_META_REPLACE, "this file has extensions", true); 259 266 // XXX what is the EXTNAME??
Note:
See TracChangeset
for help on using the changeset viewer.
