Changeset 18601
- Timestamp:
- Jul 17, 2008, 12:38:15 PM (18 years ago)
- Location:
- trunk/psModules/src
- Files:
-
- 11 edited
-
astrom/pmAstrometryModel.c (modified) (28 diffs)
-
astrom/pmAstrometryModel.h (modified) (2 diffs)
-
astrom/pmAstrometryRefstars.c (modified) (6 diffs)
-
astrom/pmAstrometryRefstars.h (modified) (2 diffs)
-
camera/pmFPAfileFitsIO.c (modified) (9 diffs)
-
camera/pmFPAfileFitsIO.h (modified) (3 diffs)
-
camera/pmFPAfileIO.c (modified) (3 diffs)
-
objects/pmPSF_IO.c (modified) (15 diffs)
-
objects/pmPSF_IO.h (modified) (2 diffs)
-
objects/pmSourceIO.c (modified) (22 diffs)
-
objects/pmSourceIO.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/astrom/pmAstrometryModel.c
r18008 r18601 2 2 * 3 3 * @brief Functions to read and write astrometric model 4 * 4 * 5 5 * The generic model does not specify the location of the boresite on the sky, and it includes 6 6 * a model for the rotator and motion of the boresite. … … 9 9 * 10 10 * @author EAM, IfA 11 * @version $Revision: 1. 3$ $Name: not supported by cvs2svn $12 * @date $Date: 2008-0 6-09 01:53:31$11 * @version $Revision: 1.4 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2008-07-17 22:38:15 $ 13 13 * 14 14 * Copyright 2007 Institute for Astronomy, University of Hawaii … … 38 38 #include "pmFPAfile.h" 39 39 #include "pmFPAExtent.h" 40 #include "pmFPAfileFitsIO.h" 40 41 #include "pmAstrometryWCS.h" 41 42 #include "pmAstrometryUtils.h" … … 96 97 /********************* Write Data functions *****************************/ 97 98 98 bool pmAstromModelWriteForView (const pmFPAview *view, pmFPAfile *file, const pmConfig *config) {99 99 bool pmAstromModelWriteForView (const pmFPAview *view, pmFPAfile *file, pmConfig *config) 100 { 100 101 // write the full model in one pass: require the level to be FPA 101 102 if (view->chip != -1) { 102 psError(PS_ERR_IO, false, "Astrometry must be written at the FPA level"); 103 return false; 104 } 105 106 if (!pmAstromModelWriteFPA (file)) { 107 psError(PS_ERR_IO, false, "Failed to write Astrometry for fpa"); 108 return false; 109 } 103 psError(PS_ERR_IO, false, "Astrometry must be written at the FPA level"); 104 return false; 105 } 106 107 pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config, false); // Suitable FPA for writing 108 109 if (!pmAstromModelWriteFPA(file, fpa)) { 110 psError(PS_ERR_IO, false, "Failed to write Astrometry for fpa"); 111 psFree(fpa); 112 return false; 113 } 114 115 psFree(fpa); 116 110 117 return true; 111 118 } 112 119 113 120 // write out all chip-level Astrometry data for this FPA 114 bool pmAstromModelWriteFPA (pmFPAfile *file) { 115 116 if (!pmAstromModelWritePHU (file)) { 117 psError(PS_ERR_IO, false, "Failed to write PHU for Astrometry model"); 118 return false; 121 bool pmAstromModelWriteFPA (pmFPAfile *file, const pmFPA *fpa) 122 { 123 124 125 if (!pmAstromModelWritePHU (file, fpa)) { 126 psError(PS_ERR_IO, false, "Failed to write PHU for Astrometry model"); 127 return false; 119 128 } 120 129 121 130 if (!pmAstromModelWriteChips (file)) { 122 psError(PS_ERR_IO, false, "Failed to write Astrometry for chips");123 return false;131 psError(PS_ERR_IO, false, "Failed to write Astrometry for chips"); 132 return false; 124 133 } 125 134 126 135 if (!pmAstromModelWriteFP (file)) { 127 psError(PS_ERR_IO, false, "Failed to write Sky for Astrometry model");128 return false;136 psError(PS_ERR_IO, false, "Failed to write Sky for Astrometry model"); 137 return false; 129 138 } 130 139 131 140 if (!pmAstromModelWriteTP (file)) { 132 psError(PS_ERR_IO, false, "Failed to write Sky for Astrometry model");133 return false;141 psError(PS_ERR_IO, false, "Failed to write Sky for Astrometry model"); 142 return false; 134 143 } 135 144 136 145 if (!pmAstromModelWriteSky (file)) { 137 psError(PS_ERR_IO, false, "Failed to write Sky for Astrometry model"); 138 return false; 139 } 140 141 return true; 142 } 143 144 bool pmAstromModelWritePHU (pmFPAfile *file) { 145 146 // output header data 146 psError(PS_ERR_IO, false, "Failed to write Sky for Astrometry model"); 147 return false; 148 } 149 150 return true; 151 } 152 153 bool pmAstromModelWritePHU (pmFPAfile *file, const pmFPA *fpa) { 154 // Need to have an FPA suitable for writing, so that the headers are all kosher 155 156 // output header data 147 157 psMetadata *outhead = psMetadataAlloc(); 148 158 149 159 // use the FPA phu to generate the PHU header 150 pmHDU *phu = f ile->fpa->hdu;160 pmHDU *phu = fpa->hdu; 151 161 152 162 // if there is no FPA PHU, this is a single header+image (extension-less) file. This could be … … 154 164 // write it out as a 'blank' 155 165 if (phu) { 156 psMetadataCopy (outhead, phu->header);166 psMetadataCopy (outhead, phu->header); 157 167 } else { 158 pmConfigConformHeader (outhead, file->format); 159 160 # if (0) 161 // XXX this is no longer needed : FPA.OBS is now correctly copied in pmConfigConformHeader 162 // XXX probably need other info to conform the header 163 psMetadata *fileData = psMetadataLookupMetadata(NULL, file->format, "FILE"); // File information 164 const char *fpaNameHdr = psMetadataLookupStr(NULL, fileData, "FPA.NAME"); 165 if (fpaNameHdr && strlen(fpaNameHdr) > 0) { 166 const char *fpaName = psMetadataLookupStr(NULL, file->fpa->concepts, "FPA.NAME"); 167 psMetadataAddStr(outhead, PS_LIST_TAIL, fpaNameHdr, PS_META_REPLACE, "FPA name", fpaName); 168 } 169 # endif 168 pmConfigConformHeader (outhead, file->format); 170 169 } 171 170 … … 184 183 185 184 psMetadata *header = psMetadataAlloc(); 186 psMetadataAddStr(header, PS_LIST_TAIL, "COORD", PS_META_REPLACE, "name of this layer", "CHIPS");187 psMetadataAddStr(header, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "FOCAL_PLANE");188 psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region", "RECTANGLE");189 psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", "POLYNOMIAL");185 psMetadataAddStr(header, PS_LIST_TAIL, "COORD", PS_META_REPLACE, "name of this layer", "CHIPS"); 186 psMetadataAddStr(header, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "FOCAL_PLANE"); 187 psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region", "RECTANGLE"); 188 psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", "POLYNOMIAL"); 190 189 191 190 psArray *model = psArrayAllocEmpty (1); … … 196 195 while ((chip = pmFPAviewNextChip (view, file->fpa, 1)) != NULL) { 197 196 198 if (!chip->toFPA) continue;199 assert (chip->toFPA->x);200 assert (chip->toFPA->y);201 202 psRegion *region = pmChipPixels (chip);203 204 // set the chip name205 char *chiprule = psStringCopy ("{CHIP.NAME}"); 197 if (!chip->toFPA) continue; 198 assert (chip->toFPA->x); 199 assert (chip->toFPA->y); 200 201 psRegion *region = pmChipPixels (chip); 202 203 // set the chip name 204 char *chiprule = psStringCopy ("{CHIP.NAME}"); 206 205 char *chipname = pmFPAfileNameFromRule (chiprule, file, view); 207 206 208 for (int i = 0; i <= chip->toFPA->x->nX; i++) {209 for (int j = 0; j <= chip->toFPA->x->nY; j++) {210 psMetadata *row = psMetadataAlloc ();211 212 psMetadataAddStr(row, PS_LIST_TAIL, "SEGMENT", PS_META_REPLACE, "name of this segment", chipname);213 psMetadataAddStr(row, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "FOCAL_PLANE");214 psMetadataAddF32(row, PS_LIST_TAIL, "MINX", PS_META_REPLACE, "range", region->x0);215 psMetadataAddF32(row, PS_LIST_TAIL, "MAXX", PS_META_REPLACE, "range", region->x1);216 psMetadataAddF32(row, PS_LIST_TAIL, "MINY", PS_META_REPLACE, "range", region->y0);217 psMetadataAddF32(row, PS_LIST_TAIL, "MAXY", PS_META_REPLACE, "range", region->y1);218 219 psMetadataAddS32(row, PS_LIST_TAIL, "XORDER", PS_META_REPLACE, "", i);220 psMetadataAddS32(row, PS_LIST_TAIL, "YORDER", PS_META_REPLACE, "", j);221 psMetadataAddS32(row, PS_LIST_TAIL, "NXORDER", PS_META_REPLACE, "", chip->toFPA->x->nX);222 psMetadataAddS32(row, PS_LIST_TAIL, "NYORDER", PS_META_REPLACE, "", chip->toFPA->x->nY);223 psMetadataAddF32(row, PS_LIST_TAIL, "POLY_X", PS_META_REPLACE, "", chip->toFPA->x->coeff[i][j]);224 psMetadataAddF32(row, PS_LIST_TAIL, "POLY_Y", PS_META_REPLACE, "", chip->toFPA->y->coeff[i][j]);225 psMetadataAddF32(row, PS_LIST_TAIL, "ERROR_X", PS_META_REPLACE, "", chip->toFPA->x->coeffErr[i][j]);226 psMetadataAddF32(row, PS_LIST_TAIL, "ERROR_Y", PS_META_REPLACE, "", chip->toFPA->y->coeffErr[i][j]);227 psMetadataAddU8 (row, PS_LIST_TAIL, "MASK_X", PS_META_REPLACE, "", chip->toFPA->x->coeffMask[i][j]);228 psMetadataAddU8 (row, PS_LIST_TAIL, "MASK_Y", PS_META_REPLACE, "", chip->toFPA->y->coeffMask[i][j]);229 psArrayAdd (model, 100, row);230 psFree (row);231 }232 }233 psFree (chiprule);234 psFree (chipname);235 psFree (region);207 for (int i = 0; i <= chip->toFPA->x->nX; i++) { 208 for (int j = 0; j <= chip->toFPA->x->nY; j++) { 209 psMetadata *row = psMetadataAlloc (); 210 211 psMetadataAddStr(row, PS_LIST_TAIL, "SEGMENT", PS_META_REPLACE, "name of this segment", chipname); 212 psMetadataAddStr(row, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "FOCAL_PLANE"); 213 psMetadataAddF32(row, PS_LIST_TAIL, "MINX", PS_META_REPLACE, "range", region->x0); 214 psMetadataAddF32(row, PS_LIST_TAIL, "MAXX", PS_META_REPLACE, "range", region->x1); 215 psMetadataAddF32(row, PS_LIST_TAIL, "MINY", PS_META_REPLACE, "range", region->y0); 216 psMetadataAddF32(row, PS_LIST_TAIL, "MAXY", PS_META_REPLACE, "range", region->y1); 217 218 psMetadataAddS32(row, PS_LIST_TAIL, "XORDER", PS_META_REPLACE, "", i); 219 psMetadataAddS32(row, PS_LIST_TAIL, "YORDER", PS_META_REPLACE, "", j); 220 psMetadataAddS32(row, PS_LIST_TAIL, "NXORDER", PS_META_REPLACE, "", chip->toFPA->x->nX); 221 psMetadataAddS32(row, PS_LIST_TAIL, "NYORDER", PS_META_REPLACE, "", chip->toFPA->x->nY); 222 psMetadataAddF32(row, PS_LIST_TAIL, "POLY_X", PS_META_REPLACE, "", chip->toFPA->x->coeff[i][j]); 223 psMetadataAddF32(row, PS_LIST_TAIL, "POLY_Y", PS_META_REPLACE, "", chip->toFPA->y->coeff[i][j]); 224 psMetadataAddF32(row, PS_LIST_TAIL, "ERROR_X", PS_META_REPLACE, "", chip->toFPA->x->coeffErr[i][j]); 225 psMetadataAddF32(row, PS_LIST_TAIL, "ERROR_Y", PS_META_REPLACE, "", chip->toFPA->y->coeffErr[i][j]); 226 psMetadataAddU8 (row, PS_LIST_TAIL, "MASK_X", PS_META_REPLACE, "", chip->toFPA->x->coeffMask[i][j]); 227 psMetadataAddU8 (row, PS_LIST_TAIL, "MASK_Y", PS_META_REPLACE, "", chip->toFPA->y->coeffMask[i][j]); 228 psArrayAdd (model, 100, row); 229 psFree (row); 230 } 231 } 232 psFree (chiprule); 233 psFree (chipname); 234 psFree (region); 236 235 } 237 236 … … 254 253 255 254 psMetadata *header = psMetadataAlloc(); 256 psMetadataAddStr(header, PS_LIST_TAIL, "COORD", PS_META_REPLACE, "name of this layer", "FOCAL_PLANE");257 psMetadataAddStr(header, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "TANGENT_PLANE");258 psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region", "RECTANGLE");259 psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", "POLYNOMIAL");255 psMetadataAddStr(header, PS_LIST_TAIL, "COORD", PS_META_REPLACE, "name of this layer", "FOCAL_PLANE"); 256 psMetadataAddStr(header, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "TANGENT_PLANE"); 257 psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region", "RECTANGLE"); 258 psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", "POLYNOMIAL"); 260 259 261 260 psArray *model = psArrayAllocEmpty (1); … … 265 264 266 265 // rotate the toTPA to have 0.0 posangle 267 float posangle = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.POSANGLE"); 266 float posangle = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.POSANGLE"); 268 267 269 268 // the to/from TPA transform currently has rotation of posangle; remove it & create the toTPA version … … 272 271 273 272 for (int i = 0; i <= toTPA->x->nX; i++) { 274 for (int j = 0; j <= toTPA->x->nY; j++) {275 psMetadata *row = psMetadataAlloc ();276 psMetadataAddStr(row, PS_LIST_TAIL, "SEGMENT", PS_META_REPLACE, "name of this segment", "FOCAL_PLANE");277 psMetadataAddStr(row, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "TANGENT_PLANE");278 psMetadataAddF32(row, PS_LIST_TAIL, "MINX", PS_META_REPLACE, "range", region->x0);279 psMetadataAddF32(row, PS_LIST_TAIL, "MAXX", PS_META_REPLACE, "range", region->x1);280 psMetadataAddF32(row, PS_LIST_TAIL, "MINY", PS_META_REPLACE, "range", region->y0);281 psMetadataAddF32(row, PS_LIST_TAIL, "MAXY", PS_META_REPLACE, "range", region->y1);282 283 psMetadataAddS32(row, PS_LIST_TAIL, "XORDER", PS_META_REPLACE, "", i);284 psMetadataAddS32(row, PS_LIST_TAIL, "YORDER", PS_META_REPLACE, "", j);285 psMetadataAddS32(row, PS_LIST_TAIL, "NXORDER", PS_META_REPLACE, "", toTPA->x->nX);286 psMetadataAddS32(row, PS_LIST_TAIL, "NYORDER", PS_META_REPLACE, "", toTPA->x->nY);287 psMetadataAddF32(row, PS_LIST_TAIL, "POLY_X", PS_META_REPLACE, "", toTPA->x->coeff[i][j]);288 psMetadataAddF32(row, PS_LIST_TAIL, "POLY_Y", PS_META_REPLACE, "", toTPA->y->coeff[i][j]);289 psMetadataAddF32(row, PS_LIST_TAIL, "ERROR_X", PS_META_REPLACE, "", toTPA->x->coeffErr[i][j]);290 psMetadataAddF32(row, PS_LIST_TAIL, "ERROR_Y", PS_META_REPLACE, "", toTPA->y->coeffErr[i][j]);291 psMetadataAddU8 (row, PS_LIST_TAIL, "MASK_X", PS_META_REPLACE, "", toTPA->x->coeffMask[i][j]);292 psMetadataAddU8 (row, PS_LIST_TAIL, "MASK_Y", PS_META_REPLACE, "", toTPA->y->coeffMask[i][j]);293 294 psArrayAdd (model, 100, row);295 psFree (row);296 }273 for (int j = 0; j <= toTPA->x->nY; j++) { 274 psMetadata *row = psMetadataAlloc (); 275 psMetadataAddStr(row, PS_LIST_TAIL, "SEGMENT", PS_META_REPLACE, "name of this segment", "FOCAL_PLANE"); 276 psMetadataAddStr(row, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "TANGENT_PLANE"); 277 psMetadataAddF32(row, PS_LIST_TAIL, "MINX", PS_META_REPLACE, "range", region->x0); 278 psMetadataAddF32(row, PS_LIST_TAIL, "MAXX", PS_META_REPLACE, "range", region->x1); 279 psMetadataAddF32(row, PS_LIST_TAIL, "MINY", PS_META_REPLACE, "range", region->y0); 280 psMetadataAddF32(row, PS_LIST_TAIL, "MAXY", PS_META_REPLACE, "range", region->y1); 281 282 psMetadataAddS32(row, PS_LIST_TAIL, "XORDER", PS_META_REPLACE, "", i); 283 psMetadataAddS32(row, PS_LIST_TAIL, "YORDER", PS_META_REPLACE, "", j); 284 psMetadataAddS32(row, PS_LIST_TAIL, "NXORDER", PS_META_REPLACE, "", toTPA->x->nX); 285 psMetadataAddS32(row, PS_LIST_TAIL, "NYORDER", PS_META_REPLACE, "", toTPA->x->nY); 286 psMetadataAddF32(row, PS_LIST_TAIL, "POLY_X", PS_META_REPLACE, "", toTPA->x->coeff[i][j]); 287 psMetadataAddF32(row, PS_LIST_TAIL, "POLY_Y", PS_META_REPLACE, "", toTPA->y->coeff[i][j]); 288 psMetadataAddF32(row, PS_LIST_TAIL, "ERROR_X", PS_META_REPLACE, "", toTPA->x->coeffErr[i][j]); 289 psMetadataAddF32(row, PS_LIST_TAIL, "ERROR_Y", PS_META_REPLACE, "", toTPA->y->coeffErr[i][j]); 290 psMetadataAddU8 (row, PS_LIST_TAIL, "MASK_X", PS_META_REPLACE, "", toTPA->x->coeffMask[i][j]); 291 psMetadataAddU8 (row, PS_LIST_TAIL, "MASK_Y", PS_META_REPLACE, "", toTPA->y->coeffMask[i][j]); 292 293 psArrayAdd (model, 100, row); 294 psFree (row); 295 } 297 296 } 298 297 … … 300 299 psError(PS_ERR_IO, false, "writing sky data\n"); 301 300 psFree(model); 302 psFree (header);303 psFree (region);301 psFree (header); 302 psFree (region); 304 303 return false; 305 304 } … … 317 316 318 317 // get the boresite model parameters 319 float Xo = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.BORE.X0"); 320 float Yo = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.BORE.Y0"); 321 float RX = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.BORE.RX"); 322 float RY = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.BORE.RY"); 323 float To = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.BORE.T0"); 324 float Po = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.BORE.P0"); 318 float Xo = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.BORE.X0"); 319 float Yo = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.BORE.Y0"); 320 float RX = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.BORE.RX"); 321 float RY = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.BORE.RY"); 322 float To = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.BORE.T0"); 323 float Po = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.BORE.P0"); 325 324 float PosZero = psMetadataLookupF32 (&status, file->fpa->concepts, "FPA.POS_ZERO"); /// XXX be consistent with degrees v radians 326 325 char *refChip = psMetadataLookupStr (&status, file->fpa->concepts, "FPA.REF.CHIP"); 327 326 328 327 psMetadata *header = psMetadataAlloc(); 329 psMetadataAddStr(header, PS_LIST_TAIL, "COORD", PS_META_REPLACE, "name of this layer", "TANGENT_PLANE");330 psMetadataAddStr(header, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "SKY");331 psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region", "RECTANGLE");332 psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", "PROJECTION");328 psMetadataAddStr(header, PS_LIST_TAIL, "COORD", PS_META_REPLACE, "name of this layer", "TANGENT_PLANE"); 329 psMetadataAddStr(header, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "SKY"); 330 psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region", "RECTANGLE"); 331 psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", "PROJECTION"); 333 332 334 333 psArray *model = psArrayAllocEmpty (1); … … 342 341 psMetadataAddF32(row, PS_LIST_TAIL, "MINY", PS_META_REPLACE, "range", region->y0); 343 342 psMetadataAddF32(row, PS_LIST_TAIL, "MAXY", PS_META_REPLACE, "range", region->y1); 344 343 345 344 // psMetadataAddF32(row, PS_LIST_TAIL, "XREF", PS_META_REPLACE, "", file->fpa->toSky->R * PS_DEG_RAD); 346 345 // psMetadataAddF32(row, PS_LIST_TAIL, "YREF", PS_META_REPLACE, "", file->fpa->toSky->D * PS_DEG_RAD); … … 362 361 if (!psFitsWriteTable (file->fits, header, model, "TP")) { 363 362 psError(PS_ERR_IO, false, "writing sky data\n"); 364 psFree (region);363 psFree (region); 365 364 psFree (model); 366 psFree (header);365 psFree (header); 367 366 return false; 368 367 } … … 378 377 379 378 psMetadata *header = psMetadataAlloc(); 380 psMetadataAddStr(header, PS_LIST_TAIL, "COORD", PS_META_REPLACE, "name of this layer", "SKY");381 psMetadataAddStr(header, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "NONE");382 psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region", "NONE");383 psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", "NONE");379 psMetadataAddStr(header, PS_LIST_TAIL, "COORD", PS_META_REPLACE, "name of this layer", "SKY"); 380 psMetadataAddStr(header, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "NONE"); 381 psMetadataAddStr(header, PS_LIST_TAIL, "BOUNDARY", PS_META_REPLACE, "validity region", "NONE"); 382 psMetadataAddStr(header, PS_LIST_TAIL, "TRANSFRM", PS_META_REPLACE, "mapping to parent", "NONE"); 384 383 385 384 psArray *model = psArrayAllocEmpty (1); … … 387 386 psMetadataAddStr(row, PS_LIST_TAIL, "SEGMENT", PS_META_REPLACE, "name of this segment", "SKY"); 388 387 psMetadataAddStr(row, PS_LIST_TAIL, "PARENT", PS_META_REPLACE, "next layer up", "NONE"); 389 388 390 389 psArrayAdd (model, 100, row); 391 390 psFree (row); … … 407 406 { 408 407 409 // write the full model in one pass: require the level to be FPA410 if (view->chip != -1) {411 psError(PS_ERR_IO, false, "Astrometry must be read at the FPA level");412 return false;413 }414 415 if (!pmAstromModelReadFPA (file)) {416 psError(PS_ERR_IO, false, "Failed to read Astrometry for fpa");417 return false;418 }419 return true;408 // write the full model in one pass: require the level to be FPA 409 if (view->chip != -1) { 410 psError(PS_ERR_IO, false, "Astrometry must be read at the FPA level"); 411 return false; 412 } 413 414 if (!pmAstromModelReadFPA (file)) { 415 psError(PS_ERR_IO, false, "Failed to read Astrometry for fpa"); 416 return false; 417 } 418 return true; 420 419 } 421 420 … … 424 423 425 424 if (!pmAstromModelReadPHU (file)) { 426 psError(PS_ERR_IO, false, "Failed to read PHU for Astrometry model");427 return false;425 psError(PS_ERR_IO, false, "Failed to read PHU for Astrometry model"); 426 return false; 428 427 } 429 428 430 429 if (!pmAstromModelReadChips (file)) { 431 psError(PS_ERR_IO, false, "Failed to read Astrometry for chips");432 return false;430 psError(PS_ERR_IO, false, "Failed to read Astrometry for chips"); 431 return false; 433 432 } 434 433 435 434 if (!pmAstromModelReadFP (file)) { 436 psError(PS_ERR_IO, false, "Failed to read Sky for Astrometry model");437 return false;435 psError(PS_ERR_IO, false, "Failed to read Sky for Astrometry model"); 436 return false; 438 437 } 439 438 … … 441 440 // transformation determined in FP 442 441 if (!pmAstromModelReadTP (file)) { 443 psError(PS_ERR_IO, false, "Failed to read Sky for Astrometry model");444 return false;442 psError(PS_ERR_IO, false, "Failed to read Sky for Astrometry model"); 443 return false; 445 444 } 446 445 447 446 if (!pmAstromModelReadSky (file)) { 448 psError(PS_ERR_IO, false, "Failed to read Sky for Astrometry model");449 return false;450 } 451 452 return true; 453 } 454 455 bool pmAstromModelReadPHU (pmFPAfile *file) { 447 psError(PS_ERR_IO, false, "Failed to read Sky for Astrometry model"); 448 return false; 449 } 450 451 return true; 452 } 453 454 bool pmAstromModelReadPHU (pmFPAfile *file) { 456 455 457 456 fprintf (stderr, "not sure we need to read PHU\n"); … … 462 461 463 462 for (int i = 0; i < fpa->chips->n; i++) { 464 pmChip *chip = fpa->chips->data[i];465 if (!chip) continue;466 char *thisone = psMetadataLookupStr (NULL, chip->concepts, "CHIP.NAME");467 if (!thisone) continue;468 if (!strcmp (name, thisone)) return (i);463 pmChip *chip = fpa->chips->data[i]; 464 if (!chip) continue; 465 char *thisone = psMetadataLookupStr (NULL, chip->concepts, "CHIP.NAME"); 466 if (!thisone) continue; 467 if (!strcmp (name, thisone)) return (i); 469 468 } 470 469 return -1; … … 474 473 475 474 for (int i = 0; i < fpa->chips->n; i++) { 476 pmChip *chip = fpa->chips->data[i];477 if (!chip) continue;478 char *thisone = psMetadataLookupStr (NULL, chip->concepts, "CHIP.NAME");479 if (!thisone) continue;480 if (!strcmp (name, thisone)) return (chip);475 pmChip *chip = fpa->chips->data[i]; 476 if (!chip) continue; 477 char *thisone = psMetadataLookupStr (NULL, chip->concepts, "CHIP.NAME"); 478 if (!thisone) continue; 479 if (!strcmp (name, thisone)) return (chip); 481 480 } 482 481 return NULL; … … 496 495 // free exising tranformations in prep for new alloc below 497 496 for (int i = 0; i < file->fpa->chips->n; i++) { 498 pmChip *chip = file->fpa->chips->data[i];499 psFree (chip->toFPA);500 chip->toFPA = NULL;497 pmChip *chip = file->fpa->chips->data[i]; 498 psFree (chip->toFPA); 499 chip->toFPA = NULL; 501 500 } 502 501 … … 512 511 // parse the model entries 513 512 for (int i = 0; i < model->n; i++) { 514 psMetadata *row = model->data[i];515 516 // name of the chip for this row. 517 char *chipname = psMetadataLookupStr (&status, row, "SEGMENT");518 519 // get chip from name520 pmChip *chip = pmConceptsChipFromName (file->fpa, chipname);521 REQUIRE (chip, "invalid chip name");522 523 // define the toFPA transform if not already defined524 int nX = psMetadataLookupS32(&status, row, "NXORDER"); REQUIRE (status, "missing NXORDER");525 int nY = psMetadataLookupS32(&status, row, "NYORDER"); REQUIRE (status, "missing NYORDER");526 if (chip->toFPA == NULL) {527 chip->toFPA = psPlaneTransformAlloc(nX, nY);528 } else {529 REQUIRE (chip->toFPA->x->nX == nX, "mismatch in chip order");530 REQUIRE (chip->toFPA->x->nY == nY, "mismatch in chip order");531 REQUIRE (chip->toFPA->y->nX == nX, "mismatch in chip order");532 REQUIRE (chip->toFPA->y->nY == nY, "mismatch in chip order");533 }534 535 int ix = psMetadataLookupS32(&status, row, "XORDER"); REQUIRE (status, "missing XORDER");536 int iy = psMetadataLookupS32(&status, row, "YORDER"); REQUIRE (status, "missing YORDER");537 538 // XXX do I need to use this or can i rely on the camera concepts?539 // minX = psMetadataLookupF32(&status, row, "MINX");540 // maxX = psMetadataLookupF32(&status, row, "MAXX");541 // minY = psMetadataLookupF32(&status, row, "MINY");542 // maxY = psMetadataLookupF32(&status, row, "MAXY");543 544 // XXX need to include mask values545 chip->toFPA->x->coeff[ix][iy] = psMetadataLookupF32(&status, row, "POLY_X");546 chip->toFPA->y->coeff[ix][iy] = psMetadataLookupF32(&status, row, "POLY_Y");547 chip->toFPA->x->coeffErr[ix][iy] = psMetadataLookupF32(&status, row, "ERROR_X");548 chip->toFPA->y->coeffErr[ix][iy] = psMetadataLookupF32(&status, row, "ERROR_Y");549 chip->toFPA->x->coeffMask[ix][iy] = psMetadataLookupU8(&status, row, "MASK_X");550 chip->toFPA->y->coeffMask[ix][iy] = psMetadataLookupU8(&status, row, "MASK_Y");513 psMetadata *row = model->data[i]; 514 515 // name of the chip for this row. 516 char *chipname = psMetadataLookupStr (&status, row, "SEGMENT"); 517 518 // get chip from name 519 pmChip *chip = pmConceptsChipFromName (file->fpa, chipname); 520 REQUIRE (chip, "invalid chip name"); 521 522 // define the toFPA transform if not already defined 523 int nX = psMetadataLookupS32(&status, row, "NXORDER"); REQUIRE (status, "missing NXORDER"); 524 int nY = psMetadataLookupS32(&status, row, "NYORDER"); REQUIRE (status, "missing NYORDER"); 525 if (chip->toFPA == NULL) { 526 chip->toFPA = psPlaneTransformAlloc(nX, nY); 527 } else { 528 REQUIRE (chip->toFPA->x->nX == nX, "mismatch in chip order"); 529 REQUIRE (chip->toFPA->x->nY == nY, "mismatch in chip order"); 530 REQUIRE (chip->toFPA->y->nX == nX, "mismatch in chip order"); 531 REQUIRE (chip->toFPA->y->nY == nY, "mismatch in chip order"); 532 } 533 534 int ix = psMetadataLookupS32(&status, row, "XORDER"); REQUIRE (status, "missing XORDER"); 535 int iy = psMetadataLookupS32(&status, row, "YORDER"); REQUIRE (status, "missing YORDER"); 536 537 // XXX do I need to use this or can i rely on the camera concepts? 538 // minX = psMetadataLookupF32(&status, row, "MINX"); 539 // maxX = psMetadataLookupF32(&status, row, "MAXX"); 540 // minY = psMetadataLookupF32(&status, row, "MINY"); 541 // maxY = psMetadataLookupF32(&status, row, "MAXY"); 542 543 // XXX need to include mask values 544 chip->toFPA->x->coeff[ix][iy] = psMetadataLookupF32(&status, row, "POLY_X"); 545 chip->toFPA->y->coeff[ix][iy] = psMetadataLookupF32(&status, row, "POLY_Y"); 546 chip->toFPA->x->coeffErr[ix][iy] = psMetadataLookupF32(&status, row, "ERROR_X"); 547 chip->toFPA->y->coeffErr[ix][iy] = psMetadataLookupF32(&status, row, "ERROR_Y"); 548 chip->toFPA->x->coeffMask[ix][iy] = psMetadataLookupU8(&status, row, "MASK_X"); 549 chip->toFPA->y->coeffMask[ix][iy] = psMetadataLookupU8(&status, row, "MASK_Y"); 551 550 } 552 551 553 552 // convert the toFPA transfomations to fromFPA transformations 554 553 for (int i = 0; i < file->fpa->chips->n; i++) { 555 pmChip *chip = file->fpa->chips->data[i];556 if (!chip->toFPA) continue;557 psRegion *region = pmChipPixels (chip);558 psFree (chip->fromFPA);559 chip->fromFPA = psPlaneTransformInvert(NULL, chip->toFPA, *region, 50);560 psFree (region);554 pmChip *chip = file->fpa->chips->data[i]; 555 if (!chip->toFPA) continue; 556 psRegion *region = pmChipPixels (chip); 557 psFree (chip->fromFPA); 558 chip->fromFPA = psPlaneTransformInvert(NULL, chip->toFPA, *region, 50); 559 psFree (region); 561 560 } 562 561 … … 589 588 // parse the model 590 589 for (int i = 0; i < model->n; i++) { 591 psMetadata *row = model->data[i];592 593 // there is only one transformation in this model; the order is defined in the header594 int nX = psMetadataLookupS32(&status, row, "NXORDER"); REQUIRE (status, "missing NXORDER");595 int nY = psMetadataLookupS32(&status, row, "NYORDER"); REQUIRE (status, "missing NYORDER");596 if (file->fpa->toTPA == NULL) {597 // allocate the new transformation598 file->fpa->toTPA = psPlaneTransformAlloc(nX, nY);599 } else {600 REQUIRE (file->fpa->toTPA->x->nX == nX, "mismatch in chip order");601 REQUIRE (file->fpa->toTPA->x->nY == nY, "mismatch in chip order");602 REQUIRE (file->fpa->toTPA->y->nX == nX, "mismatch in chip order");603 REQUIRE (file->fpa->toTPA->y->nY == nY, "mismatch in chip order");604 }605 606 int ix = psMetadataLookupS32(&status, row, "XORDER"); REQUIRE (status, "missing XORDER");607 int iy = psMetadataLookupS32(&status, row, "YORDER"); REQUIRE (status, "missing YORDER");608 file->fpa->toTPA->x->coeff[ix][iy] = psMetadataLookupF32(&status, row, "POLY_X"); REQUIRE (status, "missing POLY_X");609 file->fpa->toTPA->y->coeff[ix][iy] = psMetadataLookupF32(&status, row, "POLY_Y"); REQUIRE (status, "missing POLY_Y");610 file->fpa->toTPA->x->coeffErr[ix][iy] = psMetadataLookupF32(&status, row, "ERROR_X"); REQUIRE (status, "missing ERROR_X");611 file->fpa->toTPA->y->coeffErr[ix][iy] = psMetadataLookupF32(&status, row, "ERROR_Y"); REQUIRE (status, "missing ERROR_Y");612 file->fpa->toTPA->x->coeffMask[ix][iy] = psMetadataLookupU8 (&status, row, "MASK_X"); REQUIRE (status, "missing MASK_X");613 file->fpa->toTPA->y->coeffMask[ix][iy] = psMetadataLookupU8 (&status, row, "MASK_Y"); REQUIRE (status, "missing MASK_Y");590 psMetadata *row = model->data[i]; 591 592 // there is only one transformation in this model; the order is defined in the header 593 int nX = psMetadataLookupS32(&status, row, "NXORDER"); REQUIRE (status, "missing NXORDER"); 594 int nY = psMetadataLookupS32(&status, row, "NYORDER"); REQUIRE (status, "missing NYORDER"); 595 if (file->fpa->toTPA == NULL) { 596 // allocate the new transformation 597 file->fpa->toTPA = psPlaneTransformAlloc(nX, nY); 598 } else { 599 REQUIRE (file->fpa->toTPA->x->nX == nX, "mismatch in chip order"); 600 REQUIRE (file->fpa->toTPA->x->nY == nY, "mismatch in chip order"); 601 REQUIRE (file->fpa->toTPA->y->nX == nX, "mismatch in chip order"); 602 REQUIRE (file->fpa->toTPA->y->nY == nY, "mismatch in chip order"); 603 } 604 605 int ix = psMetadataLookupS32(&status, row, "XORDER"); REQUIRE (status, "missing XORDER"); 606 int iy = psMetadataLookupS32(&status, row, "YORDER"); REQUIRE (status, "missing YORDER"); 607 file->fpa->toTPA->x->coeff[ix][iy] = psMetadataLookupF32(&status, row, "POLY_X"); REQUIRE (status, "missing POLY_X"); 608 file->fpa->toTPA->y->coeff[ix][iy] = psMetadataLookupF32(&status, row, "POLY_Y"); REQUIRE (status, "missing POLY_Y"); 609 file->fpa->toTPA->x->coeffErr[ix][iy] = psMetadataLookupF32(&status, row, "ERROR_X"); REQUIRE (status, "missing ERROR_X"); 610 file->fpa->toTPA->y->coeffErr[ix][iy] = psMetadataLookupF32(&status, row, "ERROR_Y"); REQUIRE (status, "missing ERROR_Y"); 611 file->fpa->toTPA->x->coeffMask[ix][iy] = psMetadataLookupU8 (&status, row, "MASK_X"); REQUIRE (status, "missing MASK_X"); 612 file->fpa->toTPA->y->coeffMask[ix][iy] = psMetadataLookupU8 (&status, row, "MASK_Y"); REQUIRE (status, "missing MASK_Y"); 614 613 } 615 614 … … 629 628 psMetadataItem *newItem = psMetadataItemCopy(item); \ 630 629 if (!psMetadataAddItem(TO, newItem, PS_LIST_TAIL, PS_META_REPLACE)) { \ 631 psAbort ("cannot copy %s", NAME); \630 psAbort ("cannot copy %s", NAME); \ 632 631 } \ 633 632 psFree (newItem); } … … 635 634 // third layer applies boresite corrections and converts tangent plane to sky 636 635 bool pmAstromModelReadTP (pmFPAfile *file) { 637 636 638 637 if (!psFitsMoveExtName (file->fits, "TP")) { 639 638 psError(PS_ERR_IO, false, "missing TP extension in astrometry model\n"); … … 692 691 // third layer applies boresite corrections and converts tangent plane to sky 693 692 bool pmAstromModelSetTP (pmFPAfile *file, psMetadata *concepts) { 694 693 695 694 bool status; 696 695 … … 748 747 psPlaneTransformApply (boreFP, chip->toFPA, boreCH); 749 748 psPlaneTransformApply (boreTP, file->fpa->toTPA, boreFP); 750 psDeproject (boreSky, boreTP, file->fpa->toSky); 749 psDeproject (boreSky, boreTP, file->fpa->toSky); 751 750 752 751 // modify the projection to account for offset between true and reported boresite -
trunk/psModules/src/astrom/pmAstrometryModel.h
r17034 r18601 4 4 * @author EAM, IfA 5 5 * 6 * @version $Revision: 1. 1$ $Name: not supported by cvs2svn $7 * @date $Date: 2008-0 3-18 18:24:29$6 * @version $Revision: 1.2 $ $Name: not supported by cvs2svn $ 7 * @date $Date: 2008-07-17 22:38:15 $ 8 8 * Copyright 2006 Institute for Astronomy, University of Hawaii 9 9 */ … … 19 19 bool pmAstromModelCheckDataStatusForChip (const pmChip *chip); 20 20 21 bool pmAstromModelWriteForView (const pmFPAview *view, pmFPAfile *file, constpmConfig *config);22 bool pmAstromModelWriteFPA (pmFPAfile *file );23 bool pmAstromModelWritePHU (pmFPAfile *file );21 bool pmAstromModelWriteForView (const pmFPAview *view, pmFPAfile *file, pmConfig *config); 22 bool pmAstromModelWriteFPA (pmFPAfile *file, const pmFPA *fpa); 23 bool pmAstromModelWritePHU (pmFPAfile *file, const pmFPA *fpa); 24 24 bool pmAstromModelWriteSky (pmFPAfile *file); 25 25 bool pmAstromModelWriteTP (pmFPAfile *file); -
trunk/psModules/src/astrom/pmAstrometryRefstars.c
r17062 r18601 1 1 /* @file pmAstrometryRefstars.c 2 2 * @brief Functions to write (and read?) astrometric reference stars 3 * 3 * 4 4 * @ingroup AstroImage 5 5 * 6 6 * @author EAM, IfA 7 * @version $Revision: 1. 2$ $Name: not supported by cvs2svn $8 * @date $Date: 2008-0 3-20 00:27:00$7 * @version $Revision: 1.3 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2008-07-17 22:38:15 $ 9 9 * Copyright 2008 Institute for Astronomy, University of Hawaii 10 10 */ … … 32 32 #include "pmFPAview.h" 33 33 #include "pmFPAfile.h" 34 #include "pmFPAfileFitsIO.h" 34 35 #include "pmAstrometryObjects.h" 35 36 #include "pmAstrometryRefstars.h" … … 144 145 } 145 146 146 bool pmAstromRefstarsWritePHU (const pmFPAview *view, pmFPAfile *file, const pmConfig *config) {147 148 // output header data 147 bool pmAstromRefstarsWritePHU (const pmFPAview *view, pmFPAfile *file, pmConfig *config) { 148 149 // output header data 149 150 psMetadata *outhead = psMetadataAlloc(); 150 151 151 152 // use the FPA phu to generate the PHU header 152 pmHDU *phu = file->fpa->hdu; 153 pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config, false); // Suitable FPA for writing 154 pmHDU *phu = psMemIncrRefCounter(fpa->hdu); 155 psFree(fpa); 153 156 154 157 // if there is no FPA PHU, this is a single header+image (extension-less) file. This could be … … 156 159 // write it out as a 'blank' 157 160 if (phu) { 158 psMetadataCopy (outhead, phu->header);161 psMetadataCopy (outhead, phu->header); 159 162 } else { 160 pmConfigConformHeader (outhead, file->format); 161 } 163 pmConfigConformHeader (outhead, file->format); 164 } 165 psFree(phu); 162 166 163 167 psMetadataAddBool (outhead, PS_LIST_TAIL, "EXTEND", PS_META_REPLACE, "this file has extensions", true); … … 256 260 257 261 // set the extname : we are really only allowed one entry per chip; check this here? 258 char *chiprule = psStringCopy ("{CHIP.NAME}"); 262 char *chiprule = psStringCopy ("{CHIP.NAME}"); 259 263 char *chipname = pmFPAfileNameFromRule (chiprule, file, view); 260 264 261 265 for (int i = 0; i < refstars->n; i++) { 262 266 psMetadata *row = psMetadataAlloc (); 263 267 264 268 pmAstromObj *ref = refstars->data[i]; 265 269 266 psMetadataAddF64(row, PS_LIST_TAIL, "RA", PS_META_REPLACE, "degrees", PS_DEG_RAD*ref->sky->r);267 psMetadataAddF64(row, PS_LIST_TAIL, "DEC", PS_META_REPLACE, "degrees", PS_DEG_RAD*ref->sky->d);268 psMetadataAddF32(row, PS_LIST_TAIL, "TP_X", PS_META_REPLACE, "microns", ref->TP->x);269 psMetadataAddF32(row, PS_LIST_TAIL, "TP_Y", PS_META_REPLACE, "microns", ref->TP->y);270 psMetadataAddF32(row, PS_LIST_TAIL, "FP_X", PS_META_REPLACE, "microns", ref->FP->x);271 psMetadataAddF32(row, PS_LIST_TAIL, "FP_Y", PS_META_REPLACE, "microns", ref->FP->y);272 psMetadataAddF32(row, PS_LIST_TAIL, "CHIP_X", PS_META_REPLACE, "microns", ref->chip->x);273 psMetadataAddF32(row, PS_LIST_TAIL, "CHIP_Y", PS_META_REPLACE, "microns", ref->chip->y);274 psMetadataAddF32(row, PS_LIST_TAIL, "MAG", PS_META_REPLACE, "microns", ref->Mag);270 psMetadataAddF64(row, PS_LIST_TAIL, "RA", PS_META_REPLACE, "degrees", PS_DEG_RAD*ref->sky->r); 271 psMetadataAddF64(row, PS_LIST_TAIL, "DEC", PS_META_REPLACE, "degrees", PS_DEG_RAD*ref->sky->d); 272 psMetadataAddF32(row, PS_LIST_TAIL, "TP_X", PS_META_REPLACE, "microns", ref->TP->x); 273 psMetadataAddF32(row, PS_LIST_TAIL, "TP_Y", PS_META_REPLACE, "microns", ref->TP->y); 274 psMetadataAddF32(row, PS_LIST_TAIL, "FP_X", PS_META_REPLACE, "microns", ref->FP->x); 275 psMetadataAddF32(row, PS_LIST_TAIL, "FP_Y", PS_META_REPLACE, "microns", ref->FP->y); 276 psMetadataAddF32(row, PS_LIST_TAIL, "CHIP_X", PS_META_REPLACE, "microns", ref->chip->x); 277 psMetadataAddF32(row, PS_LIST_TAIL, "CHIP_Y", PS_META_REPLACE, "microns", ref->chip->y); 278 psMetadataAddF32(row, PS_LIST_TAIL, "MAG", PS_META_REPLACE, "microns", ref->Mag); 275 279 psMetadataAddF32(row, PS_LIST_TAIL, "MAG_ERR", PS_META_REPLACE, "microns", ref->dMag); 276 280 … … 281 285 psError(PS_ERR_IO, false, "writing refstars\n"); 282 286 psFree (table); 283 psFree (header);284 psFree (chiprule);285 psFree (chipname);287 psFree (header); 288 psFree (chiprule); 289 psFree (chipname); 286 290 return false; 287 291 } -
trunk/psModules/src/astrom/pmAstrometryRefstars.h
r17034 r18601 5 5 * 6 6 * @author EAM, IfA 7 * @version $Revision: 1. 1$ $Name: not supported by cvs2svn $8 * @date $Date: 2008-0 3-18 18:24:29$7 * @version $Revision: 1.2 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2008-07-17 22:38:15 $ 9 9 * Copyright 2008 Institute for Astronomy, University of Hawaii 10 10 */ … … 23 23 24 24 bool pmAstromRefstarsWriteForView (const pmFPAview *view, pmFPAfile *file, const pmConfig *config); 25 bool pmAstromRefstarsWritePHU (const pmFPAview *view, pmFPAfile *file, constpmConfig *config);25 bool pmAstromRefstarsWritePHU (const pmFPAview *view, pmFPAfile *file, pmConfig *config); 26 26 27 27 bool pmAstromRefstarsWriteFPA (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file, const pmConfig *config); -
trunk/psModules/src/camera/pmFPAfileFitsIO.c
r18554 r18601 22 22 #include "pmFPAConstruct.h" 23 23 #include "pmDark.h" 24 25 pmFPA *pmFPAfileSuitableFPA(const pmFPAfile *file, const pmFPAview *view, const pmConfig *config) 26 { 27 PS_ASSERT_PTR_NON_NULL(file, NULL); 28 PS_ASSERT_PTR_NON_NULL(view, NULL); 24 #include "pmConcepts.h" 25 26 // Get a suitable FPA for the file; generate it if necessary 27 static pmFPA *suitableFPA(const pmFPAfile *file, // File for which to get FPA 28 const pmFPAview *view, // View at which to produce the FPA 29 pmConfig *config, // Configuration (for concepts update) 30 bool pixels // Worry about copying pixels? 31 ) 32 { 33 psAssert(file, "It's supposed to be here"); 34 psAssert(view, "It's supposed to be here"); 35 psAssert(config, "It's supposed to be here"); 29 36 30 37 if (!file->format) { // Working with the same output format as input format … … 86 93 switch (level) { 87 94 case PM_FPA_LEVEL_FPA: 88 if (!pmFPACopy(copy, file->fpa)) { 95 if ((pixels && !pmFPACopy(copy, file->fpa)) || 96 (!pixels && !pmFPACopyStructure(copy, file->fpa, 1, 1))) { 89 97 psError(PS_ERR_UNKNOWN, false, "Unable to copy FPA for format conversion.\n"); 90 98 return NULL; … … 94 102 pmChip *chip = pmFPAviewThisChip(view, copy); // Chip of interest 95 103 pmChip *srcChip = pmFPAviewThisChip(view, file->fpa); // Source chip 96 if (!pmChipCopy(chip, srcChip)) { 104 if ((pixels && !pmChipCopy(chip, srcChip)) || 105 (!pixels && !pmChipCopyStructure(chip, srcChip, 1, 1))) { 97 106 psError(PS_ERR_UNKNOWN, false, "Unable to copy chip for format conversion.\n"); 98 107 return false; … … 103 112 pmCell *cell = pmFPAviewThisCell(view, copy); // Cell of interest 104 113 pmCell *srcCell = pmFPAviewThisCell(view, file->fpa); // Source cell 105 if (!pmCellCopy(cell, srcCell)) { 114 if ((pixels && !pmCellCopy(cell, srcCell)) || 115 (!pixels && !pmCellCopyStructure(cell, srcCell, 1, 1))) { 106 116 psError(PS_ERR_UNKNOWN, false, "Unable to copy cell for format conversion.\n"); 107 117 return false; … … 115 125 } 116 126 127 // Unreachable 117 128 return NULL; 118 129 } 130 131 132 pmFPA *pmFPAfileSuitableFPA(const pmFPAfile *file, const pmFPAview *view, pmConfig *config, bool pixels) 133 { 134 PS_ASSERT_PTR_NON_NULL(file, NULL); 135 PS_ASSERT_PTR_NON_NULL(view, NULL); 136 PS_ASSERT_PTR_NON_NULL(config, NULL); 137 138 pmFPA *fpa = suitableFPA(file, view, config, pixels); // A suitable FPA for writing 139 if (!fpa) { 140 psError(PS_ERR_UNKNOWN, false, "Unable to produce suitable FPA."); 141 return NULL; 142 } 143 144 // Ensure headers and all are updated 145 // This is here so that the individual write functions (e.g., images, PSFs, sources, etc) don't have to 146 // take care of all this themselves (because they generally don't). 147 switch (file->type) { 148 case PM_FPA_FILE_IMAGE: 149 case PM_FPA_FILE_MASK: 150 case PM_FPA_FILE_WEIGHT: 151 case PM_FPA_FILE_HEADER: 152 case PM_FPA_FILE_FRINGE: 153 case PM_FPA_FILE_DARK: 154 case PM_FPA_FILE_CMP: 155 case PM_FPA_FILE_CMF: 156 case PM_FPA_FILE_PSF: 157 case PM_FPA_FILE_ASTROM_MODEL: 158 case PM_FPA_FILE_ASTROM_REFSTARS: { 159 pmHDU *hdu = pmFPAviewThisHDU(view, fpa); 160 if (hdu) { 161 if (!hdu->header) { 162 hdu->header = psMetadataAlloc(); 163 } 164 pmConfigConformHeader(hdu->header, file->format); 165 166 // whenever we write out a mask image, we should define the bits which represent mask concepts 167 if (file->type == PM_FPA_FILE_MASK) { 168 assert (hdu->header); 169 if (!pmConfigMaskWriteHeader(config, hdu->header)) { 170 psError(PS_ERR_UNKNOWN, false, 171 "failed to set the bitmask names in the PHU header for Image %s (%s)\n", 172 file->filename, file->name); 173 return false; 174 } 175 } 176 } 177 178 pmChip *chip = pmFPAviewThisChip(view, fpa); // Chip of interest, or NULL 179 pmCell *cell = pmFPAviewThisCell(view, fpa); // Cell of interest, or NULL 180 if (!pmFPAUpdateNames(fpa, chip, cell)) { 181 psError(PS_ERR_UNKNOWN, false, "Unable to update names in header."); 182 return false; 183 } 184 185 pmConceptSource sources = PM_CONCEPT_SOURCE_HEADER | PM_CONCEPT_SOURCE_CELLS | 186 PM_CONCEPT_SOURCE_DEFAULTS | PM_CONCEPT_SOURCE_DATABASE; // Concept sources to write 187 if (cell) { 188 if (!pmConceptsWriteCell(cell, sources, true, config)) { 189 psError(PS_ERR_IO, false, "Unable to write concepts for cell.\n"); 190 return false; 191 } 192 } else if (chip) { 193 if (!pmConceptsWriteChip(chip, sources, true, true, config)) { 194 psError(PS_ERR_IO, false, "Unable to write concepts for chip.\n"); 195 return false; 196 } 197 } else if (!pmConceptsWriteFPA(fpa, sources, true, config)) { 198 psError(PS_ERR_IO, false, "Unable to write concepts for FPA.\n"); 199 return false; 200 } 201 break; 202 } 203 default: 204 // No action 205 break; 206 } 207 208 return fpa; 119 209 } 120 210 … … 142 232 143 233 // given an already-opened fits file, write the table corresponding to the specified view 144 bool pmFPAviewWriteFitsTable(const pmFPAview *view, pmFPAfile *file, const char *name )145 { 146 PS_ASSERT_PTR_NON_NULL(view, false); 147 PS_ASSERT_PTR_NON_NULL(file, false); 148 149 pmFPA *fpa = file->fpa;// FPA of interest234 bool pmFPAviewWriteFitsTable(const pmFPAview *view, pmFPAfile *file, const char *name, pmConfig *config) 235 { 236 PS_ASSERT_PTR_NON_NULL(view, false); 237 PS_ASSERT_PTR_NON_NULL(file, false); 238 239 pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config, false); // FPA of interest 150 240 psFits *fits = file->fits; // FITS file 151 241 … … 280 370 PS_ASSERT_PTR_NON_NULL(fits, false); 281 371 282 pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config ); // FPA to write372 pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config, true); // FPA to write 283 373 284 374 switch (pmFPAviewLevel(view)) { … … 489 579 490 580 // select or generate the desired fpa in the correct output format 491 pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config );581 pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config, false); 492 582 pmHDU *phu = pmFPAviewThisHDU(view, fpa); 493 583 if (!phu || !phu->blankPHU) { … … 499 589 // whenever we write out a mask image, we should define the bits which represent mask concepts 500 590 if (file->type == PM_FPA_FILE_MASK) { 501 assert (phu->header);502 if (!pmConfigMaskWriteHeader (config, phu->header)) {503 psError(PS_ERR_UNKNOWN, false, "failed to set the bitmask names in the PHU header for Image %s (%s)\n", file->filename, file->name);504 return false;505 }591 assert (phu->header); 592 if (!pmConfigMaskWriteHeader (config, phu->header)) { 593 psError(PS_ERR_UNKNOWN, false, "failed to set the bitmask names in the PHU header for Image %s (%s)\n", file->filename, file->name); 594 return false; 595 } 506 596 } 507 597 -
trunk/psModules/src/camera/pmFPAfileFitsIO.h
r18364 r18601 5 5 * @author PAP, IfA 6 6 * 7 * @version $Revision: 1.1 4$ $Name: not supported by cvs2svn $8 * @date $Date: 2008-0 6-30 00:53:45 $7 * @version $Revision: 1.15 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2008-07-17 22:38:15 $ 9 9 * Copyright 2004-2005 Institute for Astronomy, University of Hawaii 10 10 */ … … 86 86 bool pmFPAviewWriteFitsTable(const pmFPAview *view, ///< View specifying level of interest 87 87 pmFPAfile *file, ///< FPA file to write 88 const char *name ///< Name of table 88 const char *name, ///< Name of table 89 pmConfig *config ///< Configuration 89 90 ); 90 91 … … 97 98 pmFPA *pmFPAfileSuitableFPA(const pmFPAfile *file,///< File containing the fpa 98 99 const pmFPAview *view, ///< View at which to produce the fpa 99 const pmConfig *config ///< Configuration 100 pmConfig *config, ///< Configuration 101 bool pixels ///< Worry about copying the pixels? 100 102 ); 101 103 -
trunk/psModules/src/camera/pmFPAfileIO.c
r18554 r18601 405 405 } 406 406 407 // check if the file is a FITS file (or uses the fits header) 408 bool fitsType = false; 409 fitsType |= (file->type == PM_FPA_FILE_IMAGE); 410 fitsType |= (file->type == PM_FPA_FILE_MASK); 411 fitsType |= (file->type == PM_FPA_FILE_WEIGHT); 412 fitsType |= (file->type == PM_FPA_FILE_HEADER); 413 fitsType |= (file->type == PM_FPA_FILE_FRINGE); 414 fitsType |= (file->type == PM_FPA_FILE_DARK); 415 fitsType |= (file->type == PM_FPA_FILE_CMP); 416 fitsType |= (file->type == PM_FPA_FILE_CMF); 417 fitsType |= (file->type == PM_FPA_FILE_PSF); 418 fitsType |= (file->type == PM_FPA_FILE_ASTROM_MODEL); 419 fitsType |= (file->type == PM_FPA_FILE_ASTROM_REFSTARS); 420 421 // Ensure headers and all are updated 422 // This is here so that the individual write functions (e.g., images, PSFs, sources, etc) don't have to 423 // take care of all this themselves (because they generally don't). 424 if (fitsType) { 425 pmHDU *hdu = pmFPAviewThisHDU(view, file->fpa); 426 if (hdu) { 427 if (!hdu->header) { 428 hdu->header = psMetadataAlloc(); 429 } 430 pmConfigConformHeader(hdu->header, file->format); 431 432 // whenever we write out a mask image, we should define the bits which represent mask concepts 433 if (file->type == PM_FPA_FILE_MASK) { 434 assert (hdu->header); 435 if (!pmConfigMaskWriteHeader (config, hdu->header)) { 436 psError(PS_ERR_UNKNOWN, false, "failed to set the bitmask names in the PHU header for Image %s (%s)\n", file->filename, file->name); 437 return false; 438 } 439 } 440 } 441 442 pmFPA *fpa = file->fpa; // FPA of interest 443 pmChip *chip = pmFPAviewThisChip(view, file->fpa); // Chip of interest, or NULL 444 pmCell *cell = pmFPAviewThisCell(view, file->fpa); // Cell of interest, or NULL 445 if (!pmFPAUpdateNames(fpa, chip, cell)) { 446 psError(PS_ERR_UNKNOWN, false, "Unable to update names in header."); 447 return false; 448 } 449 450 pmConceptSource sources = PM_CONCEPT_SOURCE_HEADER | PM_CONCEPT_SOURCE_CELLS | 451 PM_CONCEPT_SOURCE_DEFAULTS | PM_CONCEPT_SOURCE_DATABASE; // Concept sources to write 452 if (cell) { 453 if (!pmConceptsWriteCell(cell, sources, true, config)) { 454 psError(PS_ERR_IO, false, "Unable to write concepts for cell.\n"); 455 return false; 456 } 457 } else if (chip) { 458 if (!pmConceptsWriteChip(chip, sources, true, true, config)) { 459 psError(PS_ERR_IO, false, "Unable to write concepts for chip.\n"); 460 return false; 461 } 462 } else if (!pmConceptsWriteFPA(fpa, sources, true, config)) { 463 psError(PS_ERR_IO, false, "Unable to write concepts for FPA.\n"); 464 return false; 465 } 466 } 407 // IMPORTANT: If adding a FITS-based file, make sure your write function uses an FPA produced by 408 // pmFPAfileSuitableFPA. This ensures the HDUs are at the correct level for your output format, and sets 409 // the headers correctly. 467 410 468 411 // select a writing method … … 487 430 status = pmFPAviewWriteFitsImage (view, file, config); 488 431 if (status) { 489 if (!pmFPAviewWriteFitsTable(view, file, "FRINGE" )) {432 if (!pmFPAviewWriteFitsTable(view, file, "FRINGE", config)) { 490 433 psError(PS_ERR_UNKNOWN, false, "Unable to write fringe data from %s.\n", file->filename); 491 434 return false; … … 802 745 } 803 746 804 // XXX if we have a mask file, then we need to read the mask bit names805 // defined for this file806 if (file->type == PM_FPA_FILE_MASK) {807 if (!pmConfigMaskReadHeader (config, phu)) {808 psError(PS_ERR_IO, false, "error in mask bits");809 return false;810 }811 }747 // XXX if we have a mask file, then we need to read the mask bit names 748 // defined for this file 749 if (file->type == PM_FPA_FILE_MASK) { 750 if (!pmConfigMaskReadHeader (config, phu)) { 751 psError(PS_ERR_IO, false, "error in mask bits"); 752 return false; 753 } 754 } 812 755 813 756 // determine the current format from the header -
trunk/psModules/src/objects/pmPSF_IO.c
r18600 r18601 6 6 * @author EAM, IfA 7 7 * 8 * @version $Revision: 1.3 3$ $Name: not supported by cvs2svn $9 * @date $Date: 2008-07-17 2 0:43:38$8 * @version $Revision: 1.34 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2008-07-17 22:38:15 $ 10 10 * 11 11 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 35 35 #include "pmFPAview.h" 36 36 #include "pmFPAfile.h" 37 #include "pmFPAfileFitsIO.h" 37 38 38 39 #include "pmPeaks.h" … … 107 108 } 108 109 109 bool pmPSFmodelWriteForView (const pmFPAview *view, pmFPAfile *file, constpmConfig *config)110 bool pmPSFmodelWriteForView (const pmFPAview *view, pmFPAfile *file, pmConfig *config) 110 111 { 111 112 PS_ASSERT_PTR_NON_NULL(view, false); … … 142 143 143 144 // read in all chip-level PSFmodel files for this FPA 144 bool pmPSFmodelWriteFPA (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file, constpmConfig *config)145 bool pmPSFmodelWriteFPA (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file, pmConfig *config) 145 146 { 146 147 PS_ASSERT_PTR_NON_NULL(view, false); … … 164 165 165 166 // read in all cell-level PSFmodel files for this chip 166 bool pmPSFmodelWriteChip (pmChip *chip, const pmFPAview *view, pmFPAfile *file, constpmConfig *config)167 bool pmPSFmodelWriteChip (pmChip *chip, const pmFPAview *view, pmFPAfile *file, pmConfig *config) 167 168 { 168 169 PS_ASSERT_PTR_NON_NULL(view, false); … … 185 186 // - psf table (+header) : FITS Table 186 187 bool pmPSFmodelWrite (psMetadata *analysis, const pmFPAview *view, 187 pmFPAfile *file, constpmConfig *config)188 pmFPAfile *file, pmConfig *config) 188 189 { 189 190 PS_ASSERT_PTR_NON_NULL(view, false); … … 208 209 209 210 // get the current header 210 pmHDU *hdu = pmFPAviewThisHDU (view, file->fpa); 211 pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config, false); // Suitable FPA for writing 212 pmHDU *hdu = psMemIncrRefCounter(pmFPAviewThisHDU(view, fpa)); 213 psFree(fpa); 211 214 if (!hdu) { 212 215 psError(PS_ERR_UNKNOWN, false, "Unable to find HDU"); … … 229 232 if (!menu) { 230 233 psError(PS_ERR_UNKNOWN, true, "missing EXTNAME.RULES in camera.config"); 234 psFree(hdu); 231 235 return false; 232 236 } … … 236 240 if (!rule) { 237 241 psError(PS_ERR_UNKNOWN, false, "missing entry for PSF.HEAD in EXTNAME.RULES in camera.config"); 242 psFree(hdu); 238 243 return false; 239 244 } … … 245 250 psError(PS_ERR_UNKNOWN, false, "missing entry for PSF.TABLE in EXTNAME.RULES in camera.config"); 246 251 psFree (headName); 252 psFree(hdu); 247 253 return false; 248 254 } … … 255 261 psFree (headName); 256 262 psFree (tableName); 263 psFree(hdu); 257 264 return false; 258 265 } … … 278 285 psFree (headName); 279 286 } 287 psFree(hdu); 280 288 281 289 // select the psf of interest … … 481 489 482 490 // if this file needs to have a PHU written out, write one 483 bool pmPSFmodelWritePHU (const pmFPAview *view, pmFPAfile *file, constpmConfig *config)491 bool pmPSFmodelWritePHU (const pmFPAview *view, pmFPAfile *file, pmConfig *config) 484 492 { 485 493 PS_ASSERT_PTR_NON_NULL(view, false); … … 496 504 if (file->fpa->chips->n == 1) return true; 497 505 506 498 507 // find the FPA phu 499 pmHDU *phu = pmFPAviewThisPHU (view, file->fpa); 508 pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config, false); // Suitable FPA for writing 509 pmHDU *phu = psMemIncrRefCounter(pmFPAviewThisPHU(view, fpa)); 510 psFree(fpa); 500 511 501 512 // if there is no PHU, this is a single header+image (extension-less) file. This could be … … 508 519 pmConfigConformHeader (outhead, file->format); 509 520 } 521 psFree(phu); 510 522 511 523 psMetadataAddBool (outhead, PS_LIST_TAIL, "EXTEND", PS_META_REPLACE, "this file has extensions", true); -
trunk/psModules/src/objects/pmPSF_IO.h
r15000 r18601 6 6 * @author EAM, IfA 7 7 * 8 * @version $Revision: 1.1 0$ $Name: not supported by cvs2svn $9 * @date $Date: 200 7-09-24 21:27:58$8 * @version $Revision: 1.11 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2008-07-17 22:38:15 $ 10 10 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii 11 11 */ … … 17 17 /// @{ 18 18 19 bool pmPSFmodelWriteForView (const pmFPAview *view, pmFPAfile *file, constpmConfig *config);20 bool pmPSFmodelWriteFPA (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file, constpmConfig *config);21 bool pmPSFmodelWriteChip (pmChip *chip, const pmFPAview *view, pmFPAfile *file, constpmConfig *config);22 bool pmPSFmodelWrite (psMetadata *analysis, const pmFPAview *view, pmFPAfile *file, constpmConfig *config);19 bool pmPSFmodelWriteForView (const pmFPAview *view, pmFPAfile *file, pmConfig *config); 20 bool pmPSFmodelWriteFPA (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file, pmConfig *config); 21 bool pmPSFmodelWriteChip (pmChip *chip, const pmFPAview *view, pmFPAfile *file, pmConfig *config); 22 bool pmPSFmodelWrite (psMetadata *analysis, const pmFPAview *view, pmFPAfile *file, pmConfig *config); 23 23 24 bool pmPSFmodelWritePHU (const pmFPAview *view, pmFPAfile *file, constpmConfig *config);24 bool pmPSFmodelWritePHU (const pmFPAview *view, pmFPAfile *file, pmConfig *config); 25 25 26 26 bool pmPSFmodelReadForView (const pmFPAview *view, pmFPAfile *file, const pmConfig *config); -
trunk/psModules/src/objects/pmSourceIO.c
r18599 r18601 3 3 * @author EAM, IfA 4 4 * 5 * @version $Revision: 1.6 2$ $Name: not supported by cvs2svn $6 * @date $Date: 2008-07-17 2 0:43:23$5 * @version $Revision: 1.63 $ $Name: not supported by cvs2svn $ 6 * @date $Date: 2008-07-17 22:38:15 $ 7 7 * 8 8 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 28 28 #include "pmFPAview.h" 29 29 #include "pmFPAfile.h" 30 #include "pmFPAfileFitsIO.h" 30 31 #include "pmConcepts.h" 31 32 … … 108 109 109 110 // Given a FITS file pointer, write the table of object data 110 bool pmFPAviewWriteObjects (const pmFPAview *view, pmFPAfile *file, constpmConfig *config)111 bool pmFPAviewWriteObjects (const pmFPAview *view, pmFPAfile *file, pmConfig *config) 111 112 { 112 113 PS_ASSERT_PTR_NON_NULL(view, false); … … 114 115 PS_ASSERT_PTR_NON_NULL(file->fpa, false); 115 116 116 pmFPA *fpa = file->fpa;117 pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config, false); // Suitable FPA for writing 117 118 118 119 if (view->chip == -1) { 119 120 if (!pmFPAWriteObjects (fpa, view, file, config)) { 120 121 psError(PS_ERR_IO, false, "Failed to write objects from fpa"); 121 return false; 122 } 122 psFree(fpa); 123 return false; 124 } 125 psFree(fpa); 123 126 return true; 124 127 } … … 126 129 if (view->chip >= fpa->chips->n) { 127 130 psError(PS_ERR_UNKNOWN, false, "Writing chip == %d (>= chips->n == %ld)", view->chip, fpa->chips->n); 131 psFree(fpa); 128 132 return false; 129 133 } … … 133 137 if (!pmChipWriteObjects (chip, view, file, config)) { 134 138 psError(PS_ERR_IO, false, "Failed to write objects from chip"); 135 return false; 136 } 139 psFree(fpa); 140 return false; 141 } 142 psFree(fpa); 137 143 return true; 138 144 } … … 141 147 psError(PS_ERR_UNKNOWN, false, "Writing cell == %d (>= cells->n == %ld)", 142 148 view->cell, chip->cells->n); 149 psFree(fpa); 143 150 return false; 144 151 } … … 148 155 if (!pmCellWriteObjects (cell, view, file, config)) { 149 156 psError(PS_ERR_IO, false, "Failed to write objects from cell"); 150 return false; 151 } 152 157 psFree(fpa); 158 return false; 159 } 160 psFree(fpa); 153 161 return true; 154 162 } … … 157 165 psError(PS_ERR_UNKNOWN, false, "Writing readout == %d (>= readouts->n == %ld)", 158 166 view->readout, cell->readouts->n); 167 psFree(fpa); 159 168 return false; 160 169 } … … 163 172 if (!pmReadoutWriteObjects (readout, view, file, config)) { 164 173 psError(PS_ERR_IO, false, "Failed to write objects from readout %d", view->readout); 165 return false; 166 } 167 174 psFree(fpa); 175 return false; 176 } 177 178 psFree(fpa); 168 179 return true; 169 180 } … … 244 255 PS_ASSERT_PTR_NON_NULL(view, false); 245 256 PS_ASSERT_PTR_NON_NULL(file, false); 246 PS_ASSERT_PTR_NON_NULL(file->fpa, false); 257 258 pmCell *cell = readout->parent; 259 PS_ASSERT_PTR_NON_NULL(cell, false); 260 pmChip *chip = cell->parent; 261 PS_ASSERT_PTR_NON_NULL(chip, false); 262 pmFPA *fpa = chip->parent; 263 PS_ASSERT_PTR_NON_NULL(fpa, false); 247 264 248 265 bool status; … … 281 298 case PM_FPA_FILE_CMP: 282 299 // a SPLIT format : only one header and object table per file 283 hdu = pmFPAviewThisHDU (view, f ile->fpa);300 hdu = pmFPAviewThisHDU (view, fpa); 284 301 if (!hdu) { 285 302 psError(PS_ERR_UNEXPECTED_NULL, true, "Unable to find HDU to write sources."); … … 317 334 318 335 // get the current header 319 hdu = pmFPAviewThisHDU (view, f ile->fpa);336 hdu = pmFPAviewThisHDU (view, fpa); 320 337 if (!hdu) { 321 338 psError(PS_ERR_UNEXPECTED_NULL, true, "Unable to find HDU to write sources."); … … 486 503 487 504 // if this file needs to have a PHU written out, write one 488 bool pmSource_CMF_WritePHU (const pmFPAview *view, pmFPAfile *file, constpmConfig *config)505 bool pmSource_CMF_WritePHU (const pmFPAview *view, pmFPAfile *file, pmConfig *config) 489 506 { 490 507 PS_ASSERT_PTR_NON_NULL(view, false); … … 503 520 if (file->fpa->chips->n == 1) return true; 504 521 522 505 523 // find the FPA phu 506 pmHDU *phu = pmFPAviewThisPHU (view, file->fpa); 524 pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config, false); // Suitable FPA for writing 525 pmHDU *phu = psMemIncrRefCounter(pmFPAviewThisPHU(view, fpa)); 507 526 508 527 // if there is no PHU, this is a single header+image (extension-less) file. This could be … … 513 532 psMetadataCopy (outhead, phu->header); 514 533 } 534 psFree(phu); 515 535 516 536 pmConfigConformHeader (outhead, file->format); … … 521 541 // XXX why are these not correctly inserted by pmConfigConformHeader?? 522 542 523 psMetadata *headers = psMetadataLookupMetadata(NULL, file->fpa->camera, BLANK_HEADERS); // Header names 543 // Because these concepts are not part of the "RULE" in the camera format, pmConfigConformHeader only adds 544 // what is required by the "RULE". 545 // Though we can configure Ohana to look at particular header keywords, it doesn't like having the 546 // important values in "HIERARCH FPA.TIME", etc, as is done for skycells, so we stoop to its level, 547 // putting in additional header keywords that it can understand. 548 549 psMetadata *headers = psMetadataLookupMetadata(NULL, fpa->camera, BLANK_HEADERS); // Header names 524 550 if (!headers) { 525 551 psError(PS_ERR_UNEXPECTED_NULL, false, 526 552 "Unable to find %s metadata within camera configuration", BLANK_HEADERS); 527 553 psFree(outhead); 554 psFree(fpa); 528 555 return false; 529 556 } … … 535 562 "Unable to find FPA.TIME in %s within camera configuration.", BLANK_HEADERS); 536 563 psFree(outhead); 537 return false; 538 } 539 psTime *time = psMetadataLookupTime(NULL, file->fpa->concepts, "FPA.TIME"); // Time of observation 564 psFree(fpa); 565 return false; 566 } 567 psTime *time = psMetadataLookupTime(NULL, fpa->concepts, "FPA.TIME"); // Time of observation 540 568 double mjd = psTimeToMJD(time); // The MJD of observation 541 569 psMetadataAddF64(outhead, PS_LIST_TAIL, mjdName, PS_META_REPLACE, … … 550 578 BLANK_HEADERS); 551 579 psFree(outhead); 552 return false;553 }554 float exptime = psMetadataLookupF32(NULL, file->fpa->concepts,555 "FPA.EXPOSURE"); // Exposure time580 psFree(fpa); 581 return false; 582 } 583 float exptime = psMetadataLookupF32(NULL, fpa->concepts, "FPA.EXPOSURE"); // Exposure time 556 584 psMetadataAddF32(outhead, PS_LIST_TAIL, expName, PS_META_REPLACE, 557 585 "Exposure time (sec)", exptime); … … 565 593 BLANK_HEADERS); 566 594 psFree(outhead); 567 return false; 568 } 569 float airmass = psMetadataLookupF32(NULL, file->fpa->concepts, "FPA.AIRMASS"); // Airmass 595 psFree(fpa); 596 return false; 597 } 598 float airmass = psMetadataLookupF32(NULL, fpa->concepts, "FPA.AIRMASS"); // Airmass 570 599 psMetadataAddF32(outhead, PS_LIST_TAIL, amName, PS_META_REPLACE, 571 600 "Observation airmass", airmass); … … 575 604 const char *fpaNameHdr = psMetadataLookupStr(NULL, fileData, "FPA.OBS"); 576 605 if (fpaNameHdr && strlen(fpaNameHdr) > 0) { 577 const char *fpaName = psMetadataLookupStr(NULL, f ile->fpa->concepts, "FPA.OBS");606 const char *fpaName = psMetadataLookupStr(NULL, fpa->concepts, "FPA.OBS"); 578 607 psMetadataAddStr(outhead, PS_LIST_TAIL, fpaNameHdr, PS_META_REPLACE, 579 608 "FPA observation identifier", fpaName); … … 581 610 582 611 // if we have mosaic-level astrometry information, add it here: 583 psMetadata *updates = psMetadataLookupPtr (&status, f ile->fpa->analysis, "PSASTRO.HEADER");612 psMetadata *updates = psMetadataLookupPtr (&status, fpa->analysis, "PSASTRO.HEADER"); 584 613 if (updates) { 585 614 psMetadataCopy (outhead, updates); 586 615 } 616 psFree(fpa); 587 617 588 618 psMetadataAddBool (outhead, PS_LIST_TAIL, "EXTEND", PS_META_REPLACE, "this file has extensions", true); -
trunk/psModules/src/objects/pmSourceIO.h
r17850 r18601 4 4 * @author EAM, IfA; GLG, MHPCC 5 5 * 6 * @version $Revision: 1.1 7$ $Name: not supported by cvs2svn $7 * @date $Date: 2008-0 5-29 13:25:38$6 * @version $Revision: 1.18 $ $Name: not supported by cvs2svn $ 7 * @date $Date: 2008-07-17 22:38:15 $ 8 8 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii 9 9 * … … 30 30 bool pmSourcesWrite_PS1_DEV_1_XFIT (psFits *fits, psArray *sources, char *extname); 31 31 32 bool pmSource_CMF_WritePHU (const pmFPAview *view, pmFPAfile *file, constpmConfig *config);32 bool pmSource_CMF_WritePHU (const pmFPAview *view, pmFPAfile *file, pmConfig *config); 33 33 34 34 psArray *pmSourcesReadCMP (char *filename, psMetadata *header); … … 50 50 bool pmReadoutReadObjects (pmReadout *readout, const pmFPAview *view, pmFPAfile *file, const pmConfig *config); 51 51 52 bool pmFPAviewWriteObjects (const pmFPAview *view, pmFPAfile *file, constpmConfig *config);52 bool pmFPAviewWriteObjects (const pmFPAview *view, pmFPAfile *file, pmConfig *config); 53 53 bool pmFPAWriteObjects (pmFPA *fpa, const pmFPAview *view, pmFPAfile *file, const pmConfig *config); 54 54 bool pmChipWriteObjects (pmChip *chip, const pmFPAview *view, pmFPAfile *file, const pmConfig *config);
Note:
See TracChangeset
for help on using the changeset viewer.
