Changeset 15665 for trunk/psModules/src/astrom/pmAstrometryTable.c
- Timestamp:
- Nov 20, 2007, 9:02:55 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/astrom/pmAstrometryTable.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/astrom/pmAstrometryTable.c
r15562 r15665 8 8 * @author EAM, IfA 9 9 * 10 * @version $Revision: 1. 2$ $Name: not supported by cvs2svn $11 * @date $Date: 2007-11- 10 01:09:20$10 * @version $Revision: 1.3 $ $Name: not supported by cvs2svn $ 11 * @date $Date: 2007-11-21 07:02:55 $ 12 12 * 13 13 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 36 36 #include "pmFPAview.h" 37 37 #include "pmFPAfile.h" 38 #include "pmFPAExtent.h" 39 #include "pmAstrometryWCS.h" 40 #include "pmAstrometryRegions.h" 38 41 #include "pmAstrometryTable.h" 39 40 42 41 43 /********************* CheckDataStatus functions *****************************/ … … 181 183 182 184 // write out chip-level Astrometry data for this chip 185 // XXX this function writes out astrometry elements for a chip->fpa->tp->sky layer set 183 186 // XXX we need to ensure the chip and fpa level data are written 184 187 // XXX can we write the rows one at a time (or groups at a time?) 188 // XXX allow this to be chip level, or just force to be fpa? is it valid at the chip level?? 185 189 bool pmAstromWriteChip (pmChip *chip, const pmFPAview *view, pmFPAfile *file, const pmConfig *config) 186 190 { 187 bool status; 188 // *** define the EXTNAME values used for the table data, and residual image segments *** 189 190 // lookup the EXTNAME values used for table data and image header segments 191 char *rule = NULL; 192 193 // Menu of EXTNAME rules 194 psMetadata *menu = psMetadataLookupMetadata(&status, file->camera, "EXTNAME.RULES"); 195 if (!menu) { 196 psError(PS_ERR_UNKNOWN, true, "missing EXTNAME.RULES in camera.config"); 197 return false; 198 } 199 200 // EXTNAME for image header 201 rule = psMetadataLookupStr(&status, menu, "ASTROMETRY"); 202 if (!rule) { 203 psError(PS_ERR_UNKNOWN, false, "missing entry for ASTROMETRY in EXTNAME.RULES in camera.config"); 204 return false; 205 } 206 207 // XXX need to finish this: uncomment when used 208 # if (0) 209 char *extname = pmFPAfileNameFromRule (rule, file, view); 210 # endif 211 212 // write the chip elements in the following form: 213 // chipID, ...? I forget the form: look at ICD 214 191 psArray *table; 192 psMetadata *row; 193 psMetadata *header; 194 195 // write out the blank PHU to start the file 196 psFitsWriteBlank (file->fits, NULL, NULL); 197 198 // first layer is the sky 199 header = psMetadataAlloc(); 200 psMetadataAddStr(header, PS_LIST_TAIL, "COORD", PS_META_REPLACE, "name of this layer", "SKY"); 201 psMetadataAddStr(header, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "NONE"); 202 psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region", "NONE"); 203 psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", "NONE"); 204 205 table = psArrayAllocEmpty (1); 206 row = psMetadataAlloc (); 207 psMetadataAddStr(row, PS_LIST_TAIL, "SEGMENT", PS_META_REPLACE, "name of this segment", "SKY"); 208 psMetadataAddStr(row, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "NONE"); 209 210 psArrayAdd (table, 100, row); 211 psFree (row); 212 213 if (!psFitsWriteTable (file->fits, header, table, "SKY")) { 214 psError(PS_ERR_IO, false, "writing sky data\n"); 215 psFree(table); 216 return false; 217 } 218 219 psFree (table); 220 psFree (header); 221 222 // second layer is the tangent plane 223 header = psMetadataAlloc(); 224 psMetadataAddStr(header, PS_LIST_TAIL, "COORD", PS_META_REPLACE, "name of this layer", "TANGENT_PLANE"); 225 psMetadataAddStr(header, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "SKY"); 226 psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region", "RECTANGLE"); 227 psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", "PROJECTION"); 228 229 table = psArrayAllocEmpty (1); 230 row = psMetadataAlloc (); 231 psMetadataAddStr(row, PS_LIST_TAIL, "SEGMENT", PS_META_REPLACE, "name of this segment", "TANGENT_PLANE"); 232 psMetadataAddStr(row, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "SKY"); 233 234 psRegion *region = pmAstromFPAExtent (file->fpa); 235 psMetadataAddF32(row, PS_LIST_TAIL, "MINX", PS_META_REPLACE, "range", region->x0); 236 psMetadataAddF32(row, PS_LIST_TAIL, "MAXX", PS_META_REPLACE, "range", region->x1); 237 psMetadataAddF32(row, PS_LIST_TAIL, "MINY", PS_META_REPLACE, "range", region->y0); 238 psMetadataAddF32(row, PS_LIST_TAIL, "MAXY", PS_META_REPLACE, "range", region->y1); 239 240 psMetadataAddF32(row, PS_LIST_TAIL, "XSCALE", PS_META_REPLACE, "", file->fpa->toSky->Xs * PM_DEG_RAD); 241 psMetadataAddF32(row, PS_LIST_TAIL, "YSCALE", PS_META_REPLACE, "", file->fpa->toSky->Ys * PM_DEG_RAD); 242 psMetadataAddF32(row, PS_LIST_TAIL, "XREF", PS_META_REPLACE, "", file->fpa->toSky->R * PM_DEG_RAD); 243 psMetadataAddF32(row, PS_LIST_TAIL, "YREF", PS_META_REPLACE, "", file->fpa->toSky->D * PM_DEG_RAD); 244 245 psArrayAdd (table, 100, row); 246 psFree (row); 247 248 if (!psFitsWriteTable (file->fits, header, table, "TP")) { 249 psError(PS_ERR_IO, false, "writing sky data\n"); 250 psFree(table); 251 return false; 252 } 253 254 psFree (table); 255 psFree (header); 256 257 // third layer is the focal plane 258 header = psMetadataAlloc(); 259 psMetadataAddStr(header, PS_LIST_TAIL, "COORD", PS_META_REPLACE, "name of this layer", "FOCAL_PLANE"); 260 psMetadataAddStr(header, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "TANGENT_PLANE"); 261 psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region", "RECTANGLE"); 262 psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", "POLYNOMIAL"); 263 264 table = psArrayAllocEmpty (1); 265 266 // XXX is this or the tpa region correct? 267 region = pmAstromFPAExtent (file->fpa); 268 269 for (int i = 0; i <= file->fpa->toTPA->x->nX; i++) { 270 for (int j = 0; j <= file->fpa->toTPA->x->nY; j++) { 271 row = psMetadataAlloc (); 272 psMetadataAddStr(row, PS_LIST_TAIL, "SEGMENT", PS_META_REPLACE, "name of this segment", "FOCAL_PLANE"); 273 psMetadataAddStr(row, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "TANGENT_PLANE"); 274 psMetadataAddF32(row, PS_LIST_TAIL, "MINX", PS_META_REPLACE, "range", region->x0); 275 psMetadataAddF32(row, PS_LIST_TAIL, "MAXX", PS_META_REPLACE, "range", region->x1); 276 psMetadataAddF32(row, PS_LIST_TAIL, "MINY", PS_META_REPLACE, "range", region->y0); 277 psMetadataAddF32(row, PS_LIST_TAIL, "MAXY", PS_META_REPLACE, "range", region->y1); 278 279 psMetadataAddS32(row, PS_LIST_TAIL, "NX", PS_META_REPLACE, "", file->fpa->toTPA->x->nX); 280 psMetadataAddS32(row, PS_LIST_TAIL, "NY", PS_META_REPLACE, "", file->fpa->toTPA->x->nY); 281 psMetadataAddF32(row, PS_LIST_TAIL, "POLY_X", PS_META_REPLACE, "", file->fpa->toTPA->x->coeff[i][j]); 282 psMetadataAddF32(row, PS_LIST_TAIL, "POLY_Y", PS_META_REPLACE, "", file->fpa->toTPA->y->coeff[i][j]); 283 psMetadataAddF32(row, PS_LIST_TAIL, "ERROR_X", PS_META_REPLACE, "", file->fpa->toTPA->x->coeffErr[i][j]); 284 psMetadataAddF32(row, PS_LIST_TAIL, "ERROR_Y", PS_META_REPLACE, "", file->fpa->toTPA->y->coeffErr[i][j]); 285 286 psArrayAdd (table, 100, row); 287 psFree (row); 288 } 289 } 290 291 if (!psFitsWriteTable (file->fits, header, table, "FP")) { 292 psError(PS_ERR_IO, false, "writing sky data\n"); 293 psFree(table); 294 return false; 295 } 296 297 psFree (table); 298 psFree (header); 299 300 // fourth layer holds the chips 301 header = psMetadataAlloc(); 302 psMetadataAddStr(header, PS_LIST_TAIL, "COORD", PS_META_REPLACE, "name of this layer", "FOCAL_PLANE"); 303 psMetadataAddStr(header, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "TANGENT_PLANE"); 304 psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region", "RECTANGLE"); 305 psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", "POLYNOMIAL"); 306 307 table = psArrayAllocEmpty (1); 308 309 pmFPAview *view = pmFPAviewAlloc (0); 310 311 pmChip *chip = NULL; 312 while ((chip = pmFPAviewNextChip (view, file->fpa, 1)) != NULL) { 313 314 psRegion *region = pmChipPixels (chip); 315 316 char *chiprule = psStringCopy ("CHIP.{CHIP.NAME}"); 317 char *chipname = pmFPAfileNameFromRule (chiprule, file, view); 318 319 for (int i = 0; i <= chip->toFPA->x->nX; i++) { 320 for (int j = 0; j <= chip->toFPA->x->nY; j++) { 321 row = psMetadataAlloc (); 322 // xXXX set chip name based on metadata 323 psMetadataAddStr(row, PS_LIST_TAIL, "SEGMENT", PS_META_REPLACE, "name of this segment", chipname); 324 psMetadataAddStr(row, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "TANGENT_PLANE"); 325 psMetadataAddF32(row, PS_LIST_TAIL, "MINX", PS_META_REPLACE, "range", region->x0); 326 psMetadataAddF32(row, PS_LIST_TAIL, "MAXX", PS_META_REPLACE, "range", region->x1); 327 psMetadataAddF32(row, PS_LIST_TAIL, "MINY", PS_META_REPLACE, "range", region->y0); 328 psMetadataAddF32(row, PS_LIST_TAIL, "MAXY", PS_META_REPLACE, "range", region->y1); 329 330 psMetadataAddS32(row, PS_LIST_TAIL, "NX", PS_META_REPLACE, "", chip->toFPA->x->nX); 331 psMetadataAddS32(row, PS_LIST_TAIL, "NY", PS_META_REPLACE, "", chip->toFPA->x->nY); 332 psMetadataAddF32(row, PS_LIST_TAIL, "POLY_X", PS_META_REPLACE, "", chip->toFPA->x->coeff[i][j]); 333 psMetadataAddF32(row, PS_LIST_TAIL, "POLY_Y", PS_META_REPLACE, "", chip->toFPA->y->coeff[i][j]); 334 psMetadataAddF32(row, PS_LIST_TAIL, "ERROR_X", PS_META_REPLACE, "", chip->toFPA->x->coeffErr[i][j]); 335 psMetadataAddF32(row, PS_LIST_TAIL, "ERROR_Y", PS_META_REPLACE, "", chip->toFPA->y->coeffErr[i][j]); 336 psArrayAdd (table, 100, row); 337 psFree (row); 338 } 339 } 340 psFree (chiprule); 341 psFree (chipname); 342 } 343 psFree (view); 344 345 if (!psFitsWriteTable (file->fits, header, table, "CHIPS")) { 346 psError(PS_ERR_IO, false, "writing sky data\n"); 347 psFree(table); 348 return false; 349 } 350 351 psFree (table); 352 psFree (header); 215 353 return true; 216 354 } … … 267 405 268 406 // EXTNAME for image header 269 rule = psMetadataLookupStr(&status, menu, " ASTROMETRY");407 rule = psMetadataLookupStr(&status, menu, "REF.ASTROM"); 270 408 if (!rule) { 271 psError(PS_ERR_UNKNOWN, false, "missing entry for ASTROMETRYin EXTNAME.RULES in camera.config");409 psError(PS_ERR_UNKNOWN, false, "missing entry for REF.ASTROM in EXTNAME.RULES in camera.config"); 272 410 return false; 273 411 }
Note:
See TracChangeset
for help on using the changeset viewer.
