Changeset 19513
- Timestamp:
- Sep 11, 2008, 3:08:49 PM (18 years ago)
- Location:
- trunk/psastro/src
- Files:
-
- 2 edited
-
psastroAnalysis.c (modified) (1 diff)
-
psastroAstromGuess.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psastro/src/psastroAnalysis.c
r19049 r19513 81 81 // psastroZeroPoint (config); 82 82 83 psastroAstromGuessCheck (config); 84 83 85 // XXX how do we specify stack astrometry? 84 86 // psastroStackAstrom (config, refs); -
trunk/psastro/src/psastroAstromGuess.c
r17933 r19513 1 1 # include "psastroInternal.h" 2 # define DEBUG 0 2 3 3 4 // this function loads the header WCS astrometry terms into the fpa terms and applies the … … 52 53 } 53 54 55 psVector *cornerL = psVectorAllocEmpty (100, PS_TYPE_F32); 56 psVector *cornerM = psVectorAllocEmpty (100, PS_TYPE_F32); 57 psVector *cornerP = psVectorAllocEmpty (100, PS_TYPE_F32); 58 psVector *cornerQ = psVectorAllocEmpty (100, PS_TYPE_F32); 59 psVector *cornerR = psVectorAllocEmpty (100, PS_TYPE_F32); 60 psVector *cornerD = psVectorAllocEmpty (100, PS_TYPE_F32); 61 54 62 pmFPA *fpa = input->fpa; 63 64 if (DEBUG) psastroDumpCorners ("corners.up.guess1.dat", "corners.dn.guess1.dat", fpa); 55 65 56 66 // load mosaic-level astrometry? … … 77 87 } 78 88 89 // report and save the current best guess for the chip 0,0 pixel coordinates 90 { 91 psPlane ptCH, ptFP, ptTP; 92 psSphere ptSky; 93 94 ptCH.x = 0; 95 ptCH.y = 0; 96 psPlaneTransformApply (&ptFP, chip->toFPA, &ptCH); 97 psPlaneTransformApply (&ptTP, fpa->toTPA, &ptFP); 98 psDeproject (&ptSky, &ptTP, fpa->toSky); 99 psLogMsg ("psastro", 3, "0,0 pix for chip %3d = %f,%f\n", view->chip, DEG_RAD*ptSky.r, DEG_RAD*ptSky.d); 100 101 psVectorAppend (cornerL, ptFP.x); 102 psVectorAppend (cornerM, ptFP.y); 103 psVectorAppend (cornerP, ptTP.x); 104 psVectorAppend (cornerQ, ptTP.y); 105 psVectorAppend (cornerR, ptSky.r); 106 psVectorAppend (cornerD, ptSky.d); 107 } 108 79 109 // apply the new WCS guess data to all of the data in the readouts 80 110 while ((cell = pmFPAviewNextCell (view, fpa, 1)) != NULL) { … … 85 115 while ((readout = pmFPAviewNextReadout (view, fpa, 1)) != NULL) { 86 116 if (! readout->data_exists) { continue; } 87 88 // report the current best guess for the cell 0,0 pixel coordinate89 {90 psPlane ptCH, ptFP, ptTP;91 psSphere ptSky;92 93 ptCH.x = 0;94 ptCH.y = 0;95 psPlaneTransformApply (&ptFP, chip->toFPA, &ptCH);96 psPlaneTransformApply (&ptTP, fpa->toTPA, &ptFP);97 psDeproject (&ptSky, &ptTP, fpa->toSky);98 psLogMsg ("psastro", 2, "0,0 pix for chip,cell %d,%d = %f,%f\n", view->chip, view->cell, DEG_RAD*ptSky.r, DEG_RAD*ptSky.d);99 }100 117 101 118 psArray *rawstars = psMetadataLookupPtr (NULL, readout->analysis, "PSASTRO.RAWSTARS"); … … 132 149 } 133 150 } 151 152 if (DEBUG) psastroDumpCorners ("corners.up.guess2.dat", "corners.dn.guess2.dat", fpa); 134 153 135 154 // how many total sources are available to us? … … 149 168 psMetadataAddF32 (recipe, PS_LIST_TAIL, "DEC_MIN", PS_META_REPLACE, "", DECmin); 150 169 psMetadataAddF32 (recipe, PS_LIST_TAIL, "DEC_MAX", PS_META_REPLACE, "", DECmax); 170 171 psMetadataAddVector (input->fpa->analysis, PS_LIST_TAIL, "CORNER.L", PS_META_REPLACE, "corner pixel", cornerL); 172 psMetadataAddVector (input->fpa->analysis, PS_LIST_TAIL, "CORNER.M", PS_META_REPLACE, "corner pixel", cornerM); 173 psMetadataAddVector (input->fpa->analysis, PS_LIST_TAIL, "CORNER.P", PS_META_REPLACE, "corner pixel", cornerP); 174 psMetadataAddVector (input->fpa->analysis, PS_LIST_TAIL, "CORNER.Q", PS_META_REPLACE, "corner pixel", cornerQ); 175 psMetadataAddVector (input->fpa->analysis, PS_LIST_TAIL, "CORNER.R", PS_META_REPLACE, "corner pixel", cornerR); 176 psMetadataAddVector (input->fpa->analysis, PS_LIST_TAIL, "CORNER.D", PS_META_REPLACE, "corner pixel", cornerD); 177 178 psFree (cornerL); 179 psFree (cornerM); 180 psFree (cornerP); 181 psFree (cornerQ); 182 psFree (cornerR); 183 psFree (cornerD); 151 184 152 185 psFree (view); … … 201 234 return true; 202 235 } 236 237 // we made a guess at the beginning; how does the guess compare with the result? 238 bool psastroAstromGuessCheck (pmConfig *config) { 239 240 bool status; 241 242 // select the input data sources 243 pmFPAfile *input = psMetadataLookupPtr (NULL, config->files, "PSASTRO.INPUT"); 244 if (!input) { 245 psError(PSASTRO_ERR_CONFIG, true, "Can't find input data"); 246 return false; 247 } 248 249 psVector *cornerLn = psVectorAllocEmpty (100, PS_TYPE_F32); 250 psVector *cornerMn = psVectorAllocEmpty (100, PS_TYPE_F32); 251 psVector *cornerPn = psVectorAllocEmpty (100, PS_TYPE_F32); 252 psVector *cornerQn = psVectorAllocEmpty (100, PS_TYPE_F32); 253 psVector *cornerRn = psVectorAllocEmpty (100, PS_TYPE_F32); 254 psVector *cornerDn = psVectorAllocEmpty (100, PS_TYPE_F32); 255 256 pmFPA *fpa = input->fpa; 257 258 if (DEBUG) psastroDumpCorners ("corners.up.guess3.dat", "corners.dn.guess3.dat", fpa); 259 260 pmChip *chip = NULL; 261 pmFPAview *view = pmFPAviewAlloc (0); 262 263 while ((chip = pmFPAviewNextChip (view, fpa, 1)) != NULL) { 264 if (!chip->process || !chip->file_exists || !chip->data_exists) { continue; } 265 266 psPlane ptCH, ptFP, ptTP; 267 psSphere ptSky; 268 269 ptCH.x = 0; 270 ptCH.y = 0; 271 psPlaneTransformApply (&ptFP, chip->toFPA, &ptCH); 272 psPlaneTransformApply (&ptTP, fpa->toTPA, &ptFP); 273 psDeproject (&ptSky, &ptTP, fpa->toSky); 274 psLogMsg ("psastro", 3, "0,0 pix for chip %3d = %f,%f\n", view->chip, DEG_RAD*ptSky.r, DEG_RAD*ptSky.d); 275 276 // new corner locations based on the calibrated astrometry 277 psVectorAppend (cornerLn, ptFP.x); 278 psVectorAppend (cornerMn, ptFP.y); 279 psVectorAppend (cornerPn, ptTP.x); 280 psVectorAppend (cornerQn, ptTP.y); 281 psVectorAppend (cornerRn, ptSky.r); 282 psVectorAppend (cornerDn, ptSky.d); 283 } 284 285 psVector *cornerLo = psMetadataLookupPtr (&status, input->fpa->analysis, "CORNER.L"); 286 psVector *cornerMo = psMetadataLookupPtr (&status, input->fpa->analysis, "CORNER.M"); 287 psVector *cornerPo = psMetadataLookupPtr (&status, input->fpa->analysis, "CORNER.P"); 288 psVector *cornerQo = psMetadataLookupPtr (&status, input->fpa->analysis, "CORNER.Q"); 289 psVector *cornerRo = psMetadataLookupPtr (&status, input->fpa->analysis, "CORNER.R"); 290 psVector *cornerDo = psMetadataLookupPtr (&status, input->fpa->analysis, "CORNER.D"); 291 292 // compare the old R,D values projected to the same tangent plane as the new R,D values: 293 294 psVector *cornerPs = psVectorAllocEmpty (100, PS_TYPE_F32); 295 psVector *cornerQs = psVectorAllocEmpty (100, PS_TYPE_F32); 296 297 for (int i = 0; i < cornerRo->n; i++) { 298 299 psPlane ptTP; 300 psSphere ptSky; 301 302 ptSky.r = cornerRo->data.F32[i]; 303 ptSky.d = cornerDo->data.F32[i]; 304 305 psProject (&ptTP, &ptSky, fpa->toSky); 306 psVectorAppend (cornerPs, ptTP.x); 307 psVectorAppend (cornerQs, ptTP.y); 308 } 309 310 psPlaneTransform *map = psPlaneTransformAlloc (1, 1); 311 map->x->coeffMask[1][1] = PS_POLY_MASK_SET; 312 map->y->coeffMask[1][1] = PS_POLY_MASK_SET; 313 314 psVectorFitPolynomial2D (map->x, NULL, 0, cornerPn, NULL, cornerPs, cornerQs); 315 psVectorFitPolynomial2D (map->y, NULL, 0, cornerQn, NULL, cornerPs, cornerQs); 316 317 // apply the linear fit... 318 psVector *cornerPf = psPolynomial2DEvalVector (map->x, cornerPs, cornerQs); 319 psVector *cornerQf = psPolynomial2DEvalVector (map->y, cornerPs, cornerQs); 320 321 // ...and calculate the residual between Pn,Qn and Pf,Qf 322 psVector *cornerPd = (psVector *) psBinaryOp (NULL, cornerPn, "-", cornerPf); 323 psVector *cornerQd = (psVector *) psBinaryOp (NULL, cornerQn, "-", cornerQf); 324 325 psStats *statsP = psStatsAlloc (PS_STAT_SAMPLE_MEAN | PS_STAT_SAMPLE_STDEV); 326 psStats *statsQ = psStatsAlloc (PS_STAT_SAMPLE_MEAN | PS_STAT_SAMPLE_STDEV); 327 328 psVectorStats (statsP, cornerPd, NULL, NULL, 0); 329 psVectorStats (statsQ, cornerQd, NULL, NULL, 0); 330 331 float angle = atan2 (map->y->coeff[1][0], map->x->coeff[1][0]); 332 float scale = hypot (map->y->coeff[1][0], map->x->coeff[1][0]); 333 334 psLogMsg ("psastro", 3, "boresite offset : %f,%f\n", map->x->coeff[0][0], map->y->coeff[0][0]); 335 psLogMsg ("psastro", 3, "boresite angle : %f, scale: %f", angle*PS_DEG_RAD, scale); 336 psLogMsg ("psastro", 3, "boresite scatter : %f,%f\n", statsP->sampleStdev, statsQ->sampleStdev); 337 338 // write the elapsed time here; this will be updated in psastroMosaicAstrometry, if called 339 psMetadata *header = psMetadataLookupMetadata (&status, input->fpa->analysis, "PSASTRO.HEADER"); 340 if (!header) { 341 header = psMetadataAlloc(); 342 psMetadataAddMetadata (input->fpa->analysis, PS_LIST_TAIL, "PSASTRO.HEADER", PS_META_REPLACE, "psastro header stats", header); 343 psFree (header); // drop this reference 344 } 345 346 psMetadataAddF32 (header, PS_LIST_TAIL, "AST_R0", PS_META_REPLACE, "boresite offset in RA (TP units)", map->x->coeff[0][0]); 347 psMetadataAddF32 (header, PS_LIST_TAIL, "AST_D0", PS_META_REPLACE, "boresite offset in DEC (TP units)", map->y->coeff[0][0]); 348 psMetadataAddF32 (header, PS_LIST_TAIL, "AST_T0", PS_META_REPLACE, "boresite angle (degrees)", angle*PS_DEG_RAD); 349 psMetadataAddF32 (header, PS_LIST_TAIL, "AST_S0", PS_META_REPLACE, "boresite scale correction", scale); 350 psMetadataAddF32 (header, PS_LIST_TAIL, "AST_RS", PS_META_REPLACE, "boresite scatter in RA (TP units)", statsP->sampleStdev); 351 psMetadataAddF32 (header, PS_LIST_TAIL, "AST_DS", PS_META_REPLACE, "boresite scatter in DEC (TP units)", statsQ->sampleStdev); 352 353 if (0) { 354 FILE *f = fopen ("corners.dat", "w"); 355 for (int i = 0; i < cornerRo->n; i++) { 356 fprintf (f, "%10.6f %10.6f %9.2f %9.2f %9.2f %9.2f | %10.6f %10.6f %9.2f %9.2f %9.2f %9.2f\n", 357 cornerRn->data.F32[i], cornerDn->data.F32[i], cornerPn->data.F32[i], cornerQn->data.F32[i], cornerLn->data.F32[i], cornerMn->data.F32[i], 358 cornerRo->data.F32[i], cornerDo->data.F32[i], cornerPo->data.F32[i], cornerQo->data.F32[i], cornerLo->data.F32[i], cornerMo->data.F32[i]); 359 } 360 fclose (f); 361 } 362 363 psFree (cornerPf); 364 psFree (cornerQf); 365 psFree (cornerPd); 366 psFree (cornerQd); 367 368 psFree (statsP); 369 psFree (statsQ); 370 371 psFree (cornerLn); 372 psFree (cornerMn); 373 psFree (cornerPn); 374 psFree (cornerQn); 375 psFree (cornerRn); 376 psFree (cornerDn); 377 psFree (cornerPs); 378 psFree (cornerQs); 379 psFree (map); 380 psFree (view); 381 382 383 return true; 384 }
Note:
See TracChangeset
for help on using the changeset viewer.
