Changeset 28623 for trunk/ppTranslate/src/ppMopsWrite.c
- Timestamp:
- Jul 7, 2010, 10:44:29 AM (16 years ago)
- File:
-
- 1 edited
-
trunk/ppTranslate/src/ppMopsWrite.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ppTranslate/src/ppMopsWrite.c
r28264 r28623 9 9 #include "ppTranslateVersion.h" 10 10 11 bool ppMopsWrite(const p sArray *detections, const ppMopsArguments *args)11 bool ppMopsWrite(const ppMopsDetections *det, const ppMopsArguments *args) 12 12 { 13 psTrace("ppMops.write", 1, "Writing %ld extensions to %s", detections->n, args->output);13 psTrace("ppMops.write", 1, "Writing %ld rows to %s", det->num, args->output); 14 14 15 15 psFits *fits = psFitsOpen(args->output, "w"); // FITS file … … 19 19 } 20 20 21 // Primary header22 {23 psMetadata *header = psMetadataAlloc(); // Header to write24 ppTranslateVersionHeader(header);25 psMetadataAddStr(header, PS_LIST_TAIL, "EXP_NAME", 0, "Exposure name", args->exp_name);26 psMetadataAddS64(header, PS_LIST_TAIL, "EXP_ID", 0, "Exposure identifier", args->exp_id);27 psMetadataAddS64(header, PS_LIST_TAIL, "CHIP_ID", 0, "Chip stage identifier", args->chip_id);28 psMetadataAddS64(header, PS_LIST_TAIL, "CAM_ID", 0, "Cam stage identifier", args->cam_id);29 psMetadataAddS64(header, PS_LIST_TAIL, "FAKE_ID", 0, "Fake stage identifier", args->fake_id);30 psMetadataAddS64(header, PS_LIST_TAIL, "WARP_ID", 0, "Warp stage identifier", args->warp_id);31 psMetadataAddS64(header, PS_LIST_TAIL, "DIFF_ID", 0, "Diff stage identifier", args->diff_id);32 psMetadataAddBool(header, PS_LIST_TAIL, "DIFF_POS", 0, "Positive subtraction?", args->positive);33 psMetadataAddF32(header, PS_LIST_TAIL, "MAGZP", 0, "Magnitude zero point", args->zp);34 psMetadataAddF32(header, PS_LIST_TAIL, "MAGZPERR", 0, "Error in magnitude zero point", args->zpErr);35 psMetadataAddF32(header, PS_LIST_TAIL, "ASTRORMS", 0, "RMS of astrometric fit", args->rmsAstrom);36 psMetadataAddStr(header, PS_LIST_TAIL, "OBSCODE", 0, "IAU Observatory code", OBSERVATORY_CODE);37 21 38 ppMopsDetections *det = detections->data[0]; // Representative set of detections 39 psMetadataAddStr(header, PS_LIST_TAIL, "RA", 0, "Right Ascension of boresight", det->raBoresight); 40 psMetadataAddStr(header, PS_LIST_TAIL, "DEC", 0, "Declination of boresight", det->decBoresight); 41 psMetadataAddStr(header, PS_LIST_TAIL, "FILTER", 0, "Filter name", det->filter); 42 psMetadataAddF32(header, PS_LIST_TAIL, "AIRMASS", 0, "Airmass at boresight", det->airmass); 43 psMetadataAddF32(header, PS_LIST_TAIL, "EXPTIME", 0, "Exposure time (sec)", det->exptime); 44 psMetadataAddF64(header, PS_LIST_TAIL, "POSANG", 0, "Position angle", det->posangle); 45 psMetadataAddF64(header, PS_LIST_TAIL, "ALT", 0, "Altitude of boresight", det->alt); 46 psMetadataAddF64(header, PS_LIST_TAIL, "AZ", 0, "Azimuth of boresight", det->az); 47 psMetadataAddF64(header, PS_LIST_TAIL, "MJD-OBS", 0, "MJD of observation", det->mjd); 22 psMetadata *header = psMetadataAlloc(); // Header to write 23 psString source = ppTranslateSource(), version = ppTranslateVersion(); 24 psMetadataAddStr(header, PS_LIST_TAIL, "SWSOURCE", 0, "Software source", source); 25 psMetadataAddStr(header, PS_LIST_TAIL, "SWVERSN", 0, "Software version", version); 26 ppTranslateVersionHeader(header); 27 psFree(source); 28 psFree(version); 48 29 49 if (!psFitsWriteBlank(fits, header, NULL)) { 50 psError(psErrorCodeLast(), false, "Unable to write primary header"); 30 psMetadataAddStr(header, PS_LIST_TAIL, "EXP_NAME", 0, "Exposure name", args->exp_name); 31 psMetadataAddS64(header, PS_LIST_TAIL, "EXP_ID", 0, "Exposure identifier", args->exp_id); 32 psMetadataAddS64(header, PS_LIST_TAIL, "CHIP_ID", 0, "Chip stage identifier", args->chip_id); 33 psMetadataAddS64(header, PS_LIST_TAIL, "CAM_ID", 0, "Cam stage identifier", args->cam_id); 34 psMetadataAddS64(header, PS_LIST_TAIL, "FAKE_ID", 0, "Fake stage identifier", args->fake_id); 35 psMetadataAddS64(header, PS_LIST_TAIL, "WARP_ID", 0, "Warp stage identifier", args->warp_id); 36 psMetadataAddS64(header, PS_LIST_TAIL, "DIFF_ID", 0, "Diff stage identifier", args->diff_id); 37 psMetadataAddBool(header, PS_LIST_TAIL, "DIFF_POS", 0, "Positive subtraction?", args->positive); 38 39 psMetadataAddF64(header, PS_LIST_TAIL, "MJD-OBS", 0, "MJD of exposure midpoint", det->mjd); 40 psMetadataAddStr(header, PS_LIST_TAIL, "RA", 0, "Right Ascension of boresight", det->raBoresight); 41 psMetadataAddStr(header, PS_LIST_TAIL, "DEC", 0, "Declination of boresight", det->decBoresight); 42 psMetadataAddF64(header, PS_LIST_TAIL, "TEL_ALT", 0, "Telescope altitude", det->alt); 43 psMetadataAddF64(header, PS_LIST_TAIL, "TEL_AZ", 0, "Telescope azimuth", det->az); 44 psMetadataAddF64(header, PS_LIST_TAIL, "EXPTIME", 0, "Exposure time (sec)", det->exptime); 45 psMetadataAddF64(header, PS_LIST_TAIL, "ROTANGLE", 0, "Rotator position angle", det->posangle); 46 psMetadataAddStr(header, PS_LIST_TAIL, "FILTER", 0, "Filter name", det->filter); 47 psMetadataAddF32(header, PS_LIST_TAIL, "AIRMASS", 0, "Airmass of exposure", det->airmass); 48 psMetadataAddStr(header, PS_LIST_TAIL, "OBSCODE", 0, "IAU Observatory code", OBSERVATORY_CODE); 49 psMetadataAddF32(header, PS_LIST_TAIL, "SEEING", 0, "Mean seeing", det->seeing); 50 psMetadataAddF32(header, PS_LIST_TAIL, "MAGZP", 0, "Magnitude zero point", args->zp); 51 psMetadataAddF32(header, PS_LIST_TAIL, "MAGZPERR", 0, "Error in magnitude zero point", args->zpErr); 52 psMetadataAddF32(header, PS_LIST_TAIL, "ASTRORMS", 0, "RMS of astrometric fit", args->rmsAstrom); 53 54 if (det->num == 0) { 55 // Write dummy table 56 psMetadata *row = psMetadataAlloc(); // Output row 57 psMetadataAddF64(row, PS_LIST_TAIL, "RA", 0, "Right ascension (degrees)", NAN); 58 psMetadataAddF64(row, PS_LIST_TAIL, "RA_ERR", 0, "Right ascension error (degrees)", NAN); 59 psMetadataAddF64(row, PS_LIST_TAIL, "DEC", 0, "Declination (degrees)", NAN); 60 psMetadataAddF64(row, PS_LIST_TAIL, "DEC_ERR", 0, "Declination error (degrees)", NAN); 61 psMetadataAddF32(row, PS_LIST_TAIL, "MAG", 0, "Magnitude", NAN); 62 psMetadataAddF32(row, PS_LIST_TAIL, "MAG_ERR", 0, "Magnitude error", NAN); 63 psMetadataAddF32(row, PS_LIST_TAIL, "PSF_CHI2", 0, "chi^2 of PSF fit", NAN); 64 psMetadataAddS32(row, PS_LIST_TAIL, "PSF_DOF", 0, "Degrees of freedom of PSF fit", 0); 65 psMetadataAddF32(row, PS_LIST_TAIL, "CR_SIGNIFICANCE", 0, "Significance of CR", NAN); 66 psMetadataAddF32(row, PS_LIST_TAIL, "EXT_SIGNIFICANCE", 0, "Significance of extendedness", NAN); 67 psMetadataAddF32(row, PS_LIST_TAIL, "PSF_MAJOR", 0, "PSF major axis (pixels)", NAN); 68 psMetadataAddF32(row, PS_LIST_TAIL, "PSF_MINOR", 0, "PSF minor axis (pixels)", NAN); 69 psMetadataAddF32(row, PS_LIST_TAIL, "PSF_THETA", 0, "PSF position angle (deg on chip)", NAN); 70 psMetadataAddF32(row, PS_LIST_TAIL, "PSF_QUALITY", 0, "PSF quality factor", NAN); 71 psMetadataAddS32(row, PS_LIST_TAIL, "PSF_NPIX", 0, "Number of pixels in PSF", 0); 72 psMetadataAddF32(row, PS_LIST_TAIL, "MOMENTS_XX", 0, "xx moment", NAN); 73 psMetadataAddF32(row, PS_LIST_TAIL, "MOMENTS_XY", 0, "xy moment", NAN); 74 psMetadataAddF32(row, PS_LIST_TAIL, "MOMENTS_YY", 0, "yy moment", NAN); 75 psMetadataAddU32(row, PS_LIST_TAIL, "FLAGS", 0, "Detection bit flags", 0); 76 psMetadataAddS64(row, PS_LIST_TAIL, "DIFF_SKYFILE_ID", 0, "Identifier for diff skyfile", 0); 77 78 psMetadataAddS32(row, PS_LIST_TAIL, "N_POS", 0, "Number of positive pixels", 0); 79 psMetadataAddF32(row, PS_LIST_TAIL, "F_POS", 0, "Fraction of positive pixels", NAN); 80 psMetadataAddF32(row, PS_LIST_TAIL, "RATIO_BAD", 0, "Ratio of positive pixels to negative", NAN); 81 psMetadataAddF32(row, PS_LIST_TAIL, "RATIO_MASK", 0, "Ratio of positive pixels to masked", NAN); 82 psMetadataAddF32(row, PS_LIST_TAIL, "RATIO_ALL", 0, "Ratio of positive pixels to all", NAN); 83 if (!psFitsWriteTableEmpty(fits, header, row, OUT_EXTNAME)) { 84 psErrorStackPrint(stderr, "Unable to write empty table."); 85 psFree(header); 86 psFree(row); 51 87 return false; 52 88 } 53 psFree(header); 89 psFree(row); 90 } else { 91 psArray *table = psArrayAlloc(det->num); // Table to write 92 for (long i = 0; i < det->num; i++) { 93 psMetadata *row = psMetadataAlloc(); // Output row 94 psMetadataAddF64(row, PS_LIST_TAIL, "RA", 0, "Right ascension (degrees)", 95 RAD_TO_DEG(det->ra->data.F64[i])); 96 psMetadataAddF64(row, PS_LIST_TAIL, "RA_ERR", 0, "Right ascension error (degrees)", 97 det->raErr->data.F64[i]); 98 psMetadataAddF64(row, PS_LIST_TAIL, "DEC", 0, "Declination (degrees)", 99 RAD_TO_DEG(det->dec->data.F64[i])); 100 psMetadataAddF64(row, PS_LIST_TAIL, "DEC_ERR", 0, "Declination error (degrees)", 101 det->decErr->data.F64[i]); 102 psMetadataAddF32(row, PS_LIST_TAIL, "MAG", 0, "Magnitude", det->mag->data.F32[i]); 103 psMetadataAddF32(row, PS_LIST_TAIL, "MAG_ERR", 0, "Magnitude error", det->magErr->data.F32[i]); 104 psMetadataAddF32(row, PS_LIST_TAIL, "PSF_CHI2", 0, "chi^2 of PSF fit", det->chi2->data.F32[i]); 105 psMetadataAddS32(row, PS_LIST_TAIL, "PSF_DOF", 0, "Degrees of freedom of PSF fit", 106 det->dof->data.S32[i]); 107 psMetadataAddF32(row, PS_LIST_TAIL, "CR_SIGNIFICANCE", 0, "Significance of CR", 108 det->cr->data.F32[i]); 109 psMetadataAddF32(row, PS_LIST_TAIL, "EXT_SIGNIFICANCE", 0, "Significance of extendedness", 110 det->extended->data.F32[i]); 111 psMetadataAddF32(row, PS_LIST_TAIL, "PSF_MAJOR", 0, "PSF major axis (pixels)", det->psfMajor->data.F32[i]); 112 psMetadataAddF32(row, PS_LIST_TAIL, "PSF_MINOR", 0, "PSF minor axis (pixels)", det->psfMinor->data.F32[i]); 113 psMetadataAddF32(row, PS_LIST_TAIL, "PSF_THETA", 0, "PSF position angle (deg on chip)", 114 det->psfTheta->data.F32[i]); 115 psMetadataAddF32(row, PS_LIST_TAIL, "PSF_QUALITY", 0, "PSF quality factor", 116 det->quality->data.F32[i]); 117 psMetadataAddS32(row, PS_LIST_TAIL, "PSF_NPIX", 0, "Number of pixels in PSF", 118 det->numPix->data.S32[i]); 119 psMetadataAddF32(row, PS_LIST_TAIL, "MOMENTS_XX", 0, "xx moment", det->xxMoment->data.F32[i]); 120 psMetadataAddF32(row, PS_LIST_TAIL, "MOMENTS_XY", 0, "xy moment", det->xyMoment->data.F32[i]); 121 psMetadataAddF32(row, PS_LIST_TAIL, "MOMENTS_YY", 0, "yy moment", det->yyMoment->data.F32[i]); 122 psMetadataAddS32(row, PS_LIST_TAIL, "N_POS", 0, "Number of positive pixels", 123 det->nPos->data.S32[i]); 124 psMetadataAddF32(row, PS_LIST_TAIL, "F_POS", 0, "Fraction of positive pixels", 125 det->fPos->data.F32[i]); 126 psMetadataAddF32(row, PS_LIST_TAIL, "RATIO_BAD", 0, "Ratio of positive pixels to negative", 127 det->nRatioBad->data.F32[i]); 128 psMetadataAddF32(row, PS_LIST_TAIL, "RATIO_MASK", 0, "Ratio of positive pixels to masked", 129 det->nRatioMask->data.F32[i]); 130 psMetadataAddF32(row, PS_LIST_TAIL, "RATIO_ALL", 0, "Ratio of positive pixels to all", 131 det->nRatioAll->data.F32[i]); 132 psMetadataAddU32(row, PS_LIST_TAIL, "FLAGS", 0, "Detection bit flags", det->flags->data.U32[i]); 133 psMetadataAddS64(row, PS_LIST_TAIL, "DIFF_SKYFILE_ID", 0, "Identifier for diff skyfile", 134 det->diffSkyfileId->data.S64[i]); 135 136 table->data[i] = row; 137 } 138 if (!psFitsWriteTable(fits, header, table, OUT_EXTNAME)) { 139 psErrorStackPrint(stderr, "Unable to write table."); 140 psFree(header); 141 psFree(table); 142 return false; 143 } 144 psFree(table); 54 145 } 55 146 56 for (int i = 0; i < detections->n; i++) { 57 ppMopsDetections *det = detections->data[i]; // Detections for extension 58 psTrace("ppMops.write", 1, "Writing extension %d to %s", i, args->output); 59 psString hdrName = NULL, psfName = NULL, deteffName = NULL; 60 psStringAppend(&hdrName, "%s.hdr", det->component); 61 psStringAppend(&psfName, "%s.psf", det->component); 62 psStringAppend(&deteffName, "%s.deteff", det->component); 63 64 if (!psFitsWriteBlank(fits, det->header, hdrName)) { 65 psError(psErrorCodeLast(), false, "Unable to write header %d", i); 66 return false; 67 } 68 if (!psFitsWriteTableAllColumns(fits, det->psfHeader, det->table, psfName)) { 69 psError(psErrorCodeLast(), false, "Unable to write table %d", i); 70 return false; 71 } 72 if (det->deteffHeader && det->deteffTable && 73 !psFitsWriteTableAllColumns(fits, det->deteffHeader, det->deteffTable, deteffName)) { 74 psError(psErrorCodeLast(), false, "Unable to write detection efficiency %d", i); 75 return false; 76 } 77 psFree(hdrName); 78 psFree(psfName); 79 psFree(deteffName); 80 } 147 psFree(header); 81 148 psFitsClose(fits); 82 149 83 psTrace("ppMops.write", 1, "Done writing to %s", args->output);150 psTrace("ppMops.write", 1, "Done writing %ld rows to %s", det->num, args->output); 84 151 85 152 return true;
Note:
See TracChangeset
for help on using the changeset viewer.
