Changeset 10873
- Timestamp:
- Jan 1, 2007, 11:05:46 AM (19 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/astrom/pmAstrometryWCS.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/astrom/pmAstrometryWCS.c
r10859 r10873 7 7 * @author EAM, IfA 8 8 * 9 * @version $Revision: 1.1 4$ $Name: not supported by cvs2svn $10 * @date $Date: 200 6-12-30 03:27:19$9 * @version $Revision: 1.15 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2007-01-01 21:05:46 $ 11 11 * 12 12 * Copyright 2006 Institute for Astronomy, University of Hawaii … … 48 48 // convert toFPA / toSky components to pmAstromWCS 49 49 // tolerance is convergence for inversion of non-linear terms in pixels 50 bool pmAstromWriteWCS (psMetadata *header, const pmFPA *fpa, const pmChip *chip, floattol)50 bool pmAstromWriteWCS (psMetadata *header, const pmFPA *fpa, const pmChip *chip, double tol) 51 51 { 52 52 // XXX require chip->toFPA->x->nX == chip->toFPA->x->nY … … 95 95 96 96 // convert chip->toFPA components to bilevel WCS 97 bool pmAstromWriteBilevelChip (psMetadata *header, const pmChip *chip, floattol)97 bool pmAstromWriteBilevelChip (psMetadata *header, const pmChip *chip, double tol) 98 98 { 99 99 pmAstromWCS *wcs = pmAstromWCSBilevelChipFromFPA (chip, tol); … … 107 107 108 108 // convert fpa->toTPA, fpa->toSky components to bilevel WCS 109 bool pmAstromWriteBilevelMosaic (psMetadata *header, const pmFPA *fpa, floattol)109 bool pmAstromWriteBilevelMosaic (psMetadata *header, const pmFPA *fpa, double tol) 110 110 { 111 111 pmAstromWCS *wcs = pmAstromWCSBilevelMosaicFromFPA (fpa, tol); … … 198 198 // XXX add check for CROTA2 199 199 int fitOrder = psMetadataLookupS32 (&isPoly, header, "NPLYTERM"); 200 psMetadataLookupF 32(&pcKeys, header, "PC001001");201 psMetadataLookupF 32(&cdKeys, header, "CD1_1");200 psMetadataLookupF64 (&pcKeys, header, "PC001001"); 201 psMetadataLookupF64 (&cdKeys, header, "CD1_1"); 202 202 203 203 if (cdKeys && pcKeys) { … … 231 231 // and then define a transformation from degrees to degrees 232 232 233 wcs->crval1 = psMetadataLookupF 32(&status, header, "CRVAL1");234 wcs->crval2 = psMetadataLookupF 32(&status, header, "CRVAL2");235 wcs->crpix1 = psMetadataLookupF 32(&status, header, "CRPIX1");236 wcs->crpix2 = psMetadataLookupF 32(&status, header, "CRPIX2");233 wcs->crval1 = psMetadataLookupF64 (&status, header, "CRVAL1"); 234 wcs->crval2 = psMetadataLookupF64 (&status, header, "CRVAL2"); 235 wcs->crpix1 = psMetadataLookupF64 (&status, header, "CRPIX1"); 236 wcs->crpix2 = psMetadataLookupF64 (&status, header, "CRPIX2"); 237 237 wcs->toSky = psProjectionAlloc (wcs->crval1*PM_RAD_DEG, wcs->crval2*PM_RAD_DEG, PM_RAD_DEG, PM_RAD_DEG, type); 238 238 239 239 // test the CDELTi varient 240 240 if (pcKeys) { 241 wcs->cdelt1 = psMetadataLookupF 32(&status, header, "CDELT1");242 wcs->cdelt2 = psMetadataLookupF 32(&status, header, "CDELT2");241 wcs->cdelt1 = psMetadataLookupF64 (&status, header, "CDELT1"); 242 wcs->cdelt2 = psMetadataLookupF64 (&status, header, "CDELT2"); 243 243 244 244 // test the CROTAi varient: 245 245 // XXX double check lambda.. 246 double rotate = psMetadataLookupF 32(&status, header, "CROTA2");246 double rotate = psMetadataLookupF64 (&status, header, "CROTA2"); 247 247 if (status) { 248 248 wcs->trans->x->coeff[1][0] = +wcs->cdelt1 * cos(rotate*PM_RAD_DEG); // == PC1_1 … … 254 254 255 255 // test the PC00i00j varient: 256 wcs->trans->x->coeff[1][0] = wcs->cdelt1 * psMetadataLookupF 32(&status, header, "PC001001"); // == PC1_1257 wcs->trans->x->coeff[0][1] = wcs->cdelt2 * psMetadataLookupF 32(&status, header, "PC001002"); // == PC1_2258 wcs->trans->y->coeff[1][0] = wcs->cdelt1 * psMetadataLookupF 32(&status, header, "PC002001"); // == PC2_1259 wcs->trans->y->coeff[0][1] = wcs->cdelt2 * psMetadataLookupF 32(&status, header, "PC002002"); // == PC2_2256 wcs->trans->x->coeff[1][0] = wcs->cdelt1 * psMetadataLookupF64 (&status, header, "PC001001"); // == PC1_1 257 wcs->trans->x->coeff[0][1] = wcs->cdelt2 * psMetadataLookupF64 (&status, header, "PC001002"); // == PC1_2 258 wcs->trans->y->coeff[1][0] = wcs->cdelt1 * psMetadataLookupF64 (&status, header, "PC002001"); // == PC2_1 259 wcs->trans->y->coeff[0][1] = wcs->cdelt2 * psMetadataLookupF64 (&status, header, "PC002002"); // == PC2_2 260 260 261 261 if (isPoly) { … … 272 272 } 273 273 sprintf (name, "PCA1X%1dY%1d", i, j); 274 wcs->trans->x->coeff[i][j] = pow(wcs->cdelt1, i) * pow(wcs->cdelt2, j) * psMetadataLookupF 32(&status, header, name);274 wcs->trans->x->coeff[i][j] = pow(wcs->cdelt1, i) * pow(wcs->cdelt2, j) * psMetadataLookupF64 (&status, header, name); 275 275 sprintf (name, "PCA2X%1dY%1d", i, j); 276 wcs->trans->y->coeff[i][j] = pow(wcs->cdelt1, i) * pow(wcs->cdelt2, j) * psMetadataLookupF 32(&status, header, name);276 wcs->trans->y->coeff[i][j] = pow(wcs->cdelt1, i) * pow(wcs->cdelt2, j) * psMetadataLookupF64 (&status, header, name); 277 277 } 278 278 } … … 285 285 wcs->cdelt1 = 1.0; 286 286 wcs->cdelt2 = 1.0; 287 wcs->trans->x->coeff[1][0] = psMetadataLookupF 32(&status, header, "CD1_1"); // == PC1_1288 wcs->trans->x->coeff[0][1] = psMetadataLookupF 32(&status, header, "CD1_2"); // == PC1_2289 wcs->trans->y->coeff[1][0] = psMetadataLookupF 32(&status, header, "CD2_1"); // == PC2_1290 wcs->trans->y->coeff[0][1] = psMetadataLookupF 32(&status, header, "CD2_2"); // == PC2_2287 wcs->trans->x->coeff[1][0] = psMetadataLookupF64 (&status, header, "CD1_1"); // == PC1_1 288 wcs->trans->x->coeff[0][1] = psMetadataLookupF64 (&status, header, "CD1_2"); // == PC1_2 289 wcs->trans->y->coeff[1][0] = psMetadataLookupF64 (&status, header, "CD2_1"); // == PC2_1 290 wcs->trans->y->coeff[0][1] = psMetadataLookupF64 (&status, header, "CD2_2"); // == PC2_2 291 291 return wcs; 292 292 } … … 328 328 329 329 // test the PC00i00j varient: 330 psMetadataAddF 32(header, PS_LIST_TAIL, "PC001001", PS_META_REPLACE, "", wcs->trans->x->coeff[1][0] / cdelt1); // == PC1_1331 psMetadataAddF 32(header, PS_LIST_TAIL, "PC001002", PS_META_REPLACE, "", wcs->trans->x->coeff[0][1] / cdelt2); // == PC1_2332 psMetadataAddF 32(header, PS_LIST_TAIL, "PC002001", PS_META_REPLACE, "", wcs->trans->y->coeff[1][0] / cdelt1); // == PC2_1333 psMetadataAddF 32(header, PS_LIST_TAIL, "PC002002", PS_META_REPLACE, "", wcs->trans->y->coeff[0][1] / cdelt2); // == PC2_2330 psMetadataAddF64 (header, PS_LIST_TAIL, "PC001001", PS_META_REPLACE, "", wcs->trans->x->coeff[1][0] / cdelt1); // == PC1_1 331 psMetadataAddF64 (header, PS_LIST_TAIL, "PC001002", PS_META_REPLACE, "", wcs->trans->x->coeff[0][1] / cdelt2); // == PC1_2 332 psMetadataAddF64 (header, PS_LIST_TAIL, "PC002001", PS_META_REPLACE, "", wcs->trans->y->coeff[1][0] / cdelt1); // == PC2_1 333 psMetadataAddF64 (header, PS_LIST_TAIL, "PC002002", PS_META_REPLACE, "", wcs->trans->y->coeff[0][1] / cdelt2); // == PC2_2 334 334 335 335 // Elixir-style polynomial terms … … 345 345 continue; 346 346 sprintf (name, "PCA1X%1dY%1d", i, j); 347 psMetadataAddF 32(header, PS_LIST_TAIL, name, PS_META_REPLACE, "", wcs->trans->x->coeff[i][j] / pow(wcs->cdelt1, i) / pow(wcs->cdelt2, j));347 psMetadataAddF64 (header, PS_LIST_TAIL, name, PS_META_REPLACE, "", wcs->trans->x->coeff[i][j] / pow(wcs->cdelt1, i) / pow(wcs->cdelt2, j)); 348 348 sprintf (name, "PCA2X%1dY%1d", i, j); 349 psMetadataAddF 32(header, PS_LIST_TAIL, name, PS_META_REPLACE, "", wcs->trans->y->coeff[i][j] / pow(wcs->cdelt1, i) / pow(wcs->cdelt2, j));349 psMetadataAddF64 (header, PS_LIST_TAIL, name, PS_META_REPLACE, "", wcs->trans->y->coeff[i][j] / pow(wcs->cdelt1, i) / pow(wcs->cdelt2, j)); 350 350 } 351 351 } … … 390 390 } 391 391 392 // scale from FPA to TPA (degrees / micron)392 // scale from TPA (microns) to degrees 393 393 double pdelt1 = cdelt1 / pixelScale; 394 394 double pdelt2 = cdelt2 / pixelScale; 395 float rX = 1.0; 396 float rY = 1.0; 397 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); 395 396 // projection from TPA (linear microns) to SKY (radians) 397 psProjection *toSky = psProjectionAlloc (wcs->toSky->R, wcs->toSky->D, PM_RAD_DEG*pdelt1, PM_RAD_DEG*pdelt2, wcs->toSky->type); 400 398 401 399 if (fpa->toSky == NULL) { 402 400 fpa->toTPA = psPlaneTransformIdentity (1); 403 401 fpa->fromTPA = psPlaneTransformIdentity (1); 404 fpa->toTPA->x->coeff[1][0] = pdelt1;405 fpa->toTPA->y->coeff[0][1] = pdelt2;406 fpa->fromTPA->x->coeff[1][0] = 1.0 / pdelt1;407 fpa->fromTPA->y->coeff[0][1] = 1.0 / pdelt2;408 402 fpa->toSky = toSky; 409 403 } else { … … 420 414 // convert from pixels on this chip to pixels on reference chip 421 415 // rX has units of refpixels / pixel 422 rX = pdelt1 / fpa->toTPA->x->coeff[1][0];423 rY = pdelt2 / fpa->toTPA->y->coeff[0][1];416 double rX = toSky->Xs / fpa->toSky->Xs; 417 double rY = toSky->Ys / fpa->toSky->Ys; 424 418 for (int i = 0; i <= fpa->toTPA->x->nX; i++) { 425 419 for (int j = 0; j <= fpa->toTPA->x->nY; j++) { … … 527 521 // convert toFPA / toSky components to pmAstromWCS 528 522 // tolerance is allowed error in center solution in pixels 529 pmAstromWCS *pmAstromWCSfromFPA (const pmFPA *fpa, const pmChip *chip, floattol)523 pmAstromWCS *pmAstromWCSfromFPA (const pmFPA *fpa, const pmChip *chip, double tol) 530 524 { 531 525 … … 549 543 psPlane *center = psPlaneTransformGetCenter (chip->toFPA, tol); 550 544 545 // create wcs transform from toFPA, result converts pixels to microns 551 546 // adjust wcs transform to use center as reference coordinate 552 547 psPlaneTransformSetCenter (wcs->trans, chip->toFPA, center->x, center->y); … … 557 552 psFree (center); 558 553 559 // cdelt1,2 convert from pixels->degrees 560 double cdelt1 = fpa->toTPA->x->coeff[1][0]; 561 double cdelt2 = fpa->toTPA->y->coeff[0][1]; 562 wcs->cdelt1 = cdelt1; 563 wcs->cdelt2 = cdelt2; 564 565 // convert wcs->trans to a matrix which yields L,M in pixels 554 // pdelt1,2 converts from microns->degrees 555 double pdelt1 = fpa->toSky->Xs * PM_DEG_RAD; 556 double pdelt2 = fpa->toSky->Ys * PM_DEG_RAD; 557 558 // cdelt1,2 converts from pixels->degrees 559 wcs->cdelt1 = pdelt1 * hypot (chip->toFPA->x->coeff[1][0], chip->toFPA->x->coeff[0][1]); 560 wcs->cdelt2 = pdelt2 * hypot (chip->toFPA->y->coeff[1][0], chip->toFPA->y->coeff[0][1]); 561 562 // convert wcs->trans to a matrix which yields L,M in degrees 566 563 for (int i = 0; i <= wcs->trans->x->nX; i++) { 567 564 for (int j = 0; j <= wcs->trans->x->nX; j++) { 568 wcs->trans->x->coeff[i][j] *= cdelt1;569 wcs->trans->y->coeff[i][j] *= cdelt2;565 wcs->trans->x->coeff[i][j] *= pdelt1; 566 wcs->trans->y->coeff[i][j] *= pdelt2; 570 567 } 571 568 } … … 580 577 581 578 // convert the chip-level toFPA to a wcs polynomial transformation 582 pmAstromWCS *pmAstromWCSBilevelChipFromFPA (const pmChip *chip, floattol)579 pmAstromWCS *pmAstromWCSBilevelChipFromFPA (const pmChip *chip, double tol) 583 580 { 584 581 // XXX require chip->toFPA->x->nX == chip->toFPA->x->nY … … 616 613 617 614 // convert the fpa-level toTPA, toSky to a wcs polynomial transformation 618 pmAstromWCS *pmAstromWCSBilevelMosaicFromFPA (const pmFPA *fpa, floattol)615 pmAstromWCS *pmAstromWCSBilevelMosaicFromFPA (const pmFPA *fpa, double tol) 619 616 { 620 617 // XXX require fpa->toTPA->x->nX == fpa->toTPA->x->nY
Note:
See TracChangeset
for help on using the changeset viewer.
